XRootD
Loading...
Searching...
No Matches
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
11class XrdSysLogger;
12
13class 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
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
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.
XrdSys::RAtomic< uint64_t > RAtomic_uint64_t
static void Record(XrdHttpReq &req, int code)
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