- sstrncpy (dest, string, size);
-
-#define REPLACE_FIELD(t, v) \
- if (subst_string (temp, sizeof (temp), dest, t, v) != NULL) \
- sstrncpy (dest, temp, size);
- REPLACE_FIELD ("%{host}", vl->host);
- REPLACE_FIELD ("%{plugin}", vl->plugin);
- REPLACE_FIELD ("%{plugin_instance}", vl->plugin_instance);
- REPLACE_FIELD ("%{type}", vl->type);
- REPLACE_FIELD ("%{type_instance}", vl->type_instance);
-
- meta_entries = meta_data_toc (vl->meta, &meta_toc);
- for (int i = 0; i < meta_entries; i++)
- {
- char meta_name[DATA_MAX_NAME_LEN];
- char value_str[DATA_MAX_NAME_LEN];
- int meta_type;
- const char *key = meta_toc[i];
-
- ssnprintf (meta_name, sizeof (meta_name), "%%{meta:%s}", key);
-
- meta_type = meta_data_type (vl->meta, key);
- switch (meta_type)
- {
- case MD_TYPE_STRING:
- {
- char *meta_value;
- if (meta_data_get_string (vl->meta, key, &meta_value))
- {
- ERROR ("Target `set': Unable to get string metadata value `%s'.",
- key);
- continue;
- }
- sstrncpy (value_str, meta_value, sizeof (value_str));
- }
- break;
- case MD_TYPE_SIGNED_INT:
- {
- int64_t meta_value;
- if (meta_data_get_signed_int (vl->meta, key, &meta_value))
- {
- ERROR ("Target `set': Unable to get signed int metadata value "
- "`%s'.", key);
- continue;
- }
- ssnprintf (value_str, sizeof (value_str), "%"PRIi64, meta_value);
- }
- break;
- case MD_TYPE_UNSIGNED_INT:
- {
- uint64_t meta_value;
- if (meta_data_get_unsigned_int (vl->meta, key, &meta_value))
- {
- ERROR ("Target `set': Unable to get unsigned int metadata value "
- "`%s'.", key);
- continue;
- }
- ssnprintf (value_str, sizeof (value_str), "%"PRIu64, meta_value);
- }
- break;
- case MD_TYPE_DOUBLE:
- {
- double meta_value;
- if (meta_data_get_double (vl->meta, key, &meta_value))
- {
- ERROR ("Target `set': Unable to get double metadata value `%s'.",
- key);
- continue;
- }
- ssnprintf (value_str, sizeof (value_str), GAUGE_FORMAT, meta_value);
- }
- break;
- case MD_TYPE_BOOLEAN:
- {
- _Bool meta_value;
- if (meta_data_get_boolean (vl->meta, key, &meta_value))
- {
- ERROR ("Target `set': Unable to get boolean metadata value `%s'.",
- key);
- continue;
- }
- sstrncpy (value_str, meta_value ? "true" : "false",
- sizeof (value_str));
- }
- break;
- default:
- ERROR ("Target `set': Unable to retrieve metadata type for `%s'.",
- key);
+ sstrncpy(dest, string, size);
+
+ if (strchr(dest, '%') == NULL)
+ return;
+
+#define REPLACE_FIELD(t, v) \
+ if (subst_string(temp, sizeof(temp), dest, t, v) != NULL) \
+ sstrncpy(dest, temp, size);
+ REPLACE_FIELD("%{host}", vl->host);
+ REPLACE_FIELD("%{plugin}", vl->plugin);
+ REPLACE_FIELD("%{plugin_instance}", vl->plugin_instance);
+ REPLACE_FIELD("%{type}", vl->type);
+ REPLACE_FIELD("%{type_instance}", vl->type_instance);
+
+ if (vl->meta != NULL) {
+ char **meta_toc = NULL;
+ int meta_entries = meta_data_toc(vl->meta, &meta_toc);
+ if (meta_entries <= 0)
+ return;
+
+ for (int i = 0; i < meta_entries; i++) {
+ char meta_name[DATA_MAX_NAME_LEN];
+ char *value_str;
+ const char *key = meta_toc[i];
+
+ ssnprintf(meta_name, sizeof(meta_name), "%%{meta:%s}", key);
+ if (meta_data_as_string(vl->meta, key, &value_str) != 0)