]> granicus.if.org Git - sysstat/commitdiff
sadf: PCP: Add support for A_NET_IP and A_NET_EIP activities
authorSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 29 Mar 2019 06:34:30 +0000 (07:34 +0100)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 29 Mar 2019 06:34:30 +0000 (07:34 +0100)
Add metrics displayed by "sar -n IP" and "sar -n EIP" (network IP
statistics) to PCP archive.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
activity.c
pcp_def_metrics.c
pcp_def_metrics.h
pcp_stats.c
pcp_stats.h
sadf_misc.c

index 45a32198df508b7af4ad6c404e83338bfe28c6f6..0df8e208e1ee0e85941d33639deaef8b58cbe696 100644 (file)
@@ -831,6 +831,7 @@ struct activity net_ip_act = {
        .f_json_print   = json_print_net_ip_stats,
        .f_svg_print    = svg_print_net_ip_stats,
        .f_raw_print    = raw_print_net_ip_stats,
+       .f_pcp_print    = pcp_print_net_ip_stats,
        .f_count_new    = NULL,
        .item_list      = NULL,
        .desc           = "IPv4 traffic statistics",
@@ -876,6 +877,7 @@ struct activity net_eip_act = {
        .f_json_print   = json_print_net_eip_stats,
        .f_svg_print    = svg_print_net_eip_stats,
        .f_raw_print    = raw_print_net_eip_stats,
+       .f_pcp_print    = pcp_print_net_eip_stats,
        .f_count_new    = NULL,
        .item_list      = NULL,
        .desc           = "IPv4 traffic errors statistics",
index ffa1a9aa0e06aefc3993325aa83941516ba9c0c0..1ced8b2caa7c51ad3d9a3d534768437302ffbfdf 100644 (file)
@@ -686,3 +686,87 @@ void pcp_def_net_nfsd_metrics(void)
                     pmiUnits(0, -1, 1, 0, PM_TIME_SEC, PM_COUNT_ONE));
 #endif /* HAVE_PCP */
 }
