Skip to content

Commit 2d5eb37

Browse files
authored
[chore] Add e2e for receiver/kubeletstats (#26676)
**Description:** <Describe what has changed.> <!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> Adds an E2E test for kubeletstats receiver Updates existing e2e k8s tests to bootstrap kind cluster with valid kubelet certificates. This will make k8s clusters used in the e2e test more inline with the security practices used by real clusters and improve testing with the kubeletstats receiver which connects to kubelet server. **Link to tracking Issue:** [26319](#26319) **Testing:** <Describe what testing was performed and which tests were added.> **Documentation:** <Describe the documentation added.>
1 parent 636cd78 commit 2d5eb37

File tree

12 files changed

+1563
-136
lines changed

12 files changed

+1563
-136
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Cluster
2+
apiVersion: kind.x-k8s.io/v1alpha4
3+
kubeadmConfigPatches:
4+
- |
5+
kind: KubeletConfiguration
6+
serverTLSBootstrap: true

.github/workflows/e2e-tests.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ jobs:
7676
node_image: kindest/node:${{ matrix.k8s-version }}
7777
kubectl_version: ${{ matrix.k8s-version }}
7878
cluster_name: kind
79+
config: ./.github/workflows/configs/e2e-kind-config.yaml
80+
- name: Fix kubelet TLS server certificates
81+
run: |
82+
kubectl get csr -o=jsonpath='{range.items[?(@.spec.signerName=="kubernetes.io/kubelet-serving")]}{.metadata.name}{" "}{end}' | xargs kubectl certificate approve
7983
- name: Download artifact
8084
uses: actions/download-artifact@v3
8185
with:
@@ -95,4 +99,7 @@ jobs:
9599
run: |
96100
cd processor/k8sattributesprocessor
97101
go test -v --tags=e2e
98-
102+
- name: run receiver/kubeletstatsreceiver e2e tests
103+
run: |
104+
cd receiver/kubeletstatsreceiver
105+
go test -v --tags=e2e
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:build e2e
5+
// +build e2e
6+
7+
package kubeletstatsreceiver
8+
9+
import (
10+
"context"
11+
"path/filepath"
12+
"testing"
13+
"time"
14+
15+
"github.com/google/uuid"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
18+
"go.opentelemetry.io/collector/component/componenttest"
19+
"go.opentelemetry.io/collector/consumer/consumertest"
20+
"go.opentelemetry.io/collector/pdata/pmetric"
21+
"go.opentelemetry.io/collector/receiver/otlpreceiver"
22+
"go.opentelemetry.io/collector/receiver/receivertest"
23+
"k8s.io/client-go/dynamic"
24+
"k8s.io/client-go/tools/clientcmd"
25+
26+
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/golden"
27+
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest"
28+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
29+
)
30+
31+
const testKubeConfig = "/tmp/kube-config-otelcol-e2e-testing"
32+
33+
func TestE2E(t *testing.T) {
34+
var expected pmetric.Metrics
35+
expectedFile := filepath.Join("testdata", "e2e", "expected.yaml")
36+
expected, err := golden.ReadMetrics(expectedFile)
37+
require.NoError(t, err)
38+
kubeConfig, err := clientcmd.BuildConfigFromFlags("", testKubeConfig)
39+
require.NoError(t, err)
40+
dynamicClient, err := dynamic.NewForConfig(kubeConfig)
41+
require.NoError(t, err)
42+
43+
testID := uuid.NewString()[:8]
44+
collectorObjs := k8stest.CreateCollectorObjects(t, dynamicClient, testID)
45+
46+
defer func() {
47+
for _, obj := range append(collectorObjs) {
48+
require.NoErrorf(t, k8stest.DeleteObject(dynamicClient, obj), "failed to delete object %s", obj.GetName())
49+
}
50+
}()
51+
52+
metricsConsumer := new(consumertest.MetricsSink)
53+
wantEntries := 10 // Minimal number of metrics to wait for.
54+
waitForData(t, wantEntries, metricsConsumer)
55+
56+
require.NoError(t, pmetrictest.CompareMetrics(expected, metricsConsumer.AllMetrics()[len(metricsConsumer.AllMetrics())-1],
57+
pmetrictest.IgnoreTimestamp(),
58+
pmetrictest.IgnoreStartTimestamp(),
59+
pmetrictest.IgnoreScopeVersion(),
60+
pmetrictest.IgnoreResourceMetricsOrder(),
61+
pmetrictest.IgnoreMetricsOrder(),
62+
pmetrictest.IgnoreScopeMetricsOrder(),
63+
pmetrictest.IgnoreMetricDataPointsOrder(),
64+
pmetrictest.IgnoreMetricValues(),
65+
),
66+
)
67+
}
68+
69+
func waitForData(t *testing.T, entriesNum int, mc *consumertest.MetricsSink) {
70+
f := otlpreceiver.NewFactory()
71+
cfg := f.CreateDefaultConfig().(*otlpreceiver.Config)
72+
73+
rcvr, err := f.CreateMetricsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, mc)
74+
require.NoError(t, rcvr.Start(context.Background(), componenttest.NewNopHost()))
75+
require.NoError(t, err, "failed creating metrics receiver")
76+
defer func() {
77+
assert.NoError(t, rcvr.Shutdown(context.Background()))
78+
}()
79+
80+
timeoutMinutes := 3
81+
require.Eventuallyf(t, func() bool {
82+
return len(mc.AllMetrics()) > entriesNum
83+
}, time.Duration(timeoutMinutes)*time.Minute, 1*time.Second,
84+
"failed to receive %d entries, received %d metrics in %d minutes", entriesNum,
85+
len(mc.AllMetrics()), timeoutMinutes)
86+
}

receiver/kubeletstatsreceiver/go.mod

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ go 1.20
44

55
require (
66
github.com/google/go-cmp v0.5.9
7+
github.com/google/uuid v1.3.1
8+
github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.85.0
79
github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.85.0
10+
github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.85.0
811
github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.85.0
12+
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.85.0
913
github.com/stretchr/testify v1.8.4
1014
go.opentelemetry.io/collector/component v0.85.0
1115
go.opentelemetry.io/collector/config/confignet v0.85.0
@@ -14,6 +18,7 @@ require (
1418
go.opentelemetry.io/collector/consumer v0.85.0
1519
go.opentelemetry.io/collector/pdata v1.0.0-rcv0014
1620
go.opentelemetry.io/collector/receiver v0.85.0
21+
go.opentelemetry.io/collector/receiver/otlpreceiver v0.85.0
1722
go.opentelemetry.io/collector/semconv v0.85.0
1823
go.uber.org/zap v1.25.0
1924
k8s.io/api v0.28.1
@@ -23,9 +28,16 @@ require (
2328
)
2429

2530
require (
31+
github.com/Microsoft/go-winio v0.6.1 // indirect
32+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
2633
github.com/davecgh/go-spew v1.1.1 // indirect
34+
github.com/docker/distribution v2.8.2+incompatible // indirect
35+
github.com/docker/docker v24.0.6+incompatible // indirect
36+
github.com/docker/go-connections v0.4.0 // indirect
37+
github.com/docker/go-units v0.5.0 // indirect
2738
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
2839
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
40+
github.com/felixge/httpsnoop v1.0.3 // indirect
2941
github.com/fsnotify/fsnotify v1.6.0 // indirect
3042
github.com/go-logr/logr v1.2.4 // indirect
3143
github.com/go-logr/stdr v1.2.2 // indirect
@@ -34,12 +46,13 @@ require (
3446
github.com/go-openapi/swag v0.22.3 // indirect
3547
github.com/gogo/protobuf v1.3.2 // indirect
3648
github.com/golang/protobuf v1.5.3 // indirect
49+
github.com/golang/snappy v0.0.4 // indirect
3750
github.com/google/gnostic-models v0.6.8 // indirect
3851
github.com/google/gofuzz v1.2.0 // indirect
39-
github.com/google/uuid v1.3.1 // indirect
4052
github.com/imdario/mergo v0.3.11 // indirect
4153
github.com/josharian/intern v1.0.0 // indirect
4254
github.com/json-iterator/go v1.1.12 // indirect
55+
github.com/klauspost/compress v1.16.7 // indirect
4356
github.com/knadh/koanf v1.5.0 // indirect
4457
github.com/knadh/koanf/v2 v2.0.1 // indirect
4558
github.com/mailru/easyjson v0.7.7 // indirect
@@ -48,32 +61,48 @@ require (
4861
github.com/mitchellh/reflectwalk v1.0.2 // indirect
4962
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
5063
github.com/modern-go/reflect2 v1.0.2 // indirect
64+
github.com/mostynb/go-grpc-compression v1.2.0 // indirect
5165
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
5266
github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.85.0 // indirect
67+
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.85.0 // indirect
68+
github.com/opencontainers/go-digest v1.0.0 // indirect
69+
github.com/opencontainers/image-spec v1.1.0-rc4 // indirect
5370
github.com/openshift/api v3.9.0+incompatible // indirect
5471
github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect
5572
github.com/pkg/errors v0.9.1 // indirect
5673
github.com/pmezard/go-difflib v1.0.0 // indirect
74+
github.com/rs/cors v1.10.0 // indirect
5775
github.com/spf13/pflag v1.0.5 // indirect
5876
go.opencensus.io v0.24.0 // indirect
5977
go.opentelemetry.io/collector v0.85.0 // indirect
78+
go.opentelemetry.io/collector/config/configauth v0.85.0 // indirect
79+
go.opentelemetry.io/collector/config/configcompression v0.85.0 // indirect
80+
go.opentelemetry.io/collector/config/configgrpc v0.85.0 // indirect
81+
go.opentelemetry.io/collector/config/confighttp v0.85.0 // indirect
6082
go.opentelemetry.io/collector/config/configopaque v0.85.0 // indirect
6183
go.opentelemetry.io/collector/config/configtelemetry v0.85.0 // indirect
84+
go.opentelemetry.io/collector/config/internal v0.85.0 // indirect
6285
go.opentelemetry.io/collector/exporter v0.85.0 // indirect
86+
go.opentelemetry.io/collector/extension v0.85.0 // indirect
87+
go.opentelemetry.io/collector/extension/auth v0.85.0 // indirect
6388
go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 // indirect
6489
go.opentelemetry.io/collector/processor v0.85.0 // indirect
90+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.43.0 // indirect
91+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.43.0 // indirect
6592
go.opentelemetry.io/otel v1.17.0 // indirect
6693
go.opentelemetry.io/otel/metric v1.17.0 // indirect
6794
go.opentelemetry.io/otel/sdk v1.17.0 // indirect
6895
go.opentelemetry.io/otel/sdk/metric v0.40.0 // indirect
6996
go.opentelemetry.io/otel/trace v1.17.0 // indirect
7097
go.uber.org/multierr v1.11.0 // indirect
98+
golang.org/x/mod v0.12.0 // indirect
7199
golang.org/x/net v0.15.0 // indirect
72100
golang.org/x/oauth2 v0.12.0 // indirect
73101
golang.org/x/sys v0.12.0 // indirect
74102
golang.org/x/term v0.12.0 // indirect
75103
golang.org/x/text v0.13.0 // indirect
76104
golang.org/x/time v0.3.0 // indirect
105+
golang.org/x/tools v0.13.0 // indirect
77106
google.golang.org/appengine v1.6.7 // indirect
78107
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
79108
google.golang.org/grpc v1.58.0 // indirect
@@ -103,3 +132,14 @@ retract (
103132
v0.76.1
104133
v0.65.0
105134
)
135+
136+
replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal
137+
138+
replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest
139+
140+
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest
141+
142+
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
143+
144+
// ambiguous import: found package cloud.google.com/go/compute/metadata in multiple modules
145+
replace cloud.google.com/go => cloud.google.com/go v0.110.7

0 commit comments

Comments
 (0)