Skip to content

Commit a02b361

Browse files
paweljwclaude
andauthored
More legible errors (#36)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 68f58f9 commit a02b361

20 files changed

Lines changed: 274 additions & 189 deletions

.github/workflows/ci.yaml

Lines changed: 12 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -16,147 +16,15 @@ jobs:
1616
- name: Install Helm
1717
uses: azure/setup-helm@v4.3.0
1818

19-
- name: Lint chart
20-
run: helm lint . --set collector.env.COLLECTOR_SECRET=test123
21-
22-
- name: Test template with COLLECTOR_SECRET
23-
run: helm template test . --set collector.env.COLLECTOR_SECRET=test123
24-
25-
- name: Test template with envFrom
26-
run: helm template test . --set-json 'collector.envFrom=[{"secretRef":{"name":"my-secret"}}]'
27-
28-
- name: Test template with collectOtel ports
29-
run: |
30-
output=$(helm template test . --set collector.env.COLLECTOR_SECRET=test123 --set collectOtel.grpcPort=4317 --set collectOtel.httpPort=4318)
31-
echo "$output" | grep -q 'hostPort: 4317' || { echo "Missing hostPort 4317"; exit 1; }
32-
echo "$output" | grep -q 'hostPort: 4318' || { echo "Missing hostPort 4318"; exit 1; }
33-
echo "$output" | grep -q 'containerPort: 4317' || { echo "Missing containerPort 4317"; exit 1; }
34-
echo "$output" | grep -q 'containerPort: 4318' || { echo "Missing containerPort 4318"; exit 1; }
35-
echo "$output" | grep -q 'COLLECT_OTEL_GRPC_PORT' || { echo "Missing COLLECT_OTEL_GRPC_PORT env var"; exit 1; }
36-
echo "$output" | grep -q 'COLLECT_OTEL_HTTP_PORT' || { echo "Missing COLLECT_OTEL_HTTP_PORT env var"; exit 1; }
37-
38-
- name: Test template without collectOtel ports has no otel ports
39-
run: |
40-
output=$(helm template test . --set collector.env.COLLECTOR_SECRET=test123)
41-
if echo "$output" | grep -q 'otel-grpc\|otel-http'; then
42-
echo "Unexpected otel ports when collectOtel ports are not set"
43-
exit 1
44-
fi
45-
if echo "$output" | grep -q 'COLLECT_OTEL_GRPC_PORT\|COLLECT_OTEL_HTTP_PORT'; then
46-
echo "Unexpected COLLECT_OTEL env vars when collectOtel ports are not set"
47-
exit 1
48-
fi
49-
50-
- name: Test validation fails without secret
51-
run: |
52-
if helm template test . 2>&1; then
53-
echo "Expected validation to fail but it passed"
54-
exit 1
55-
fi
56-
57-
- name: Test deprecated beyla key still works
58-
run: |
59-
output=$(helm template test . --set collector.env.COLLECTOR_SECRET=test123)
60-
if ! echo "$output" | grep -q "name: ebpf"; then
61-
echo "Expected ebpf container to be present when using beyla key"
62-
exit 1
63-
fi
64-
65-
- name: Test new ebpf key works
66-
run: |
67-
output=$(helm template test . \
68-
--set collector.env.COLLECTOR_SECRET=test123 \
69-
--set ebpf.enabled=true \
70-
--set ebpf.image.repository=ghcr.io/betterstackhq/collector-ebpf \
71-
--set ebpf.image.tag=v1.0.0 \
72-
--set ebpf.image.pullPolicy=Always \
73-
--set 'ebpf.env.GOMEMLIMIT=1400MiB' \
74-
--set ebpf.dockerprobe.enabled=false \
75-
--set ebpf.memoryRestartThreshold=1450 \
76-
--set-json 'ebpf.resources={"limits":{"cpu":"1000m","memory":"3000Mi"},"requests":{"cpu":"800m","memory":"1000Mi"}}' \
77-
--set securityContext.ebpf.privileged=true)
78-
if ! echo "$output" | grep -q "name: ebpf"; then
79-
echo "Expected ebpf container when using ebpf key"
80-
exit 1
81-
fi
82-
if ! echo "$output" | grep -q "v1.0.0"; then
83-
echo "Expected custom image tag v1.0.0"
84-
exit 1
85-
fi
86-
87-
- name: Test ebpf key takes precedence over beyla
88-
run: |
89-
output=$(helm template test . \
90-
--set collector.env.COLLECTOR_SECRET=test123 \
91-
--set beyla.image.tag=old-tag \
92-
--set ebpf.enabled=true \
93-
--set ebpf.image.repository=ghcr.io/betterstackhq/collector-ebpf \
94-
--set ebpf.image.tag=new-tag \
95-
--set ebpf.image.pullPolicy=Always \
96-
--set 'ebpf.env.GOMEMLIMIT=1400MiB' \
97-
--set ebpf.dockerprobe.enabled=false \
98-
--set ebpf.memoryRestartThreshold=1450 \
99-
--set-json 'ebpf.resources={"limits":{"cpu":"1000m","memory":"3000Mi"},"requests":{"cpu":"800m","memory":"1000Mi"}}' \
100-
--set securityContext.ebpf.privileged=true)
101-
if echo "$output" | grep -q "old-tag"; then
102-
echo "Expected ebpf key to take precedence, but found old-tag from beyla"
103-
exit 1
104-
fi
105-
if ! echo "$output" | grep -q "new-tag"; then
106-
echo "Expected new-tag from ebpf key"
107-
exit 1
108-
fi
109-
110-
- name: Test envFrom with beyla key (backward compat)
111-
run: |
112-
output=$(helm template test . \
113-
--set collector.env.COLLECTOR_SECRET=test123 \
114-
--set-json 'beyla.envFrom=[{"secretRef":{"name":"beyla-secret"}}]')
115-
if ! echo "$output" | grep -q "beyla-secret"; then
116-
echo "Expected beyla-secret in envFrom"
117-
exit 1
118-
fi
119-
120-
- name: Test envFrom with ebpf key
121-
run: |
122-
output=$(helm template test . \
123-
--set collector.env.COLLECTOR_SECRET=test123 \
124-
--set ebpf.enabled=true \
125-
--set ebpf.image.repository=ghcr.io/betterstackhq/collector-ebpf \
126-
--set ebpf.image.tag=latest \
127-
--set ebpf.image.pullPolicy=Always \
128-
--set 'ebpf.env.GOMEMLIMIT=1400MiB' \
129-
--set ebpf.dockerprobe.enabled=false \
130-
--set ebpf.memoryRestartThreshold=1450 \
131-
--set-json 'ebpf.resources={"limits":{"cpu":"1000m","memory":"3000Mi"},"requests":{"cpu":"800m","memory":"1000Mi"}}' \
132-
--set securityContext.ebpf.privileged=true \
133-
--set-json 'ebpf.envFrom=[{"secretRef":{"name":"ebpf-secret"}}]')
134-
if ! echo "$output" | grep -q "ebpf-secret"; then
135-
echo "Expected ebpf-secret in envFrom"
136-
exit 1
137-
fi
138-
139-
- name: Test ebpf disabled
140-
run: |
141-
output=$(helm template test . \
142-
--set collector.env.COLLECTOR_SECRET=test123 \
143-
--set beyla.enabled=false)
144-
if echo "$output" | grep -q "name: ebpf"; then
145-
echo "Expected ebpf container to be absent when disabled"
146-
exit 1
147-
fi
148-
149-
- name: Test partial ebpf override (only resources) still enables ebpf
150-
run: |
151-
output=$(helm template test . \
152-
--set collector.env.COLLECTOR_SECRET=test123 \
153-
--set ebpf.resources.requests.cpu=400m \
154-
--set ebpf.resources.limits.cpu=800m)
155-
if ! echo "$output" | grep -q "name: ebpf"; then
156-
echo "Expected ebpf container when setting ebpf.resources without ebpf.enabled"
157-
exit 1
158-
fi
159-
if ! echo "$output" | grep -q "ghcr.io/betterstackhq/collector-ebpf"; then
160-
echo "Expected default ebpf image from beyla defaults"
161-
exit 1
162-
fi
19+
- name: Run tests
20+
run: |
21+
failed=0
22+
for test in tests/[0-9]*.sh; do
23+
echo "--- Running $test ---"
24+
if bash "$test"; then
25+
:
26+
else
27+
failed=1
28+
fi
29+
done
30+
exit $failed

Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: v2
22
name: collector
33
description: A Helm chart for Better Stack Collector - monitoring solution that collects metrics, logs, and traces
44
type: application
5-
version: 0.1.37
5+
version: 0.1.38
66
appVersion: "latest"
77
keywords:
88
- monitoring

templates/NOTES.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ Better Stack Collector has been deployed.
22

33
{{- if include "better-stack-collector.ebpf.usingDeprecatedKey" . }}
44

5-
WARNING: You are using the deprecated 'beyla' configuration key.
6-
Please migrate to 'ebpf' in your values.yaml:
5+
WARNING: Your release contains values under the deprecated 'beyla' key.
6+
This may happen because you explicitly set 'beyla' values, or because
7+
'helm upgrade --reuse-values' carried them over from an older chart version.
8+
9+
Please migrate your eBPF configuration to the 'ebpf' key:
710

811
Before (deprecated):
912
beyla:
@@ -21,5 +24,8 @@ Please migrate to 'ebpf' in your values.yaml:
2124
ebpf:
2225
privileged: true
2326

27+
If you use --reuse-values, switch to --reset-values with an explicit values
28+
file to avoid carrying over the old 'beyla' key.
29+
2430
The 'beyla' key will be removed in a future release.
2531
{{- end }}

templates/_helpers.tpl

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,65 @@ Create the name of the service account to use
6666
Validate required values
6767
*/}}
6868
{{- define "better-stack-collector.validateValues" -}}
69+
{{- if and .Values.collector.envFrom (eq (kindOf .Values.collector.envFrom) "map") }}
70+
{{- fail `Legacy envFrom format detected in collector.envFrom. The chart no longer supports the secretRefs/configMapRefs format.
71+
72+
Please update your values from:
73+
74+
collector:
75+
envFrom:
76+
secretRefs: ["my-secret"]
77+
78+
To the standard Kubernetes envFrom format:
79+
80+
collector:
81+
envFrom:
82+
- secretRef:
83+
name: my-secret` }}
84+
{{- end }}
85+
{{- $ebpf := include "better-stack-collector.ebpf" . | fromYaml -}}
86+
{{- if and $ebpf.envFrom (eq (kindOf $ebpf.envFrom) "map") }}
87+
{{- fail `Legacy envFrom format detected in ebpf.envFrom. The chart no longer supports the secretRefs/configMapRefs format.
88+
89+
Please update your values from:
90+
91+
ebpf:
92+
envFrom:
93+
secretRefs: ["my-secret"]
94+
95+
To the standard Kubernetes envFrom format:
96+
97+
ebpf:
98+
envFrom:
99+
- secretRef:
100+
name: my-secret` }}
101+
{{- end }}
69102
{{- if not (or .Values.collector.env.COLLECTOR_SECRET (gt (len .Values.collector.envFrom) 0)) }}
70103
{{- fail "COLLECTOR_SECRET is required. Please provide your Better Stack collector secret either via collector.env.COLLECTOR_SECRET or through collector.envFrom (standard Kubernetes envFrom format). Find your collector secret here: https://telemetry.betterstack.com/team/0/collectors." }}
71104
{{- end }}
72105
{{- end }}
73106