+
+/*
+ ***************************************************************************
+ * Define PCP metrics for IP network statistics.
+ ***************************************************************************
+ */
+void pcp_def_net_ip_metrics(void)
+{
+#ifdef HAVE_PCP
+       pmiAddMetric("network.snmp.ip.ipInReceives",
+                    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.ip.ipForwDatagrams",
+                    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.ip.ipInDelivers",
+                    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.ip.ipOutRequests",
+                    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.ip.ipReasmReqds",
+                    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.ip.ipReasmOKs",
+                    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.ip.ipFragOKs",
+                    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.ip.ipFragCreates",
+                    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 IP network errors statistics.
+ ***************************************************************************
+ */
+void pcp_def_net_eip_metrics(void)
+{
+#ifdef HAVE_PCP
+       pmiAddMetric("network.snmp.ip.ipInHdrErrors",
+                    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.ip.ipInAddrErrors",
+                    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.ip.ipInUnknownProtos",
+                    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.ip.ipInDiscards",
+                    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.ip.ipOutDiscards",
+                    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.ip.ipOutNoRoutes",
+                    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.ip.ipReasmFails",
+                    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.ip.ipFragFails",
+                    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 */
+}
index a1a555f90e5483909f05745fe2a713d3cf0cabd6..a037496043d3faeedb22453452ad37de8a62b9f0 100644 (file)
@@ -25,6 +25,8 @@ void pcp_def_serial_metrics(struct activity *);
 void pcp_def_net_dev_metrics(struct activity *);
 void pcp_def_net_nfs_metrics(void);
 void pcp_def_net_nfsd_metrics(void);
+void pcp_def_net_ip_metrics(void);
+void pcp_def_net_eip_metrics(void);
 
 /* Define domains number */
 #define PM_INDOM_CPU           0
index 88b68389a8594dff3ab19e94e959b52c4a7787dd..784988adf2fd66e336f9e73913e03b7442db6c79 100644 (file)
@@ -904,3 +904,111 @@ __print_funct_t pcp_print_net_nfsd_stats(struct activity *a, int curr, unsigned
        pmiPutValue("network.fs.server.getattr", NULL, buf);
 #endif /* HAVE_PCP */
 }
+
+/*
+ ***************************************************************************
+ * Display IP 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_ip_stats(struct activity *a, int curr, unsigned long long itv,
+                                      struct record_header *record_hdr)
+{
+#ifdef HAVE_PCP
+       char buf[64];
+       struct stats_net_ip
+               *snic = (struct stats_net_ip *) a->buf[curr],
+               *snip = (struct stats_net_ip *) a->buf[!curr];
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->InReceives, snic->InReceives, itv));
+       pmiPutValue("network.snmp.ip.ipInReceives", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->ForwDatagrams, snic->ForwDatagrams, itv));
+       pmiPutValue("network.snmp.ip.ipForwDatagrams", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->InDelivers, snic->InDelivers, itv));
+       pmiPutValue("network.snmp.ip.ipInDelivers", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->OutRequests, snic->OutRequests, itv));
+       pmiPutValue("network.snmp.ip.ipOutRequests", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->ReasmReqds, snic->ReasmReqds, itv));
+       pmiPutValue("network.snmp.ip.ipReasmReqds", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->ReasmOKs, snic->ReasmOKs, itv));
+       pmiPutValue("network.snmp.ip.ipReasmOKs", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->FragOKs, snic->FragOKs, itv));
+       pmiPutValue("network.snmp.ip.ipFragOKs", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(snip->FragCreates, snic->FragCreates, itv));
+       pmiPutValue("network.snmp.ip.ipFragCreates", NULL, buf);
+#endif /* HAVE_PCP */
+}
+
+/*
+ ***************************************************************************
+ * Display IP 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_eip_stats(struct activity *a, int curr, unsigned long long itv,
+                                       struct record_header *record_hdr)
+{
+#ifdef HAVE_PCP
+       char buf[64];
+       struct stats_net_eip
+               *sneic = (struct stats_net_eip *) a->buf[curr],
+               *sneip = (struct stats_net_eip *) a->buf[!curr];
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->InHdrErrors, sneic->InHdrErrors, itv));
+       pmiPutValue("network.snmp.ip.ipInHdrErrors", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->InAddrErrors, sneic->InAddrErrors, itv));
+       pmiPutValue("network.snmp.ip.ipInAddrErrors", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->InUnknownProtos, sneic->InUnknownProtos, itv));
+       pmiPutValue("network.snmp.ip.ipInUnknownProtos", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->InDiscards, sneic->InDiscards, itv));
+       pmiPutValue("network.snmp.ip.ipInDiscards", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->OutDiscards, sneic->OutDiscards, itv));
+       pmiPutValue("network.snmp.ip.ipOutDiscards", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->OutNoRoutes, sneic->OutNoRoutes, itv));
+       pmiPutValue("network.snmp.ip.ipOutNoRoutes", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->ReasmFails, sneic->ReasmFails, itv));
+       pmiPutValue("network.snmp.ip.ipReasmFails", NULL, buf);
+
+       snprintf(buf, sizeof(buf), "%f",
+               S_VALUE(sneip->FragFails, sneic->FragFails, itv));
+       pmiPutValue("network.snmp.ip.ipFragFails", NULL, buf);
+#endif /* HAVE_PCP */
+}
index 60c3e36dd8a77aadcb5852352fde2b6e89330cd5..fd93d757bb299f9b0e0059a1f6c62f91f1cd34c4 100644 (file)
@@ -41,5 +41,9 @@ __print_funct_t pcp_print_net_nfs_stats
        (struct activity *, int, unsigned long long, struct record_header *);
 __print_funct_t pcp_print_net_nfsd_stats
        (struct activity *, int, unsigned long long, struct record_header *);
+__print_funct_t pcp_print_net_ip_stats
+       (struct activity *, int, unsigned long long, struct record_header *);
+__print_funct_t pcp_print_net_eip_stats
+       (struct activity *, int, unsigned long long, struct record_header *);
 
 #endif /* _PCP_STATS_H */
index 799f6aa847728a4b4a11b55ca0bc1fd973f88266..79a18889486cd2a728dc53ea8e21375247f431b6 100644 (file)
@@ -549,6 +549,14 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act
                                case A_NET_NFSD:
                                        pcp_def_net_nfsd_metrics();
                                        break;
+
+                               case A_NET_IP:
+                                       pcp_def_net_ip_metrics();
+                                       break;
+
+                               case A_NET_EIP:
+                                       pcp_def_net_eip_metrics();
+                                       break;
                        }
                }
        }