Skip to content

Commit eef773b

Browse files
fix(monitoringstack): Changed the way EnableOTLP is passed to Prometheus
1 parent 8627d46 commit eef773b

File tree

4 files changed

+83
-10
lines changed

4 files changed

+83
-10
lines changed

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ replace (
4444
github.com/rhobs/observability-operator/pkg/apis => ./pkg/apis
4545
)
4646

47+
require github.com/blang/semver/v4 v4.0.0
48+
4749
require (
4850
cel.dev/expr v0.24.0 // indirect
4951
dario.cat/mergo v1.0.2 // indirect
@@ -52,7 +54,6 @@ require (
5254
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
5355
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
5456
github.com/beorn7/perks v1.0.1 // indirect
55-
github.com/blang/semver/v4 v4.0.0 // indirect
5657
github.com/brunoga/deep v1.2.5 // indirect
5758
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
5859
github.com/cespare/xxhash/v2 v2.3.0 // indirect

pkg/controllers/monitoring/monitoring-stack/components.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"fmt"
55
"path/filepath"
66
"reflect"
7+
"strings"
78

9+
"github.com/blang/semver/v4"
810
monv1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1"
911
corev1 "k8s.io/api/core/v1"
1012
policyv1 "k8s.io/api/policy/v1"
@@ -136,6 +138,18 @@ func newPrometheus(
136138

137139
config := ms.Spec.PrometheusConfig
138140

141+
detectedVersion := ""
142+
if prometheusCfg.Image != "" {
143+
parts := strings.Split(prometheusCfg.Image, ":")
144+
if len(parts) > 1 {
145+
tag := parts[len(parts)-1]
146+
cleanTag := strings.TrimPrefix(tag, "v")
147+
if _, err := semver.ParseTolerant(cleanTag); err == nil {
148+
detectedVersion = cleanTag
149+
}
150+
}
151+
}
152+
139153
prometheus := &monv1.Prometheus{
140154
TypeMeta: metav1.TypeMeta{
141155
APIVersion: monv1.SchemeGroupVersion.String(),
@@ -202,12 +216,8 @@ func newPrometheus(
202216
RemoteWrite: config.RemoteWrite,
203217
ExternalLabels: config.ExternalLabels,
204218
EnableRemoteWriteReceiver: config.EnableRemoteWriteReceiver,
205-
EnableFeatures: func() []monv1.EnableFeature {
206-
if config.EnableOtlpHttpReceiver != nil && *config.EnableOtlpHttpReceiver {
207-
return []monv1.EnableFeature{"otlp-write-receiver"}
208-
}
209-
return []monv1.EnableFeature{}
210-
}(),
219+
Version: detectedVersion,
220+
EnableOTLPReceiver: config.EnableOtlpHttpReceiver,
211221
},
212222
Retention: ms.Spec.Retention,
213223
RuleSelector: prometheusSelector,

test/e2e/framework/assertions.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,55 @@ func (f *Framework) AssertStatefulsetReady(name, namespace string, fns ...Option
159159
}
160160
}
161161

162+
// AssertStatefulSetContainerHasArg asserts that a specific container in a StatefulSet's
163+
// Pod template contains the expected command-line argument.
164+
func (f *Framework) AssertStatefulSetContainerHasArg(t *testing.T, name, namespace, containerName, expectedArg string, fns ...OptionFn) func(t *testing.T) {
165+
option := AssertOption{
166+
PollInterval: 5 * time.Second,
167+
WaitTimeout: DefaultTestTimeout,
168+
}
169+
for _, fn := range fns {
170+
fn(&option)
171+
}
172+
173+
return func(t *testing.T) {
174+
t.Helper()
175+
statefulSet := &appsv1.StatefulSet{}
176+
key := types.NamespacedName{Name: name, Namespace: namespace}
177+
178+
if err := wait.PollUntilContextTimeout(context.Background(), option.PollInterval, option.WaitTimeout, true, func(ctx context.Context) (bool, error) {
179+
180+
if err := f.K8sClient.Get(ctx, key, statefulSet); apierrors.IsNotFound(err) {
181+
return false, nil
182+
}
183+
184+
var container *v1.Container
185+
for i, c := range statefulSet.Spec.Template.Spec.Containers {
186+
if c.Name == containerName {
187+
container = &statefulSet.Spec.Template.Spec.Containers[i]
188+
break
189+
}
190+
}
191+
192+
if container == nil {
193+
return false, fmt.Errorf("container %q not found in StatefulSet template", containerName)
194+
}
195+
196+
for _, arg := range container.Args {
197+
if arg == expectedArg {
198+
return true, nil
199+
}
200+
}
201+
202+
t.Logf("StatefulSet %s container %q args are missing %q. Retrying...", name, containerName, expectedArg)
203+
return false, nil
204+
}); wait.Interrupted(err) {
205+
t.Fatalf("StatefulSet %s failed to contain argument %q in container %q within timeout. Final args: %v",
206+
name, expectedArg, containerName, statefulSet.Spec.Template.Spec.Containers[0].Args)
207+
}
208+
}
209+
}
210+
162211
// AssertDeploymentReady asserts that a deployment has the desired number of pods running
163212
func (f *Framework) AssertDeploymentReady(name, namespace string, fns ...OptionFn) func(t *testing.T) {
164213
option := AssertOption{

test/e2e/monitoring_stack_controller_test.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ func TestMonitoringStackController(t *testing.T) {
130130
}, {
131131
name: "Prometheus stacks can scrape themselves behind TLS",
132132
scenario: assertPrometheusScrapesItselfTLS,
133+
}, {
134+
name: "Assert OTLP receiver flag is set when enabled in CR",
135+
scenario: assertDefaultOTLPFlagIsSet,
133136
}}
134137
for _, tc := range ts {
135138
t.Run(tc.name, tc.scenario)
@@ -969,6 +972,18 @@ func assertPrometheusScrapesItselfTLS(t *testing.T) {
969972
}
970973
}
971974

975+
func assertDefaultOTLPFlagIsSet(t *testing.T) {
976+
ms := newMonitoringStack(t, "otlp-flag-test")
977+
ms.Spec.PrometheusConfig = &stack.PrometheusConfig{
978+
EnableOtlpHttpReceiver: ptr.To(true),
979+
}
980+
981+
err := f.K8sClient.Create(context.Background(), ms)
982+
assert.NilError(t, err, "failed to create a monitoring stack")
983+
984+
f.AssertStatefulSetContainerHasArg(t, "prometheus-"+ms.Name, e2eTestNamespace, "prometheus", "--web.enable-otlp-receiver")(t)
985+
}
986+
972987
// Update this json when a new Prometheus field is set by MonitoringStack
973988
const oboManagedFieldsJson = `
974989
{
@@ -998,9 +1013,7 @@ const oboManagedFieldsJson = `
9981013
"f:probeNamespaceSelector": {},
9991014
"f:probeSelector": {},
10001015
"f:remoteWrite": {},
1001-
"f:enableFeatures": {
1002-
"v:\"otlp-write-receiver\"": {}
1003-
},
1016+
"f:enableOTLPReceiver": {},
10041017
"f:replicas": {},
10051018
"f:resources": {},
10061019
"f:retention": {},

0 commit comments

Comments
 (0)