XRootD
XrdHttpMon.hh
Go to the documentation of this file.
1 #include "Xrd/XrdMonRoll.hh"
2 #include "XrdHttpReq.hh"
4 
5 #include <array>
6 #include <chrono>
7 #include <string>
8 #include <vector>
9 
10 class XrdXrootdGStream;
11 class XrdSysLogger;
12 
13 class XrdHttpMon {
14  public:
15  // Supported HTTP status codes
16  // We use this separate enum from the one defined in XrdHttpUtils to optimise on space and array indexing, this is
17  // not possible with the anonymous enum in httputils mapped to actual status code values making it sparse
18  enum StatusCodes {
40  sc_Count
41  };
42 
43  // Per (operation, status code) statistics
44  struct HttpInfo { // All fields are cumulative; a reset to 0 usually means a server restart and the monitoring
45  // endpoint shall simply add the values from there on
46  RAtomic_uint64_t count{0}; // total http requests
47  RAtomic_uint64_t error_network{0}; // errors with the connection
48  RAtomic_uint64_t error_xrootd{0}; // errors returned by the protocol/bridge layer
49  RAtomic_uint64_t success{0}; // success in responding back with a http response code
50  RAtomic_uint64_t duration_us{0}; // sum of operation duration in microseconds
51  };
52 
53  static void Initialize(XrdSysLogger* logP, XrdXrootdGStream* gStream, XrdMonRoll *mrollP);
54  static void* Start(void*);
55  static void Record(XrdHttpReq &req, int code);
56  static bool IsInitialized() { return isInitialized; }
57 
58  private:
59  // Global stats table
60  static std::array<std::array<HttpInfo, StatusCodes::sc_Count>, XrdHttpReq::ReqType::rtCount> statsInfo;
61 
62  static RAtomic_uint64_t verbCounters[XrdHttpReq::ReqType::rtCount];
63  static RAtomic_uint64_t statusCounters[StatusCodes::sc_Count];
64  static std::vector<XrdMonRoll::Item> statsSchema;
65 
66  // Static members for monitoring configuration
67  static XrdXrootdGStream* gStream;
68  static XrdMonRoll* mrollP;
69  static std::chrono::seconds flushPeriod;
70 
71  // Flags to track which monitoring types are enabled
72  static bool hasGStream; // True if gStream monitoring is enabled (needs detailed metrics)
73  static bool hasMonRoll; // True if MonRoll summary monitoring is enabled (needs simple counters)
74  static bool isInitialized; // True if monitoring has been initialized
75 
76  static void RecordErrProt(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration);
77  static void RecordErrNet(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration);
78  static void RecordCount(XrdHttpReq::ReqType op, StatusCodes sc);
79  static void RecordSuccess(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration);
80 
81  // Helper functions for conditional monitoring updates
82  // These are simple functions that the compiler will hopefully inline
83  static inline void RecordGStreamCount(XrdHttpReq::ReqType op, StatusCodes sc) {
84  if (hasGStream) RecordCount(op, sc);
85  }
86  static inline void RecordGStreamSuccess(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration) {
87  if (hasGStream) RecordSuccess(op, sc, duration);
88  }
89  static inline void RecordGStreamErrNet(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration) {
90  if (hasGStream) RecordErrNet(op, sc, duration);
91  }
92  static inline void RecordGStreamErrProt(XrdHttpReq::ReqType op, StatusCodes sc, std::chrono::steady_clock::duration duration) {
93  if (hasGStream) RecordErrProt(op, sc, duration);
94  }
95  static inline void RecordMonRollVerb(XrdHttpReq::ReqType op) {
96  if (hasMonRoll) verbCounters[op]++;
97 
98  }
99  static inline void RecordMonRollStatus(StatusCodes sc) {
100  if (hasMonRoll) statusCounters[sc]++;
101  }
102 
103  static StatusCodes ToStatusCode(int code);
104 
105  static std::string GetMonitoringJson();
106 
107  static std::string GetOperationString(XrdHttpReq::ReqType op);
108  static std::string GetStatusCodeString(StatusCodes sc);
109  static void Report();
110 
111  // Prevent instantiation
112  XrdHttpMon() = delete;
113  ~XrdHttpMon() = delete;
114 
115 };
Main request/response class, handling the logical status of the communication.
static void Record(XrdHttpReq &req, int code)
Definition: XrdHttpMon.cc:106
static void Initialize(XrdSysLogger *logP, XrdXrootdGStream *gStream, XrdMonRoll *mrollP)
Definition: XrdHttpMon.cc:74
RAtomic_uint64_t duration_us
Definition: XrdHttpMon.hh:50
static bool IsInitialized()
Definition: XrdHttpMon.hh:56
static void * Start(void *)
Definition: XrdHttpMon.cc:99
RAtomic_uint64_t count
Definition: XrdHttpMon.hh:46
RAtomic_uint64_t error_network
Definition: XrdHttpMon.hh:47
RAtomic_uint64_t success
Definition: XrdHttpMon.hh:49
RAtomic_uint64_t error_xrootd
Definition: XrdHttpMon.hh:48
ReqType
These are the HTTP/DAV requests that we support.
Definition: XrdHttpReq.hh:76