diff --git a/chrony.texi.in b/chrony.texi.in index e831b08..2fc780c 100644 --- a/chrony.texi.in +++ b/chrony.texi.in @@ -3396,6 +3396,7 @@ interface. * reselectdist command:: Set improvement in distance needed to reselect a source * retries command:: Set maximum number of retries * rtcdata command:: Display RTC parameters +* serverstats command:: Display statistics of the server * settime command:: Provide a manual input of the current time * smoothing command:: Display current time smoothing state * smoothtime command:: Reset/activate server time smoothing @@ -4314,6 +4315,24 @@ right when it crosses a particular second boundary. Then it would be 1 microsecond fast when it crosses its next second boundary. @end table @c }}} +@c {{{ serverstats command +@node serverstats command +@subsubsection serverstats command +The @code{serverstats} command displays how many valid NTP and command requests +@code{chronyd} as a server received from clients, how many of them were dropped +to limit the response rate as configured by the @code{ratelimit} and +@code{cmdratelimit} directives, and how many client log records were dropped +due to the memory limit configured by the @code{clientloglimit} directive. An +example of the output is shown below. + +@example +NTP packets received : 1598 +NTP packets dropped : 8 +Command packets received : 19 +Command packets dropped : 0 +Client log records dropped : 0 +@end example +@c }}} @c {{{ settime @node settime command @subsubsection settime diff --git a/client.c b/client.c index c98ab56..2257763 100644 --- a/client.c +++ b/client.c @@ -1225,6 +1225,7 @@ give_help(void) "\0\0NTP access:\0\0" "accheck
\0Check whether address is allowed\0" "clients\0Report on clients that have accessed the server\0" + "serverstats\0Display statistics of the server\0" "allow []\0Allow access to subnet as a default\0" "allow all []\0Allow access to subnet and all children\0" "deny []\0Deny access to subnet as a default\0" @@ -1962,6 +1963,29 @@ process_cmd_tracking(char *line) } return 0; } + +/* ================================================== */ + +static int +process_cmd_serverstats(char *line) +{ + CMD_Request request; + CMD_Reply reply; + + request.command = htons(REQ_SERVER_STATS); + + if (!request_reply(&request, &reply, RPY_SERVER_STATS, 0)) + return 0; + + printf("NTP packets received : %"PRIu32"\n", ntohl(reply.data.server_stats.ntp_hits)); + printf("NTP packets dropped : %"PRIu32"\n", ntohl(reply.data.server_stats.ntp_drops)); + printf("Command packets received : %"PRIu32"\n", ntohl(reply.data.server_stats.cmd_hits)); + printf("Command packets dropped : %"PRIu32"\n", ntohl(reply.data.server_stats.cmd_drops)); + printf("Client log records dropped : %"PRIu32"\n", ntohl(reply.data.server_stats.log_drops)); + + return 1; +} + /* ================================================== */ static int @@ -2590,6 +2614,9 @@ process_line(char *line) } else if (!strcmp(command, "rtcdata")) { do_normal_submit = 0; ret = process_cmd_rtcreport(line); + } else if (!strcmp(command, "serverstats")) { + do_normal_submit = 0; + ret = process_cmd_serverstats(line); } else if (!strcmp(command, "settime")) { do_normal_submit = 0; ret = process_cmd_settime(line);