From: Sebastien GODARD Date: Tue, 2 Apr 2019 16:40:30 +0000 (+0200) Subject: sadf: PCP: Add support for A_NET_ICMP6 and A_NET_EICMP6 activities X-Git-Tag: v12.1.4~20 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ad81339c540b171218815edfd8edd5f6e6475a3;p=sysstat sadf: PCP: Add support for A_NET_ICMP6 and A_NET_EICMP6 activities Add metrics displayed by "sar -n ICMP6" and "sar -n EICMP6" (ICMPv6 network statistics) to PCP archive. Signed-off-by: Sebastien GODARD --- diff --git a/activity.c b/activity.c index 9ebc3fb..4671f47 100644 --- a/activity.c +++ b/activity.c @@ -1296,6 +1296,7 @@ struct activity net_icmp6_act = { .f_json_print = json_print_net_icmp6_stats, .f_svg_print = svg_print_net_icmp6_stats, .f_raw_print = raw_print_net_icmp6_stats, + .f_pcp_print = pcp_print_net_icmp6_stats, .f_count_new = NULL, .item_list = NULL, .desc = "ICMPv6 traffic statistics", @@ -1342,6 +1343,7 @@ struct activity net_eicmp6_act = { .f_json_print = json_print_net_eicmp6_stats, .f_svg_print = svg_print_net_eicmp6_stats, .f_raw_print = raw_print_net_eicmp6_stats, + .f_pcp_print = pcp_print_net_eicmp6_stats, .f_count_new = NULL, .item_list = NULL, .desc = "ICMPv6 traffic errors statistics", diff --git a/pcp_def_metrics.c b/pcp_def_metrics.c index eab482b..87b2bc3 100644 --- a/pcp_def_metrics.c +++ b/pcp_def_metrics.c @@ -1081,6 +1081,138 @@ void pcp_def_net_eip6_metrics(void) #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Define PCP metrics for ICMPv6 network statistics. + *************************************************************************** + */ +void pcp_def_net_icmp6_metrics(void) +{ +#ifdef HAVE_PCP + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInMsgs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutMsgs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInEchos", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInEchoReplies", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutEchoReplies", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInGroupMembQueries", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInGroupMembResponses", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutGroupMembResponses", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInGroupMembReductions", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutGroupMembReductions", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInRouterSolicits", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutRouterSolicits", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInRouterAdvertisements", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInNeighborSolicits", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutNeighborSolicits", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInNeighborAdvertisements", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutNeighborAdvertisements", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); +#endif /* HAVE_PCP */ +} + +/* + *************************************************************************** + * Define PCP metrics for ICMPv6 network errors statistics. + *************************************************************************** + */ +void pcp_def_net_eicmp6_metrics(void) +{ +#ifdef HAVE_PCP + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInErrors", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInDestUnreachs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutDestUnreachs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInTimeExcds", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutTimeExcds", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInParmProblems", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutParmProblems", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInRedirects", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutRedirects", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpInPktTooBigs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); + + pmiAddMetric("network.snmp.icmp6.ipv6IfIcmpOutPktTooBigs", + PM_IN_NULL, PM_TYPE_FLOAT, PM_INDOM_NULL, PM_SEM_INSTANT, + pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE)); +#endif /* HAVE_PCP */ +} + /* *************************************************************************** * Define PCP metrics for UDPv6 network statistics. diff --git a/pcp_def_metrics.h b/pcp_def_metrics.h index 705f292..bd65fc8 100644 --- a/pcp_def_metrics.h +++ b/pcp_def_metrics.h @@ -34,6 +34,8 @@ void pcp_def_net_etcp_metrics(void); void pcp_def_net_udp_metrics(void); void pcp_def_net_ip6_metrics(void); void pcp_def_net_eip6_metrics(void); +void pcp_def_net_icmp6_metrics(void); +void pcp_def_net_eicmp6_metrics(void); void pcp_def_net_udp6_metrics(void); /* Define domains number */ diff --git a/pcp_stats.c b/pcp_stats.c index 81f58f4..e39d939 100644 --- a/pcp_stats.c +++ b/pcp_stats.c @@ -1408,6 +1408,162 @@ __print_funct_t pcp_print_net_eip6_stats(struct activity *a, int curr, unsigned #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Display ICMPv6 network statistics in PCP format. + * + * IN: + * @a Activity structure with statistics. + * @curr Index in array for current sample statistics. + * @itv Interval of time in 1/100th of a second. + * @record_hdr Record header for current sample. + *************************************************************************** + */ +__print_funct_t pcp_print_net_icmp6_stats(struct activity *a, int curr, unsigned long long itv, + struct record_header *record_hdr) +{ +#ifdef HAVE_PCP + char buf[64]; + struct stats_net_icmp6 + *snic = (struct stats_net_icmp6 *) a->buf[curr], + *snip = (struct stats_net_icmp6 *) a->buf[!curr]; + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InMsgs6, snic->InMsgs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInMsgs", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutMsgs6, snic->OutMsgs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutMsgs", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InEchos6, snic->InEchos6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInEchos", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InEchoReplies6, snic->InEchoReplies6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInEchoReplies", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutEchoReplies6, snic->OutEchoReplies6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutEchoReplies", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InGroupMembQueries6, snic->InGroupMembQueries6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInGroupMembQueries", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InGroupMembResponses6, snic->InGroupMembResponses6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInGroupMembResponses", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutGroupMembResponses6, snic->OutGroupMembResponses6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutGroupMembResponses", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InGroupMembReductions6, snic->InGroupMembReductions6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInGroupMembReductions", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutGroupMembReductions6, snic->OutGroupMembReductions6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutGroupMembReductions", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InRouterSolicits6, snic->InRouterSolicits6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInRouterSolicits", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutRouterSolicits6, snic->OutRouterSolicits6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutRouterSolicits", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InRouterAdvertisements6, snic->InRouterAdvertisements6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInRouterAdvertisements", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InNeighborSolicits6, snic->InNeighborSolicits6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInNeighborSolicits", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutNeighborSolicits6, snic->OutNeighborSolicits6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutNeighborSolicits", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->InNeighborAdvertisements6, snic->InNeighborAdvertisements6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInNeighborAdvertisements", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(snip->OutNeighborAdvertisements6, snic->OutNeighborAdvertisements6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutNeighborAdvertisements", NULL, buf); +#endif /* HAVE_PCP */ +} + +/* + *************************************************************************** + * Display ICMPv6 network errors statistics in PCP format. + * + * IN: + * @a Activity structure with statistics. + * @curr Index in array for current sample statistics. + * @itv Interval of time in 1/100th of a second. + * @record_hdr Record header for current sample. + *************************************************************************** + */ +__print_funct_t pcp_print_net_eicmp6_stats(struct activity *a, int curr, unsigned long long itv, + struct record_header *record_hdr) +{ +#ifdef HAVE_PCP + char buf[64]; + struct stats_net_eicmp6 + *sneic = (struct stats_net_eicmp6 *) a->buf[curr], + *sneip = (struct stats_net_eicmp6 *) a->buf[!curr]; + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InErrors6, sneic->InErrors6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInErrors", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InDestUnreachs6, sneic->InDestUnreachs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInDestUnreachs", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->OutDestUnreachs6, sneic->OutDestUnreachs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutDestUnreachs", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InTimeExcds6, sneic->InTimeExcds6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInTimeExcds", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->OutTimeExcds6, sneic->OutTimeExcds6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutTimeExcds", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InParmProblems6, sneic->InParmProblems6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInParmProblems", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->OutParmProblems6, sneic->OutParmProblems6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutParmProblems", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InRedirects6, sneic->InRedirects6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInRedirects", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->OutRedirects6, sneic->OutRedirects6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutRedirects", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->InPktTooBigs6, sneic->InPktTooBigs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpInPktTooBigs", NULL, buf); + + snprintf(buf, sizeof(buf), "%f", + S_VALUE(sneip->OutPktTooBigs6, sneic->OutPktTooBigs6, itv)); + pmiPutValue("network.snmp.icmp6.ipv6IfIcmpOutPktTooBigs", NULL, buf); +#endif /* HAVE_PCP */ +} + /* *************************************************************************** * Display UDPv6 network statistics in PCP format. diff --git a/pcp_stats.h b/pcp_stats.h index c6526aa..2de47ca 100644 --- a/pcp_stats.h +++ b/pcp_stats.h @@ -59,6 +59,10 @@ __print_funct_t pcp_print_net_ip6_stats (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_net_eip6_stats (struct activity *, int, unsigned long long, struct record_header *); +__print_funct_t pcp_print_net_icmp6_stats + (struct activity *, int, unsigned long long, struct record_header *); +__print_funct_t pcp_print_net_eicmp6_stats + (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_net_udp6_stats (struct activity *, int, unsigned long long, struct record_header *); diff --git a/sadf_misc.c b/sadf_misc.c index 4d5bf5e..7215184 100644 --- a/sadf_misc.c +++ b/sadf_misc.c @@ -589,6 +589,14 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act pcp_def_net_eip6_metrics(); break; + case A_NET_ICMP6: + pcp_def_net_icmp6_metrics(); + break; + + case A_NET_EICMP6: + pcp_def_net_eicmp6_metrics(); + break; + case A_NET_UDP6: pcp_def_net_udp6_metrics(); break;