Skip to content

Commit 195ef43

Browse files
authored
[receiver/k8s_cluster] Switch k8s.deployment metrics to use pdata. (open-telemetry#23416)
1 parent 0ae07ba commit 195ef43

File tree

16 files changed

+823
-49
lines changed

16 files changed

+823
-49
lines changed

.chloggen/switchk8sdeployment.yaml

+11
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.deployment metrics to use pdata.
9+
10+
# One or more tracking issues related to the change
11+
issues: [23416]

pkg/pdatatest/pmetrictest/options.go

+18
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,24 @@ func sortResourceMetricsSlice(rms pmetric.ResourceMetricsSlice) {
315315
})
316316
}
317317

318+
func IgnoreScopeVersion() CompareMetricsOption {
319+
return compareMetricsOptionFunc(func(expected, actual pmetric.Metrics) {
320+
maskScopeVersion(expected)
321+
maskScopeVersion(actual)
322+
})
323+
}
324+
325+
func maskScopeVersion(metrics pmetric.Metrics) {
326+
rms := metrics.ResourceMetrics()
327+
for i := 0; i < rms.Len(); i++ {
328+
rm := rms.At(i)
329+
for j := 0; j < rm.ScopeMetrics().Len(); j++ {
330+
sm := rm.ScopeMetrics().At(j)
331+
sm.Scope().SetVersion("")
332+
}
333+
}
334+
}
335+
318336
// IgnoreScopeMetricsOrder is a CompareMetricsOption that ignores the order of instrumentation scope traces/metrics/logs.
319337
func IgnoreScopeMetricsOrder() CompareMetricsOption {
320338
return compareMetricsOptionFunc(func(expected, actual pmetric.Metrics) {

receiver/k8sclusterreceiver/e2e_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ func TestE2E(t *testing.T) {
100100
pmetrictest.ChangeResourceAttributeValue("k8s.namespace.uid", replaceWithStar),
101101
pmetrictest.ChangeResourceAttributeValue("k8s.daemonset.uid", replaceWithStar),
102102
pmetrictest.ChangeResourceAttributeValue("container.image.name", containerImageShorten),
103+
pmetrictest.IgnoreScopeVersion(),
103104
pmetrictest.IgnoreResourceMetricsOrder(),
104105
pmetrictest.IgnoreMetricsOrder(),
105106
pmetrictest.IgnoreScopeMetricsOrder(),

receiver/k8sclusterreceiver/internal/collection/collector.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (dc *DataCollector) SyncMetrics(obj interface{}) {
114114
case *corev1.ResourceQuota:
115115
md = resourcequota.GetMetrics(dc.settings, o)
116116
case *appsv1.Deployment:
117-
md = ocsToMetrics(deployment.GetMetrics(o))
117+
md = deployment.GetMetrics(dc.settings, o)
118118
case *appsv1.ReplicaSet:
119119
md = ocsToMetrics(replicaset.GetMetrics(o))
120120
case *appsv1.DaemonSet:

receiver/k8sclusterreceiver/internal/deployment/deployments.go

+12-29
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,26 @@
44
package deployment // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/deployment"
55

66
import (
7-
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
8-
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
7+
"time"
8+
9+
"go.opentelemetry.io/collector/pdata/pcommon"
10+
"go.opentelemetry.io/collector/pdata/pmetric"
11+
"go.opentelemetry.io/collector/receiver"
912
conventions "go.opentelemetry.io/collector/semconv/v1.6.1"
1013
appsv1 "k8s.io/api/apps/v1"
1114

1215
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata"
1316
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/constants"
17+
imetadata "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/deployment/internal/metadata"
1418
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/metadata"
15-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/replica"
1619
)
1720

18-
func GetMetrics(dep *appsv1.Deployment) []*agentmetricspb.ExportMetricsServiceRequest {
19-
if dep.Spec.Replicas == nil {
20-
return nil
21-
}
22-
23-
return []*agentmetricspb.ExportMetricsServiceRequest{
24-
{
25-
Resource: getResource(dep),
26-
Metrics: replica.GetMetrics(
27-
"deployment",
28-
*dep.Spec.Replicas,
29-
dep.Status.AvailableReplicas,
30-
),
31-
},
32-
}
33-
}
34-
35-
func getResource(dep *appsv1.Deployment) *resourcepb.Resource {
36-
return &resourcepb.Resource{
37-
Type: constants.K8sType,
38-
Labels: map[string]string{
39-
conventions.AttributeK8SDeploymentUID: string(dep.UID),
40-
conventions.AttributeK8SDeploymentName: dep.Name,
41-
conventions.AttributeK8SNamespaceName: dep.Namespace,
42-
},
43-
}
21+
func GetMetrics(set receiver.CreateSettings, dep *appsv1.Deployment) pmetric.Metrics {
22+
mb := imetadata.NewMetricsBuilder(imetadata.DefaultMetricsBuilderConfig(), set)
23+
ts := pcommon.NewTimestampFromTime(time.Now())
24+
mb.RecordK8sDeploymentDesiredDataPoint(ts, int64(*dep.Spec.Replicas))
25+
mb.RecordK8sDeploymentAvailableDataPoint(ts, int64(dep.Status.AvailableReplicas))
26+
return mb.Emit(imetadata.WithK8sDeploymentName(dep.Name), imetadata.WithK8sDeploymentUID(string(dep.UID)), imetadata.WithK8sNamespaceName(dep.Namespace), imetadata.WithOpencensusResourcetype("k8s"))
4427
}
4528

4629
func GetMetadata(dep *appsv1.Deployment) map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata {

receiver/k8sclusterreceiver/internal/deployment/deployments_test.go

+41-16
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,60 @@
44
package deployment
55

66
import (
7+
"path/filepath"
78
"testing"
89

9-
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
10+
"github.com/stretchr/testify/assert"
1011
"github.com/stretchr/testify/require"
12+
"go.opentelemetry.io/collector/pdata/pmetric"
13+
"go.opentelemetry.io/collector/receiver/receivertest"
1114

12-
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/constants"
15+
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/golden"
16+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
1317
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/testutils"
1418
)
1519

1620
func TestDeploymentMetrics(t *testing.T) {
1721
dep := testutils.NewDeployment("1")
1822

19-
actualResourceMetrics := GetMetrics(dep)
23+
m := GetMetrics(receivertest.NewNopCreateSettings(), dep)
2024

21-
require.Equal(t, 1, len(actualResourceMetrics))
22-
require.Equal(t, 2, len(actualResourceMetrics[0].Metrics))
25+
require.Equal(t, 1, m.ResourceMetrics().Len())
26+
require.Equal(t, 2, m.MetricCount())
2327

24-
rm := actualResourceMetrics[0]
25-
testutils.AssertResource(t, rm.Resource, constants.K8sType,
26-
map[string]string{
27-
"k8s.deployment.uid": "test-deployment-1-uid",
28-
"k8s.deployment.name": "test-deployment-1",
29-
"k8s.namespace.name": "test-namespace",
28+
rm := m.ResourceMetrics().At(0)
29+
assert.Equal(t,
30+
map[string]interface{}{
31+
"k8s.deployment.uid": "test-deployment-1-uid",
32+
"k8s.deployment.name": "test-deployment-1",
33+
"k8s.namespace.name": "test-namespace",
34+
"opencensus.resourcetype": "k8s",
3035
},
36+
rm.Resource().Attributes().AsRaw(),
3137
)
38+
require.Equal(t, 1, rm.ScopeMetrics().Len())
39+
sms := rm.ScopeMetrics().At(0)
40+
require.Equal(t, 2, sms.Metrics().Len())
41+
sms.Metrics().Sort(func(a, b pmetric.Metric) bool {
42+
return a.Name() < b.Name()
43+
})
44+
testutils.AssertMetricInt(t, sms.Metrics().At(0), "k8s.deployment.available", pmetric.MetricTypeGauge, int64(3))
45+
testutils.AssertMetricInt(t, sms.Metrics().At(1), "k8s.deployment.desired", pmetric.MetricTypeGauge, int64(10))
46+
}
3247

33-
testutils.AssertMetricsInt(t, rm.Metrics[0], "k8s.deployment.desired",
34-
metricspb.MetricDescriptor_GAUGE_INT64, 10)
35-
36-
testutils.AssertMetricsInt(t, rm.Metrics[1], "k8s.deployment.available",
37-
metricspb.MetricDescriptor_GAUGE_INT64, 3)
48+
func TestGoldenFile(t *testing.T) {
49+
dep := testutils.NewDeployment("1")
50+
m := GetMetrics(receivertest.NewNopCreateSettings(), dep)
51+
expectedFile := filepath.Join("testdata", "expected.yaml")
52+
expected, err := golden.ReadMetrics(expectedFile)
53+
require.NoError(t, err)
54+
require.NoError(t, pmetrictest.CompareMetrics(expected, m,
55+
pmetrictest.IgnoreTimestamp(),
56+
pmetrictest.IgnoreStartTimestamp(),
57+
pmetrictest.IgnoreResourceMetricsOrder(),
58+
pmetrictest.IgnoreMetricsOrder(),
59+
pmetrictest.IgnoreScopeMetricsOrder(),
60+
pmetrictest.IgnoreMetricDataPointsOrder(),
61+
),
62+
)
3863
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:generate mdatagen metadata.yaml
5+
6+
package deployment // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver/internal/deployment"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[comment]: <> (Code generated by mdatagen. DO NOT EDIT.)
2+
3+
# k8s/deployment
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.deployment.available
16+
17+
Total number of available pods (ready for at least minReadySeconds) targeted by this deployment
18+
19+
| Unit | Metric Type | Value Type |
20+
| ---- | ----------- | ---------- |
21+
| 1 | Gauge | Int |
22+
23+
### k8s.deployment.desired
24+
25+
Number of desired pods in this deployment
26+
27+
| Unit | Metric Type | Value Type |
28+
| ---- | ----------- | ---------- |
29+
| 1 | Gauge | Int |
30+
31+
## Resource Attributes
32+
33+
| Name | Description | Values | Enabled |
34+
| ---- | ----------- | ------ | ------- |
35+
| k8s.deployment.name | The name of the Deployment. | Any Str | true |
36+
| k8s.deployment.uid | The UID of the Deployment. | Any Str | true |
37+
| k8s.namespace.name | The name of the namespace that the pod is running in. | Any Str | true |
38+
| opencensus.resourcetype | The OpenCensus resource type. | Any Str | true |

receiver/k8sclusterreceiver/internal/deployment/internal/metadata/generated_config.go

+84
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/k8sclusterreceiver/internal/deployment/internal/metadata/generated_config_test.go

+74
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)