0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 17:51:53 +00:00

Nest: Statistics

Adds command 'show table statistics' to show statistics related
to routing tables.
This commit is contained in:
Ondrej Zajicek (work) 2018-10-24 16:18:36 +02:00
parent 60dda81b82
commit 5a96090a5b
4 changed files with 69 additions and 4 deletions

View File

@ -60,6 +60,7 @@ Reply codes of BIRD command-line interface
1023 Show Babel interfaces 1023 Show Babel interfaces
1024 Show Babel neighbors 1024 Show Babel neighbors
1025 Show Babel entries 1025 Show Babel entries
1026 Show table
8000 Reply too long 8000 Reply too long
8001 Route not found 8001 Route not found

View File

@ -74,7 +74,7 @@ CF_KEYWORDS(PRIMARY, STATS, COUNT, BY, FOR, COMMANDS, PREEXPORT, NOEXPORT, GENER
CF_KEYWORDS(BGP, PASSWORDS, DESCRIPTION, SORTED) CF_KEYWORDS(BGP, PASSWORDS, DESCRIPTION, SORTED)
CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC, CLASS, DSCP) CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC, CLASS, DSCP)
CF_KEYWORDS(TIMEFORMAT, ISO, SHORT, LONG, ROUTE, PROTOCOL, BASE, LOG, S, MS, US) CF_KEYWORDS(TIMEFORMAT, ISO, SHORT, LONG, ROUTE, PROTOCOL, BASE, LOG, S, MS, US)
CF_KEYWORDS(GRACEFUL, RESTART, WAIT, MAX, FLUSH, AS) CF_KEYWORDS(GRACEFUL, RESTART, WAIT, MAX, FLUSH, AS, STATISTICS)
/* For r_args_channel */ /* For r_args_channel */
CF_KEYWORDS(IPV4, IPV4_MC, IPV4_MPLS, IPV6, IPV6_MC, IPV6_MPLS, IPV6_SADR, VPN4, VPN4_MC, VPN4_MPLS, VPN6, VPN6_MC, VPN6_MPLS, ROA4, ROA6, FLOW4, FLOW6, MPLS, PRI, SEC) CF_KEYWORDS(IPV4, IPV4_MC, IPV4_MPLS, IPV6, IPV6_MC, IPV6_MPLS, IPV6_SADR, VPN4, VPN4_MC, VPN4_MPLS, VPN6, VPN6_MC, VPN6_MPLS, ROA4, ROA6, FLOW4, FLOW6, MPLS, PRI, SEC)
@ -87,7 +87,7 @@ CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID)
%type <i32> idval %type <i32> idval
%type <f> imexport %type <f> imexport
%type <r> rtable %type <r> rtable rtable_spec
%type <s> optsym %type <s> optsym
%type <ra> r_args %type <ra> r_args
%type <sd> sym_args %type <sd> sym_args
@ -688,6 +688,14 @@ r_args_channel:
| SEC { $$ = "sec"; } | SEC { $$ = "sec"; }
; ;
CF_CLI(SHOW TABLE STATISTICS, rtable_spec, (<table> | all), [[Show routing table details]])
{ cmd_show_table_stats($4); } ;
rtable_spec:
rtable { $$ = $1; }
| ALL { $$ = NULL; }
;
CF_CLI_HELP(SHOW SYMBOLS, ..., [[Show all known symbolic names]]) CF_CLI_HELP(SHOW SYMBOLS, ..., [[Show all known symbolic names]])
CF_CLI(SHOW SYMBOLS, sym_args, [table|filter|function|protocol|template|<symbol>], [[Show all known symbolic names]]) CF_CLI(SHOW SYMBOLS, sym_args, [table|filter|function|protocol|template|<symbol>], [[Show all known symbolic names]])
{ cmd_show_symbols($3); } ; { cmd_show_symbols($3); } ;

View File

