DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ciara Power <ciara.power@intel.com>
To: harry.van.haaren@intel.com, brian.archbold@intel.com,
	emma.kenny@intel.com, ciara.power@intel.com
Cc: dev@dpdk.org
Subject: [dpdk-dev] [PATCH 11/11] telemetry: add collectd plugin patch
Date: Thu, 23 Aug 2018 13:08:13 +0100	[thread overview]
Message-ID: <1535026093-101872-12-git-send-email-ciara.power@intel.com> (raw)
In-Reply-To: <1535026093-101872-1-git-send-email-ciara.power@intel.com>

This patch adds the patch for the collectd plugin developed for use
with the DPDK Telemetry library. The patch is included here to allow
users to apply the patch to collectd when using DPDK Telemetry.
Further details on applying the collectd patch can be found in the
collectd patch commit message.

The collectd plugin will be upstreamed to collectd at a later stage.

Signed-off-by: Brian Archbold <brian.archbold@intel.com>
Signed-off-by: Emma Kenny <emma.kenny@intel.com>
---
 ...emetry-add-plugin-for-DPDK-metrics-via-DP.patch | 578 +++++++++++++++++++++
 1 file changed, 578 insertions(+)
 create mode 100644 lib/librte_telemetry/collectd_plugin/v1-0001-dpdk_telemetry-add-plugin-for-DPDK-metrics-via-DP.patch

