diff --git a/test/e2e/prometheus_test.go b/test/e2e/prometheus_test.go index 81cce797c..f8f4f62c3 100644 --- a/test/e2e/prometheus_test.go +++ b/test/e2e/prometheus_test.go @@ -32,6 +32,7 @@ import ( "testing" "time" + "github.com/blang/semver/v4" "github.com/kylelemons/godebug/pretty" "github.com/stretchr/testify/require" "golang.org/x/net/http2" @@ -5788,6 +5789,39 @@ func testPrometheusUTF8LabelSupport(t *testing.T) { _, err = framework.KubeClient.CoreV1().Services(ns).Create(context.Background(), service, metav1.CreateOptions{}) require.NoError(t, err) + // Determine the Prometheus version that will be used. + promVersion := operator.DefaultPrometheusVersion + if os.Getenv("TEST_PROMETHEUS_V2") == "true" { + promVersion = operator.DefaultPrometheusV2 + } + + // Parse the version to check if it supports UTF-8. + parsedVersion, err := semver.ParseTolerant(promVersion) + require.NoError(t, err) + + supportsUTF8 := parsedVersion.GTE(semver.MustParse("3.0.0")) + + var relabelConfigs []monitoringv1.RelabelConfig + var expectedLabelName string + + if supportsUTF8 { + // Use UTF-8 label for Prometheus 3.0+ + relabelConfigs = []monitoringv1.RelabelConfig{{ + SourceLabels: []monitoringv1.LabelName{"__meta_kubernetes_service_label_cluster"}, + TargetLabel: "service_clustér_label", + Action: "replace", + }} + expectedLabelName = "service_clustér_label" + } else { + // Use ASCII-only label for Prometheus 2.x + relabelConfigs = []monitoringv1.RelabelConfig{{ + SourceLabels: []monitoringv1.LabelName{"__meta_kubernetes_service_label_cluster"}, + TargetLabel: "service_cluster_label", + Action: "replace", + }} + expectedLabelName = "service_cluster_label" + } + sm := &monitoringv1.ServiceMonitor{ ObjectMeta: metav1.ObjectMeta{ Name: "utf8-servicemonitor", @@ -5799,13 +5833,9 @@ func testPrometheusUTF8LabelSupport(t *testing.T) { MatchLabels: map[string]string{"app.name": "instrumented-sample-app"}, }, Endpoints: []monitoringv1.Endpoint{{ - Port: "web", - Interval: "2s", - RelabelConfigs: []monitoringv1.RelabelConfig{{ - SourceLabels: []monitoringv1.LabelName{"__meta_kubernetes_service_label_cluster"}, - TargetLabel: "service_clustér_label", - Action: "replace", - }}, + Port: "web", + Interval: "2s", + RelabelConfigs: relabelConfigs, BasicAuth: &monitoringv1.BasicAuth{ Username: v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{Name: "basic-auth"}, @@ -5847,26 +5877,32 @@ func testPrometheusUTF8LabelSupport(t *testing.T) { // Default Prometheus service name is "prometheus-operated". promSvcName := "prometheus-operated" - // Wait for the instrumented-sample-app target to be discovered + // Wait for the instrumented-sample-app target to be discovered. err = framework.WaitForHealthyTargets(context.Background(), ns, promSvcName, 1) require.NoError(t, err) - // Verify UTF8 labels work in queries. + // Verify label queries work based on the Prometheus version. + queryLabel := fmt.Sprintf(`{"%s"="dev"}`, expectedLabelName) err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) { - results, err := framework.PrometheusQuery(ns, promSvcName, "http", `{"service_clustér_label"="dev"}`) + results, err := framework.PrometheusQuery(ns, promSvcName, "http", queryLabel) if err != nil { - t.Logf("UTF8 label query failed: %v", err) + t.Logf("Label query failed: %v", err) return false, nil } if len(results) == 0 { - t.Logf("UTF8 label query returned no results") + t.Logf("Label query returned no results") return false, nil } return true, nil }) - require.NoError(t, err, "UTF-8 label queries should work in Prometheus 3.0+ queries") + + if supportsUTF8 { + require.NoError(t, err, "UTF-8 label queries should work in Prometheus 3.0+") + } else { + require.NoError(t, err, "ASCII label queries should work in Prometheus 2.x") + } } func isAlertmanagerDiscoveryWorking(ns, promSVCName, alertmanagerName string) func(ctx context.Context) (bool, error) {