Skip to content

Commit fd526ee

Browse files
atoulmebogdandrutu
andauthored
[k8sclusterreceiver] switch k8s.hpa metrics to use pdata (open-telemetry#23408)
Rebase of open-telemetry#18250 with latest main. --------- Signed-off-by: Bogdan Drutu <[email protected]> Co-authored-by: Bogdan Drutu <[email protected]>
1 parent e6e1e76 commit fd526ee

19 files changed

+956
-158
lines changed

.chloggen/switchk8shpa.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
5+
component: k8sclusterreceiver
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Switch k8s.hpa metrics to use pdata.
9+
10+
# One or more tracking issues related to the change
11+
issues: [18250]

receiver/k8sclusterreceiver/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.19
44

55
require (
66
github.com/census-instrumentation/opencensus-proto v0.4.1
7+
github.com/google/go-cmp v0.5.9
78
github.com/google/uuid v1.3.0
89
github.com/iancoleman/strcase v0.2.0
910
github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.79.0
@@ -57,7 +58,6 @@ require (
5758
github.com/golang/protobuf v1.5.3 // indirect
5859
github.com/golang/snappy v0.0.4 // indirect
5960
github.com/google/gnostic v0.5.7-v3refs // indirect
60-
github.com/google/go-cmp v0.5.9 // indirect
6161
github.com/google/gofuzz v1.2.0 // indirect
6262
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
6363
github.com/imdario/mergo v0.3.12 // indirect

receiver/k8sclusterreceiver/internal/collection/collector.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
1111
quotav1 "github.com/openshift/api/quota/v1"
1212
"go.opentelemetry.io/collector/pdata/pmetric"
13+
"go.opentelemetry.io/collector/receiver"
1314
"go.uber.org/zap"
1415
appsv1 "k8s.io/api/apps/v1"
1516
autoscalingv2 "k8s.io/api/autoscaling/v2"
@@ -48,17 +49,17 @@ import (
4849
// an interface to interact with refactored code from SignalFx Agent which is
4950
// confined to the collection package.
5051
type DataCollector struct {
51-
logger *zap.Logger
52+
settings receiver.CreateSettings
5253
metricsStore *metricsStore
5354
metadataStore *metadata.Store
5455
nodeConditionsToReport []string
5556
allocatableTypesToReport []string
5657
}
5758

5859
// NewDataCollector returns a DataCollector.
59-
func NewDataCollector(logger *zap.Logger, nodeConditionsToReport, allocatableTypesToReport []string) *DataCollector {
60+
func NewDataCollector(set receiver.CreateSettings, nodeConditionsToReport, allocatableTypesToReport []string) *DataCollector {
6061
return &DataCollector{
61-
logger: logger,
62+
settings: set,
6263
metricsStore: &metricsStore{
6364
metricsCache: make(map[types.UID]pmetric.Metrics),
6465
},
@@ -75,7 +76,7 @@ func (dc *DataCollector) SetupMetadataStore(gvk schema.GroupVersionKind, store c
7576

7677
func (dc *DataCollector) RemoveFromMetricsStore(obj interface{}) {
7778
if err := dc.metricsStore.remove(obj.(runtime.Object)); err != nil {
78-
dc.logger.Error(
79+
dc.settings.TelemetrySettings.Logger.Error(
7980
"failed to remove from metric cache",
8081
zap.String("obj", reflect.TypeOf(obj).String()),
8182
zap.Error(err),
@@ -85,7 +86,7 @@ func (dc *DataCollector) RemoveFromMetricsStore(obj interface{}) {
8586

8687
func (dc *DataCollector) UpdateMetricsStore(obj interface{}, md pmetric.Metrics) {
8788
if err := dc.metricsStore.update(obj.(runtime.Object), md); err != nil {
88-
dc.logger.Error(
89+
dc.settings.TelemetrySettings.Logger.Error(
8990
"failed to update metric cache",
9091
zap.String("obj", reflect.TypeOf(obj).String()),
9192
zap.Error(err),
@@ -103,9 +104,9 @@ func (dc *DataCollector) SyncMetrics(obj interface{}) {
103104

104105
switch o := obj.(type) {
105106
case *corev1.Pod:
106-
md = ocsToMetrics(pod.GetMetrics(o, dc.logger))
107+
md = ocsToMetrics(pod.GetMetrics(o, dc.settings.TelemetrySettings.Logger))
107108
case *corev1.Node:
108-
md = ocsToMetrics(node.GetMetrics(o, dc.nodeConditionsToReport, dc.allocatableTypesToReport, dc.logger))
109+
md = ocsToMetrics(node.GetMetrics(o, dc.nodeConditionsToReport, dc.allocatableTypesToReport, dc.settings.TelemetrySettings.Logger))
109110
case *corev1.Namespace:
110111
md = ocsToMetrics(namespace.GetMetrics(o))
111112
case *corev1.ReplicationController:
@@ -127,9 +128,9 @@ func (dc *DataCollector) SyncMetrics(obj interface{}) {
127128
case *batchv1beta1.CronJob:
128129
md = ocsToMetrics(cronjob.GetMetricsBeta(o))
129130
case *autoscalingv2.HorizontalPodAutoscaler:
130-
md = ocsToMetrics(hpa.GetMetrics(o))
131+
md = hpa.GetMetrics(dc.settings, o)
131132
case *autoscalingv2beta2.HorizontalPodAutoscaler:
132-
md = ocsToMetrics(hpa.GetMetricsBeta(o))
133+
md = hpa.GetMetricsBeta(dc.settings, o)
133134
case *quotav1.ClusterResourceQuota:
134135
md = ocsToMetrics(clusterresourcequota.GetMetrics(o))
135136
default:
@@ -148,7 +149,7 @@ func (dc *DataCollector) SyncMetadata(obj interface{}) map[experimentalmetricmet
148149
km := map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata{}
149150
switch o := obj.(type) {
150151
case *corev1.Pod:
151-
km = pod.GetMetadata(o, dc.metadataStore, dc.logger)
152+
km = pod.GetMetadata(o, dc.metadataStore, dc.settings.TelemetrySettings.Logger)
152153
case *corev1.Node:
153154
km = node.GetMetadata(o)
154155
case *corev1.ReplicationController:

receiver/k8sclusterreceiver/internal/collection/collector_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
"github.com/stretchr/testify/require"
10+
"go.opentelemetry.io/collector/receiver/receivertest"
1011
"go.uber.org/zap"
1112
"go.uber.org/zap/zapcore"
1213
"go.uber.org/zap/zaptest/observer"
@@ -263,10 +264,11 @@ func TestDataCollectorSyncMetadata(t *testing.T) {
263264

264265
for _, tt := range tests {
265266
observedLogger, _ := observer.New(zapcore.WarnLevel)
266-
logger := zap.New(observedLogger)
267+
set := receivertest.NewNopCreateSettings()
268+
set.TelemetrySettings.Logger = zap.New(observedLogger)
267269
t.Run(tt.name, func(t *testing.T) {
268270
dc := &DataCollector{
269-
logger: logger,
271+
settings: set,
270272
metadataStore: tt.metadataStore,
271273
nodeConditionsToReport: []string{},
272274
}

receiver/k8sclusterreceiver/internal/constants/constants.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@ const (
1212
// Resource labels keys for UID.
1313
K8sKeyNamespaceUID = "k8s.namespace.uid"
1414
K8sKeyReplicationControllerUID = "k8s.replicationcontroller.uid"
15-
K8sKeyHPAUID = "k8s.hpa.uid"
1615
K8sKeyResourceQuotaUID = "k8s.resourcequota.uid"
1716
K8sKeyClusterResourceQuotaUID = "openshift.clusterquota.uid"
1817

1918
// Resource labels keys for Name.
2019
K8sKeyReplicationControllerName = "k8s.replicationcontroller.name"
21-
K8sKeyHPAName = "k8s.hpa.name"
2220
K8sKeyResourceQuotaName = "k8s.resourcequota.name"
2321
K8sKeyClusterResourceQuotaName = "openshift.clusterquota.name"
2422

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:build !windows
5+
// +build !windows
6+
7+
//go:generate mdatagen metadata.yaml
8+
9+
package hpa // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/hpa"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
[comment]: <> (Code generated by mdatagen. DO NOT EDIT.)
2+
3+
# k8s/hpa
4+
5+
## Default Metrics
6+
7+
The following metrics are emitted by default. Each of them can be disabled by applying the following configuration:
8+
9+
```yaml
10+
metrics:
11+
<metric_name>:
12+
enabled: false
13+
```
14+
15+
### k8s.hpa.current_replicas
16+
17+
Current number of pod replicas managed by this autoscaler.
18+
19+
| Unit | Metric Type | Value Type |
20+
| ---- | ----------- | ---------- |
21+
| 1 | Gauge | Int |
22+
23+
### k8s.hpa.desired_replicas
24+
25+
Desired number of pod replicas managed by this autoscaler.
26+
27+
| Unit | Metric Type | Value Type |
28+
| ---- | ----------- | ---------- |
29+
| 1 | Gauge | Int |
30+
31+
### k8s.hpa.max_replicas
32+
33+
Maximum number of replicas to which the autoscaler can scale up.
34+
35+
| Unit | Metric Type | Value Type |
36+
| ---- | ----------- | ---------- |
37+
| 1 | Gauge | Int |
38+
39+
### k8s.hpa.min_replicas
40+
41+
Minimum number of replicas to which the autoscaler can scale up.
42+
43+
| Unit | Metric Type | Value Type |
44+
| ---- | ----------- | ---------- |
45+
| 1 | Gauge | Int |
46+
47+
## Resource Attributes
48+
49+
| Name | Description | Values | Enabled |
50+
| ---- | ----------- | ------ | ------- |
51+
| k8s.hpa.name | The k8s hpa name. | Any Str | true |
52+
| k8s.hpa.uid | The k8s hpa uid. | Any Str | true |
53+
| k8s.namespace.name | The name of the namespace that the pod is running in. | Any Str | true |

receiver/k8sclusterreceiver/internal/hpa/hpa.go

Lines changed: 24 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -4,129 +4,37 @@
44
package hpa // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/hpa"
55

66
import (
7-
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
8-
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
9-
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
10-
conventions "go.opentelemetry.io/collector/semconv/v1.6.1"
7+
"time"
8+
9+
"go.opentelemetry.io/collector/pdata/pcommon"
10+
"go.opentelemetry.io/collector/pdata/pmetric"
11+
"go.opentelemetry.io/collector/receiver"
1112
autoscalingv2 "k8s.io/api/autoscaling/v2"
1213
autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2"
13-
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1414

1515
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata"
16-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/constants"
16+
imetadata "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/hpa/internal/metadata"
1717
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/metadata"
18-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/utils"
1918
)
2019

21-
var hpaMaxReplicasMetric = &metricspb.MetricDescriptor{
22-
Name: "k8s.hpa.max_replicas",
23-
Description: "Maximum number of replicas to which the autoscaler can scale up",
24-
Unit: "1",
25-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
26-
}
27-
28-
var hpaMinReplicasMetric = &metricspb.MetricDescriptor{
29-
Name: "k8s.hpa.min_replicas",
30-
Description: "Minimum number of replicas to which the autoscaler can scale down",
31-
Unit: "1",
32-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
33-
}
34-
35-
var hpaCurrentReplicasMetric = &metricspb.MetricDescriptor{
36-
Name: "k8s.hpa.current_replicas",
37-
Description: "Current number of pod replicas managed by this autoscaler",
38-
Unit: "1",
39-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
40-
}
41-
42-
var hpaDesiredReplicasMetric = &metricspb.MetricDescriptor{
43-
Name: "k8s.hpa.desired_replicas",
44-
Description: "Desired number of pod replicas managed by this autoscaler",
45-
Unit: "1",
46-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
47-
}
48-
49-
func GetMetrics(hpa *autoscalingv2.HorizontalPodAutoscaler) []*agentmetricspb.ExportMetricsServiceRequest {
50-
metrics := []*metricspb.Metric{
51-
{
52-
MetricDescriptor: hpaMaxReplicasMetric,
53-
Timeseries: []*metricspb.TimeSeries{
54-
utils.GetInt64TimeSeries(int64(hpa.Spec.MaxReplicas)),
55-
},
56-
},
57-
{
58-
MetricDescriptor: hpaMinReplicasMetric,
59-
Timeseries: []*metricspb.TimeSeries{
60-
utils.GetInt64TimeSeries(int64(*hpa.Spec.MinReplicas)),
61-
},
62-
},
63-
{
64-
MetricDescriptor: hpaCurrentReplicasMetric,
65-
Timeseries: []*metricspb.TimeSeries{
66-
utils.GetInt64TimeSeries(int64(hpa.Status.CurrentReplicas)),
67-
},
68-
},
69-
{
70-
MetricDescriptor: hpaDesiredReplicasMetric,
71-
Timeseries: []*metricspb.TimeSeries{
72-
utils.GetInt64TimeSeries(int64(hpa.Status.DesiredReplicas)),
73-
},
74-
},
75-
}
76-
77-
return []*agentmetricspb.ExportMetricsServiceRequest{
78-
{
79-
Resource: getResourceForHPA(&hpa.ObjectMeta),
80-
Metrics: metrics,
81-
},
82-
}
83-
}
84-
85-
func GetMetricsBeta(hpa *autoscalingv2beta2.HorizontalPodAutoscaler) []*agentmetricspb.ExportMetricsServiceRequest {
86-
metrics := []*metricspb.Metric{
87-
{
88-
MetricDescriptor: hpaMaxReplicasMetric,
89-
Timeseries: []*metricspb.TimeSeries{
90-
utils.GetInt64TimeSeries(int64(hpa.Spec.MaxReplicas)),
91-
},
92-
},
93-
{
94-
MetricDescriptor: hpaMinReplicasMetric,
95-
Timeseries: []*metricspb.TimeSeries{
96-
utils.GetInt64TimeSeries(int64(*hpa.Spec.MinReplicas)),
97-
},
98-
},
99-
{
100-
MetricDescriptor: hpaCurrentReplicasMetric,
101-
Timeseries: []*metricspb.TimeSeries{
102-
utils.GetInt64TimeSeries(int64(hpa.Status.CurrentReplicas)),
103-
},
104-
},
105-
{
106-
MetricDescriptor: hpaDesiredReplicasMetric,
107-
Timeseries: []*metricspb.TimeSeries{
108-
utils.GetInt64TimeSeries(int64(hpa.Status.DesiredReplicas)),
109-
},
110-
},
111-
}
112-
113-
return []*agentmetricspb.ExportMetricsServiceRequest{
114-
{
115-
Resource: getResourceForHPA(&hpa.ObjectMeta),
116-
Metrics: metrics,
117-
},
118-
}
119-
}
120-
121-
func getResourceForHPA(om *v1.ObjectMeta) *resourcepb.Resource {
122-
return &resourcepb.Resource{
123-
Type: constants.K8sType,
124-
Labels: map[string]string{
125-
constants.K8sKeyHPAUID: string(om.UID),
126-
constants.K8sKeyHPAName: om.Name,
127-
conventions.AttributeK8SNamespaceName: om.Namespace,
128-
},
129-
}
20+
func GetMetricsBeta(set receiver.CreateSettings, hpa *autoscalingv2beta2.HorizontalPodAutoscaler) pmetric.Metrics {
21+
mb := imetadata.NewMetricsBuilder(imetadata.DefaultMetricsBuilderConfig(), set)
22+
ts := pcommon.NewTimestampFromTime(time.Now())
23+
mb.RecordK8sHpaMaxReplicasDataPoint(ts, int64(hpa.Spec.MaxReplicas))
24+
mb.RecordK8sHpaMinReplicasDataPoint(ts, int64(*hpa.Spec.MinReplicas))
25+
mb.RecordK8sHpaCurrentReplicasDataPoint(ts, int64(hpa.Status.CurrentReplicas))
26+
mb.RecordK8sHpaDesiredReplicasDataPoint(ts, int64(hpa.Status.DesiredReplicas))
27+
return mb.Emit(imetadata.WithK8sHpaUID(string(hpa.UID)), imetadata.WithK8sHpaName(hpa.Name), imetadata.WithK8sNamespaceName(hpa.Namespace))
28+
}
29+
30+
func GetMetrics(set receiver.CreateSettings, hpa *autoscalingv2.HorizontalPodAutoscaler) pmetric.Metrics {
31+
mb := imetadata.NewMetricsBuilder(imetadata.DefaultMetricsBuilderConfig(), set)
32+
ts := pcommon.NewTimestampFromTime(time.Now())
33+
mb.RecordK8sHpaMaxReplicasDataPoint(ts, int64(hpa.Spec.MaxReplicas))
34+
mb.RecordK8sHpaMinReplicasDataPoint(ts, int64(*hpa.Spec.MinReplicas))
35+
mb.RecordK8sHpaCurrentReplicasDataPoint(ts, int64(hpa.Status.CurrentReplicas))
36+
mb.RecordK8sHpaDesiredReplicasDataPoint(ts, int64(hpa.Status.DesiredReplicas))
37+
return mb.Emit(imetadata.WithK8sHpaUID(string(hpa.UID)), imetadata.WithK8sHpaName(hpa.Name), imetadata.WithK8sNamespaceName(hpa.Namespace))
13038
}
13139

13240
func GetMetadata(hpa *autoscalingv2.HorizontalPodAutoscaler) map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata {

0 commit comments

Comments
 (0)