74107
{{/*
75-
eBPF config - supports both 'ebpf' (preferred) and 'beyla' (deprecated) keys.
76-
When 'ebpf' is partially set (e.g. only resources), merges over 'beyla' defaults
77-
so that image, env, etc. are still present.
108+
eBPF config - defaults live under 'ebpf'. The deprecated 'beyla' key is still
109+
supported: when set, its values are merged over the ebpf defaults so that
110+
existing beyla-based installs keep working.
78111
*/}}
79112
{{- define "better-stack-collector.ebpf" -}}
80-
{{- if .Values.ebpf -}}
81-
{{- mustMergeOverwrite (deepCopy .Values.beyla) .Values.ebpf | toYaml -}}
113+
{{- if .Values.beyla -}}
114+
{{- mustMergeOverwrite (deepCopy .Values.ebpf) .Values.beyla | toYaml -}}
82115
{{- else -}}
83-
{{- .Values.beyla | toYaml -}}
116+
{{- .Values.ebpf | toYaml -}}
84117
{{- end -}}
85118
{{- end -}}
86119

87120
{{/*
88-
eBPF security context - supports both 'ebpf' (preferred) and 'beyla' (deprecated) keys
121+
eBPF security context - defaults under 'ebpf', deprecated 'beyla' still supported
89122
*/}}
90123
{{- define "better-stack-collector.ebpf.securityContext" -}}
91-
{{- if .Values.securityContext.ebpf -}}
92-
{{- .Values.securityContext.ebpf | toYaml -}}
93-
{{- else -}}
124+
{{- if .Values.securityContext.beyla -}}
94125
{{- .Values.securityContext.beyla | toYaml -}}
126+
{{- else -}}
127+
{{- .Values.securityContext.ebpf | toYaml -}}
95128
{{- end -}}
96129
{{- end -}}
97130