diff --git a/lib/librte_telemetry/collectd_plugin/v1-0001-dpdk_telemetry-add-plugin-for-DPDK-metrics-via-DP.patch b/lib/librte_telemetry/collectd_plugin/v1-0001-dpdk_telemetry-add-plugin-for-DPDK-metrics-via-DP.patch
new file mode 100644
index 0000000..e81d463
--- /dev/null
+++ b/lib/librte_telemetry/collectd_plugin/v1-0001-dpdk_telemetry-add-plugin-for-DPDK-metrics-via-DP.patch
@@ -0,0 +1,578 @@
+From 4c7660827b471ecd862122aa0e2a90c0a0f8ec97 Mon Sep 17 00:00:00 2001
+From: Emma Kenny <emma.kenny@intel.com>
+Date: Tue, 21 Aug 2018 15:49:15 +0100
+Subject: [PATCH v1] dpdk_telemetry: add plugin for DPDK metrics via DPDK
+ Telemetry library
+
+This patch introduces a new plugin for collectd, which consumes DPDK metrics
+via the dpdk_telemetry library. The collectd plugin here provides an
+easy way to use the DPDK telemetry API to query ethernet device metrics.
+
+The collectd plugin retrieves metrics from a DPDK packet forwarding
+application by sending a JSON formatted message via a UNIX domain
+socket. The DPDK telemetry component will respond with a JSON formatted
+reply, delivering the requested metrics. The dpdk_telemetry collectd
+plugin parses the JSON data, and publishes the metric values to collectd
+for further use.
+
+This plugin has a dependency on the DPDK Telemetry library, as it must be
+"in sync" with the DPDK Telemetry implementation.
+
+This patch should be applied on the following collectd commit:
+fff795c9846bd8fe4bc7f76bcd83a2b8cefb4525
+
+Signed-off-by: Emma Kenny <emma.kenny@intel.com>
+Signed-off-by: Brian Archbold <brian.archbold@intel.com>
+---
+ Makefile.am           |   7 +
+ configure.ac          |   4 +
+ src/collectd.conf.in  |  26 ++--
+ src/collectd.conf.pod |  35 +++++
+ src/dpdk_telemetry.c  | 364 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/types.db          |   1 +
+ 6 files changed, 427 insertions(+), 10 deletions(-)
+ create mode 100755 src/dpdk_telemetry.c
+
+diff --git a/Makefile.am b/Makefile.am
+index cb40148..66885e2 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -884,6 +884,13 @@ dpdkstat_la_CFLAGS = $(AM_CFLAGS) $(LIBDPDK_CFLAGS)
+ dpdkstat_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBDPDK_LDFLAGS)
+ dpdkstat_la_LIBADD = $(LIBDPDK_LIBS)
+ endif
++if BUILD_PLUGIN_DPDK_TELEMETRY
++pkglib_LTLIBRARIES += dpdk_telemetry.la
++dpdk_telemetry_la_SOURCES = src/dpdk_telemetry.c
++dpdk_telemetry_la_CFLAGS = $(AM_CFLAGS)
++dpdk_telemetry_la_LDFLAGS = $(PLUGIN_LDFLAGS)
++dpdk_telemetry_la_LIBADD = -ljansson
++endif
+ 
+ if BUILD_PLUGIN_DRBD
+ pkglib_LTLIBRARIES += drbd.la
+diff --git a/configure.ac b/configure.ac
+index 7bf3718..93ee1a0 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -6289,6 +6289,7 @@ plugin_disk="no"
+ plugin_drbd="no"
+ plugin_dpdkevents="no"
+ plugin_dpdkstat="no"
++plugin_dpdk_telemetry="no"
+ plugin_entropy="no"
+ plugin_ethstat="no"
+ plugin_fhcount="no"
+@@ -6349,6 +6350,7 @@ if test "x$ac_system" = "xLinux"; then
+   plugin_cpufreq="yes"
+   plugin_disk="yes"
+   plugin_drbd="yes"
++  plugin_dpdk_telemetry="yes"
+   plugin_entropy="yes"
+   plugin_fhcount="yes"
+   plugin_fscache="yes"
+@@ -6710,6 +6712,7 @@ AC_PLUGIN([dns],                 [$with_libpcap],           [DNS traffic analysi
+ AC_PLUGIN([dpdkevents],          [$plugin_dpdkevents],      [Events from DPDK])
+ AC_PLUGIN([dpdkstat],            [$plugin_dpdkstat],        [Stats from DPDK])
+ AC_PLUGIN([drbd],                [$plugin_drbd],            [DRBD statistics])
++AC_PLUGIN([dpdk_telemetry],      [$plugin_dpdk_telemetry],  [Metrics from DPDK Telemetry])
+ AC_PLUGIN([email],               [yes],                     [EMail statistics])
+ AC_PLUGIN([entropy],             [$plugin_entropy],         [Entropy statistics])
+ AC_PLUGIN([ethstat],             [$plugin_ethstat],         [Stats from NIC driver])
+@@ -7132,6 +7135,7 @@ AC_MSG_RESULT([    dns . . . . . . . . . $enable_dns])
+ AC_MSG_RESULT([    dpdkevents. . . . . . $enable_dpdkevents])
+ AC_MSG_RESULT([    dpdkstat  . . . . . . $enable_dpdkstat])
+ AC_MSG_RESULT([    drbd  . . . . . . . . $enable_drbd])
++AC_MSG_RESULT([    dpdk_telemetry. . . . $enable_dpdk_telemetry])
+ AC_MSG_RESULT([    email . . . . . . . . $enable_email])
+ AC_MSG_RESULT([    entropy . . . . . . . $enable_entropy])
+ AC_MSG_RESULT([    ethstat . . . . . . . $enable_ethstat])
+diff --git a/src/collectd.conf.in b/src/collectd.conf.in
+index af65214..8e9d500 100644
+--- a/src/collectd.conf.in
++++ b/src/collectd.conf.in
+@@ -62,12 +62,12 @@
+ @LOAD_PLUGIN_LOGFILE@LoadPlugin logfile
+ @LOAD_PLUGIN_LOG_LOGSTASH@LoadPlugin log_logstash
+ 
+-#<Plugin logfile>
+-#	LogLevel @DEFAULT_LOG_LEVEL@
+-#	File STDOUT
+-#	Timestamp true
+-#	PrintSeverity false
+-#</Plugin>
++<Plugin logfile>
++	LogLevel @DEFAULT_LOG_LEVEL@
++	File STDOUT
++	Timestamp true
++	PrintSeverity false
++</Plugin>
+ 
+ #<Plugin log_logstash>
+ #	LogLevel @DEFAULT_LOG_LEVEL@
+@@ -117,6 +117,7 @@
+ #@BUILD_PLUGIN_DNS_TRUE@LoadPlugin dns
+ #@BUILD_PLUGIN_DPDKEVENTS_TRUE@LoadPlugin dpdkevents
+ #@BUILD_PLUGIN_DPDKSTAT_TRUE@LoadPlugin dpdkstat
++@BUILD_PLUGIN_DPDK_TELEMETRY_TRUE@LoadPlugin dpdk_telemetry
+ #@BUILD_PLUGIN_DRBD_TRUE@LoadPlugin drbd
+ #@BUILD_PLUGIN_EMAIL_TRUE@LoadPlugin email
+ #@BUILD_PLUGIN_ENTROPY_TRUE@LoadPlugin entropy
+@@ -394,10 +395,10 @@
+ #  SubtractGuestState true
+ #</Plugin>
+ #
+-#<Plugin csv>
+-#	DataDir "@localstatedir@/lib/@PACKAGE_NAME@/csv"
+-#	StoreRates false
+-#</Plugin>
++<Plugin csv>
++	DataDir "@localstatedir@/lib/@PACKAGE_NAME@/csv"
++	StoreRates false
++</Plugin>
+ 
+ #<Plugin curl>
+ #  <Page "stock_quotes">
+@@ -595,6 +596,11 @@
+ #  PortName "interface2"
+ #</Plugin>
+ 
++<Plugin dpdk_telemetry>
++	ClientSocketPath "/var/run/.client"
++	DpdkSocketPath "/var/run/.rte_telemetry"
++</Plugin>
++
+ #<Plugin email>
+ #	SocketFile "@localstatedir@/run/@PACKAGE_NAME@-email"
+ #	SocketGroup "collectd"
+diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
+index 6e6d6ea..3cc062f 100644
+--- a/src/collectd.conf.pod
++++ b/src/collectd.conf.pod
+@@ -2822,6 +2822,41 @@ convention will be used for the additional ports.
+ 
+ =back
+ 
++=head2 Plugin C<dpdk_telemetry>
++
++
++The I< dpdk_telemetry > plugin collects DPDK metrics via the dpdk_telemetry library.
++
++
++B<Synopsis:>
++
++
++  <Plugin dpdk_telemetry>
++    ClientSocketPath "/var/run/.client"
++    DpdkSocketPath "/var/run/.rte_telemetry"
++  </Plugin>
++
++
++B<Options:>
++
++
++=over 2
++
++
++=item B<ClientSocketPath> I<Client_Path>
++
++
++The path to the client socket.
++
++
++=item B<DpdkSocketPath> I<Dpdk_Path>
++
++
++The path to DPDK Telemetry.
++
++
++=back
++
+ =head2 Plugin C<email>
+ 
+ =over 4
+diff --git a/src/dpdk_telemetry.c b/src/dpdk_telemetry.c
+new file mode 100755
+index 0000000..773256e
+--- /dev/null
++++ b/src/dpdk_telemetry.c
+@@ -0,0 +1,364 @@
++/*-
++ * collectd - src/dpdk_telemetry.c
++ * MIT License
++ *
++ * Copyright(c) 2018 Intel Corporation. All rights reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of
++ * this software and associated documentation files (the "Software"), to deal in
++ * the Software without restriction, including without limitation the rights to
++ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
++ * of the Software, and to permit persons to whom the Software is furnished to
++ * do
++ * so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all
++ * copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ *
++ */
++
++#include "collectd.h"
++#include "common.h"
++#include "plugin.h"
++#include "utils_time.h"
++
++#include <errno.h>
++#include <jansson.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/queue.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++#include <sys/unistd.h>
++
++#define BUF_SIZE 1000000
++#define PLUGIN_NAME "dpdk_telemetry"
++#define DEFAULT_DPDK_PATH "/var/run/.rte_telemetry"
++#define DEFAULT_CLIENT_PATH "/var/run/.client"
++
++struct client_info {
++  int s_send;
++  int s_recv;
++  int fd;
++  const char *dpdk_path;
++  const char *client_path;
++  struct sockaddr_un addr;
++  struct sockaddr_un addrs;
++};
++
++static struct client_info *client = NULL;
++static char g_client_path[BUF_SIZE];
++static char g_dpdk_path[BUF_SIZE];
++
++static int dpdk_telemetry_config(oconfig_item_t *ci) {
++  int ret, i;
++
++  INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__);
++
++  for (i = 0; i < ci->children_num; i++) {
++    oconfig_item_t *child = ci->children + i;
++
++    if (strcasecmp("ClientSocketPath", child->key) == 0) {
++      ret = cf_util_get_string_buffer(child, g_client_path,
++                                      sizeof(g_client_path));
++    } else if (strcasecmp("DpdkSocketPath", child->key) == 0) {
++      ret = cf_util_get_string_buffer(child, g_dpdk_path, sizeof(g_dpdk_path));
++    } else {
++      ERROR(PLUGIN_NAME ": Unknown configuration parameter"
++                        "\"%s\"",
++            child->key);
++      ret = -1;
++    }
++
++    if (ret < 0) {
++      INFO(PLUGIN_NAME ": %s:%d ret =%d", __FUNCTION__, __LINE__, ret);
++      return ret;
++    }
++  }
++  return 0;
++}
++
++static int dpdk_telemetry_parse(json_t *stats, json_t *port, int portid) {
++  json_t *statsArrayObj;
++  if (!stats) {
++    ERROR("dpdk_telemetry: Stats pointer is invalid\n");
++    return -1;
++  }
++
++  if (!port) {
++    ERROR("dpdk_telemetry:  Port pointer is invalid\n");
++    return -1;
++  }
++
++  if (portid < 0) {
++    ERROR("dpdk_telemetry: portid is invalid\n");
++    return -1;
++  }
++
++  json_t *name, *value;
++  const char *name_string;
++  int value_int, statslen, i;
++  statslen = json_array_size(stats);
++  for (i = 0; i < statslen; i++) {
++    statsArrayObj = json_array_get(stats, i);
++    name = json_object_get(statsArrayObj, "name");
++    value = json_object_get(statsArrayObj, "value");
++    if (!name) {
++      ERROR("dpdk_telemetry: Request does not have name field\n");
++      return -1;
++    }
++    if (!json_is_string(name)) {
++      ERROR("dpdk_telemetry: Stat name value is not a string\n");
++      return -1;
++    }
++    name_string = json_string_value(name);
++    if (!value) {
++      ERROR("dpdk_telemetry: Request does not have value name\n");
++      return -1;
++    }
++    if (!json_is_integer(value)) {
++      ERROR("dpdk_telemetry: Stat value is not an integer\n");
++      return -1;
++    }
++
++    char dev_name[BUF_SIZE];
++    snprintf(dev_name, sizeof(dev_name), "%s.%d", name_string, portid);
++    value_int = json_integer_value(value);
++    value_t dpdk_telemetry_values[1];
++    value_list_t dpdk_telemetry_vl = VALUE_LIST_INIT;
++    dpdk_telemetry_values[0].counter = value_int;
++    dpdk_telemetry_vl.values = dpdk_telemetry_values;
++    dpdk_telemetry_vl.values_len = 1;
++    dpdk_telemetry_vl.time = cdtime();
++    snprintf(dpdk_telemetry_vl.host, sizeof(dpdk_telemetry_vl.host), "%s",
++             hostname_g);
++    snprintf(dpdk_telemetry_vl.plugin, sizeof(dpdk_telemetry_vl.plugin),
++             "dpdk_telemetry");
++    snprintf(dpdk_telemetry_vl.plugin_instance,
++             sizeof(dpdk_telemetry_vl.plugin_instance), "%s", dev_name);
++    snprintf(dpdk_telemetry_vl.type, sizeof(dpdk_telemetry_vl.type),
++             "dpdk_telemetry");
++    snprintf(dpdk_telemetry_vl.type_instance,
++             sizeof(dpdk_telemetry_vl.type_instance), "%s", name_string);
++
++    int ret = plugin_dispatch_values(&dpdk_telemetry_vl);
++    if (ret < 0) {
++      ERROR("dpdk_telemetry: Failed to dispatch values");
++      return -1;
++    }
++  }
++  return 0;
++}
++
++static int parse_json(char *buf) {
++
++  if (!buf) {
++    ERROR("dpdk_telemetry: buf pointer is invalid\n");
++    return -1;
++  }
++  json_error_t error;
++  json_t *root = json_loads(buf, 0, &error);
++  int arraylen, i;
++  json_t *status, *dataArray, *stats, *dataArrayObj;
++  stats = NULL;
++
++  if (!root) {
++    ERROR("dpdk_telemetry: Could not load JSON object from data passed in"
++          " : %s\n",
++          error.text);
++    return -1;
++  } else if (!json_is_object(root)) {
++    ERROR("dpdk_telemetry: JSON Request is not a JSON object\n");
++    json_decref(root);
++    return -1;
++  }
++
++  status = json_object_get(root, "status_code");
++  if (!status) {
++    ERROR("dpdk_telemetry: Request does not have status field\n");
++    return -1;
++  } else if (!json_is_string(status)) {
++    ERROR("dpdk_telemetry: Status value is not a string\n");
++    return -1;
++  }
++  dataArray = json_object_get(root, "data");
++  if (!dataArray) {
++    ERROR("dpdk_telemetry: Request does not have data field\n");
++    return -1;
++  }
++  arraylen = json_array_size(dataArray);
++  if (!arraylen) {
++    ERROR("dpdk_telemetry: No data to get\n");
++    return -1;
++  }
++
++  for (i = 0; i < arraylen; i++) {
++    json_t *port;
++    dataArrayObj = json_array_get(dataArray, i);
++    port = json_object_get(dataArrayObj, "port");
++    stats = json_object_get(dataArrayObj, "stats");
++    if (!port) {
++      ERROR("dpdk_telemetry: Request does not have port field\n");
++      return -1;
++    }
++    if (!json_is_integer(port)) {
++      ERROR("dpdk_telemetry: Port value is not an integer\n");
++      return -1;
++    }
++
++    if (!stats) {
++      ERROR("dpdk_telemetry: Request does not have stats field\n");
++      return -1;
++    }
++    dpdk_telemetry_parse(stats, port, i);
++  }
++  return 0;
++}
++
++static int dpdk_telemetry_cleanup(void) {
++  if (!client) {
++    WARNING("dpdk_telemetry: instance pointer is NULL, cleanup() has already "
++            "been called\n");
++    return -1;
++  }
++  close(client->s_send);
++  close(client->s_recv);
++  close(client->fd);
++  free(client);
++  client = NULL;
++  return 0;
++}
++
++static int dpdk_telemetry_read(user_data_t *ud) {
++  INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__);
++  struct client_info *client = (struct client_info *)ud->data;
++  char buffer[BUF_SIZE];
++  int bytes, ret;
++  char *json_string = "{\"action\":0,\"command\":"
++                      "\"ports_all_stat_values\",\"data\":null}";
++  if (send(client->fd, json_string, strlen(json_string), 0) < 0) {
++    ERROR("dpdk_telemetry: Could not send stats\n");
++    return -1;
++  }
++  bytes = recv(client->fd, buffer, sizeof(buffer), 0);
++  buffer[bytes] = '\0';
++  if (bytes < 0) {
++    ERROR("dpdk_telemetry: Could not receive stats\n");
++    return -1;
++  }
++  ret = parse_json(buffer);
++  if (ret < 0) {
++    ERROR("dpdk_telemetry: Parsing failed\n");
++    return -1;
++  }
++  return 0;
++}
++
++static int dpdk_telemetry_init(void) {
++  INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__);
++  char message[BUF_SIZE];
++
++  client = calloc(1, sizeof(struct client_info));
++  if (!client) {
++    ERROR("dpdk_telemetry: Memory could not be allocated\n");
++    return -1;
++  }
++  /*Here we look up the length of the g_dpdk_path string
++   * If it has a length we use it, otherwise we fall back to default
++   * See dpdk_telemetry_config() for details
++  */
++  client->dpdk_path = (strlen(g_dpdk_path)) ? g_dpdk_path : DEFAULT_DPDK_PATH;
++  client->client_path =
++      (strlen(g_client_path)) ? g_client_path : DEFAULT_CLIENT_PATH;
++  client->s_send = socket(AF_UNIX, SOCK_STREAM, 0);
++  if (client->s_send < 0) {
++    ERROR("dpdk_telemetry: Failed to open socket\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  client->s_recv = socket(AF_UNIX, SOCK_STREAM, 0);
++  if (client->s_recv < 0) {
++    ERROR("dpdk_telemetry: Failed to open message socket\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  client->addr.sun_family = AF_UNIX;
++  snprintf(client->addr.sun_path, sizeof(client->addr.sun_path), "%s",
++           client->dpdk_path);
++  if (connect(client->s_send, (struct sockaddr *)&client->addr,
++              sizeof(client->addr)) < 0) {
++    ERROR("dpdk_telemetry: Failed to connect\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  client->addrs.sun_family = AF_UNIX;
++  snprintf(client->addrs.sun_path, sizeof(client->addrs.sun_path), "%s",
++           client->client_path);
++  unlink(client->client_path);
++  if (bind(client->s_recv, (struct sockaddr *)&client->addrs,
++           sizeof(client->addrs)) < 0) {
++    ERROR("dpdk_telemetry: Failed to bind\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  if (listen(client->s_recv, 1) < 0) {
++    ERROR("dpdk_telemetry: Listen failed\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  snprintf(message, sizeof(message), "{\"action\":1,\"command\":\"clients\""
++                                     ",\"data\":{\"client_path\":\"%s\"}}",
++           client->client_path);
++  if (send(client->s_send, message, strlen(message), 0) < 0) {
++    ERROR("dpdk_telemetry: Could not send register message\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  client->fd = accept(client->s_recv, NULL, NULL);
++  if (client->fd < 0) {
++    ERROR("dpdk_telemetry: Failed to accept\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  user_data_t ud;
++  memset(&ud, 0, sizeof(ud));
++  ud.data = (void *)client;
++  plugin_register_complex_read(NULL, "dpdk_telemetry", dpdk_telemetry_read, 0,
++                               &ud);
++  return 0;
++}
++
++static int dpdk_telemetry_shutdown(void) {
++  INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__);
++  char msg[BUF_SIZE];
++  int ret;
++
++  snprintf(msg, sizeof(msg), "{\"action\":2,\"command\":\"clients\""
++                             ",\"data\":{\"client_path\":\"%s\"}}",
++           client->client_path);
++  ret = send(client->fd, msg, strlen(msg), 0);
++  if (ret < 0) {
++    ERROR("dpdk_telemetry: Could not send unregister message\n");
++    dpdk_telemetry_cleanup();
++    return -1;
++  }
++  dpdk_telemetry_cleanup();
++  return 0;
++}
++
++void module_register(void) {
++  plugin_register_init("dpdk_telemetry", dpdk_telemetry_init);
++  plugin_register_complex_config("dpdk_telemetry", dpdk_telemetry_config);
++  plugin_register_shutdown("dpdk_telemetry", dpdk_telemetry_shutdown);
++}
+diff --git a/src/types.db b/src/types.db
+index f4933ee..4517b3c 100644
+--- a/src/types.db
++++ b/src/types.db
+@@ -76,6 +76,7 @@ dns_transfer            value:DERIVE:0:U
+ dns_update              value:DERIVE:0:U
+ dns_zops                value:DERIVE:0:U
+ domain_state            state:GAUGE:0:U, reason:GAUGE:0:U
++dpdk_telemetry		value:DERIVE:0:U
+ drbd_resource           value:DERIVE:0:U
+ duration                seconds:GAUGE:0:U
+ email_check             value:GAUGE:0:U
+-- 
+2.9.5
+
-- 
2.7.4

  parent reply	other threads:[~2018-08-23 12:08 UTC|newest]

Thread overview: 219+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-23 12:08 [dpdk-dev] [PATCH 00/11] introduce telemetry library Ciara Power
2018-08-23 12:08 ` [dpdk-dev] [PATCH 01/11] telemetry: initial telemetry infrastructure Ciara Power
2018-08-23 23:17   ` Stephen Hemminger
2018-08-23 23:17   ` Stephen Hemminger
2018-08-23 23:18   ` Stephen Hemminger
2018-08-23 23:19   ` Stephen Hemminger
2018-08-23 23:22   ` Stephen Hemminger
2018-08-28 17:12     ` Van Haaren, Harry
2018-08-24 13:03   ` Shreyansh Jain
2018-08-28 16:50     ` Van Haaren, Harry
2018-08-28 11:46   ` Gaëtan Rivet
2018-08-28 16:54     ` Van Haaren, Harry
2018-08-29  8:23       ` Gaëtan Rivet
2018-08-23 12:08 ` [dpdk-dev] [PATCH 02/11] telemetry: add initial connection socket Ciara Power
2018-08-28 16:40   ` Gaëtan Rivet
2018-08-28 17:03     ` Van Haaren, Harry
2018-09-07  9:48   ` Burakov, Anatoly
2018-08-23 12:08 ` [dpdk-dev] [PATCH 03/11] telemetry: add client feature and sockets Ciara Power
2018-08-23 23:27   ` Stephen Hemminger
2018-08-28 15:26     ` Hunt, David
2018-08-28 17:09       ` Van Haaren, Harry
2018-08-23 12:08 ` [dpdk-dev] [PATCH 04/11] telemetry: add parser for client socket messages Ciara Power
2018-08-30 23:57   ` Gaëtan Rivet
2018-08-23 12:08 ` [dpdk-dev] [PATCH 05/11] telemetry: update metrics before sending stats Ciara Power
2018-08-23 12:08 ` [dpdk-dev] [PATCH 06/11] telemetry: format json response when " Ciara Power
2018-08-23 12:08 ` [dpdk-dev] [PATCH 07/11] telemetry: add tests for telemetry api Ciara Power
2018-08-23 23:15   ` Stephen Hemminger
2018-08-23 12:08 ` [dpdk-dev] [PATCH 08/11] telemetry: add vdev kvargs for selftest Ciara Power
2018-08-23 12:08 ` [dpdk-dev] [PATCH 09/11] doc: add telemetry documentation Ciara Power
2018-09-25  8:53   ` Kovacevic, Marko
2018-08-23 12:08 ` [dpdk-dev] [PATCH 10/11] usertools: add client python script for telemetry Ciara Power
2018-08-23 12:08 ` Ciara Power [this message]
2018-09-18  9:52   ` [dpdk-dev] [PATCH 11/11] telemetry: add collectd plugin patch Thomas Monjalon
2018-09-19 11:09     ` Laatz, Kevin
2018-10-03 17:36 ` [dpdk-dev] [PATCH v2 00/10] introduce telemetry library Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 01/10] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-04 14:13     ` Gaëtan Rivet
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 02/10] telemetry: add initial connection socket Kevin Laatz
2018-10-03 18:40     ` Mattias Rönnblom
2018-10-03 19:36       ` Thomas Monjalon
2018-10-03 19:49         ` Mattias Rönnblom
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 03/10] telemetry: add client feature and sockets Kevin Laatz
2018-10-03 19:06     ` Mattias Rönnblom
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 04/10] telemetry: add parser for client socket messages Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 05/10] telemetry: update metrics before sending stats Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 06/10] telemetry: format json response when " Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 07/10] telemetry: add tests for telemetry api Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 08/10] telemetry: add ability to disable selftest Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 09/10] doc: add telemetry documentation Kevin Laatz
2018-10-03 17:36   ` [dpdk-dev] [PATCH v2 10/10] usertools: add client python script for telemetry Kevin Laatz
2018-10-04 13:00   ` [dpdk-dev] [PATCH v2 00/10] introduce telemetry library Van Haaren, Harry
2018-10-04 13:25   ` Van Haaren, Harry
2018-10-04 15:16     ` Gaëtan Rivet
2018-10-04 15:53     ` Thomas Monjalon
2018-10-05 22:05       ` Gaëtan Rivet
2018-10-09 10:33       ` Van Haaren, Harry
2018-10-09 11:41         ` Thomas Monjalon
2018-10-09 14:56           ` Bruce Richardson
2018-10-09 17:07             ` Thomas Monjalon
2018-10-10 10:51   ` [dpdk-dev] [PATCH v3 00/12] " Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 01/12] eal: add param register infrastructure Kevin Laatz
2018-10-10 12:28       ` Thomas Monjalon
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 02/12] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 03/12] telemetry: add initial connection socket Kevin Laatz
2018-10-10 12:24       ` Thomas Monjalon
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 04/12] telemetry: add client feature and sockets Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 05/12] telemetry: add parser for client socket messages Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 06/12] telemetry: update metrics before sending stats Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 07/12] telemetry: format json response when " Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 08/12] telemetry: add tests for telemetry api Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 09/12] telemetry: add ability to disable selftest Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 10/12] doc: add telemetry documentation Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 11/12] usertools: add client python script for telemetry Kevin Laatz
2018-10-10 10:51     ` [dpdk-dev] [PATCH v3 12/12] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-11 16:58     ` [dpdk-dev] [PATCH v4 00/13] introduce telemetry library Kevin Laatz
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 01/13] eal: add param register infrastructure Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-16 13:42         ` Thomas Monjalon
2018-10-16 14:20           ` Laatz, Kevin
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 02/13] eal: make get runtime dir function public Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 03/13] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 04/13] telemetry: add initial connection socket Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 05/13] telemetry: add client feature and sockets Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 06/13] telemetry: add parser for client socket messages Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 07/13] telemetry: update metrics before sending stats Kevin Laatz
2018-10-16  0:45         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 08/13] telemetry: format json response when " Kevin Laatz
2018-10-16  0:46         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 09/13] telemetry: add tests for telemetry api Kevin Laatz
2018-10-16  0:46         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 10/13] telemetry: add ability to disable selftest Kevin Laatz
2018-10-16  0:47         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 11/13] doc: add telemetry documentation Kevin Laatz
2018-10-16  0:47         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 12/13] usertools: add client python script for telemetry Kevin Laatz
2018-10-16  0:47         ` Van Haaren, Harry
2018-10-11 16:58       ` [dpdk-dev] [PATCH v4 13/13] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-16  0:47         ` Van Haaren, Harry
2018-10-16 15:57       ` [dpdk-dev] [PATCH v5 00/13] introduce telemetry library Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 01/13] eal: add param register infrastructure Kevin Laatz
2018-10-17  9:41           ` Thomas Monjalon
2018-10-17 11:45             ` Gaëtan Rivet
2018-10-17 13:46               ` Thomas Monjalon
2018-10-17 14:09                 ` Laatz, Kevin
2018-10-17 14:20                   ` Thomas Monjalon
2018-10-17 13:55               ` Laatz, Kevin
2018-10-17 15:56           ` Gaëtan Rivet
2018-10-18 15:58             ` Laatz, Kevin
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 02/13] eal: make get runtime dir function public Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 03/13] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 04/13] telemetry: add initial connection socket Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 05/13] telemetry: add client feature and sockets Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 06/13] telemetry: add parser for client socket messages Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 07/13] telemetry: update metrics before sending stats Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 08/13] telemetry: format json response when " Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 09/13] telemetry: add tests for telemetry api Kevin Laatz
2018-10-16 15:57         ` [dpdk-dev] [PATCH v5 10/13] telemetry: add ability to disable selftest Kevin Laatz
2018-10-16 15:58         ` [dpdk-dev] [PATCH v5 11/13] doc: add telemetry documentation Kevin Laatz
2018-10-16 15:58         ` [dpdk-dev] [PATCH v5 12/13] usertools: add client python script for telemetry Kevin Laatz
2018-10-16 15:58         ` [dpdk-dev] [PATCH v5 13/13] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-18  8:07         ` [dpdk-dev] [PATCH v5 00/13] introduce telemetry library Mattias Rönnblom
2018-10-19 10:16           ` Laatz, Kevin
2018-10-22  7:11             ` Mattias Rönnblom
2018-10-22  9:03               ` Laatz, Kevin
2018-10-22 11:00         ` [dpdk-dev] [PATCH v6 " Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 01/13] eal: add option register infrastructure Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 02/13] eal: make get runtime dir function public Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 03/13] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 04/13] telemetry: add initial connection socket Kevin Laatz
2018-10-22 13:50             ` Mattias Rönnblom
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 05/13] telemetry: add client feature and sockets Kevin Laatz
2018-10-22 14:05             ` Mattias Rönnblom
2018-10-23  8:42               ` Laatz, Kevin
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 06/13] telemetry: add parser for client socket messages Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 07/13] telemetry: update metrics before sending stats Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 08/13] telemetry: format json response when " Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 09/13] telemetry: add tests for telemetry api Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 10/13] telemetry: add ability to disable selftest Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 11/13] doc: add telemetry documentation Kevin Laatz
2018-10-22 12:25             ` Kovacevic, Marko
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 12/13] usertools: add client python script for telemetry Kevin Laatz
2018-10-22 11:00           ` [dpdk-dev] [PATCH v6 13/13] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-24 13:27           ` [dpdk-dev] [PATCH v7 00/13] introduce telemetry library Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 01/13] eal: add option register infrastructure Kevin Laatz
2018-10-24 14:01               ` Gaëtan Rivet
2018-10-24 14:33                 ` Thomas Monjalon
2018-10-24 14:52                   ` Laatz, Kevin
2018-10-24 15:05                     ` Laatz, Kevin
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 02/13] eal: make get runtime dir function public Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 03/13] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 04/13] telemetry: add initial connection socket Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 05/13] telemetry: add client feature and sockets Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 06/13] telemetry: add parser for client socket messages Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 07/13] telemetry: update metrics before sending stats Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 08/13] telemetry: format json response when " Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 09/13] telemetry: add tests for telemetry api Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 10/13] telemetry: add ability to disable selftest Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 11/13] doc: add telemetry documentation Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 12/13] usertools: add client python script for telemetry Kevin Laatz
2018-10-24 13:27             ` [dpdk-dev] [PATCH v7 13/13] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-24 14:13             ` [dpdk-dev] [PATCH v7 00/13] introduce telemetry library Thomas Monjalon
2018-10-24 14:49               ` Laatz, Kevin
2018-10-24 16:02             ` [dpdk-dev] [PATCH v8 " Kevin Laatz
2018-10-24 16:02               ` [dpdk-dev] [PATCH v8 01/13] eal: add option register infrastructure Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 02/13] eal: make get runtime dir function public Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 03/13] telemetry: initial telemetry infrastructure Kevin Laatz
2018-10-25 20:33                 ` Thomas Monjalon
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 04/13] telemetry: add initial connection socket Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 05/13] telemetry: add client feature and sockets Kevin Laatz
2018-10-25 20:29                 ` Thomas Monjalon
2018-10-25 20:41                   ` Thomas Monjalon
2018-10-25 20:44                     ` Bruce Richardson
2018-10-25 20:49                       ` Thomas Monjalon
2018-10-25 21:16                         ` Richardson, Bruce
2018-10-25 23:58                           ` Thomas Monjalon
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 06/13] telemetry: add parser for client socket messages Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 07/13] telemetry: update metrics before sending stats Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 08/13] telemetry: format json response when " Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 09/13] telemetry: add tests for telemetry api Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 10/13] telemetry: add ability to disable selftest Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 11/13] doc: add telemetry documentation Kevin Laatz
2018-10-25 20:31                 ` Thomas Monjalon
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 12/13] usertools: add client python script for telemetry Kevin Laatz
2018-10-24 16:03               ` [dpdk-dev] [PATCH v8 13/13] build: add dependency on telemetry to apps in meson Kevin Laatz
2018-10-26 23:59               ` [dpdk-dev] [PATCH v9 00/12] Introduce Telemetry Library Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 01/12] eal: add option register infrastructure Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 02/12] eal: make get runtime dir function public Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 03/12] telemetry: initial telemetry infrastructure Harry van Haaren
2018-10-27  1:56                   ` Thomas Monjalon
2018-10-27  2:19                     ` Van Haaren, Harry
2018-10-27  2:33                       ` Thomas Monjalon
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 04/12] telemetry: add initial connection socket Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 05/12] telemetry: add client feature and sockets Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 06/12] telemetry: add parser for client socket messages Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 07/12] telemetry: update metrics before sending stats Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 08/12] telemetry: format json response when " Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 09/12] telemetry: add ability to disable selftest Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 10/12] doc: add telemetry documentation Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 11/12] usertools: add client python script for telemetry Harry van Haaren
2018-10-26 23:59                 ` [dpdk-dev] [PATCH v9 12/12] build: add dependency on telemetry to apps in meson Harry van Haaren
2018-10-27  9:17                 ` [dpdk-dev] [PATCH v10 00/12] Introduce Telemetry Library Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 01/12] eal: add option register infrastructure Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 02/12] eal: make get runtime dir function public Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 03/12] telemetry: initial telemetry infrastructure Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 04/12] telemetry: add initial connection socket Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 05/12] telemetry: add client feature and sockets Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 06/12] telemetry: add parser for client socket messages Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 07/12] telemetry: update metrics before sending stats Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 08/12] telemetry: format json response when " Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 09/12] telemetry: add ability to disable selftest Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 10/12] doc: add telemetry documentation Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 11/12] usertools: add client python script for telemetry Harry van Haaren
2018-10-27  9:17                   ` [dpdk-dev] [PATCH v10 12/12] build: add dependency on telemetry to apps in meson Harry van Haaren
2018-10-27 13:24                   ` [dpdk-dev] [PATCH v10 00/12] Introduce Telemetry Library Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1535026093-101872-12-git-send-email-ciara.power@intel.com \
    --to=ciara.power@intel.com \
    --cc=brian.archbold@intel.com \
    --cc=dev@dpdk.org \
    --cc=emma.kenny@intel.com \
    --cc=harry.van.haaren@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).