Extract average calculation in separated function
This commit is contained in:
parent
d106364638
commit
f715ee5381
2 changed files with 40 additions and 14 deletions
|
|
@ -83,6 +83,11 @@ void pyfcgi_stats_buffprintf(const char *fmt, ...);
|
|||
*/
|
||||
int pyfcgi_stats_reqbuff(size_t);
|
||||
|
||||
int pyfcgi_stats_avg(const int[], int*, int, int*, double[4]);
|
||||
|
||||
/**@brief Returns the formated buffer
|
||||
* @todo make @ref pyfcgi_stats_format() implement this functionnality
|
||||
* to remove this function... */
|
||||
const char *pyfcgi_stats_buff(const char **, size_t*);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
49
src/stats.c
49
src/stats.c
|
|
@ -108,26 +108,43 @@ size_t pyfcgi_stats_format()
|
|||
PACKAGE_STRING, uptime, since);
|
||||
|
||||
// Request counter stats formating
|
||||
double avgs[4];
|
||||
int last_rs, ret;
|
||||
|
||||
do
|
||||
{
|
||||
ret = pyfcgi_stats_avg(pyfcgi_stats.reqs,
|
||||
&(pyfcgi_stats.cur_req), PYFCGI_STATS_REQS_SAMPLES,
|
||||
&last_rs, avgs);
|
||||
} while(ret < 0 && errno == EINTR);
|
||||
pyfcgi_stats_buffprintf("Requests stats :\n1s:%dr/s 1m:%.2fr/s 5m:%.2fr/s 10m:%.2fr/s 15m:%.2fr/s\n",
|
||||
last_rs, avgs[0], avgs[1], avgs[2], avgs[3]);
|
||||
return pyfcgi_stats.buff_ptr;
|
||||
}
|
||||
|
||||
int pyfcgi_stats_avg(const int data[], int *idx_first, int len,
|
||||
int *last, double avgs[4])
|
||||
{
|
||||
double r15, r10, r5, r1, rtmp;
|
||||
unsigned long stmp; // stores a 60s req sum
|
||||
int i, cur_req, cur_rs, idx;
|
||||
int i, cur, idx, first;
|
||||
r15 = r10 = r5 = r1 = stmp = 0;
|
||||
cur_req = pyfcgi_stats.cur_req;
|
||||
first = *idx_first;
|
||||
//Block interrupt/ALARM ??
|
||||
for(i=0; i<PYFCGI_STATS_REQS_SAMPLES; i++)
|
||||
for(i=0; i<len; i++)
|
||||
{
|
||||
if(cur_req != pyfcgi_stats.cur_req)
|
||||
if(first != *idx_first)
|
||||
{
|
||||
errno = EINTR;
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
idx = (pyfcgi_stats.cur_req - i - 1);
|
||||
idx = (idx<0)?PYFCGI_STATS_REQS_SAMPLES + idx:idx;
|
||||
idx %= PYFCGI_STATS_REQS_SAMPLES;
|
||||
cur_rs = pyfcgi_stats.reqs[idx];
|
||||
idx = (*idx_first- i - 1);
|
||||
idx = (idx<0)?len + idx:idx;
|
||||
idx %= len;
|
||||
cur = data[idx];
|
||||
if(!i || i%60)
|
||||
{
|
||||
stmp += cur_rs;
|
||||
stmp += cur;
|
||||
continue;
|
||||
}
|
||||
rtmp = (long double)stmp / 60;
|
||||
|
|
@ -135,15 +152,19 @@ size_t pyfcgi_stats_format()
|
|||
if(i<5*60) { r5 += rtmp; }
|
||||
if(i<10*60) { r10 += rtmp; }
|
||||
if(i<15*60) { r15 += rtmp; }
|
||||
stmp = cur_rs;
|
||||
stmp = cur;
|
||||
}
|
||||
//Restore interrupt/ALARM ??
|
||||
r5 /= 5;
|
||||
r10 /= 10;
|
||||
r15 /= 15;
|
||||
pyfcgi_stats_buffprintf("Requests stats :\n1s:%dr/s 1m:%.2fr/s 5m:%.2fr/s 10m:%.2fr/s 15m:%.2fr/s\n",
|
||||
pyfcgi_stats.reqs[pyfcgi_stats.cur_req-1], r1, r5, r10, r15);
|
||||
return pyfcgi_stats.buff_ptr;
|
||||
*last = data[*idx_first];
|
||||
avgs[0] = r1;
|
||||
avgs[1] = r5;
|
||||
avgs[2] = r10;
|
||||
avgs[3] = r15;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pyfcgi_stats_buffprintf(const char *fmt, ...)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue