[dpdk-dev] [RFC 2/2] ethdev: add basic stats for telemetry
Bruce Richardson
bruce.richardson at intel.com
Fri Jun 12 15:10:20 CEST 2020
On Fri, Jun 12, 2020 at 11:53:44AM +0100, Ciara Power wrote:
> The ethdev library now registers a telemetry command for basic ethdev
> statistics.
>
> An example usage is shown below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 20.05.0-rc3", "pid": 14119, "max_output_len": 16384}
> --> /ethdev/stats,0
> {"/ethdev/stats": {"ipackets": 0, "opackets": 0, "ibytes": 0, "obytes": \
> 0, "imissed": 0, "ierrors": 0, "oerrors": 0, "rx_nombuf": 0, \
> "q_ipackets": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
> "q_opackets": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
> "q_ibytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
> "q_obytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \
> "q_errors": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}
>
> Signed-off-by: Ciara Power <ciara.power at intel.com>
> ---
> lib/librte_ethdev/rte_ethdev.c | 54 ++++++++++++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index 8e10a6fc3..1a33e41d3 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -5215,6 +5215,58 @@ handle_port_list(const char *cmd __rte_unused,
> return 0;
> }
>
> +static void
> +add_port_queue_stats(struct rte_tel_data *d, uint64_t *q_stats,
> + const char *stat_name)
> +{
> + int q;
> + struct rte_tel_data *q_data = malloc(rte_tel_get_data_size());
> + rte_tel_data_start_array(q_data, RTE_TEL_U64_VAL);
> + for (q = 0; q < RTE_ETHDEV_QUEUE_STAT_CNTRS; q++)
> + rte_tel_data_add_array_u64(q_data, q_stats[q]);
> + rte_tel_data_add_dict_data(d, stat_name, q_data);
> +}
It might be worthwhile adding an function to create an array based off
existing numbers. Save a function call per element.
> +
> +static int
> +handle_port_stats(const char *cmd __rte_unused,
> + const char *params,
> + struct rte_tel_data *d)
> +{
> + struct rte_eth_stats stats;
> + int port_id, ret;
> +
> +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, stats.s)
I think the macro would be better defined just above the function, rather
than inside it. Perhaps just after the opening brace might also work, but I
think it looks wrong being in the middle of the code itself.
> +
> + if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> + return -1;
> +
> + port_id = atoi(params);
> + if (!rte_eth_dev_is_valid_port(port_id))
> + return -1;
> +
> + ret = rte_eth_stats_get(port_id, &stats);
> + if (ret < 0)
> + return -1;
> +
> + rte_tel_data_start_dict(d);
> + ADD_DICT_STAT(ipackets);
> + ADD_DICT_STAT(opackets);
> + ADD_DICT_STAT(ibytes);
> + ADD_DICT_STAT(obytes);
> + ADD_DICT_STAT(imissed);
> + ADD_DICT_STAT(ierrors);
> + ADD_DICT_STAT(oerrors);
> + ADD_DICT_STAT(rx_nombuf);
> +
> + add_port_queue_stats(d, stats.q_ipackets, "q_ipackets");
> + add_port_queue_stats(d, stats.q_opackets, "q_opackets");
> + add_port_queue_stats(d, stats.q_ibytes, "q_ibytes");
> + add_port_queue_stats(d, stats.q_obytes, "q_obytes");
> + add_port_queue_stats(d, stats.q_errors, "q_errors");
> +
> + return 0;
> +}
> +
> static int
> handle_port_xstats(const char *cmd __rte_unused,
> const char *params,
> @@ -5302,6 +5354,8 @@ RTE_INIT(ethdev_init_log)
> rte_log_set_level(rte_eth_dev_logtype, RTE_LOG_INFO);
> rte_telemetry_register_cmd("/ethdev/list", handle_port_list,
> "Returns list of available ethdev ports. Takes no parameters");
> + rte_telemetry_register_cmd("/ethdev/stats", handle_port_stats,
> + "Returns the basic stats for a port. Parameters: int port_id");
> rte_telemetry_register_cmd("/ethdev/xstats", handle_port_xstats,
> "Returns the extended stats for a port. Parameters: int port_id");
> rte_telemetry_register_cmd("/ethdev/link_status",
> --
> 2.17.1
>
More information about the dev
mailing list