devargs: unify scratch buffer storage
[dpdk.git] / lib / librte_metrics / rte_metrics_telemetry.c
index 1b9dfa4..c24990d 100644 (file)
@@ -2,14 +2,19 @@
  * Copyright(c) 2020 Intel Corporation
  */
 
-#include <jansson.h>
-
 #include <rte_ethdev.h>
 #include <rte_string_fns.h>
+#ifdef RTE_LIB_TELEMETRY
+#include <telemetry_internal.h>
+#endif
 
 #include "rte_metrics.h"
 #include "rte_metrics_telemetry.h"
 
+#ifdef RTE_HAS_JANSSON
+
+struct telemetry_metrics_data tel_met_data;
+
 int metrics_log_level;
 
 /* Logging Macros */
@@ -76,6 +81,7 @@ rte_metrics_tel_reg_all_ethdev(int *metrics_register_done, int *reg_index_list)
        int ret, nb_drv_idx = 0;
        uint16_t d;
 
+       rte_metrics_init(rte_socket_id());
        RTE_ETH_FOREACH_DEV(d) {
                int i;
                /* Different device types have different numbers of stats, so
@@ -166,7 +172,8 @@ rte_metrics_tel_format_port(uint32_t pid, json_t *ports,
        names = malloc(sizeof(struct rte_metric_name) * num_metrics);
        if (metrics == NULL || names == NULL) {
                METRICS_LOG_ERR("Cannot allocate memory");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto fail;
        }
 
        if (rte_metrics_get_names(names, num_metrics) != num_metrics ||
@@ -415,9 +422,181 @@ rte_metrics_tel_extract_data(struct telemetry_encode_param *ep, json_t *data)
        return 0;
 }
 
+static int
+rte_metrics_tel_initial_metrics_setup(void)
+{
+       int ret;
+       rte_metrics_init(rte_socket_id());
+
+       if (!tel_met_data.metrics_register_done) {
+               ret = rte_metrics_tel_reg_all_ethdev(
+                       &tel_met_data.metrics_register_done,
+                       tel_met_data.reg_index);
+               if (ret < 0)
+                       return ret;
+       }
+       return 0;
+}
+
+static int
+handle_ports_all_stats_values(const char *cmd __rte_unused,
+               const char *params __rte_unused,
+               char *buffer, int buf_len)
+{
+       struct telemetry_encode_param ep;
+       int ret, used = 0;
+       char *json_buffer = NULL;
+
+       ret = rte_metrics_tel_initial_metrics_setup();
+       if (ret < 0)
+               return ret;
+
+       memset(&ep, 0, sizeof(ep));
+       ret = rte_metrics_tel_get_port_stats_ids(&ep);
+       if (ret < 0)
+               return ret;
+
+       ret = rte_metrics_tel_get_ports_stats_json(&ep, tel_met_data.reg_index,
+                       &json_buffer);
+       if (ret < 0)
+               return ret;
+
+       used += strlcpy(buffer, json_buffer, buf_len);
+       return used;
+}
+
+static int
+handle_global_stats_values(const char *cmd __rte_unused,
+               const char *params __rte_unused,
+               char *buffer, int buf_len)
+{
+       char *json_buffer = NULL;
+       struct telemetry_encode_param ep = { .type = GLOBAL_STATS };
+       int ret, used = 0;
+
+       ret = rte_metrics_tel_initial_metrics_setup();
+       if (ret < 0)
+               return ret;
+
+       ret = rte_metrics_tel_encode_json_format(&ep, &json_buffer);
+       if (ret < 0) {
+               METRICS_LOG_ERR("JSON encode function failed");
+               return ret;
+       }
+       used += strlcpy(buffer, json_buffer, buf_len);
+       return used;
+}
+
+static int
+handle_ports_stats_values_by_name(const char *cmd __rte_unused,
+               const char *params,
+               char *buffer, int buf_len)
+{
+       char *json_buffer = NULL;
+       struct telemetry_encode_param ep;
+       int ret, used = 0;
+       json_t *data;
+       json_error_t error;
+
+       ret = rte_metrics_tel_initial_metrics_setup();
+       if (ret < 0)
+               return ret;
+
+       data = json_loads(params, 0, &error);
+       if (!data) {
+               METRICS_LOG_WARN("Could not load JSON object from data passed in : %s",
+                               error.text);
+               return -EPERM;
+       } else if (!json_is_object(data)) {
+               METRICS_LOG_WARN("JSON Request data is not a JSON object");
+               json_decref(data);
+               return -EINVAL;
+       }
+
+       ret = rte_metrics_tel_extract_data(&ep, data);
+       if (ret < 0) {
+               METRICS_LOG_ERR("Extract data function failed");
+               return ret;
+       }
+
+       ret = rte_metrics_tel_encode_json_format(&ep, &json_buffer);
+       if (ret < 0) {
+               METRICS_LOG_ERR("JSON encode function failed");
+               return ret;
+       }
+       used += strlcpy(buffer, json_buffer, buf_len);
+       return used;
+}
+
+RTE_LOG_REGISTER(metrics_log_level, lib.metrics, ERR);
+
 RTE_INIT(metrics_ctor)
 {
-       metrics_log_level = rte_log_register("lib.metrics");
-       if (metrics_log_level >= 0)
-               rte_log_set_level(metrics_log_level, RTE_LOG_ERR);
+#ifdef RTE_LIB_TELEMETRY
+       rte_telemetry_legacy_register("ports_all_stat_values", DATA_NOT_REQ,
+                       handle_ports_all_stats_values);
+       rte_telemetry_legacy_register("global_stat_values", DATA_NOT_REQ,
+                       handle_global_stats_values);
+       rte_telemetry_legacy_register("ports_stats_values_by_name", DATA_REQ,
+                       handle_ports_stats_values_by_name);
+#endif
+}
+
+#else /* !RTE_HAS_JANSSON */
+
+int32_t
+rte_metrics_tel_reg_all_ethdev(int *metrics_register_done, int *reg_index_list)
+{
+       RTE_SET_USED(metrics_register_done);
+       RTE_SET_USED(reg_index_list);
+
+       return -ENOTSUP;
+}
+
+int32_t
+rte_metrics_tel_encode_json_format(struct telemetry_encode_param *ep,
+       char **json_buffer)
+{
+       RTE_SET_USED(ep);
+       RTE_SET_USED(json_buffer);
+
+       return -ENOTSUP;
 }
+
+int32_t
+rte_metrics_tel_get_ports_stats_json(struct telemetry_encode_param *ep,
+       int *reg_index, char **json_buffer)
+{
+       RTE_SET_USED(ep);
+       RTE_SET_USED(reg_index);
+       RTE_SET_USED(json_buffer);
+
+       return -ENOTSUP;
+}
+
+int32_t
+rte_metrics_tel_get_port_stats_ids(struct telemetry_encode_param *ep)
+{
+       RTE_SET_USED(ep);
+
+       return -ENOTSUP;
+}
+
+int32_t
+rte_metrics_tel_extract_data(struct telemetry_encode_param *ep, json_t *data)
+{
+       RTE_SET_USED(ep);
+       RTE_SET_USED(data);
+
+       return -ENOTSUP;
+}
+
+int32_t
+rte_metrics_tel_get_global_stats(struct telemetry_encode_param *ep)
+{
+       RTE_SET_USED(ep);
+
+       return -ENOTSUP;
+}
+
+#endif /* !RTE_HAS_JANSSON */