On 2/10/2023 1:23 AM, fengchengwen wrote: > On 2023/2/10 7:30, Ferruh Yigit wrote: >> On 2/9/2023 3:07 AM, Chengwen Feng wrote: >>> The number of xstats may be large, after the hide zero option is added, >>> only non-zero values can be displayed. >>> >> >> Hi Chengwen, >> >> No objection on the functionality, we have similar config option in >> testpmd too, but I have some question on telemetry side of things: >> >> 1) optional parameters, I don't know if there is a defined way to handle >> this in telemetry but with current method only one optional parameter >> can be supported and it has to be the last one. In the feature if a new >> mandatory option required, this changes the user interface. To prevent >> this, is it possible to use "key=value" syntax, like >> "/ethdev/xstats,0,hide_zero=true" >> >> This way order or existence of multiple options doesn't matter. > > Yes, KV (just like PMD's runtime parameters) is more flexible for multiple > optional parameters. > AFAIK, only some dmadev commands have optional parameters (which using this > patch way to identify). > > Until there are more parameters, I think we can keep the status quo. >
I think better to start using it with first optional parameter, which is this patch, otherwise it will be pushing the work to next contributor. >> >> >> 2) Where should be this functionality, it is possible to filter out zero >> values either in dpdk side or telemetry client side. >> Just for this one I think both options are OK, but if there is a >> possibility to have multiple and complex filtering, I think that should >> go to the client side since this is not really task of the dpdk library. > > Agree. > This patch just target who using telemetry.py directly, it's valuable in this > scenario. > If clients supports filtering, they could use original way (don't add > options). > OK, I don't have strong option, if there is no objection we can have this functionality in dpdk side. > Thanks. > >> >> >>> Signed-off-by: Chengwen Feng <fengcheng...@huawei.com> >>> --- >>> lib/ethdev/rte_ethdev.c | 23 +++++++++++++++++------ >>> 1 file changed, 17 insertions(+), 6 deletions(-) >>> >>> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c >>> index d25db35f7f..8f79ae45d5 100644 >>> --- a/lib/ethdev/rte_ethdev.c >>> +++ b/lib/ethdev/rte_ethdev.c >>> @@ -5870,20 +5870,28 @@ eth_dev_handle_port_xstats(const char *cmd >>> __rte_unused, >>> { >>> struct rte_eth_xstat *eth_xstats; >>> struct rte_eth_xstat_name *xstat_names; >>> + char *end_param, *hide_param; >>> int port_id, num_xstats; >>> + int hide_zero = 0; >>> int i, ret; >>> - char *end_param; >>> >>> if (params == NULL || strlen(params) == 0 || !isdigit(*params)) >>> return -1; >>> >>> port_id = strtoul(params, &end_param, 0); >>> - if (*end_param != '\0') >>> - RTE_ETHDEV_LOG(NOTICE, >>> - "Extra parameters passed to ethdev telemetry command, >>> ignoring"); >>> if (!rte_eth_dev_is_valid_port(port_id)) >>> return -1; >>> >>> + if (*end_param != '\0') { >>> + hide_param = strtok(end_param, ","); >>> + if (hide_param == NULL || strlen(hide_param) == 0 || >>> !isdigit(*hide_param)) >>> + return -EINVAL; >>> + hide_zero = strtoul(hide_param, &end_param, 0); >>> + if (*end_param != '\0') >>> + RTE_ETHDEV_LOG(NOTICE, >>> + "Extra parameters passed to ethdev telemetry >>> command, ignoring"); >>> + } >>> + >>> num_xstats = rte_eth_xstats_get(port_id, NULL, 0); >>> if (num_xstats < 0) >>> return -1; >>> @@ -5908,9 +5916,12 @@ eth_dev_handle_port_xstats(const char *cmd >>> __rte_unused, >>> } >>> >>> rte_tel_data_start_dict(d); >>> - for (i = 0; i < num_xstats; i++) >>> + for (i = 0; i < num_xstats; i++) { >>> + if (hide_zero != 0 && eth_xstats[i].value == 0) >>> + continue; >>> rte_tel_data_add_dict_uint(d, xstat_names[i].name, >>> eth_xstats[i].value); >>> + } >>> free(eth_xstats); >>> return 0; >>> } >>> @@ -6328,7 +6339,7 @@ RTE_INIT(ethdev_init_telemetry) >>> rte_telemetry_register_cmd("/ethdev/stats", eth_dev_handle_port_stats, >>> "Returns the common stats for a port. Parameters: int >>> port_id"); >>> rte_telemetry_register_cmd("/ethdev/xstats", eth_dev_handle_port_xstats, >>> - "Returns the extended stats for a port. Parameters: int >>> port_id"); >>> + "Returns the extended stats for a port. Parameters: int >>> port_id, bool hide_zero (Optional, non-zero indicates hide zero xstats)"); >>> #ifndef RTE_EXEC_ENV_WINDOWS >>> rte_telemetry_register_cmd("/ethdev/dump_priv", >>> eth_dev_handle_port_dump_priv, >>> "Returns dump private information for a port. >>> Parameters: int port_id"); >> >> . >>