Skip to content

Commit 3193ae6

Browse files
committed
[k8sclusterreceiver] switch k8s.hpa metrics to use pdata
Signed-off-by: Bogdan Drutu <[email protected]>
1 parent 641d772 commit 3193ae6

File tree

16 files changed

+881
-118
lines changed

16 files changed

+881
-118
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/internal/collection/collector.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
2222
quotav1 "github.com/openshift/api/quota/v1"
2323
"go.opentelemetry.io/collector/pdata/pmetric"
24+
"go.opentelemetry.io/collector/receiver"
2425
"go.uber.org/zap"
2526
appsv1 "k8s.io/api/apps/v1"
2627
autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2"
@@ -58,17 +59,17 @@ import (
5859
// an interface to interact with refactored code from SignalFx Agent which is
5960
// confined to the collection package.
6061
type DataCollector struct {
61-
logger *zap.Logger
62+
settings receiver.CreateSettings
6263
metricsStore *metricsStore
6364
metadataStore *metadata.Store
6465
nodeConditionsToReport []string
6566
allocatableTypesToReport []string
6667
}
6768

6869
// NewDataCollector returns a DataCollector.
69-
func NewDataCollector(logger *zap.Logger, nodeConditionsToReport, allocatableTypesToReport []string) *DataCollector {
70+
func NewDataCollector(set receiver.CreateSettings, nodeConditionsToReport, allocatableTypesToReport []string) *DataCollector {
7071
return &DataCollector{
71-
logger: logger,
72+
settings: set,
7273
metricsStore: &metricsStore{
7374
metricsCache: make(map[types.UID]pmetric.Metrics),
7475
},
@@ -85,7 +86,7 @@ func (dc *DataCollector) SetupMetadataStore(gvk schema.GroupVersionKind, store c
8586

8687
func (dc *DataCollector) RemoveFromMetricsStore(obj interface{}) {
8788
if err := dc.metricsStore.remove(obj.(runtime.Object)); err != nil {
88-
dc.logger.Error(
89+
dc.settings.TelemetrySettings.Logger.Error(
8990
"failed to remove from metric cache",
9091
zap.String("obj", reflect.TypeOf(obj).String()),
9192
zap.Error(err),
@@ -95,7 +96,7 @@ func (dc *DataCollector) RemoveFromMetricsStore(obj interface{}) {
9596

9697
func (dc *DataCollector) UpdateMetricsStore(obj interface{}, md pmetric.Metrics) {
9798
if err := dc.metricsStore.update(obj.(runtime.Object), md); err != nil {
98-
dc.logger.Error(
99+
dc.settings.TelemetrySettings.Logger.Error(
99100
"failed to update metric cache",
100101
zap.String("obj", reflect.TypeOf(obj).String()),
101102
zap.Error(err),
@@ -113,9 +114,9 @@ func (dc *DataCollector) SyncMetrics(obj interface{}) {
113114

114115
switch o := obj.(type) {
115116
case *corev1.Pod:
116-
md = ocsToMetrics(pod.GetMetrics(o, dc.logger))
117+
md = ocsToMetrics(pod.GetMetrics(o, dc.settings.TelemetrySettings.Logger))
117118
case *corev1.Node:
118-
md = ocsToMetrics(node.GetMetrics(o, dc.nodeConditionsToReport, dc.allocatableTypesToReport, dc.logger))
119+
md = ocsToMetrics(node.GetMetrics(o, dc.nodeConditionsToReport, dc.allocatableTypesToReport, dc.settings.TelemetrySettings.Logger))
119120
case *corev1.Namespace:
120121
md = ocsToMetrics(namespace.GetMetrics(o))
121122
case *corev1.ReplicationController:
@@ -137,7 +138,7 @@ func (dc *DataCollector) SyncMetrics(obj interface{}) {
137138
case *batchv1beta1.CronJob:
138139
md = ocsToMetrics(cronjob.GetMetricsBeta(o))
139140
case *autoscalingv2beta2.HorizontalPodAutoscaler:
140-
md = ocsToMetrics(hpa.GetMetrics(o))
141+
md = hpa.GetMetrics(dc.settings, o)
141142
case *quotav1.ClusterResourceQuota:
142143
md = ocsToMetrics(clusterresourcequota.GetMetrics(o))
143144
default:
@@ -156,7 +157,7 @@ func (dc *DataCollector) SyncMetadata(obj interface{}) map[experimentalmetricmet
156157
km := map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata{}
157158
switch o := obj.(type) {
158159
case *corev1.Pod:
159-
km = pod.GetMetadata(o, dc.metadataStore, dc.logger)
160+
km = pod.GetMetadata(o, dc.metadataStore, dc.settings.TelemetrySettings.Logger)
160161
case *corev1.Node:
161162
km = node.GetMetadata(o)
162163
case *corev1.ReplicationController:

receiver/k8sclusterreceiver/internal/collection/collector_test.go

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

2020
"github.com/stretchr/testify/require"
21+
"go.opentelemetry.io/collector/receiver/receivertest"
2122
"go.uber.org/zap"
2223
"go.uber.org/zap/zapcore"
2324
"go.uber.org/zap/zaptest/observer"
@@ -274,10 +275,11 @@ func TestDataCollectorSyncMetadata(t *testing.T) {
274275

275276
for _, tt := range tests {
276277
observedLogger, _ := observer.New(zapcore.WarnLevel)
277-
logger := zap.New(observedLogger)
278+
set := receivertest.NewNopCreateSettings()
279+
set.TelemetrySettings.Logger = zap.New(observedLogger)
278280
t.Run(tt.name, func(t *testing.T) {
279281
dc := &DataCollector{
280-
logger: logger,
282+
settings: set,
281283
metadataStore: tt.metadataStore,
282284
nodeConditionsToReport: []string{},
283285
}

receiver/k8sclusterreceiver/internal/constants/constants.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@ const (
2323
// Resource labels keys for UID.
2424
K8sKeyNamespaceUID = "k8s.namespace.uid"
2525
K8sKeyReplicationControllerUID = "k8s.replicationcontroller.uid"
26-
K8sKeyHPAUID = "k8s.hpa.uid"
2726
K8sKeyResourceQuotaUID = "k8s.resourcequota.uid"
2827
K8sKeyClusterResourceQuotaUID = "openshift.clusterquota.uid"
2928

3029
// Resource labels keys for Name.
3130
K8sKeyReplicationControllerName = "k8s.replicationcontroller.name"
32-
K8sKeyHPAName = "k8s.hpa.name"
3331
K8sKeyResourceQuotaName = "k8s.resourcequota.name"
3432
K8sKeyClusterResourceQuotaName = "openshift.clusterquota.name"
3533

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright The OpenTelemetry Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
//go:build !windows
16+
// +build !windows
17+
18+
//go:generate mdatagen metadata.yaml
19+
20+
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: 14 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -15,91 +15,27 @@
1515
package hpa // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/hpa"
1616

1717
import (
18-
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
19-
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
20-
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
21-
conventions "go.opentelemetry.io/collector/semconv/v1.6.1"
18+
"time"
19+
20+
"go.opentelemetry.io/collector/pdata/pcommon"
21+
"go.opentelemetry.io/collector/pdata/pmetric"
22+
"go.opentelemetry.io/collector/receiver"
2223
autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2"
2324

2425
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata"
25-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/constants"
26+
imetadata "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/hpa/internal/metadata"
2627
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/metadata"
27-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/utils"
2828
)
2929

30-
var hpaMaxReplicasMetric = &metricspb.MetricDescriptor{
31-
Name: "k8s.hpa.max_replicas",
32-
Description: "Maximum number of replicas to which the autoscaler can scale up",
33-
Unit: "1",
34-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
35-
}
36-
37-
var hpaMinReplicasMetric = &metricspb.MetricDescriptor{
38-
Name: "k8s.hpa.min_replicas",
39-
Description: "Minimum number of replicas to which the autoscaler can scale down",
40-
Unit: "1",
41-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
42-
}
43-
44-
var hpaCurrentReplicasMetric = &metricspb.MetricDescriptor{
45-
Name: "k8s.hpa.current_replicas",
46-
Description: "Current number of pod replicas managed by this autoscaler",
47-
Unit: "1",
48-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
49-
}
50-
51-
var hpaDesiredReplicasMetric = &metricspb.MetricDescriptor{
52-
Name: "k8s.hpa.desired_replicas",
53-
Description: "Desired number of pod replicas managed by this autoscaler",
54-
Unit: "1",
55-
Type: metricspb.MetricDescriptor_GAUGE_INT64,
56-
}
57-
58-
func GetMetrics(hpa *autoscalingv2beta2.HorizontalPodAutoscaler) []*agentmetricspb.ExportMetricsServiceRequest {
59-
metrics := []*metricspb.Metric{
60-
{
61-
MetricDescriptor: hpaMaxReplicasMetric,
62-
Timeseries: []*metricspb.TimeSeries{
63-
utils.GetInt64TimeSeries(int64(hpa.Spec.MaxReplicas)),
64-
},
65-
},
66-
{
67-
MetricDescriptor: hpaMinReplicasMetric,
68-
Timeseries: []*metricspb.TimeSeries{
69-
utils.GetInt64TimeSeries(int64(*hpa.Spec.MinReplicas)),
70-
},
71-
},
72-
{
73-
MetricDescriptor: hpaCurrentReplicasMetric,
74-
Timeseries: []*metricspb.TimeSeries{
75-
utils.GetInt64TimeSeries(int64(hpa.Status.CurrentReplicas)),
76-
},
77-
},
78-
{
79-
MetricDescriptor: hpaDesiredReplicasMetric,
80-
Timeseries: []*metricspb.TimeSeries{
81-
utils.GetInt64TimeSeries(int64(hpa.Status.DesiredReplicas)),
82-
},
83-
},
84-
}
30+
func GetMetrics(set receiver.CreateSettings, hpa *autoscalingv2beta2.HorizontalPodAutoscaler) pmetric.Metrics {
31+
mb := imetadata.NewMetricsBuilder(imetadata.DefaultMetricsSettings(), set)
8532

86-
return []*agentmetricspb.ExportMetricsServiceRequest{
87-
{
88-
Resource: getResourceForHPA(hpa),
89-
Metrics: metrics,
90-
},
91-
}
92-
}
93-
94-
func getResourceForHPA(hpa *autoscalingv2beta2.HorizontalPodAutoscaler) *resourcepb.Resource {
95-
return &resourcepb.Resource{
96-
Type: constants.K8sType,
97-
Labels: map[string]string{
98-
constants.K8sKeyHPAUID: string(hpa.UID),
99-
constants.K8sKeyHPAName: hpa.Name,
100-
conventions.AttributeK8SNamespaceName: hpa.Namespace,
101-
},
102-
}
33+
ts := pcommon.NewTimestampFromTime(time.Now())
34+
mb.RecordK8sHpaMaxReplicasDataPoint(ts, int64(hpa.Spec.MaxReplicas))
35+
mb.RecordK8sHpaMinReplicasDataPoint(ts, int64(*hpa.Spec.MinReplicas))
36+
mb.RecordK8sHpaCurrentReplicasDataPoint(ts, int64(hpa.Status.CurrentReplicas))
37+
mb.RecordK8sHpaDesiredReplicasDataPoint(ts, int64(hpa.Status.DesiredReplicas))
38+
return mb.Emit(imetadata.WithK8sHpaUID(string(hpa.UID)), imetadata.WithK8sHpaName(hpa.Name), imetadata.WithK8sNamespaceName(hpa.Namespace))
10339
}
10440

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

receiver/k8sclusterreceiver/internal/hpa/hpa_test.go

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,37 @@ package hpa
1717
import (
1818
"testing"
1919

20-
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
20+
"github.com/stretchr/testify/assert"
2121
"github.com/stretchr/testify/require"
22+
"go.opentelemetry.io/collector/pdata/pmetric"
23+
"go.opentelemetry.io/collector/receiver/receivertest"
2224

23-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/constants"
2425
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/testutils"
2526
)
2627

2728
func TestHPAMetrics(t *testing.T) {
2829
hpa := testutils.NewHPA("1")
2930

30-
actualResourceMetrics := GetMetrics(hpa)
31+
md := GetMetrics(receivertest.NewNopCreateSettings(), hpa)
3132

32-
require.Equal(t, 1, len(actualResourceMetrics))
33-
require.Equal(t, 4, len(actualResourceMetrics[0].Metrics))
34-
35-
rm := actualResourceMetrics[0]
36-
testutils.AssertResource(t, rm.Resource, constants.K8sType,
37-
map[string]string{
33+
require.Equal(t, 1, md.ResourceMetrics().Len())
34+
rm := md.ResourceMetrics().At(0)
35+
assert.Equal(t,
36+
map[string]any{
3837
"k8s.hpa.uid": "test-hpa-1-uid",
3938
"k8s.hpa.name": "test-hpa-1",
4039
"k8s.namespace.name": "test-namespace",
4140
},
42-
)
43-
44-
testutils.AssertMetricsInt(t, rm.Metrics[0], "k8s.hpa.max_replicas",
45-
metricspb.MetricDescriptor_GAUGE_INT64, 10)
46-
47-
testutils.AssertMetricsInt(t, rm.Metrics[1], "k8s.hpa.min_replicas",
48-
metricspb.MetricDescriptor_GAUGE_INT64, 2)
49-
50-
testutils.AssertMetricsInt(t, rm.Metrics[2], "k8s.hpa.current_replicas",
51-
metricspb.MetricDescriptor_GAUGE_INT64, 5)
52-
53-
testutils.AssertMetricsInt(t, rm.Metrics[3], "k8s.hpa.desired_replicas",
54-
metricspb.MetricDescriptor_GAUGE_INT64, 7)
41+
rm.Resource().Attributes().AsRaw())
42+
43+
require.Equal(t, 1, rm.ScopeMetrics().Len())
44+
sms := rm.ScopeMetrics().At(0)
45+
require.Equal(t, 4, sms.Metrics().Len())
46+
sms.Metrics().Sort(func(a, b pmetric.Metric) bool {
47+
return a.Name() < b.Name()
48+
})
49+
testutils.AssertMetricInt(t, sms.Metrics().At(0), "k8s.hpa.current_replicas", pmetric.MetricTypeGauge, 5)
50+
testutils.AssertMetricInt(t, sms.Metrics().At(1), "k8s.hpa.desired_replicas", pmetric.MetricTypeGauge, 7)
51+
testutils.AssertMetricInt(t, sms.Metrics().At(2), "k8s.hpa.max_replicas", pmetric.MetricTypeGauge, 10)
52+
testutils.AssertMetricInt(t, sms.Metrics().At(3), "k8s.hpa.min_replicas", pmetric.MetricTypeGauge, 2)
5553
}

0 commit comments

Comments
 (0)