Browse Source

Extract average calculation in separated function

Yann Weber 4 years ago
parent
commit
f715ee5381
2 changed files with 40 additions and 14 deletions
  1. 5
    0
      include/stats.h
  2. 35
    14
      src/stats.c

+ 5
- 0
include/stats.h View File

83
  */
83
  */
84
 int pyfcgi_stats_reqbuff(size_t);
84
 int pyfcgi_stats_reqbuff(size_t);
85
 
85
 
86
+int pyfcgi_stats_avg(const int[], int*, int, int*, double[4]);
87
+
88
+/**@brief Returns the formated buffer
89
+ * @todo make @ref pyfcgi_stats_format() implement this functionnality
90
+ * to remove this function... */
86
 const char *pyfcgi_stats_buff(const char **, size_t*);
91
 const char *pyfcgi_stats_buff(const char **, size_t*);
87
 
92
 
88
 #endif
93
 #endif

+ 35
- 14
src/stats.c View File

108
 		PACKAGE_STRING, uptime, since);
108
 		PACKAGE_STRING, uptime, since);
109
 
109
 
110
 	// Request counter stats formating
110
 	// Request counter stats formating
111
+	double avgs[4];
112
+	int last_rs, ret;
113
+
114
+	do
115
+	{
116
+		ret = pyfcgi_stats_avg(pyfcgi_stats.reqs,
117
+			&(pyfcgi_stats.cur_req), PYFCGI_STATS_REQS_SAMPLES,
118
+			&last_rs, avgs);
119
+	} while(ret < 0 && errno == EINTR);
120
+	pyfcgi_stats_buffprintf("Requests stats :\n1s:%dr/s 1m:%.2fr/s 5m:%.2fr/s 10m:%.2fr/s 15m:%.2fr/s\n",
121
+		last_rs, avgs[0], avgs[1], avgs[2], avgs[3]);
122
+	return pyfcgi_stats.buff_ptr;
123
+}
124
+
125
+int pyfcgi_stats_avg(const int data[], int *idx_first, int len,
126
+	int *last, double avgs[4])
127
+{
111
 	double r15, r10, r5, r1, rtmp;
128
 	double r15, r10, r5, r1, rtmp;
112
 	unsigned long stmp; // stores a 60s req sum
129
 	unsigned long stmp; // stores a 60s req sum
113
-	int i, cur_req, cur_rs, idx;
130
+	int i, cur, idx, first;
114
 	r15 = r10 = r5 = r1 = stmp = 0;
131
 	r15 = r10 = r5 = r1 = stmp = 0;
115
-	cur_req = pyfcgi_stats.cur_req;
132
+	first = *idx_first;
116
 	//Block interrupt/ALARM ??
133
 	//Block interrupt/ALARM ??
117
-	for(i=0; i<PYFCGI_STATS_REQS_SAMPLES; i++)
134
+	for(i=0; i<len; i++)
118
 	{
135
 	{
119
-		if(cur_req != pyfcgi_stats.cur_req)
136
+		if(first != *idx_first)
120
 		{
137
 		{
121
 			errno = EINTR;
138
 			errno = EINTR;
122
-			return 0;
139
+			return -1;
123
 		}
140
 		}
124
-		idx = (pyfcgi_stats.cur_req - i - 1);
125
-		idx = (idx<0)?PYFCGI_STATS_REQS_SAMPLES + idx:idx;
126
-		idx %= PYFCGI_STATS_REQS_SAMPLES;
127
-		cur_rs = pyfcgi_stats.reqs[idx];
141
+		idx = (*idx_first- i - 1);
142
+		idx = (idx<0)?len + idx:idx;
143
+		idx %= len;
144
+		cur = data[idx];
128
 		if(!i || i%60)
145
 		if(!i || i%60)
129
 		{
146
 		{
130
-			stmp += cur_rs;
147
+			stmp += cur;
131
 			continue;
148
 			continue;
132
 		}
149
 		}
133
 		rtmp = (long double)stmp / 60;
150
 		rtmp = (long double)stmp / 60;
135
 		if(i<5*60) { r5 += rtmp; }
152
 		if(i<5*60) { r5 += rtmp; }
136
 		if(i<10*60) { r10 += rtmp; }
153
 		if(i<10*60) { r10 += rtmp; }
137
 		if(i<15*60) { r15 += rtmp; }
154
 		if(i<15*60) { r15 += rtmp; }
138
-		stmp = cur_rs;
155
+		stmp = cur;
139
 	}
156
 	}
140
 	//Restore interrupt/ALARM ??
157
 	//Restore interrupt/ALARM ??
141
 	r5 /= 5;
158
 	r5 /= 5;
142
 	r10 /= 10;
159
 	r10 /= 10;
143
 	r15 /= 15;
160
 	r15 /= 15;
144
-	pyfcgi_stats_buffprintf("Requests stats :\n1s:%dr/s 1m:%.2fr/s 5m:%.2fr/s 10m:%.2fr/s 15m:%.2fr/s\n",
145
-		pyfcgi_stats.reqs[pyfcgi_stats.cur_req-1], r1, r5, r10, r15);
146
-	return pyfcgi_stats.buff_ptr;
161
+	*last = data[*idx_first];
162
+	avgs[0] = r1;
163
+	avgs[1] = r5;
164
+	avgs[2] = r10;
165
+	avgs[3] = r15;
166
+
167
+	return 0;
147
 }
168
 }
148
 
169
 
149
 void pyfcgi_stats_buffprintf(const char *fmt, ...)
170
 void pyfcgi_stats_buffprintf(const char *fmt, ...)

Loading…
Cancel
Save