From 3542e28d7ff89f9822e0a6ad8eebe276c7471b68 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 26 Mar 2024 17:34:01 -0700 Subject: [PATCH 1/9] fix --- .chloggen/fix-keepequal-dropequal.yaml | 16 +++++++++++ cmd/otel-allocator/server/server.go | 38 +++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .chloggen/fix-keepequal-dropequal.yaml diff --git a/.chloggen/fix-keepequal-dropequal.yaml b/.chloggen/fix-keepequal-dropequal.yaml new file mode 100644 index 0000000000..5632b044cf --- /dev/null +++ b/.chloggen/fix-keepequal-dropequal.yaml @@ -0,0 +1,16 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: bug_fix + +# The name of the component, or a single word describing the area of concern, (e.g. operator, target allocator, github action) +component: target allocator + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Fix for keepequal/dropequal action + +# One or more tracking issues related to the change +issues: [2793] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index 9dda8347a7..88487567c1 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -120,8 +120,44 @@ func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.Scrap if err != nil { return err } + + var jobToScrapeConfig map[string]interface{} + err = json.Unmarshal(jsonConfig, &jobToScrapeConfig) + if jobToScrapeConfig != nil { + for _, scrapeConfig := range jobToScrapeConfig { + scrapeConfig := scrapeConfig.(map[string]interface{}) + if scrapeConfig["relabel_configs"] != nil { + relabelConfigs := scrapeConfig["relabel_configs"].([]interface{}) + for _, relabelConfig := range relabelConfigs { + relabelConfig := relabelConfig.(map[string]interface{}) + // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error + // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 + if relabelConfig["action"] == "keepequal" || relabelConfig["action"] == "dropequal" { + delete(relabelConfig, "regex") + } + } + } + if scrapeConfig["metric_relabel_configs"] != nil { + metricRelabelConfigs := scrapeConfig["metric_relabel_configs"].([]interface{}) + for _, metricRelabelConfig := range metricRelabelConfigs { + metricRelabelConfig := metricRelabelConfig.(map[string]interface{}) + // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error + // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 + if metricRelabelConfig["action"] == "keepequal" || metricRelabelConfig["action"] == "dropequal" { + delete(metricRelabelConfig, "regex") + } + } + } + } + } + + jsonConfigNew, err := json.Marshal(jobToScrapeConfig) + if err != nil { + return err + } + s.mtx.Lock() - s.scrapeConfigResponse = jsonConfig + s.scrapeConfigResponse = jsonConfigNew s.mtx.Unlock() return nil } From 76cceab347816546b459994651dfb0af89db46ab Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Apr 2024 13:07:29 -0700 Subject: [PATCH 2/9] add require --- cmd/otel-allocator/server/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index 88487567c1..ac9e7b7fc3 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -16,6 +16,7 @@ package server import ( "context" + "encoding/json" "fmt" "net/http" "net/http/pprof" From 68514e32ef41da17c4e7b9267fe29f4f4689d286 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Apr 2024 13:17:39 -0700 Subject: [PATCH 3/9] fixing lint errors --- cmd/otel-allocator/server/server.go | 43 +++++++++++++++-------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index ac9e7b7fc3..260931b016 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -124,29 +124,30 @@ func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.Scrap var jobToScrapeConfig map[string]interface{} err = json.Unmarshal(jsonConfig, &jobToScrapeConfig) - if jobToScrapeConfig != nil { - for _, scrapeConfig := range jobToScrapeConfig { - scrapeConfig := scrapeConfig.(map[string]interface{}) - if scrapeConfig["relabel_configs"] != nil { - relabelConfigs := scrapeConfig["relabel_configs"].([]interface{}) - for _, relabelConfig := range relabelConfigs { - relabelConfig := relabelConfig.(map[string]interface{}) - // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error - // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 - if relabelConfig["action"] == "keepequal" || relabelConfig["action"] == "dropequal" { - delete(relabelConfig, "regex") - } + if err != nil { + return err + } + for _, scrapeConfig := range jobToScrapeConfig { + scrapeConfig := scrapeConfig.(map[string]interface{}) + if scrapeConfig["relabel_configs"] != nil { + relabelConfigs := scrapeConfig["relabel_configs"].([]interface{}) + for _, relabelConfig := range relabelConfigs { + relabelConfig := relabelConfig.(map[string]interface{}) + // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error + // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 + if relabelConfig["action"] == "keepequal" || relabelConfig["action"] == "dropequal" { + delete(relabelConfig, "regex") } } - if scrapeConfig["metric_relabel_configs"] != nil { - metricRelabelConfigs := scrapeConfig["metric_relabel_configs"].([]interface{}) - for _, metricRelabelConfig := range metricRelabelConfigs { - metricRelabelConfig := metricRelabelConfig.(map[string]interface{}) - // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error - // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 - if metricRelabelConfig["action"] == "keepequal" || metricRelabelConfig["action"] == "dropequal" { - delete(metricRelabelConfig, "regex") - } + } + if scrapeConfig["metric_relabel_configs"] != nil { + metricRelabelConfigs := scrapeConfig["metric_relabel_configs"].([]interface{}) + for _, metricRelabelConfig := range metricRelabelConfigs { + metricRelabelConfig := metricRelabelConfig.(map[string]interface{}) + // Dropping regex key from the map since unmarshalling this on the client(metrics_receiver.go) results in error + // because of the bug here - https://github.com/prometheus/prometheus/issues/12534 + if metricRelabelConfig["action"] == "keepequal" || metricRelabelConfig["action"] == "dropequal" { + delete(metricRelabelConfig, "regex") } } } From 028f90a4df40b9dc398b46522783cee5865ab8c7 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Mon, 8 Apr 2024 16:34:04 -0700 Subject: [PATCH 4/9] adding unit tests --- cmd/otel-allocator/server/server_test.go | 45 ++++ .../testdata/prom-config-all-actions.yaml | 220 ++++++++++++++++++ 2 files changed, 265 insertions(+) create mode 100644 cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml diff --git a/cmd/otel-allocator/server/server_test.go b/cmd/otel-allocator/server/server_test.go index edda74e074..48920927b8 100644 --- a/cmd/otel-allocator/server/server_test.go +++ b/cmd/otel-allocator/server/server_test.go @@ -34,6 +34,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/allocation" + allocatorconfig "github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/config" "github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/target" ) @@ -612,6 +613,50 @@ func TestServer_Readiness(t *testing.T) { } } +func TestServer_ScrapeConfigRespose(t *testing.T) { + tests := []struct { + description string + expectedCode int + }{ + { + description: "Jobs with all actions", + expectedCode: http.StatusOK, + }, + } + for _, tc := range tests { + t.Run(tc.description, func(t *testing.T) { + listenAddr := ":8080" + s := NewServer(logger, nil, listenAddr) + + allocCfg := allocatorconfig.CreateDefaultConfig() + err := allocatorconfig.LoadFromFile("./testdata/prom-config-all-actions.yaml", &allocCfg) + + jobToScrapeConfig := make(map[string]*promconfig.ScrapeConfig) + + for _, scrapeConfig := range allocCfg.PromConfig.ScrapeConfigs { + jobToScrapeConfig[scrapeConfig.JobName] = scrapeConfig + } + + assert.NoError(t, s.UpdateScrapeConfigResponse(jobToScrapeConfig)) + + request := httptest.NewRequest("GET", "/scrape_configs", nil) + w := httptest.NewRecorder() + + s.server.Handler.ServeHTTP(w, request) + result := w.Result() + + assert.Equal(t, tc.expectedCode, result.StatusCode) + bodyBytes, err := io.ReadAll(result.Body) + require.NoError(t, err) + + // Checking to make sure yaml unmarshaling doesn't result in errors for responses containing any supported prometheus relabel action + scrapeConfigs := map[string]*promconfig.ScrapeConfig{} + err = yaml.Unmarshal(bodyBytes, scrapeConfigs) + require.NoError(t, err) + }) + } +} + func newLink(jobName string) target.LinkJSON { return target.LinkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(jobName))} } diff --git a/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml b/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml new file mode 100644 index 0000000000..05b8b163fb --- /dev/null +++ b/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml @@ -0,0 +1,220 @@ +collector_selector: + matchlabels: + app.kubernetes.io/instance: default.test + app.kubernetes.io/managed-by: opentelemetry-operator +prometheus_cr: + scrape_interval: 60s +config: + scrape_configs: + - job_name: job-replace + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_test] + action: replace + regex: "test$1replacement" + replacement: "myreplacement$$1" + target_label: "mytarget" + metric_relabel_configs: + - action: replace + source_labels: [city] + separator: "," + regex: (s.*)(ttle$) + replacement: "test_newest_1_$1" + target_label: city + - job_name: job-lowercase + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_test] + action: lowercase + regex: "test$1replacement" + target_label: "mytarget" + metric_relabel_configs: + - action: lowercase + source_labels: [city] + separator: "," + regex: (s.*)(ttle$) + target_label: city + - job_name: job-uppercase + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_test] + action: uppercase + regex: "test$1replacement" + target_label: "mytarget" + metric_relabel_configs: + - action: uppercase + source_labels: [city] + regex: (s.*)(ttle$) + separator: "," + target_label: city + - job_name: job-keep + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + metric_relabel_configs: + - action: keep + source_labels: [city] + separator: "," + regex: (s.*)(ttle$) + replacement: "test_newest_1_$$1" + target_label: city + - job_name: job-drop + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_droplabel] + action: drop + regex: "prometheus-reference-app" + metric_relabel_configs: + - action: drop + source_labels: [city] + separator: "," + regex: (s.*)(ttle$) + replacement: "test_newest_1_$1" + target_label: city + - job_name: job-keepequal + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keepequal + target_label: __meta_kubernetes_pod_label_mylabel + metric_relabel_configs: + - action: keepequal + source_labels: [city] + target_label: city + - job_name: job-dropequal + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_dropequallabel] + action: dropequal + target_label: "test" + metric_relabel_configs: + - action: dropequal + source_labels: [citytest] + target_label: city + - job_name: job-hashmod + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_hashmod] + action: hashmod + modulus: 5 + regex: "prometheus-reference-app" + target_label: city + metric_relabel_configs: + - action: hashmod + modulus: 5 + separator: "," + source_labels: [city] + regex: (s.*)(ttle$) + replacement: "test_newest_1_$1" + target_label: city + - job_name: job-labelmap + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_hashmod] + action: labelmap + regex: "prometheus-reference-app" + replacement: "$1" + target_label: city + metric_relabel_configs: + - action: labelmap + source_labels: [city] + regex: (s.*)(ttle$) + separator: "," + replacement: $1 + target_label: city + - job_name: job-labeldrop + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - action: labeldrop + regex: "prometheus-reference-app" + metric_relabel_configs: + - action: labeldrop + regex: (s.*)(ttle$) + - job_name: job-labelkeep + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - action: labelkeep + regex: "prometheus-reference-app" + metric_relabel_configs: + - action: labelkeep + regex: (s.*)(ttle$$) + - job_name: job-nodename-nodeip + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_test] + action: keep + regex: "$NODE_NAME" + target_label: city + - source_labels: [__meta_kubernetes_pod_label_test] + action: keep + regex: "$NODE_IP" + target_label: city + metric_relabel_configs: + - action: keep + source_labels: [city] + regex: $NODE_NAME + replacement: $1 + separator: "," + target_label: city + - action: replace + source_labels: [city] + regex: (s.*)(ttle$$) + replacement: $NODE_IP + separator: "," + target_label: city \ No newline at end of file From 36e1a2508a0d6a12ff49b7ec99182486ab8f0e33 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Mon, 8 Apr 2024 16:41:44 -0700 Subject: [PATCH 5/9] fixing some yaml --- .../testdata/prom-config-all-actions.yaml | 59 +++---------------- 1 file changed, 7 insertions(+), 52 deletions(-) diff --git a/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml b/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml index 05b8b163fb..2cc3dee3c7 100644 --- a/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml +++ b/cmd/otel-allocator/server/testdata/prom-config-all-actions.yaml @@ -23,7 +23,7 @@ config: - action: replace source_labels: [city] separator: "," - regex: (s.*)(ttle$) + regex: (ci.*)(name$) replacement: "test_newest_1_$1" target_label: city - job_name: job-lowercase @@ -36,13 +36,10 @@ config: regex: "prometheus-reference-app" - source_labels: [__meta_kubernetes_pod_label_test] action: lowercase - regex: "test$1replacement" target_label: "mytarget" metric_relabel_configs: - action: lowercase source_labels: [city] - separator: "," - regex: (s.*)(ttle$) target_label: city - job_name: job-uppercase scheme: http @@ -54,13 +51,10 @@ config: regex: "prometheus-reference-app" - source_labels: [__meta_kubernetes_pod_label_test] action: uppercase - regex: "test$1replacement" target_label: "mytarget" metric_relabel_configs: - action: uppercase source_labels: [city] - regex: (s.*)(ttle$) - separator: "," target_label: city - job_name: job-keep scheme: http @@ -74,9 +68,7 @@ config: - action: keep source_labels: [city] separator: "," - regex: (s.*)(ttle$) - replacement: "test_newest_1_$$1" - target_label: city + regex: (ci.*)(name$) - job_name: job-drop scheme: http kubernetes_sd_configs: @@ -91,10 +83,7 @@ config: metric_relabel_configs: - action: drop source_labels: [city] - separator: "," - regex: (s.*)(ttle$) - replacement: "test_newest_1_$1" - target_label: city + regex: (ci.*)(name$) - job_name: job-keepequal scheme: http kubernetes_sd_configs: @@ -138,10 +127,8 @@ config: metric_relabel_configs: - action: hashmod modulus: 5 - separator: "," source_labels: [city] - regex: (s.*)(ttle$) - replacement: "test_newest_1_$1" + regex: (ci.*)(name$) target_label: city - job_name: job-labelmap scheme: http @@ -154,14 +141,11 @@ config: - source_labels: [__meta_kubernetes_pod_label_hashmod] action: labelmap regex: "prometheus-reference-app" - replacement: "$1" target_label: city metric_relabel_configs: - action: labelmap source_labels: [city] - regex: (s.*)(ttle$) - separator: "," - replacement: $1 + regex: (ci.*)(name$) target_label: city - job_name: job-labeldrop scheme: http @@ -175,7 +159,7 @@ config: regex: "prometheus-reference-app" metric_relabel_configs: - action: labeldrop - regex: (s.*)(ttle$) + regex: (ci.*)(name$) - job_name: job-labelkeep scheme: http kubernetes_sd_configs: @@ -188,33 +172,4 @@ config: regex: "prometheus-reference-app" metric_relabel_configs: - action: labelkeep - regex: (s.*)(ttle$$) - - job_name: job-nodename-nodeip - scheme: http - kubernetes_sd_configs: - - role: pod - relabel_configs: - - source_labels: [__meta_kubernetes_pod_label_app] - action: keep - regex: "prometheus-reference-app" - - source_labels: [__meta_kubernetes_pod_label_test] - action: keep - regex: "$NODE_NAME" - target_label: city - - source_labels: [__meta_kubernetes_pod_label_test] - action: keep - regex: "$NODE_IP" - target_label: city - metric_relabel_configs: - - action: keep - source_labels: [city] - regex: $NODE_NAME - replacement: $1 - separator: "," - target_label: city - - action: replace - source_labels: [city] - regex: (s.*)(ttle$$) - replacement: $NODE_IP - separator: "," - target_label: city \ No newline at end of file + regex: (ci.*)(name$$) \ No newline at end of file From 91d2ebeed4d94a13d68f35e0909ec5d4d6c5ef52 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 9 Apr 2024 10:18:32 -0700 Subject: [PATCH 6/9] adding few more tests --- cmd/otel-allocator/server/server.go | 42 +++++++++++-------- cmd/otel-allocator/server/server_test.go | 15 ++++++- .../server/testdata/prom-config-test.yaml | 34 +++++++++++++++ .../server/testdata/prom-no-config.yaml | 8 ++++ 4 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 cmd/otel-allocator/server/testdata/prom-config-test.yaml create mode 100644 cmd/otel-allocator/server/testdata/prom-no-config.yaml diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index 260931b016..fd4570513a 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -107,25 +107,11 @@ func (s *Server) Shutdown(ctx context.Context) error { return s.server.Shutdown(ctx) } -// UpdateScrapeConfigResponse updates the scrape config response. The target allocator first marshals these -// configurations such that the underlying prometheus marshaling is used. After that, the YAML is converted -// in to a JSON format for consumers to use. -func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.ScrapeConfig) error { - var configBytes []byte - configBytes, err := yaml.Marshal(configs) - if err != nil { - return err - } - var jsonConfig []byte - jsonConfig, err = yaml2.YAMLToJSON(configBytes) - if err != nil { - return err - } - +func RemoveRelabelAction(jsonConfig []byte) ([]byte, error) { var jobToScrapeConfig map[string]interface{} - err = json.Unmarshal(jsonConfig, &jobToScrapeConfig) + err := json.Unmarshal(jsonConfig, &jobToScrapeConfig) if err != nil { - return err + return nil, err } for _, scrapeConfig := range jobToScrapeConfig { scrapeConfig := scrapeConfig.(map[string]interface{}) @@ -154,6 +140,28 @@ func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.Scrap } jsonConfigNew, err := json.Marshal(jobToScrapeConfig) + if err != nil { + return nil, err + } + return jsonConfigNew, nil +} + +// UpdateScrapeConfigResponse updates the scrape config response. The target allocator first marshals these +// configurations such that the underlying prometheus marshaling is used. After that, the YAML is converted +// in to a JSON format for consumers to use. +func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.ScrapeConfig) error { + var configBytes []byte + configBytes, err := yaml.Marshal(configs) + if err != nil { + return err + } + var jsonConfig []byte + jsonConfig, err = yaml2.YAMLToJSON(configBytes) + if err != nil { + return err + } + + jsonConfigNew, err := RemoveRelabelAction(jsonConfig) if err != nil { return err } diff --git a/cmd/otel-allocator/server/server_test.go b/cmd/otel-allocator/server/server_test.go index 48920927b8..230f4e3944 100644 --- a/cmd/otel-allocator/server/server_test.go +++ b/cmd/otel-allocator/server/server_test.go @@ -616,10 +616,22 @@ func TestServer_Readiness(t *testing.T) { func TestServer_ScrapeConfigRespose(t *testing.T) { tests := []struct { description string + filePath string expectedCode int }{ { description: "Jobs with all actions", + filePath: "./testdata/prom-config-all-actions.yaml", + expectedCode: http.StatusOK, + }, + { + description: "Jobs with config combinations", + filePath: "./testdata/prom-config-test.yaml", + expectedCode: http.StatusOK, + }, + { + description: "Jobs with no config", + filePath: "./testdata/prom-no-config.yaml", expectedCode: http.StatusOK, }, } @@ -629,7 +641,8 @@ func TestServer_ScrapeConfigRespose(t *testing.T) { s := NewServer(logger, nil, listenAddr) allocCfg := allocatorconfig.CreateDefaultConfig() - err := allocatorconfig.LoadFromFile("./testdata/prom-config-all-actions.yaml", &allocCfg) + // err := allocatorconfig.LoadFromFile("./testdata/prom-config-all-actions.yaml", &allocCfg) + err := allocatorconfig.LoadFromFile(tc.filePath, &allocCfg) jobToScrapeConfig := make(map[string]*promconfig.ScrapeConfig) diff --git a/cmd/otel-allocator/server/testdata/prom-config-test.yaml b/cmd/otel-allocator/server/testdata/prom-config-test.yaml new file mode 100644 index 0000000000..40a5919fa8 --- /dev/null +++ b/cmd/otel-allocator/server/testdata/prom-config-test.yaml @@ -0,0 +1,34 @@ +collector_selector: + matchlabels: + app.kubernetes.io/instance: default.test + app.kubernetes.io/managed-by: opentelemetry-operator +prometheus_cr: + scrape_interval: 60s +config: + scrape_configs: + - job_name: job-no-target-relabel + scheme: http + kubernetes_sd_configs: + - role: pod + metric_relabel_configs: + - action: replace + source_labels: [city] + separator: "," + regex: (ci.*)(name$) + replacement: "test_newest_1_$1" + target_label: city + - job_name: job-no-metric-relabel + scheme: http + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + action: keep + regex: "prometheus-reference-app" + - source_labels: [__meta_kubernetes_pod_label_test] + action: lowercase + target_label: "mytarget" + - job_name: job-no-relabel + scheme: http + kubernetes_sd_configs: + - role: pod \ No newline at end of file diff --git a/cmd/otel-allocator/server/testdata/prom-no-config.yaml b/cmd/otel-allocator/server/testdata/prom-no-config.yaml new file mode 100644 index 0000000000..fa9d5f151d --- /dev/null +++ b/cmd/otel-allocator/server/testdata/prom-no-config.yaml @@ -0,0 +1,8 @@ +collector_selector: + matchlabels: + app.kubernetes.io/instance: default.test + app.kubernetes.io/managed-by: opentelemetry-operator +prometheus_cr: + scrape_interval: 60s +config: + scrape_configs: From af8e992ed5cf5c47afb8f58d9b5fba3b92f151cd Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 9 Apr 2024 10:43:25 -0700 Subject: [PATCH 7/9] fixing lint --- cmd/otel-allocator/server/server_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/otel-allocator/server/server_test.go b/cmd/otel-allocator/server/server_test.go index 230f4e3944..1a83875cf5 100644 --- a/cmd/otel-allocator/server/server_test.go +++ b/cmd/otel-allocator/server/server_test.go @@ -641,8 +641,8 @@ func TestServer_ScrapeConfigRespose(t *testing.T) { s := NewServer(logger, nil, listenAddr) allocCfg := allocatorconfig.CreateDefaultConfig() - // err := allocatorconfig.LoadFromFile("./testdata/prom-config-all-actions.yaml", &allocCfg) err := allocatorconfig.LoadFromFile(tc.filePath, &allocCfg) + require.NoError(t, err) jobToScrapeConfig := make(map[string]*promconfig.ScrapeConfig) From b9980e65bc420049fd0656a26f0f9d786451c0c5 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 10 Apr 2024 09:58:51 -0700 Subject: [PATCH 8/9] adding comment --- cmd/otel-allocator/server/server.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index fd4570513a..d3a36e26b8 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -107,7 +107,12 @@ func (s *Server) Shutdown(ctx context.Context) error { return s.server.Shutdown(ctx) } -func RemoveRelabelAction(jsonConfig []byte) ([]byte, error) { +// This is needed specifically for keepequal/dropequal actions because even though the user doesn't specify the +// regex field for these actions the unmarshalling implementations of prometheus adds back the default regex fields +// which in turn causes the receiver to error out since the unmarshaling of the json response doesn't expect anything in the regex fields +// for these actions. Adding this as a fix until the original issue with prometheus unmarshaling is fixed - +// https://github.com/prometheus/prometheus/issues/12534 +func RemoveRegexFromRelabelAction(jsonConfig []byte) ([]byte, error) { var jobToScrapeConfig map[string]interface{} err := json.Unmarshal(jsonConfig, &jobToScrapeConfig) if err != nil { @@ -161,7 +166,7 @@ func (s *Server) UpdateScrapeConfigResponse(configs map[string]*promconfig.Scrap return err } - jsonConfigNew, err := RemoveRelabelAction(jsonConfig) + jsonConfigNew, err := RemoveRegexFromRelabelAction(jsonConfig) if err != nil { return err } From bf11879902f6e9ca2ea940c0f9b0ed0796ff3277 Mon Sep 17 00:00:00 2001 From: rashmichandrashekar Date: Wed, 10 Apr 2024 10:04:01 -0700 Subject: [PATCH 9/9] Update cmd/otel-allocator/server/server.go Co-authored-by: Jacob Aronoff --- cmd/otel-allocator/server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/otel-allocator/server/server.go b/cmd/otel-allocator/server/server.go index d3a36e26b8..90771839a8 100644 --- a/cmd/otel-allocator/server/server.go +++ b/cmd/otel-allocator/server/server.go @@ -107,7 +107,7 @@ func (s *Server) Shutdown(ctx context.Context) error { return s.server.Shutdown(ctx) } -// This is needed specifically for keepequal/dropequal actions because even though the user doesn't specify the +// RemoveRegexFromRelabelAction is needed specifically for keepequal/dropequal actions because even though the user doesn't specify the // regex field for these actions the unmarshalling implementations of prometheus adds back the default regex fields // which in turn causes the receiver to error out since the unmarshaling of the json response doesn't expect anything in the regex fields // for these actions. Adding this as a fix until the original issue with prometheus unmarshaling is fixed -