examples/packet_ordering: enhance getopt_long usage
[dpdk.git] / lib / librte_telemetry / telemetry.c
index 7875405..14b4ff5 100644 (file)
@@ -15,7 +15,6 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 #include <rte_spinlock.h>
-#include <rte_version.h>
 
 #include "rte_telemetry.h"
 #include "telemetry_json.h"
@@ -48,6 +47,8 @@ struct socket {
 static struct socket v2_socket; /* socket for v2 telemetry */
 static struct socket v1_socket; /* socket for v1 telemetry */
 #endif /* !RTE_EXEC_ENV_WINDOWS */
+
+static const char *telemetry_version; /* save rte_version */
 static char telemetry_log_error[1024]; /* Will contain error on init failure */
 /* list of command callbacks, with one command registered by default */
 static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS];
@@ -105,7 +106,7 @@ json_info(const char *cmd __rte_unused, const char *params __rte_unused,
                struct rte_tel_data *d)
 {
        rte_tel_data_start_dict(d);
-       rte_tel_data_add_dict_string(d, "version", rte_version());
+       rte_tel_data_add_dict_string(d, "version", telemetry_version);
        rte_tel_data_add_dict_int(d, "pid", getpid());
        rte_tel_data_add_dict_int(d, "max_output_len", MAX_OUTPUT_LEN);
        return 0;
@@ -133,6 +134,35 @@ command_help(const char *cmd __rte_unused, const char *params,
        return 0;
 }
 
+static int
+container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
+{
+       size_t used = 0;
+       unsigned int i;
+
+       if (d->type != RTE_TEL_ARRAY_U64 && d->type != RTE_TEL_ARRAY_INT
+                       && d->type != RTE_TEL_ARRAY_STRING)
+               return snprintf(out_buf, buf_len, "null");
+
+       used = rte_tel_json_empty_array(out_buf, buf_len, 0);
+       if (d->type == RTE_TEL_ARRAY_U64)
+               for (i = 0; i < d->data_len; i++)
+                       used = rte_tel_json_add_array_u64(out_buf,
+                               buf_len, used,
+                               d->data.array[i].u64val);
+       if (d->type == RTE_TEL_ARRAY_INT)
+               for (i = 0; i < d->data_len; i++)
+                       used = rte_tel_json_add_array_int(out_buf,
+                               buf_len, used,
+                               d->data.array[i].ival);
+       if (d->type == RTE_TEL_ARRAY_STRING)
+               for (i = 0; i < d->data_len; i++)
+                       used = rte_tel_json_add_array_string(out_buf,
+                               buf_len, used,
+                               d->data.array[i].sval);
+       return used;
+}
+
 static void
 output_json(const char *cmd, const struct rte_tel_data *d, int s)
 {
@@ -179,6 +209,20 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
                                                buf_len, used,
                                                v->name, v->value.u64val);
                                break;
+                       case RTE_TEL_CONTAINER:
+                       {
+                               char temp[buf_len];
+                               const struct container *cont =
+                                               &v->value.container;
+                               if (container_to_json(cont->data,
+                                               temp, buf_len) != 0)
+                                       used = rte_tel_json_add_obj_json(
+                                                       cb_data_buf,
+                                                       buf_len, used,
+                                                       v->name, temp);
+                               if (!cont->keep)
+                                       rte_tel_data_free(cont->data);
+                       }
                        }
                }
                used += prefix_used;
@@ -187,6 +231,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
        case RTE_TEL_ARRAY_STRING:
        case RTE_TEL_ARRAY_INT:
        case RTE_TEL_ARRAY_U64:
+       case RTE_TEL_ARRAY_CONTAINER:
                prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":",
                                MAX_CMD_LEN, cmd);
                cb_data_buf = &out_buf[prefix_used];
@@ -207,6 +252,18 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
                                used = rte_tel_json_add_array_u64(cb_data_buf,
                                                buf_len, used,
                                                d->data.array[i].u64val);
+                       else if (d->type == RTE_TEL_ARRAY_CONTAINER) {
+                               char temp[buf_len];
+                               const struct container *rec_data =
+                                               &d->data.array[i].container;
+                               if (container_to_json(rec_data->data,
+                                               temp, buf_len) != 0)
+                                       used = rte_tel_json_add_array_json(
+                                                       cb_data_buf,
+                                                       buf_len, used, temp);
+                               if (!rec_data->keep)
+                                       rte_tel_data_free(rec_data->data);
+                       }
                used += prefix_used;
                used += strlcat(out_buf + used, "}", sizeof(out_buf) - used);
                break;
@@ -247,7 +304,7 @@ client_handler(void *sock_id)
        char info_str[1024];
        snprintf(info_str, sizeof(info_str),
                        "{\"version\":\"%s\",\"pid\":%d,\"max_output_len\":%d}",
-                       rte_version(), getpid(), MAX_OUTPUT_LEN);
+                       telemetry_version, getpid(), MAX_OUTPUT_LEN);
        if (write(s, info_str, strlen(info_str)) < 0) {
                close(s);
                return NULL;
@@ -425,9 +482,10 @@ telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 int32_t
-rte_telemetry_init(const char *runtime_dir, rte_cpuset_t *cpuset,
-               const char **err_str)
+rte_telemetry_init(const char *runtime_dir, const char *rte_version,
+               rte_cpuset_t *cpuset, const char **err_str)
 {
+       telemetry_version = rte_version;
 #ifndef RTE_EXEC_ENV_WINDOWS
        if (telemetry_v2_init(runtime_dir, cpuset) != 0) {
                *err_str = telemetry_log_error;