From 672e5d53d8063cbd628c83e719bbf0b21452542e Mon Sep 17 00:00:00 2001 From: BERTRAND ZANCO Date: Mon, 11 Mar 2019 10:29:27 +0100 Subject: [PATCH 1/3] Add grouping metrics --- plugins/outputs/stackdriver/stackdriver.go | 39 +++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/plugins/outputs/stackdriver/stackdriver.go b/plugins/outputs/stackdriver/stackdriver.go index 572cdb4c7cdc4..9d97ab21af4fb 100644 --- a/plugins/outputs/stackdriver/stackdriver.go +++ b/plugins/outputs/stackdriver/stackdriver.go @@ -1,6 +1,7 @@ package stackdriver import ( + "bytes" "context" "fmt" "hash/fnv" @@ -22,6 +23,7 @@ import ( type Stackdriver struct { Project string Namespace string + GroupMetrics bool `toml:"group_metrics"` ResourceType string `toml:"resource_type"` ResourceLabels map[string]string `toml:"resource_labels"` @@ -59,6 +61,9 @@ var sampleConfig = ` ## Custom resource type # resource_type = "generic_node" + ## Compact by type + # GroupMetrics = false + ## Additonal resource labels # [outputs.stackdriver.resource_labels] # node_id = "$HOSTNAME" @@ -169,10 +174,20 @@ func (s *Stackdriver) Write(metrics []telegraf.Metric) error { Value: value, } + metricType := path.Join("custom.googleapis.com", s.Namespace, m.Name(), f.Key) + if s.GroupMetrics { + var buffer bytes.Buffer + buffer.WriteString(m.Name()) + buffer.WriteString("-") + buffer.WriteString(f.Key) + m.AddTag("name", buffer.String()) + metricType = path.Join("custom.googleapis.com", s.Namespace, getStackdriverMetricGroupName(m.Type(), f.Value)) + } + // Prepare time series. timeSeries := &monitoringpb.TimeSeries{ Metric: &metricpb.Metric{ - Type: path.Join("custom.googleapis.com", s.Namespace, m.Name(), f.Key), + Type: metricType, Labels: getStackdriverLabels(m.TagList()), }, MetricKind: metricKind, @@ -265,6 +280,28 @@ func getStackdriverTimeInterval( } } +func getStackdriverMetricGroupName(vt telegraf.ValueType, value interface{}) string { + switch vt { + case telegraf.Untyped: + switch value.(type) { + case uint64: + return "counter" + case int64: + return "counter" + case float64: + return "gauge" + default: + return "untag" + } + case telegraf.Gauge: + return "gauge" + case telegraf.Counter: + return "derive" + default: + return "unspecified" + } +} + func getStackdriverMetricKind(vt telegraf.ValueType) (metricpb.MetricDescriptor_MetricKind, error) { switch vt { case telegraf.Untyped: From e5674580a040d073b77db02194ffdbde963cfc8a Mon Sep 17 00:00:00 2001 From: ZANCO Bertrand <31990529+fean5959a@users.noreply.github.com> Date: Mon, 11 Mar 2019 10:31:32 +0100 Subject: [PATCH 2/3] Add metrics grouping --- plugins/outputs/stackdriver/stackdriver.go | 39 +++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/plugins/outputs/stackdriver/stackdriver.go b/plugins/outputs/stackdriver/stackdriver.go index 572cdb4c7cdc4..9d97ab21af4fb 100644 --- a/plugins/outputs/stackdriver/stackdriver.go +++ b/plugins/outputs/stackdriver/stackdriver.go @@ -1,6 +1,7 @@ package stackdriver import ( + "bytes" "context" "fmt" "hash/fnv" @@ -22,6 +23,7 @@ import ( type Stackdriver struct { Project string Namespace string + GroupMetrics bool `toml:"group_metrics"` ResourceType string `toml:"resource_type"` ResourceLabels map[string]string `toml:"resource_labels"` @@ -59,6 +61,9 @@ var sampleConfig = ` ## Custom resource type # resource_type = "generic_node" + ## Compact by type + # GroupMetrics = false + ## Additonal resource labels # [outputs.stackdriver.resource_labels] # node_id = "$HOSTNAME" @@ -169,10 +174,20 @@ func (s *Stackdriver) Write(metrics []telegraf.Metric) error { Value: value, } + metricType := path.Join("custom.googleapis.com", s.Namespace, m.Name(), f.Key) + if s.GroupMetrics { + var buffer bytes.Buffer + buffer.WriteString(m.Name()) + buffer.WriteString("-") + buffer.WriteString(f.Key) + m.AddTag("name", buffer.String()) + metricType = path.Join("custom.googleapis.com", s.Namespace, getStackdriverMetricGroupName(m.Type(), f.Value)) + } + // Prepare time series. timeSeries := &monitoringpb.TimeSeries{ Metric: &metricpb.Metric{ - Type: path.Join("custom.googleapis.com", s.Namespace, m.Name(), f.Key), + Type: metricType, Labels: getStackdriverLabels(m.TagList()), }, MetricKind: metricKind, @@ -265,6 +280,28 @@ func getStackdriverTimeInterval( } } +func getStackdriverMetricGroupName(vt telegraf.ValueType, value interface{}) string { + switch vt { + case telegraf.Untyped: + switch value.(type) { + case uint64: + return "counter" + case int64: + return "counter" + case float64: + return "gauge" + default: + return "untag" + } + case telegraf.Gauge: + return "gauge" + case telegraf.Counter: + return "derive" + default: + return "unspecified" + } +} + func getStackdriverMetricKind(vt telegraf.ValueType) (metricpb.MetricDescriptor_MetricKind, error) { switch vt { case telegraf.Untyped: From 3f0b256780ee66a27c058c849e4ad13be6a57dc9 Mon Sep 17 00:00:00 2001 From: ZANCO Bertrand <31990529+fean5959a@users.noreply.github.com> Date: Mon, 11 Mar 2019 10:32:34 +0100 Subject: [PATCH 3/3] Add metrics grouping --- plugins/outputs/stackdriver/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/outputs/stackdriver/README.md b/plugins/outputs/stackdriver/README.md index cdf0a1591ac58..2131a8888a07b 100644 --- a/plugins/outputs/stackdriver/README.md +++ b/plugins/outputs/stackdriver/README.md @@ -24,6 +24,9 @@ Additional resource labels can be configured by `resource_labels`. By default th ## Custom resource type # resource_type = "generic_node" + ## Compact by type + # group_metrics = false + ## Additonal resource labels # [outputs.stackdriver.resource_labels] # node_id = "$HOSTNAME"