From dfaefaa60e1ad2381246fb2a87831e2560a7fec5 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 20 Jul 2020 10:27:08 -0700 Subject: [PATCH] Update kubeletstats metric according to semantic conventions Update kubeletstats receiver metrics according to https://github.com/open-telemetry/oteps/pull/119 : - Remove "k8s." from container metrics - Change "/" metric delimiter to "." - Change ...network -> ...network.io - Avoid short forms in metrics: "mem" -> "memory", "fs" -> "filesystem" - Use "cpu.usage" in [0,1] scale instead of "cpu.utilization" in percents - Use "cpu.time" in seconds instead of "cpu/cumulative" in nanoseconds Also introduce additional metrics: "network.errors" and "filesystem.usage". --- .../kubelet/accumulator.go | 8 +++---- receiver/kubeletstatsreceiver/kubelet/cpu.go | 7 +++--- receiver/kubeletstatsreceiver/kubelet/fs.go | 9 ++++++-- receiver/kubeletstatsreceiver/kubelet/mem.go | 6 ++--- .../kubeletstatsreceiver/kubelet/network.go | 22 +++++++++++++++---- receiver/kubeletstatsreceiver/kubelet/pb.go | 20 +++++++++++++++++ 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/receiver/kubeletstatsreceiver/kubelet/accumulator.go b/receiver/kubeletstatsreceiver/kubelet/accumulator.go index a40c33e13c43..a4af96d467cf 100644 --- a/receiver/kubeletstatsreceiver/kubelet/accumulator.go +++ b/receiver/kubeletstatsreceiver/kubelet/accumulator.go @@ -27,10 +27,10 @@ type metricDataAccumulator struct { } const ( - k8sPrefix = "k8s/" - nodePrefix = k8sPrefix + "node/" - podPrefix = k8sPrefix + "pod/" - containerPrefix = k8sPrefix + "container/" + k8sPrefix = "k8s." + nodePrefix = k8sPrefix + "node." + podPrefix = k8sPrefix + "pod." + containerPrefix = "container." ) func (a *metricDataAccumulator) nodeStats(s stats.NodeStats) { diff --git a/receiver/kubeletstatsreceiver/kubelet/cpu.go b/receiver/kubeletstatsreceiver/kubelet/cpu.go index 0098b8368b27..92e56248aa80 100644 --- a/receiver/kubeletstatsreceiver/kubelet/cpu.go +++ b/receiver/kubeletstatsreceiver/kubelet/cpu.go @@ -31,10 +31,11 @@ func cpuUsageMetric(prefix string, s *stats.CPUStats) *metricspb.Metric { if nanoCores == nil { return nil } - value := float64(*nanoCores) / 1_000_000 - return doubleGauge(prefix+"cpu/usage", "%", &value) + value := float64(*nanoCores) / 1_000_000_000 + return doubleGauge(prefix+"cpu.utilization", "1", &value) } func cpuCumulativeUsageMetric(prefix string, s *stats.CPUStats) *metricspb.Metric { - return cumulativeInt(prefix+"cpu/cumulative", "ns", s.UsageCoreNanoSeconds) + value := float64(*s.UsageCoreNanoSeconds) / 1_000_000_000 + return cumulativeDouble(prefix+"cpu.time", "s", &value) } diff --git a/receiver/kubeletstatsreceiver/kubelet/fs.go b/receiver/kubeletstatsreceiver/kubelet/fs.go index c85a02ed8ac0..b633658d2378 100644 --- a/receiver/kubeletstatsreceiver/kubelet/fs.go +++ b/receiver/kubeletstatsreceiver/kubelet/fs.go @@ -23,13 +23,18 @@ func fsMetrics(prefix string, s *stats.FsStats) []*metricspb.Metric { return applyCurrentTime([]*metricspb.Metric{ fsAvailableMetric(prefix, s), fsCapacityMetric(prefix, s), + fsUsedMetric(prefix, s), }, s.Time.Time) } func fsAvailableMetric(prefix string, s *stats.FsStats) *metricspb.Metric { - return intGauge(prefix+"fs/available", "By", s.AvailableBytes) + return intGauge(prefix+"filesystem.available", "By", s.AvailableBytes) } func fsCapacityMetric(prefix string, s *stats.FsStats) *metricspb.Metric { - return intGauge(prefix+"fs/capacity", "By", s.CapacityBytes) + return intGauge(prefix+"filesystem.capacity", "By", s.CapacityBytes) +} + +func fsUsedMetric(prefix string, s *stats.FsStats) *metricspb.Metric { + return intGauge(prefix+"filesystem.usage", "By", s.UsedBytes) } diff --git a/receiver/kubeletstatsreceiver/kubelet/mem.go b/receiver/kubeletstatsreceiver/kubelet/mem.go index b75754bd3583..15213ed09103 100644 --- a/receiver/kubeletstatsreceiver/kubelet/mem.go +++ b/receiver/kubeletstatsreceiver/kubelet/mem.go @@ -28,13 +28,13 @@ func memMetrics(prefix string, s *stats.MemoryStats) []*metricspb.Metric { } func memAvailableMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric { - return intGauge(prefix+"mem/available", "By", s.AvailableBytes) + return intGauge(prefix+"memory.available", "By", s.AvailableBytes) } func memUsageMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric { - return intGauge(prefix+"mem/usage", "By", s.UsageBytes) + return intGauge(prefix+"memory.usage", "By", s.UsageBytes) } func memRssMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric { - return intGauge(prefix+"mem/rss", "By", s.RSSBytes) + return intGauge(prefix+"memory.rss", "By", s.RSSBytes) } diff --git a/receiver/kubeletstatsreceiver/kubelet/network.go b/receiver/kubeletstatsreceiver/kubelet/network.go index bf9b281029d6..fa53736a77e0 100644 --- a/receiver/kubeletstatsreceiver/kubelet/network.go +++ b/receiver/kubeletstatsreceiver/kubelet/network.go @@ -24,19 +24,33 @@ func networkMetrics(prefix string, s *stats.NetworkStats) []*metricspb.Metric { return applyCurrentTime([]*metricspb.Metric{ rxBytesMetric(prefix, s), txBytesMetric(prefix, s), + rxErrorsMetric(prefix, s), + txErrorsMetric(prefix, s), }, s.Time.Time) } const directionLabel = "direction" func rxBytesMetric(prefix string, s *stats.NetworkStats) *metricspb.Metric { - metric := cumulativeInt(prefix+"network", "By", s.RxBytes) - applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "received"}) + metric := cumulativeInt(prefix+"network.io", "By", s.RxBytes) + applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "receive"}) return metric } func txBytesMetric(prefix string, s *stats.NetworkStats) *metricspb.Metric { - metric := cumulativeInt(prefix+"network", "By", s.TxBytes) - applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "transmitted"}) + metric := cumulativeInt(prefix+"network.io", "By", s.TxBytes) + applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "transmit"}) + return metric +} + +func rxErrorsMetric(prefix string, s *stats.NetworkStats) *metricspb.Metric { + metric := cumulativeInt(prefix+"network.errors", "By", s.RxErrors) + applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "receive"}) + return metric +} + +func txErrorsMetric(prefix string, s *stats.NetworkStats) *metricspb.Metric { + metric := cumulativeInt(prefix+"network.errors", "By", s.TxErrors) + applyLabels(metric, map[string]string{"interface": s.Name, directionLabel: "transmit"}) return metric } diff --git a/receiver/kubeletstatsreceiver/kubelet/pb.go b/receiver/kubeletstatsreceiver/kubelet/pb.go index 9bdb41ff9400..851ac234c6cc 100644 --- a/receiver/kubeletstatsreceiver/kubelet/pb.go +++ b/receiver/kubeletstatsreceiver/kubelet/pb.go @@ -36,6 +36,26 @@ func cumulativeInt(metricName string, units string, value *uint64) *metricspb.Me } } +func cumulativeDouble(metricName string, units string, value *float64) *metricspb.Metric { + if value == nil { + return nil + } + return &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: metricName, + Unit: units, + Type: metricspb.MetricDescriptor_CUMULATIVE_DOUBLE, + }, + Timeseries: []*metricspb.TimeSeries{{ + Points: []*metricspb.Point{{ + Value: &metricspb.Point_DoubleValue{ + DoubleValue: *value, + }, + }}, + }}, + } +} + func intGauge(metricName string, units string, value *uint64) *metricspb.Metric { if value == nil { return nil