app/proc_info: add metrics displaying
authorReshma Pattan <reshma.pattan@intel.com>
Thu, 30 Mar 2017 21:00:58 +0000 (22:00 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 5 Apr 2017 15:58:54 +0000 (17:58 +0200)
Modify the dpdk-procinfo process to display the newly added metrics.
Added new command line option "--metrics" to display metrics.

Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
Signed-off-by: Remy Horton <remy.horton@intel.com>
app/proc_info/main.c

index ef2098d..d576b42 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -58,6 +58,7 @@
 #include <rte_atomic.h>
 #include <rte_branch_prediction.h>
 #include <rte_string_fns.h>
+#include <rte_metrics.h>
 
 /* Maximum long option length for option parsing. */
 #define MAX_LONG_OPT_SZ 64
@@ -77,6 +78,8 @@ static uint32_t enable_collectd_format;
 static int stdout_fd;
 /**< Host id process is running on */
 static char host_id[MAX_LONG_OPT_SZ];
+/**< Enable metrics. */
+static uint32_t enable_metrics;
 /**< Enable stats reset. */
 static uint32_t reset_stats;
 /**< Enable xstats reset. */
@@ -94,6 +97,8 @@ proc_info_usage(const char *prgname)
                "  --stats: to display port statistics, enabled by default\n"
                "  --xstats: to display extended port statistics, disabled by "
                        "default\n"
+               "  --metrics: to display derived metrics of the ports, disabled by "
+                       "default\n"
                "  --stats-reset: to reset port statistics\n"
                "  --xstats-reset: to reset port extended statistics\n"
                "  --collectd-format: to print statistics to STDOUT in expected by collectd format\n"
@@ -171,6 +176,7 @@ proc_info_parse_args(int argc, char **argv)
                {"stats", 0, NULL, 0},
                {"stats-reset", 0, NULL, 0},
                {"xstats", 0, NULL, 0},
+               {"metrics", 0, NULL, 0},
                {"xstats-reset", 0, NULL, 0},
                {"collectd-format", 0, NULL, 0},
                {"host-id", 0, NULL, 0},
@@ -205,6 +211,10 @@ proc_info_parse_args(int argc, char **argv)
                        else if (!strncmp(long_option[option_index].name, "xstats",
                                        MAX_LONG_OPT_SZ))
                                enable_xstats = 1;
+                       else if (!strncmp(long_option[option_index].name,
+                                       "metrics",
+                                       MAX_LONG_OPT_SZ))
+                               enable_metrics = 1;
                        /* Reset stats */
                        if (!strncmp(long_option[option_index].name, "stats-reset",
                                        MAX_LONG_OPT_SZ))
@@ -414,6 +424,67 @@ nic_xstats_clear(uint8_t port_id)
        printf("\n  NIC extended statistics for port %d cleared\n", port_id);
 }
 
+static void
+metrics_display(int port_id)
+{
+       struct rte_metric_value *metrics;
+       struct rte_metric_name *names;
+       int len, ret;
+       static const char *nic_stats_border = "########################";
+
+       len = rte_metrics_get_names(NULL, 0);
+       if (len < 0) {
+               printf("Cannot get metrics count\n");
+               return;
+       }
+       if (len == 0) {
+               printf("No metrics to display (none have been registered)\n");
+               return;
+       }
+
+       metrics = rte_malloc("proc_info_metrics",
+               sizeof(struct rte_metric_value) * len, 0);
+       if (metrics == NULL) {
+               printf("Cannot allocate memory for metrics\n");
+               return;
+       }
+
+       names =  rte_malloc(NULL, sizeof(struct rte_metric_name) * len, 0);
+       if (names == NULL) {
+               printf("Cannot allocate memory for metrcis names\n");
+               rte_free(metrics);
+               return;
+       }
+
+       if (len != rte_metrics_get_names(names, len)) {
+               printf("Cannot get metrics names\n");
+               rte_free(metrics);
+               rte_free(names);
+               return;
+       }
+
+       if (port_id == RTE_METRICS_GLOBAL)
+               printf("###### Non port specific metrics  #########\n");
+       else
+               printf("###### metrics for port %-2d #########\n", port_id);
+       printf("%s############################\n", nic_stats_border);
+       ret = rte_metrics_get_values(port_id, metrics, len);
+       if (ret < 0 || ret > len) {
+               printf("Cannot get metrics values\n");
+               rte_free(metrics);
+               rte_free(names);
+               return;
+       }
+
+       int i;
+       for (i = 0; i < len; i++)
+               printf("%s: %"PRIu64"\n", names[i].name, metrics[i].value);
+
+       printf("%s############################\n", nic_stats_border);
+       rte_free(metrics);
+       rte_free(names);
+}
+
 int
 main(int argc, char **argv)
 {
@@ -480,8 +551,14 @@ main(int argc, char **argv)
                                nic_stats_clear(i);
                        else if (reset_xstats)
                                nic_xstats_clear(i);
+                       else if (enable_metrics)
+                               metrics_display(i);
                }
        }
 
+       /* print port independent stats */
+       if (enable_metrics)
+               metrics_display(RTE_METRICS_GLOBAL);
+
        return 0;
 }