Skip to content

Commit

Permalink
sadf: PCP: Add support for A_NET_ICMP6 and A_NET_EICMP6 activities
Browse files Browse the repository at this point in the history
Add metrics displayed by "sar -n ICMP6" and "sar -n EICMP6" (ICMPv6
network statistics) to PCP archive.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
  • Loading branch information
sysstat committed Apr 2, 2019
1 parent 6fa6f84 commit 7ad8133
Show file tree
Hide file tree
Showing 6 changed files with 304 additions and 0 deletions.
2 changes: 2 additions & 0 deletions activity.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
132 changes: 132 additions & 0 deletions pcp_def_metrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions pcp_def_metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
156 changes: 156 additions & 0 deletions pcp_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions pcp_stats.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);

Expand Down
8 changes: 8 additions & 0 deletions sadf_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 7ad8133

Please sign in to comment.