@@ -106,10 +139,12 @@ doesn't accidentally disable eBPF by shadowing the 'beyla.enabled' default.
106139
{{- end -}}
107140

108141
{{/*
109-
Check if using deprecated 'beyla' key
142+
Check if using deprecated 'beyla' key.
143+
Since defaults now live under 'ebpf', .Values.beyla is only truthy when
144+
the user explicitly passes beyla values.
110145
*/}}
111146
{{- define "better-stack-collector.ebpf.usingDeprecatedKey" -}}
112-
{{- if and (not .Values.ebpf) .Values.beyla -}}
147+
{{- if .Values.beyla -}}
113148
true
114149
{{- end -}}
115150
{{- end -}}

tests/01-lint.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
helm lint "$CHART_DIR" --set collector.env.COLLECTOR_SECRET=test123
6+
7+
pass

tests/02-template-with-secret.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
render --set collector.env.COLLECTOR_SECRET=test123 > /dev/null
6+
7+
pass

tests/03-template-with-envfrom.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
render --set-json 'collector.envFrom=[{"secretRef":{"name":"my-secret"}}]' > /dev/null
6+
7+
pass

tests/04-collectotel-ports.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
output=$(render --set collector.env.COLLECTOR_SECRET=test123 --set collectOtel.grpcPort=4317 --set collectOtel.httpPort=4318)
6+
7+
assert_contains "$output" 'hostPort: 4317' "Missing hostPort 4317"
8+
assert_contains "$output" 'hostPort: 4318' "Missing hostPort 4318"
9+
assert_contains "$output" 'containerPort: 4317' "Missing containerPort 4317"
10+
assert_contains "$output" 'containerPort: 4318' "Missing containerPort 4318"
11+
assert_contains "$output" 'COLLECT_OTEL_GRPC_PORT' "Missing COLLECT_OTEL_GRPC_PORT env var"
12+
assert_contains "$output" 'COLLECT_OTEL_HTTP_PORT' "Missing COLLECT_OTEL_HTTP_PORT env var"
13+
14+
pass

tests/05-no-collectotel-ports.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
output=$(render --set collector.env.COLLECTOR_SECRET=test123)
6+
7+
assert_not_contains "$output" 'otel-grpc\|otel-http' "Unexpected otel ports when collectOtel ports are not set"
8+
assert_not_contains "$output" 'COLLECT_OTEL_GRPC_PORT\|COLLECT_OTEL_HTTP_PORT' "Unexpected COLLECT_OTEL env vars when collectOtel ports are not set"
9+
10+
pass
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
source "$(dirname "$0")/helpers.sh"
4+
5+
assert_fail render
6+
7+
pass

0 commit comments

Comments
 (0)