<div dir="ltr">Hello.<br><br>For me, the collectd model of host/plugin-plugin_instance/<wbr>type-type_instance was worked well for host metrics and for backends like rrdtool or graphite,<br>but when you collect metrics from applications or need to add some info you start to overload plugin_instance and type_instance appending strings.<br>And when you write the metrics into influxdb or opentsb, for example, you lost some flexibility in the queries.<br><br>We can use the meta data to add more info to the metrics but currently it's not handled in the network plugin and the majority of write plugins ignore them.<br><br>Thinking in the future, you will have more complex metrics (people like to monitor everything) and a tag system could be more flexible.<br><br>I'm thinking <span id="m_5213498067265866197gmail-result_box" class="m_5213498067265866197gmail-short_text" lang="en"><span class="m_5213498067265866197gmail-">of a model like the one that </span></span>opentsdb, prometheus or influxdb has:<br><br>        <metric> <timestamp> <valuek1=valuev1[ valuek2=valuev2 .. valuekN=valuevN]> <tagk1=tagv1[ tagk2=tagv2 ...tagkN=tagvN]><br><br>for example:<br><br>        cpu  1479577385.274 user=12688371,nice=7391,<wbr>system=961387,idle=78450115,<wbr>iowait=65758,irq=0,softirq=<wbr>33943,steal=0,guest=0,guest_<wbr>nice=0   host=localhost.localdomain,<wbr>rack=23,zone=eu<br><br>This could be easily converted to a path for rrd with a template or strings if the tags are sorted for graphite ( localhost_localdomain.rack-23.<wbr>zone-eu.cpu.user )<br><br>I know, it's a big change that will generate some compatibility problems with older versions and a lot of changes in the code, maybe it could be addressed in the major version like the 6, in the end, I think it will give to collectd a great flexibility.<br><br>For clarify, without entering in the implementation: if tags and values should be a list, ordered list, hashtable, avl  etc... , the value_list_t could be:<br><br>typedef enum value_type_u {<br>  VALUE_TYPE_COUNTER,<br>  VALUE_TYPE_GAUGE,<br>  VALUE_TYPE_DERIVE,<br>  VALUE_TYPE_ABSOLUTE<br>} value_type_t;<br><br>typedef union value_u {<br>  counter_t  counter;<br>  gauge_t    gauge;<br>  derive_t   derive;<br>  absolute_t absolute;<br>} value_t;<br><br>typedef struct value_entry_u {<br>  char         *key;<br>  value_t       value<br>  value_type_t  type;<br>} value_entry_t;<br><br>typedef union tag_u {<br>  char    *tv_string;<br>  int64_t  tv_signed_int;<br>  uint64_t tv_unsigned_int;<br>  double   tv_double;<br>  _Bool    tv_boolean;<br>} tag_value_t;<br><br>typedef enum tag_type_u {<br>  TAG_TYPE_STRING,<br>  TAG_TYPE_SIGNED_INT,<br>  TAG_TYPE_UNSIGNED_INT,<br>  TAG_TYPE_DOUBLE,<br>  TAG_TYPE_BOOLEAN<br>} tag_type_t;<br><br>typedef struct tag_entry_s {<br>  char         *key;<br>  tag_value_t   value;<br>  tag_type_t    type;<br>} tag_entry_t;<br><br>typedef struct value_list_s {<br>  char           *metric;<br>  tag_entry_t    *tags;<br>  size_t          tags_len;<br>  value_entry_t  *values;<br>  size_t          values_len;<br>  cdtime_t        time;<br>  cdtime_t        interval;<br>} value_list_t;<br><br></div>