diff options
author | Kozlov Dmitry <xeb@mail.ru> | 2011-09-05 15:28:02 +0400 |
---|---|---|
committer | Kozlov Dmitry <xeb@mail.ru> | 2011-09-05 15:28:02 +0400 |
commit | 3e6a720a2cbd08edb6d04255b2246a833df6825c (patch) | |
tree | f273c6d460f98f83ffca94e44ac3d7b57ebb7445 /accel-pppd/radius/serv.c | |
parent | 9739251101bffde2c62ba08c1869eb170d952d5b (diff) | |
download | accel-ppp-3e6a720a2cbd08edb6d04255b2246a833df6825c.tar.gz accel-ppp-3e6a720a2cbd08edb6d04255b2246a833df6825c.zip |
radius: per-server statistics
Diffstat (limited to 'accel-pppd/radius/serv.c')
-rw-r--r-- | accel-pppd/radius/serv.c | 108 |
1 files changed, 100 insertions, 8 deletions
diff --git a/accel-pppd/radius/serv.c b/accel-pppd/radius/serv.c index 733c975..6c28324 100644 --- a/accel-pppd/radius/serv.c +++ b/accel-pppd/radius/serv.c @@ -13,6 +13,8 @@ #include "log.h" #include "triton.h" #include "events.h" +#include "cli.h" +#include "utils.h" #include "radius_p.h" #include "memdebug.h" @@ -20,6 +22,8 @@ static int num; static LIST_HEAD(serv_list); +static void __free_server(struct rad_server_t *); + static struct rad_server_t *__rad_server_get(int type, struct rad_server_t *exclude) { struct rad_server_t *s, *s0 = NULL; @@ -65,10 +69,8 @@ void rad_server_put(struct rad_server_t *s, int type) { __sync_sub_and_fetch(&s->client_cnt[type], 1); - if (s->need_free && !s->client_cnt[0] && !s->client_cnt[1]) { - log_debug("radius: free(%i)\n", s->id); - _free(s); - } + if (s->need_free && !s->client_cnt[0] && !s->client_cnt[1]) + __free_server(s); } int rad_server_req_enter(struct rad_req_t *req) @@ -199,6 +201,59 @@ void rad_server_reply(struct rad_server_t *s) s->timeout_cnt = 0; } + +static void show_stat(struct rad_server_t *s, void *client) +{ + char addr[17]; + struct timespec ts; + + u_inet_ntoa(s->auth_addr ? s->auth_addr : s->acct_addr, addr); + clock_gettime(CLOCK_MONOTONIC, &ts); + + cli_sendv(client, "radius(%i, %s):\r\n", s->id, addr); + + if (s->conf_fail_time > 1) { + if (ts.tv_sec < s->fail_time) + cli_send(client, " state: failed\r\n"); + else + cli_send(client, " state: active\r\n"); + + cli_sendv(client, " fail count: %lu\r\n", s->stat_fail_cnt); + } + + if (s->auth_addr) { + cli_sendv(client, " auth sent: %lu\r\n", s->stat_auth_sent); + cli_sendv(client, " auth lost(total/5m/1m): %lu/%lu/%lu\r\n", + s->stat_auth_lost, stat_accm_get_cnt(s->stat_auth_lost_5m), stat_accm_get_cnt(s->stat_auth_lost_1m)); + cli_sendv(client, " auth avg query time(5m/1m): %lu/%lu ms\r\n", + stat_accm_get_avg(s->stat_auth_query_5m), stat_accm_get_avg(s->stat_auth_query_1m)); + } + + if (s->acct_addr) { + cli_sendv(client, " acct sent: %lu\r\n", s->stat_acct_sent); + cli_sendv(client, " acct lost(total/5m/1m): %lu/%lu/%lu\r\n", + s->stat_acct_lost, stat_accm_get_cnt(s->stat_acct_lost_5m), stat_accm_get_cnt(s->stat_acct_lost_1m)); + cli_sendv(client, " acct avg query time(5m/1m): %lu/%lu ms\r\n", + stat_accm_get_avg(s->stat_acct_query_5m), stat_accm_get_avg(s->stat_acct_query_1m)); + + cli_sendv(client, " interim sent: %lu\r\n", s->stat_interim_sent); + cli_sendv(client, " interim lost(total/5m/1m): %lu/%lu/%lu\r\n", + s->stat_interim_lost, stat_accm_get_cnt(s->stat_interim_lost_5m), stat_accm_get_cnt(s->stat_interim_lost_1m)); + cli_sendv(client, " interim avg query time(5m/1m): %lu/%lu ms\r\n", + stat_accm_get_avg(s->stat_interim_query_5m), stat_accm_get_avg(s->stat_interim_query_1m)); + } +} + +static int show_stat_exec(const char *cmd, char * const *fields, int fields_cnt, void *client) +{ + struct rad_server_t *s; + + list_for_each_entry(s, &serv_list, entry) + show_stat(s, client); + + return CLI_CMD_OK; +} + static void __add_server(struct rad_server_t *s) { struct rad_server_t *s1; @@ -217,6 +272,43 @@ static void __add_server(struct rad_server_t *s) pthread_mutex_init(&s->lock, NULL); s->conf_fail_time = conf_fail_time; list_add_tail(&s->entry, &serv_list); + + s->stat_auth_lost_1m = stat_accm_create(60); + s->stat_auth_lost_5m = stat_accm_create(5 * 60); + s->stat_auth_query_1m = stat_accm_create(60); + s->stat_auth_query_5m = stat_accm_create(5 * 60); + + s->stat_acct_lost_1m = stat_accm_create(60); + s->stat_acct_lost_5m = stat_accm_create(5 * 60); + s->stat_acct_query_1m = stat_accm_create(60); + s->stat_acct_query_5m = stat_accm_create(5 * 60); + + s->stat_interim_lost_1m = stat_accm_create(60); + s->stat_interim_lost_5m = stat_accm_create(5 * 60); + s->stat_interim_query_1m = stat_accm_create(60); + s->stat_interim_query_5m = stat_accm_create(5 * 60); +} + +static void __free_server(struct rad_server_t *s) +{ + log_debug("radius: free(%i)\n", s->id); + + stat_accm_free(s->stat_auth_lost_1m); + stat_accm_free(s->stat_auth_lost_5m); + stat_accm_free(s->stat_auth_query_1m); + stat_accm_free(s->stat_auth_query_5m); + + stat_accm_free(s->stat_acct_lost_1m); + stat_accm_free(s->stat_acct_lost_5m); + stat_accm_free(s->stat_acct_query_1m); + stat_accm_free(s->stat_acct_query_5m); + + stat_accm_free(s->stat_interim_lost_1m); + stat_accm_free(s->stat_interim_lost_5m); + stat_accm_free(s->stat_interim_query_1m); + stat_accm_free(s->stat_interim_query_5m); + + _free(s); } static int parse_server_old(const char *opt, in_addr_t *addr, int *port, char **secret) @@ -394,10 +486,8 @@ static void load_config(void) triton_context_wakeup(r->rpd->ppp->ctrl->ctx); } - if (!s->client_cnt[0] && !s->client_cnt[1]) { - log_debug("radius: free(%i)\n", s->id); - _free(s); - } + if (!s->client_cnt[0] && !s->client_cnt[1]) + __free_server(s); } } } @@ -409,6 +499,8 @@ static void init(void) load_config(); triton_event_register_handler(EV_CONFIG_RELOAD, (triton_event_func)load_config); + + cli_register_simple_cmd2(show_stat_exec, NULL, 2, "show", "stat"); } DEFINE_INIT(52, init); |