From e922c3e9d9300ed4dfaf2458040b007a2669f3f6 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Tue, 17 Dec 2019 13:07:34 +0200 Subject: [PATCH] Add Contour metrics --- pkg/metrics/contour.go | 72 ++++++++++++++++++++++++++++++++++++++++++ pkg/metrics/factory.go | 4 +++ 2 files changed, 76 insertions(+) create mode 100644 pkg/metrics/contour.go diff --git a/pkg/metrics/contour.go b/pkg/metrics/contour.go new file mode 100644 index 00000000..bf5345ee --- /dev/null +++ b/pkg/metrics/contour.go @@ -0,0 +1,72 @@ +package metrics + +import ( + "time" +) + +//envoy_cluster_name="test_podinfo-canary_9898" + +var contourQueries = map[string]string{ + "request-success-rate": ` + sum( + rate( + envoy_cluster_upstream_rq{ + envoy_cluster_name=~"{{ .Namespace }}_{{ .Name }}-canary_[0-9a-zA-Z-]+", + envoy_response_code!~"5.*" + }[{{ .Interval }}] + ) + ) + / + sum( + rate( + envoy_cluster_upstream_rq{ + envoy_cluster_name=~"{{ .Namespace }}_{{ .Name }}-canary_[0-9a-zA-Z-]+", + }[{{ .Interval }}] + ) + ) + * 100`, + "request-duration": ` + histogram_quantile( + 0.99, + sum( + rate( + envoy_cluster_upstream_rq_time_bucket{ + envoy_cluster_name=~"{{ .Namespace }}_{{ .Name }}-canary_[0-9a-zA-Z-]+", + }[{{ .Interval }}] + ) + ) by (le) + )`, +} + +type ContourObserver struct { + client *PrometheusClient +} + +func (ob *ContourObserver) GetRequestSuccessRate(name string, namespace string, interval string) (float64, error) { + query, err := ob.client.RenderQuery(name, namespace, interval, contourQueries["request-success-rate"]) + if err != nil { + return 0, err + } + + value, err := ob.client.RunQuery(query) + if err != nil { + return 0, err + } + + return value, nil +} + +func (ob *ContourObserver) GetRequestDuration(name string, namespace string, interval string) (time.Duration, error) { + query, err := ob.client.RenderQuery(name, namespace, interval, contourQueries["request-duration"]) + if err != nil { + return 0, err + } + + value, err := ob.client.RunQuery(query) + if err != nil { + return 0, err + } + + ms := time.Duration(int64(value)) * time.Millisecond + return ms, nil +} diff --git a/pkg/metrics/factory.go b/pkg/metrics/factory.go index be4f4314..0edc7386 100644 --- a/pkg/metrics/factory.go +++ b/pkg/metrics/factory.go @@ -58,6 +58,10 @@ func (factory Factory) Observer(provider string) Interface { return &LinkerdObserver{ client: factory.Client, } + case provider == "contour": + return &ContourObserver{ + client: factory.Client, + } default: return &IstioObserver{ client: factory.Client,