33#include <sys/resource.h>
36#include "XrdVersion.hh"
54 long XrdStats::tBoot =
static_cast<long>(time(0));
64 void DoIt() {Stats->Report();
65 Sched->Schedule((
XrdJob *)
this, time(0)+iVal);
69 :
XrdJob(
"stats reporter"),
70 Sched(schP), Stats(sP), iVal(iV)
71 {Sched->Schedule((
XrdJob *)
this, time(0)+iVal);}
84 const char *hname,
int port,
85 const char *iname,
const char *pname,
const char *site)
88 "<statistics tod=\"%%ld\" ver=\"" XrdVERSION
"\" src=\"%s:%d\" "
89 "tos=\"%ld\" pgm=\"%s\" ins=\"%s\" pid=\"%d\" "
91 Hend =
"</statistics>";
95 "{\"statistics\":{\"tod\":%%ld,\"ver\":\"" XrdVERSION
"\",\"src\":\"%s:%d\","
96 "\"tos\":%ld,\"pgm\":\"%s\",\"ins\":\"%s\",\"pid\":%d,"
107 sprintf(myBuff, head, hname, port, tBoot, pname, iname,
108 static_cast<int>(getpid()), (site ? site :
""));
109 Head = strdup(myBuff);
111 sprintf(myBuff, jead, hname, port, tBoot, pname, iname,
112 static_cast<int>(getpid()), (site ? site :
""));
113 Jead = strdup(myBuff);
118 if (posix_memalign((
void **)&buff, getpagesize(), blen)) buff = 0;
134 theEnv.
PutPtr(
"XrdMonRoll*", monRoll);
146 if (Dest[0]) netDest[0] =
new XrdNetMsg(XrdLog, Dest[0]);
147 if (Dest[1]) netDest[1] =
new XrdNetMsg(XrdLog, Dest[1]);
158 if (netDest[0])
new XrdStatsJob(XrdSched,
this, iVal);
168 char udpBuff[64*1024];
174 if (!autoSync || XrdSched->Active() <= 30) theOpts = xmlOpts;
183 if ((Data = GenStats(Dlen, theOpts)))
184 {netDest[0]->Send(Data, Dlen);
185 if (netDest[1]) netDest[1]->Send(Data, Dlen);
200 int hL = sprintf(udpBuff, Jead, time(0));
201 int bL =
sizeof(udpBuff) - hL - Jtln - 8;
202 char* bP = udpBuff + hL;
207 ioV[0].iov_base = udpBuff;
209 ioV[1].iov_base = bP;
210 ioV[2].iov_base = (
void*)Jend;
211 ioV[2].iov_len = Jtln;
213 while((uL = theMon->Format(bP, bL, sItem, theOpts)))
214 {ioV[1].iov_len = uL;
215 netDest[0]->Send(ioV, 3);
216 if (netDest[1]) netDest[1]->Send(ioV, 3);
241 if ((info = GenStats(sz,
opts))) cbP->
Info(info, sz);
255const char *XrdStats::GenStats(
int &rsz,
int opts)
257 static const char *sgen =
"<stats id=\"sgen\">"
258 "<as>%d</as><et>%lu</et><toe>%ld</toe></stats>";
259 static const char *tail =
"</statistics>";
260 static const char *snul =
"<statistics tod=\"0\" ver=\"" XrdVSTRING
"\">"
263 static const int snulsz = strlen(snul);
264 static const int ovrhed = 256+strlen(sgen)+strlen(tail);
271 if (!(bp = buff)) {rsz = snulsz;
return snul;}
280 sz = sprintf(buff, Head,
static_cast<long>(time(0)));
286 {sz = InfoStats(bp, bl, do_sync);
291 {sz = BuffPool->Stats(bp, bl, do_sync);
306 {sz = ProcStats(bp, bl, do_sync);
316 {sz = XrdSched->Stats(bp, bl, do_sync);
321 {
unsigned long totTime = 0;
323 sz = snprintf(bp,bl,sgen,do_sync==0,totTime,
static_cast<long>(time(0)));
334 while(bl > 0 && (uL = theMon->Format(bp, bl, sItem, fOpts)))
335 {bp += uL; bl -= uL;}
339 if (bl > 0) n =
strlcpy(bp, tail, bl);
341 rsz = sz + (n >= bl ? bl : n);
348void XrdStats::GenStats(std::vector<struct iovec>& ioVec,
int opts)
351 char *sbP, sBuff[64*1024];
352 std::vector<struct iovec> ioV;
353 int sTLen, sbFree, sdSZ, fOpts, sItem = 0;
358 {
int Jlen = sprintf(sBuff, Jead, time(0));
359 sdSZ = sbFree =
sizeof(sBuff) - Jlen - 64;
365 int Hlen = sprintf(sBuff, Head, time(0));
366 sdSZ = sbFree =
sizeof(sBuff) - Hlen - 64;
380 while((sdSZ = theMon->Format(sbP, sbFree, sItem, fOpts)))
381 {
if (sdSZ > 0 && sdSZ <= sbFree)
382 {
char* bP = sbP + sdSZ;
385 strcpy(bP+sTLen,
"\n");
387 ioV.iov_base = strdup(sBuff);
388 ioV.iov_len = bP - sBuff + sTLen;
389 ioVec.push_back(ioV);
398int XrdStats::InfoStats(
char *bfr,
int bln,
int do_sync)
400 static const char statfmt[] =
"<stats id=\"info\"><host>%s</host>"
401 "<port>%d</port><name>%s</name></stats>";
405 if (!bfr)
return sizeof(statfmt)+24 + strlen(myHost);
409 return snprintf(bfr, bln, statfmt, myHost, myPort, myName);
416int XrdStats::ProcStats(
char *bfr,
int bln,
int do_sync)
418 static const char statfmt[] =
"<stats id=\"proc\">"
419 "<usr><s>%lld</s><u>%lld</u></usr>"
420 "<sys><s>%lld</s><u>%lld</u></sys>"
422 struct rusage r_usage;
423 long long utime_sec, utime_usec, stime_sec, stime_usec;
429 if (!bfr)
return sizeof(statfmt)+16*13;
433 if (getrusage(RUSAGE_SELF, &r_usage))
return 0;
440 utime_sec =
static_cast<long long>(r_usage.ru_utime.tv_sec);
441 utime_usec =
static_cast<long long>(r_usage.ru_utime.tv_usec);
442 stime_sec =
static_cast<long long>(r_usage.ru_stime.tv_sec);
443 stime_usec =
static_cast<long long>(r_usage.ru_stime.tv_usec);
455 return snprintf(bfr, bln, statfmt,
456 utime_sec, utime_usec, stime_sec, stime_usec
friend class XrdScheduler
XrdJob(const char *desc="")
static int Stats(char *buff, int blen, bool do_sync=0)
void PutPtr(const char *varname, void *value)
static int Stats(char *buff, int blen, int do_sync=0)
static int Statistics(char *buff, int blen, int do_sync=0)
XrdStatsJob(XrdScheduler *schP, XrdStats *sP, int iV)
virtual void Info(const char *data, int dlen)=0
void Init(char **Dest, int iVal=600, int xOpts=0, int jOpts=0)
XrdStats(XrdSysError *eP, XrdScheduler *sP, XrdBuffManager *bP, const char *hn, int port, const char *in, const char *pn, const char *sn)
void Export(XrdOucEnv &env)
virtual void Stats(XrdStats::CallBack *InfoBack, int xOpts, int jOpts=0)
unsigned long Report(double &)