Skip to content

Commit 2fad63d

Browse files
committed
feat: add end-to-end tests to ensure consistency with Prometheus
1 parent 37a78cb commit 2fad63d

File tree

13 files changed

+602
-9
lines changed

13 files changed

+602
-9
lines changed

cmd/otel-allocator/internal/prehook/relabel_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import (
1010
"strconv"
1111
"testing"
1212

13-
"github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/internal/target"
1413
"github.com/prometheus/common/model"
1514
"github.com/prometheus/prometheus/model/labels"
1615
"github.com/prometheus/prometheus/model/relabel"
1716
"github.com/stretchr/testify/assert"
1817
logf "sigs.k8s.io/controller-runtime/pkg/log"
18+
19+
"github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/internal/target"
1920
)
2021

2122
var (
@@ -247,7 +248,6 @@ func TestApply(t *testing.T) {
247248
relabelCfg[key] = nil
248249
}
249250

250-
// cfg = createMockConfig(relabelCfg)
251251
allocatorPrehook.SetConfig(relabelCfg)
252252
remainingItems = allocatorPrehook.Apply(targets)
253253
// relabelCfg is empty so targets should be unfiltered
@@ -379,8 +379,6 @@ func TestDistinctTarget(t *testing.T) {
379379
// The deduplicated result after otel-allocator processing.
380380
allocatorPrehook.SetConfig(relabelCfg)
381381
remainingItems := allocatorPrehook.Apply(duplicatedTargets)
382-
assert.Less(t, len(remainingItems), len(duplicatedTargets), "The remainingItems should be less than the duplicated targets")
383-
384382
remainingItemsMap := make(map[target.ItemHash]*target.Item)
385383
for _, item := range remainingItems {
386384
remainingItemsMap[item.Hash()] = item

cmd/otel-allocator/internal/prehook/testutils.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ import (
1010
"strings"
1111
"time"
1212

13-
"github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/internal/target"
1413
"github.com/prometheus/common/model"
1514
"github.com/prometheus/prometheus/config"
1615
"github.com/prometheus/prometheus/model/labels"
1716
"github.com/prometheus/prometheus/model/relabel"
17+
18+
"github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/internal/target"
1819
)
1920

2021
func CompareTargetsMap(a, b map[target.ItemHash]*target.Item) bool {
@@ -86,7 +87,7 @@ func PopulateLabels(lb *labels.Builder, cfg *config.ScrapeConfig) (res, orig lab
8687

8788
addr := lb.Get(model.AddressLabel)
8889

89-
if err := config.CheckTargetAddress(model.LabelValue(addr)); err != nil {
90+
if err = config.CheckTargetAddress(model.LabelValue(addr)); err != nil {
9091
return labels.EmptyLabels(), labels.EmptyLabels(), err
9192
}
9293

cmd/otel-allocator/internal/target/target.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
package target
55

66
import (
7-
"strconv"
8-
97
"slices"
8+
"strconv"
109
"strings"
1110

1211
"github.com/cespare/xxhash/v2"
13-
1412
"github.com/prometheus/common/model"
1513
"github.com/prometheus/prometheus/model/labels"
1614
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: blackbox-exporter
5+
status:
6+
readyReplicas: 1
7+
replicas: 1
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# BlackBox Exporter - provides probe targets
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: blackbox-exporter
6+
labels:
7+
app: blackbox-exporter
8+
spec:
9+
replicas: 1
10+
selector:
11+
matchLabels:
12+
app: blackbox-exporter
13+
template:
14+
metadata:
15+
labels:
16+
app: blackbox-exporter
17+
spec:
18+
containers:
19+
- name: blackbox-exporter
20+
image: prom/blackbox-exporter:latest
21+
ports:
22+
- containerPort: 9115
23+
name: metrics
24+
args:
25+
- '--config.file=/etc/blackbox_exporter/config.yml'
26+
volumeMounts:
27+
- name: config
28+
mountPath: /etc/blackbox_exporter
29+
readOnly: true
30+
resources:
31+
limits:
32+
cpu: 200m
33+
memory: 128Mi
34+
requests:
35+
cpu: 5m
36+
memory: 64Mi
37+
volumes:
38+
- name: config
39+
configMap:
40+
name: blackbox-config
41+
---
42+
apiVersion: v1
43+
kind: ConfigMap
44+
metadata:
45+
name: blackbox-config
46+
data:
47+
config.yml: |
48+
modules:
49+
http_2xx:
50+
prober: http
51+
timeout: 5s
52+
http:
53+
preferred_ip_protocol: "ip4"
54+
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
55+
valid_status_codes: []
56+
method: GET
57+
---
58+
apiVersion: v1
59+
kind: Service
60+
metadata:
61+
name: blackbox-exporter
62+
labels:
63+
app: blackbox-exporter
64+
spec:
65+
selector:
66+
app: blackbox-exporter
67+
ports:
68+
- name: metrics
69+
port: 9115
70+
targetPort: 9115
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: ta-distributed-targetallocator
5+
status:
6+
readyReplicas: 1
7+
replicas: 1
8+
---
9+
apiVersion: apps/v1
10+
kind: StatefulSet
11+
metadata:
12+
name: ta-distributed-collector
13+
status:
14+
readyReplicas: 2
15+
replicas: 2
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
apiVersion: v1
2+
automountServiceAccountToken: true
3+
kind: ServiceAccount
4+
metadata:
5+
name: ta-common
6+
---
7+
apiVersion: rbac.authorization.k8s.io/v1
8+
kind: ClusterRole
9+
metadata:
10+
name: metrics-consistency-ta
11+
rules:
12+
- apiGroups:
13+
- ""
14+
resources:
15+
- pods
16+
- services
17+
- endpoints
18+
verbs:
19+
- get
20+
- watch
21+
- list
22+
- apiGroups:
23+
- apps
24+
resources:
25+
- statefulsets
26+
verbs:
27+
- get
28+
- watch
29+
- list
30+
- apiGroups:
31+
- discovery.k8s.io
32+
resources:
33+
- endpointslices
34+
verbs:
35+
- get
36+
- watch
37+
- list
38+
- apiGroups:
39+
- networking.k8s.io
40+
resources:
41+
- ingresses
42+
verbs:
43+
- get
44+
- watch
45+
- list
46+
---
47+
apiVersion: rbac.authorization.k8s.io/v1
48+
kind: ClusterRoleBinding
49+
metadata:
50+
name: ta-($namespace)
51+
roleRef:
52+
apiGroup: rbac.authorization.k8s.io
53+
kind: ClusterRole
54+
name: metrics-consistency-ta
55+
subjects:
56+
- kind: ServiceAccount
57+
name: ta-common
58+
namespace: ($namespace)
59+
---
60+
# Target Allocator with OTel Collector
61+
apiVersion: opentelemetry.io/v1beta1
62+
kind: OpenTelemetryCollector
63+
metadata:
64+
name: ta-distributed
65+
labels:
66+
collector-type: ta-distributed
67+
spec:
68+
mode: statefulset
69+
replicas: 2
70+
targetAllocator:
71+
allocationStrategy: least-weighted
72+
serviceAccount: ta-common
73+
enabled: true
74+
prometheusCR:
75+
enabled: false
76+
serviceMonitorSelector: { }
77+
podMonitorSelector: { }
78+
config:
79+
receivers:
80+
prometheus:
81+
config:
82+
global:
83+
scrape_interval: 10s
84+
scrape_configs:
85+
- job_name: 'static-targets'
86+
static_configs:
87+
- targets:
88+
- 'fake-app-1:8081'
89+
- 'fake-app-1:8082'
90+
- 'fake-app-1:8083'
91+
- 'fake-app-1:8084'
92+
- 'fake-app-1:8085'
93+
labels:
94+
env: 'test'
95+
team: 'platform'
96+
relabel_configs:
97+
- source_labels: [__address__]
98+
action: replace
99+
regex: ([^:]+):.*
100+
replacement: $1:8080
101+
target_label: __address__
102+
- source_labels: [env]
103+
target_label: environment
104+
- source_labels: [team]
105+
target_label: team_label
106+
metric_relabel_configs:
107+
- source_labels: [__name__]
108+
action: keep
109+
regex: "^up$"
110+
- source_labels: [job_sign]
111+
action: replace
112+
regex: ".*"
113+
replacement: duplicate_job
114+
target_label: job_sign
115+
- job_name: 'k8s-blackbox-discovery'
116+
kubernetes_sd_configs:
117+
- role: pod
118+
namespaces:
119+
names:
120+
- ($namespace)
121+
relabel_configs:
122+
- source_labels: [__meta_kubernetes_pod_label_app]
123+
action: keep
124+
regex: blackbox-exporter
125+
- source_labels: [__address__]
126+
action: replace
127+
regex: ([^:]+):.*
128+
replacement: $1:9115
129+
target_label: __address__
130+
- source_labels: [__meta_kubernetes_pod_name]
131+
target_label: pod_name
132+
- source_labels: [__meta_kubernetes_namespace]
133+
target_label: kubernetes_namespace
134+
metric_relabel_configs:
135+
- source_labels: [__name__]
136+
action: keep
137+
regex: "^up$"
138+
- source_labels: [job_sign]
139+
action: replace
140+
regex: ".*"
141+
replacement: single_job
142+
target_label: job_sign
143+
processors:
144+
# Ensure metrics are flushed to the exporter at least once
145+
batch:
146+
send_batch_size: 1000
147+
timeout: 20s
148+
exporters:
149+
prometheus:
150+
endpoint: "0.0.0.0:8889"
151+
service:
152+
pipelines:
153+
metrics:
154+
receivers: [prometheus]
155+
processors: [batch]
156+
exporters: [prometheus]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: apps/v1
2+
kind: StatefulSet
3+
metadata:
4+
name: direct-scrape-collector
5+
status:
6+
readyReplicas: 1
7+
replicas: 1
8+

0 commit comments

Comments
 (0)