Add a command line utility to display critical vpp engine metrics
vector rate, aggregate rx rate, [configurable] significant error rate Change-Id: If0b7316a62cb8478d1466f1c9a9903d6df2a6ca0 Signed-off-by: Dave Barach <openvpp@barachs.net>
This commit is contained in:

committed by
Damjan Marion

parent
ad2c9c0e7f
commit
a86e60f176
@ -140,9 +140,14 @@ test_ha_LDADD = -lvlibmemoryclient -lvlibapi -lsvmdb -lsvm -lvppinfra \
|
||||
-lpthread -lm -lrt
|
||||
|
||||
|
||||
|
||||
noinst_PROGRAMS += summary_stats_client
|
||||
|
||||
summary_stats_client_SOURCES = vpp-api/summary_stats_client.c
|
||||
summary_stats_client_LDADD = -lvlibmemoryclient -lvlibapi -lsvm -lvppinfra \
|
||||
-lpthread -lm -lrt
|
||||
|
||||
bin_PROGRAMS += vpp_get_metrics
|
||||
|
||||
vpp_get_metrics_SOURCES = vpp-api/vpp_get_metrics.c
|
||||
vpp_get_metrics_LDADD = -lsvmdb -lsvm -lvppinfra \
|
||||
-lpthread -lm -lrt
|
||||
|
@ -288,6 +288,6 @@ set_significant_error_command_fn (vlib_main_t * vm,
|
||||
|
||||
VLIB_CLI_COMMAND (set_significant_error_command, static) = {
|
||||
.path = "set significant error",
|
||||
.short_help = "set significant error <counter-index-nnn>",
|
||||
.short_help = "set significant error <counter-index-nnn> [disable]",
|
||||
.function = set_significant_error_command_fn,
|
||||
};
|
||||
|
186
vpp/vpp-api/vpp_get_metrics.c
Normal file
186
vpp/vpp-api/vpp_get_metrics.c
Normal file
@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Cisco and/or its affiliates.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <vppinfra/clib.h>
|
||||
#include <vppinfra/vec.h>
|
||||
#include <vppinfra/hash.h>
|
||||
#include <vppinfra/bitmap.h>
|
||||
#include <vppinfra/fifo.h>
|
||||
#include <vppinfra/time.h>
|
||||
#include <vppinfra/mheap.h>
|
||||
#include <vppinfra/heap.h>
|
||||
#include <vppinfra/pool.h>
|
||||
#include <vppinfra/format.h>
|
||||
#include <vlibapi/api.h>
|
||||
#include <vlibmemory/api.h>
|
||||
|
||||
#include <vlib/vlib.h>
|
||||
#include <vlib/unix/unix.h>
|
||||
#include <vnet/api_errno.h>
|
||||
|
||||
#include <svmdb.h>
|
||||
|
||||
svmdb_client_t *c;
|
||||
volatile int signal_received;
|
||||
|
||||
static void
|
||||
unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc)
|
||||
{
|
||||
static int once;
|
||||
|
||||
if (once)
|
||||
exit (1);
|
||||
|
||||
once = 1;
|
||||
signal_received = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
setup_signal_handlers (void)
|
||||
{
|
||||
uword i;
|
||||
struct sigaction sa;
|
||||
|
||||
for (i = 1; i < 32; i++)
|
||||
{
|
||||
memset (&sa, 0, sizeof (sa));
|
||||
sa.sa_sigaction = (void *) unix_signal_handler;
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
|
||||
switch (i)
|
||||
{
|
||||
/* these signals take the default action */
|
||||
case SIGABRT:
|
||||
case SIGKILL:
|
||||
case SIGSTOP:
|
||||
case SIGUSR1:
|
||||
case SIGUSR2:
|
||||
continue;
|
||||
|
||||
/* ignore SIGPIPE, SIGCHLD */
|
||||
case SIGPIPE:
|
||||
case SIGCHLD:
|
||||
sa.sa_sigaction = (void *) SIG_IGN;
|
||||
break;
|
||||
|
||||
/* catch and handle all other signals */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (sigaction (i, &sa, 0) < 0)
|
||||
return clib_unix_warning (0, "sigaction %U", format_signal, i);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
unformat_input_t input;
|
||||
char *chroot_path = 0;
|
||||
u8 *chroot_path_u8;
|
||||
int interval = 0;
|
||||
f64 *vector_ratep, *rx_ratep, *sig_error_ratep;
|
||||
pid_t *vpp_pidp;
|
||||
|
||||
unformat_init_command_line (&input, argv);
|
||||
|
||||
while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (&input, "chroot %s", &chroot_path_u8))
|
||||
{
|
||||
chroot_path = (char *) chroot_path_u8;
|
||||
}
|
||||
else if (unformat (&input, "interval %d", &interval))
|
||||
;
|
||||
else
|
||||
{
|
||||
fformat (stderr,
|
||||
"usage: vpp_get_metrics [chroot <path>] [interval <nn>]\n");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
setup_signal_handlers ();
|
||||
|
||||
c = svmdb_map_chroot (chroot_path);
|
||||
|
||||
vpp_pidp =
|
||||
svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC, "vpp_pid");
|
||||
vector_ratep =
|
||||
svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
|
||||
"vpp_vector_rate");
|
||||
rx_ratep =
|
||||
svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
|
||||
"vpp_input_rate");
|
||||
sig_error_ratep =
|
||||
svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
|
||||
"vpp_sig_error_rate");
|
||||
|
||||
/*
|
||||
* Make sure vpp is actually running. Otherwise, there's every
|
||||
* chance that the database region will be wiped out by the
|
||||
* process monitor script
|
||||
*/
|
||||
|
||||
if (vpp_pidp == 0 || vector_ratep == 0 || rx_ratep == 0
|
||||
|| sig_error_ratep == 0)
|
||||
{
|
||||
fformat (stdout, "vpp not running\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
/* Once vpp exits, the svm db region will be recreated... */
|
||||
if (*vpp_pidp == 0 || kill (*vpp_pidp, 0) < 0)
|
||||
{
|
||||
fformat (stdout, "vpp not running\n");
|
||||
exit (1);
|
||||
}
|
||||
fformat (stdout,
|
||||
"%d: vpp_vector_rate=%.2f, vpp_input_rate=%f, vpp_sig_error_rate=%f\n",
|
||||
*vpp_pidp, *vector_ratep, *rx_ratep, *sig_error_ratep);
|
||||
|
||||
if (interval)
|
||||
sleep (interval);
|
||||
if (signal_received)
|
||||
break;
|
||||
}
|
||||
while (interval);
|
||||
|
||||
svmdb_unmap (c);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
Reference in New Issue
Block a user