@ -151,6 +151,9 @@ typedef struct rtable {
uint addr_type; /* Type of address data stored in table (NET_*) */ uint addr_type; /* Type of address data stored in table (NET_*) */
int pipe_busy; /* Pipe loop detection */ int pipe_busy; /* Pipe loop detection */
int use_count; /* Number of protocols using this table */ int use_count; /* Number of protocols using this table */
uint route_count; /* Number of routes in the table */
uint route_updates; /* Number of accepted route updates */
uint route_withdraws; /* Number of accepted route withdraws */
struct hostcache *hostcache; struct hostcache *hostcache;
struct rtable_config *config; /* Configuration of this table */ struct rtable_config *config; /* Configuration of this table */
struct config *deleted; /* Table doesn't exist in current configuration, struct config *deleted; /* Table doesn't exist in current configuration,
@ -308,6 +311,8 @@ void rt_dump_all(void);
int rt_feed_channel(struct channel *c); int rt_feed_channel(struct channel *c);
void rt_feed_channel_abort(struct channel *c); void rt_feed_channel_abort(struct channel *c);
struct rtable_config *rt_new_table(struct symbol *s, uint addr_type); struct rtable_config *rt_new_table(struct symbol *s, uint addr_type);
void cmd_show_table_stats(struct rtable_config *tab);
/* Default limit for ECMP next hops, defined in sysdep code */ /* Default limit for ECMP next hops, defined in sysdep code */
extern const int rt_default_ecmp; extern const int rt_default_ecmp;

View File

@ -34,6 +34,7 @@
#include "nest/route.h" #include "nest/route.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"
#include "nest/cli.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/string.h" #include "lib/string.h"
@ -1125,14 +1126,19 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
} }
if (new_ok) if (new_ok)
stats->imp_updates_accepted++; { stats->imp_updates_accepted++; table->route_updates++; }
else if (old_ok) else if (old_ok)
stats->imp_withdraws_accepted++; { stats->imp_withdraws_accepted++; table->route_withdraws++; }
else else
stats->imp_withdraws_ignored++; stats->imp_withdraws_ignored++;
skip_stats1: skip_stats1:
if (new_ok)
table->route_count++;
if (old_ok)
table->route_count--;
if (new) if (new)
rte_is_filtered(new) ? stats->filt_routes++ : stats->imp_routes++; rte_is_filtered(new) ? stats->filt_routes++ : stats->imp_routes++;
if (old) if (old)
@ -2541,6 +2547,51 @@ rt_get_hostentry(rtable *tab, ip_addr a, ip_addr ll, rtable *dep)
} }
static void
rt_show_table_stats(rtable *tab)
{
cli_msg(-1026, "%s:", tab->name);
cli_msg(-1026, "Table type:\t\t%s", net_label[tab->addr_type]);
cli_msg(-1026, "Hash table size:\t%u", tab->fib.hash_size);
cli_msg(-1026, "Hash entry count:\t%u", tab->fib.entries);
cli_msg(-1026, "Total route count:\t%u", tab->route_count);
cli_msg(-1026, "Route updates:\t\t%u", tab->route_updates);
cli_msg(-1026, "Route withdraws:\t%u", tab->route_withdraws);
cli_msg(-1026, "");
cli_msg(-1026, "%-16s %10s %10s %10s", "Protocol", "Routes", "Updates", "Withdraws");
struct channel *c; node *n;
WALK_LIST2(c, n, tab->channels, table_node)
{
if (c->channel_state == CS_DOWN)
continue;
cli_msg(-1026, "%-16s %10u %10u %10u", c->proto->name, c->stats.imp_routes,
c->stats.imp_updates_accepted, c->stats.imp_withdraws_accepted);
}
cli_msg(-1026, "");
}
void
cmd_show_table_stats(struct rtable_config *tab)
{
if (tab && tab->table)
{
rt_show_table_stats(tab->table);
cli_msg(0, "");
return;
}
ASSERT(!tab);
rtable *t;
WALK_LIST(t, routing_tables)
rt_show_table_stats(t);
cli_msg(0, "");
}
/* /*
* Documentation for functions declared inline in route.h * Documentation for functions declared inline in route.h
*/ */