From: Alan T. DeKok Date: Thu, 23 Feb 2012 13:02:12 +0000 (+0100) Subject: Export Queue PPS in/out via the "status" interface X-Git-Tag: release_3_0_0_beta0~285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0141fccda52fb3d7e27ee0b8dcf643aee908742a;p=thirdparty%2Ffreeradius-server.git Export Queue PPS in/out via the "status" interface --- diff --git a/share/dictionary.freeradius b/share/dictionary.freeradius index 99ca5c816d6..9b04fbcf1bb 100644 --- a/share/dictionary.freeradius +++ b/share/dictionary.freeradius @@ -136,4 +136,7 @@ ATTRIBUTE FreeRADIUS-Server-EMA-Window 178 integer ATTRIBUTE FreeRADIUS-Server-EMA-USEC-Window-1 179 integer ATTRIBUTE FreeRADIUS-Server-EMA-USEC-Window-10 180 integer +ATTRIBUTE FreeRADIUS-Queue-PPS-In 181 integer +ATTRIBUTE FreeRADIUS-Queue-PPS-Out 182 integer + END-VENDOR FreeRADIUS diff --git a/src/include/radiusd.h b/src/include/radiusd.h index 069937332ac..a0012058d96 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -727,7 +727,7 @@ extern pid_t rad_waitpid(pid_t pid, int *status); extern int total_active_threads(void); extern void thread_pool_lock(void); extern void thread_pool_unlock(void); -extern void thread_pool_queue_stats(int *array); +extern void thread_pool_queue_stats(int array[RAD_LISTEN_MAX], int pps[2]); #ifndef HAVE_PTHREAD_H #define rad_fork(n) fork() diff --git a/src/main/stats.c b/src/main/stats.c index 405a0014076..55f99d1a110 100644 --- a/src/main/stats.c +++ b/src/main/stats.c @@ -507,12 +507,11 @@ void request_stats_reply(REQUEST *request) if (vp) vp->vp_date = hup_time.tv_sec; #ifdef HAVE_PTHREAD_H - int i, array[RAD_LISTEN_MAX]; + int i, array[RAD_LISTEN_MAX], pps[2]; - thread_pool_queue_stats(array); + thread_pool_queue_stats(array, pps); -#ifdef WITH_DETAIL - for (i = 0; i <= RAD_LISTEN_DETAIL; i++) { + for (i = 0; i <= 4; i++) { vp = radius_paircreate(request, &request->reply->vps, 162 + i, VENDORPEC_FREERADIUS, PW_TYPE_INTEGER); @@ -520,7 +519,15 @@ void request_stats_reply(REQUEST *request) if (!vp) continue; vp->vp_integer = array[i]; } -#endif + + for (i = 0; i < 2; i++) { + vp = radius_paircreate(request, &request->reply->vps, + 180 + i, VENDORPEC_FREERADIUS, + PW_TYPE_INTEGER); + + if (!vp) continue; + vp->vp_integer = pps[i]; + } #endif } diff --git a/src/main/threads.c b/src/main/threads.c index 09b635c86ad..68dffae7714 100644 --- a/src/main/threads.c +++ b/src/main/threads.c @@ -1227,21 +1227,37 @@ pid_t rad_waitpid(pid_t pid, int *status) */ #endif -void thread_pool_queue_stats(int *array) +void thread_pool_queue_stats(int array[RAD_LISTEN_MAX], int pps[2]) { int i; #ifndef WITH_GCD if (pool_initialized) { + struct timeval now; + for (i = 0; i < RAD_LISTEN_MAX; i++) { array[i] = fr_fifo_num_elements(thread_pool.fifo[i]); } + + gettimeofday(&now, NULL); + + pps[0] = rad_pps(&thread_pool.pps_in.pps_old, + &thread_pool.pps_in.pps_now, + &thread_pool.pps_in.time_old, + &now); + pps[1] = rad_pps(&thread_pool.pps_out.pps_old, + &thread_pool.pps_out.pps_now, + &thread_pool.pps_out.time_old, + &now); + } else #endif /* WITH_GCD */ { for (i = 0; i < RAD_LISTEN_MAX; i++) { array[i] = 0; } + + pps[0] = pps[1] = 0; } } #endif /* HAVE_PTHREAD_H */