From f991274b978bc40abf0e5dc01fde03c446414d7c Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Sun, 3 Nov 2019 00:01:32 +0200 Subject: [PATCH] Fix Prometheus query escape Removing whitespace without trimming spaces --- pkg/metrics/client.go | 11 ++++------- pkg/metrics/envoy_test.go | 4 ++-- pkg/metrics/gloo_test.go | 4 ++-- pkg/metrics/http_test.go | 4 ++-- pkg/metrics/istio_test.go | 4 ++-- pkg/metrics/linkerd_test.go | 4 ++-- pkg/metrics/nginx_test.go | 4 ++-- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/pkg/metrics/client.go b/pkg/metrics/client.go index 97647ccc5..a114125ac 100644 --- a/pkg/metrics/client.go +++ b/pkg/metrics/client.go @@ -10,8 +10,8 @@ import ( "net/http" "net/url" "path" + "regexp" "strconv" - "strings" "text/template" "time" ) @@ -137,13 +137,10 @@ func (p *PrometheusClient) RunQuery(query string) (float64, error) { return *value, nil } -// TrimQuery takes a promql query and removes spaces, tabs and new lines +// TrimQuery takes a promql query and removes whitespace func (p *PrometheusClient) TrimQuery(query string) string { - query = strings.Replace(query, "\n", "", -1) - query = strings.Replace(query, "\t", "", -1) - query = strings.Replace(query, " ", "", -1) - - return query + space := regexp.MustCompile(`\s+`) + return space.ReplaceAllString(query, " ") } // IsOnline call Prometheus status endpoint and returns an error if the API is unreachable diff --git a/pkg/metrics/envoy_test.go b/pkg/metrics/envoy_test.go index 85f279057..442b59e7e 100644 --- a/pkg/metrics/envoy_test.go +++ b/pkg/metrics/envoy_test.go @@ -8,7 +8,7 @@ import ( ) func TestEnvoyObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(envoy_cluster_upstream_rq{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)",envoy_response_code!~"5.*"}[1m]))/sum(rate(envoy_cluster_upstream_rq{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"}[1m]))*100` + expected := ` sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)" }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestEnvoyObserver_GetRequestSuccessRate(t *testing.T) { } func TestEnvoyObserver_GetRequestDuration(t *testing.T) { - expected := `histogram_quantile(0.99,sum(rate(envoy_cluster_upstream_rq_time_bucket{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"}[1m]))by(le))` + expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)" }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/metrics/gloo_test.go b/pkg/metrics/gloo_test.go index fd6ddeba5..0244e694c 100644 --- a/pkg/metrics/gloo_test.go +++ b/pkg/metrics/gloo_test.go @@ -8,7 +8,7 @@ import ( ) func TestGlooObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(envoy_cluster_upstream_rq{envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+",envoy_response_code!~"5.*"}[1m]))/sum(rate(envoy_cluster_upstream_rq{envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+",}[1m]))*100` + expected := ` sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestGlooObserver_GetRequestSuccessRate(t *testing.T) { } func TestGlooObserver_GetRequestDuration(t *testing.T) { - expected := `histogram_quantile(0.99,sum(rate(envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+",}[1m]))by(le))` + expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/metrics/http_test.go b/pkg/metrics/http_test.go index a0d31cd76..6b11c04ba 100644 --- a/pkg/metrics/http_test.go +++ b/pkg/metrics/http_test.go @@ -8,7 +8,7 @@ import ( ) func TestHttpObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(http_request_duration_seconds_count{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)",status!~"5.*"}[1m]))/sum(rate(http_request_duration_seconds_count{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"}[1m]))*100` + expected := ` sum( rate( http_request_duration_seconds_count{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)", status!~"5.*" }[1m] ) ) / sum( rate( http_request_duration_seconds_count{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)" }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestHttpObserver_GetRequestSuccessRate(t *testing.T) { } func TestHttpObserver_GetRequestDuration(t *testing.T) { - expected := `histogram_quantile(0.99,sum(rate(http_request_duration_seconds_bucket{kubernetes_namespace="default",kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"}[1m]))by(le))` + expected := ` histogram_quantile( 0.99, sum( rate( http_request_duration_seconds_bucket{ kubernetes_namespace="default", kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)" }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/metrics/istio_test.go b/pkg/metrics/istio_test.go index 2eb7f5d2d..76fff3d38 100644 --- a/pkg/metrics/istio_test.go +++ b/pkg/metrics/istio_test.go @@ -8,7 +8,7 @@ import ( ) func TestIstioObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(istio_requests_total{reporter="destination",destination_workload_namespace="default",destination_workload=~"podinfo",response_code!~"5.*"}[1m]))/sum(rate(istio_requests_total{reporter="destination",destination_workload_namespace="default",destination_workload=~"podinfo"}[1m]))*100` + expected := ` sum( rate( istio_requests_total{ reporter="destination", destination_workload_namespace="default", destination_workload=~"podinfo", response_code!~"5.*" }[1m] ) ) / sum( rate( istio_requests_total{ reporter="destination", destination_workload_namespace="default", destination_workload=~"podinfo" }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestIstioObserver_GetRequestSuccessRate(t *testing.T) { } func TestIstioObserver_GetRequestDuration(t *testing.T) { - expected := `histogram_quantile(0.99,sum(rate(istio_request_duration_seconds_bucket{reporter="destination",destination_workload_namespace="default",destination_workload=~"podinfo"}[1m]))by(le))` + expected := ` histogram_quantile( 0.99, sum( rate( istio_request_duration_seconds_bucket{ reporter="destination", destination_workload_namespace="default", destination_workload=~"podinfo" }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/metrics/linkerd_test.go b/pkg/metrics/linkerd_test.go index 82b62dd55..920d0cacb 100644 --- a/pkg/metrics/linkerd_test.go +++ b/pkg/metrics/linkerd_test.go @@ -8,7 +8,7 @@ import ( ) func TestLinkerdObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(response_total{namespace="default",deployment=~"podinfo",classification!="failure",direction="inbound"}[1m]))/sum(rate(response_total{namespace="default",deployment=~"podinfo",direction="inbound"}[1m]))*100` + expected := ` sum( rate( response_total{ namespace="default", deployment=~"podinfo", classification!="failure", direction="inbound" }[1m] ) ) / sum( rate( response_total{ namespace="default", deployment=~"podinfo", direction="inbound" }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestLinkerdObserver_GetRequestSuccessRate(t *testing.T) { } func TestLinkerdObserver_GetRequestDuration(t *testing.T) { - expected := `histogram_quantile(0.99,sum(rate(response_latency_ms_bucket{namespace="default",deployment=~"podinfo",direction="inbound"}[1m]))by(le))` + expected := ` histogram_quantile( 0.99, sum( rate( response_latency_ms_bucket{ namespace="default", deployment=~"podinfo", direction="inbound" }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/metrics/nginx_test.go b/pkg/metrics/nginx_test.go index 30b51e31f..de3613d07 100644 --- a/pkg/metrics/nginx_test.go +++ b/pkg/metrics/nginx_test.go @@ -8,7 +8,7 @@ import ( ) func TestNginxObserver_GetRequestSuccessRate(t *testing.T) { - expected := `sum(rate(nginx_ingress_controller_requests{namespace="nginx",ingress="podinfo",status!~"5.*"}[1m]))/sum(rate(nginx_ingress_controller_requests{namespace="nginx",ingress="podinfo"}[1m]))*100` + expected := ` sum( rate( nginx_ingress_controller_requests{ namespace="nginx", ingress="podinfo", status!~"5.*" }[1m] ) ) / sum( rate( nginx_ingress_controller_requests{ namespace="nginx", ingress="podinfo" }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -41,7 +41,7 @@ func TestNginxObserver_GetRequestSuccessRate(t *testing.T) { } func TestNginxObserver_GetRequestDuration(t *testing.T) { - expected := `sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_sum{namespace="nginx",ingress="podinfo"}[1m]))/sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_count{namespace="nginx",ingress="podinfo"}[1m]))*1000` + expected := ` sum( rate( nginx_ingress_controller_ingress_upstream_latency_seconds_sum{ namespace="nginx", ingress="podinfo" }[1m] ) ) / sum( rate( nginx_ingress_controller_ingress_upstream_latency_seconds_count{ namespace="nginx", ingress="podinfo" }[1m] ) ) * 1000` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0]