33 #include <sys/resource.h>
35 #include "XrdVersion.hh"
51 long XrdStats::tBoot =
static_cast<long>(time(0));
66 :
XrdJob(
"stats reporter"),
67 Sched(schP), Stats(sP), iVal(iV)
81 const char *hname,
int port,
82 const char *iname,
const char *pname,
const char *site)
84 static const char *head =
85 "<statistics tod=\"%%ld\" ver=\"" XrdVERSION
"\" src=\"%s:%d\" "
86 "tos=\"%ld\" pgm=\"%s\" ins=\"%s\" pid=\"%d\" "
94 Hlen = sprintf(myBuff, head, hname, port, tBoot, pname, iname,
95 static_cast<int>(getpid()), (site ? site :
""));
96 Head = strdup(myBuff);
111 static int autoSync, repOpts =
Opts;
120 {
if (Dest[0]) netDest[0] =
new XrdNetMsg(XrdLog, Dest[0]);
121 if (Dest[1]) netDest[1] =
new XrdNetMsg(XrdLog, Dest[1]);
127 if (netDest[0])
new XrdStatsJob(XrdSched,
this, iVal);
133 if (!autoSync || XrdSched->
Active() <= 30) theOpts = repOpts;
139 if ((Data = GenStats(Dlen, theOpts)))
140 {netDest[0]->
Send(Data, Dlen);
141 if (netDest[1]) netDest[1]->
Send(Data, Dlen);
161 if ((info = GenStats(sz,
opts))) cbP->
Info(info, sz);
175 const char *XrdStats::GenStats(
int &rsz,
int opts)
177 static const char *sgen =
"<stats id=\"sgen\">"
178 "<as>%d</as><et>%lu</et><toe>%ld</toe></stats>";
179 static const char *tail =
"</statistics>";
180 static const char *snul =
"<statistics tod=\"0\" ver=\"" XrdVSTRING
"\">"
183 static const int snulsz = strlen(snul);
184 static const int ovrhed = 256+strlen(sgen)+strlen(tail);
196 if (posix_memalign((
void **)&buff, getpagesize(), blen+256)) buff = 0;
197 if (!(bp = buff)) {rsz = snulsz;
return snul;}
207 sz = sprintf(buff, Head,
static_cast<long>(time(0)));
213 {sz = InfoStats(bp, bl, do_sync);
218 {sz = BuffPool->
Stats(bp, bl, do_sync);
233 {sz = ProcStats(bp, bl, do_sync);
243 {sz = XrdSched->
Stats(bp, bl, do_sync);
248 {
unsigned long totTime = 0;
250 sz = snprintf(bp,bl,sgen,do_sync==0,totTime,
static_cast<long>(time(0)));
255 if (bl > 0) n =
strlcpy(bp, tail, bl);
257 rsz = sz + (n >= bl ? bl : n);
265 int XrdStats::InfoStats(
char *bfr,
int bln,
int do_sync)
267 static const char statfmt[] =
"<stats id=\"info\"><host>%s</host>"
268 "<port>%d</port><name>%s</name></stats>";
272 if (!bfr)
return sizeof(statfmt)+24 + strlen(myHost);
276 return snprintf(bfr, bln, statfmt, myHost, myPort, myName);
283 int XrdStats::ProcStats(
char *bfr,
int bln,
int do_sync)
285 static const char statfmt[] =
"<stats id=\"proc\">"
286 "<usr><s>%lld</s><u>%lld</u></usr>"
287 "<sys><s>%lld</s><u>%lld</u></sys>"
289 struct rusage r_usage;
290 long long utime_sec, utime_usec, stime_sec, stime_usec;
296 if (!bfr)
return sizeof(statfmt)+16*13;
300 if (getrusage(RUSAGE_SELF, &r_usage))
return 0;
307 utime_sec =
static_cast<long long>(r_usage.ru_utime.tv_sec);
308 utime_usec =
static_cast<long long>(r_usage.ru_utime.tv_usec);
309 stime_sec =
static_cast<long long>(r_usage.ru_stime.tv_sec);
310 stime_usec =
static_cast<long long>(r_usage.ru_stime.tv_usec);
322 return snprintf(bfr, bln, statfmt,
323 utime_sec, utime_usec, stime_sec, stime_usec
int Stats(char *buff, int blen, int do_sync=0)
static int Stats(char *buff, int blen, bool do_sync=0)
int Send(const char *buff, int blen=0, const char *dest=0, int tmo=-1)
static int Stats(char *buff, int blen, int do_sync=0)
static int Statistics(char *buff, int blen, int do_sync=0)
int Stats(char *buff, int blen, int do_sync=0)
void Schedule(XrdJob *jp)
XrdStatsJob(XrdScheduler *schP, XrdStats *sP, int iV)
virtual void Info(const char *data, int dlen)=0
XrdStats(XrdSysError *eP, XrdScheduler *sP, XrdBuffManager *bP, const char *hn, int port, const char *in, const char *pn, const char *sn)
void Report(char **Dest=0, int iVal=600, int Opts=0)
virtual void Stats(CallBack *InfoBack, int opts)
unsigned long Report(double &)