Extract average calculation in separated function

This commit is contained in:
Yann Weber 2019-08-10 15:34:16 +02:00
commit f715ee5381
2 changed files with 40 additions and 14 deletions

View file

@ -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

View file

@ -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, ...)