From 7b616b39b1fa9e9f1345cd6701e488f791e1fa93 Mon Sep 17 00:00:00 2001 From: Han Kang Date: Mon, 17 Oct 2022 13:26:15 -0700 Subject: [PATCH] add support for merging calls to Linear/Exponential Buckets Change-Id: Id6005912ac71c9c15354e9e8242f0febf8569dec --- test/instrumentation/decode_metric.go | 32 +++++++ .../testdata/pkg/kubelet/metrics/metrics.go | 24 ++++++ .../testdata/test-stable-metrics-list.yaml | 86 +++++++++++++++++++ 3 files changed, 142 insertions(+) diff --git a/test/instrumentation/decode_metric.go b/test/instrumentation/decode_metric.go index 1c1cf582480..df9323e7ee3 100644 --- a/test/instrumentation/decode_metric.go +++ b/test/instrumentation/decode_metric.go @@ -438,6 +438,38 @@ func (c *metricDecoder) decodeBuckets(expr ast.Expr) ([]float64, error) { func (c *metricDecoder) decodeBucketFunctionCall(v *ast.CallExpr) ([]float64, error, bool) { se, ok := v.Fun.(*ast.SelectorExpr) if !ok { + // support merged + if ai, ok := v.Fun.(*ast.Ident); ok && ai.Name == "merge" { + merged := []float64{} + for _, arg := range v.Args { + v2, ok := arg.(*ast.CallExpr) + if !ok { + return nil, newDecodeErrorf(v2, errBuckets), true + } + se, ok = v2.Fun.(*ast.SelectorExpr) + if ok { + functionName := se.Sel.String() + functionImport, ok := se.X.(*ast.Ident) + if !ok { + return nil, newDecodeErrorf(v, errBuckets), true + } + if functionImport.String() != c.kubeMetricsImportName { + return nil, newDecodeErrorf(v, errBuckets), true + } + firstArg, secondArg, thirdArg, err := decodeBucketArguments(v2) + if err != nil { + return nil, err, true + } + switch functionName { + case "LinearBuckets": + merged = append(merged, metrics.LinearBuckets(firstArg, secondArg, thirdArg)...) + case "ExponentialBuckets": + merged = append(merged, metrics.LinearBuckets(firstArg, secondArg, thirdArg)...) + } + } + } + return merged, nil, true + } return nil, newDecodeErrorf(v, errBuckets), true } functionName := se.Sel.String() diff --git a/test/instrumentation/testdata/pkg/kubelet/metrics/metrics.go b/test/instrumentation/testdata/pkg/kubelet/metrics/metrics.go index 5a8181c6ab5..4b483bff2fc 100644 --- a/test/instrumentation/testdata/pkg/kubelet/metrics/metrics.go +++ b/test/instrumentation/testdata/pkg/kubelet/metrics/metrics.go @@ -473,6 +473,21 @@ var ( }, []string{"container_state"}, ) + + NetworkProgrammingLatency = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: "kube_proxy", + Name: "network_programming_duration_seconds", + Help: "In Cluster Network Programming Latency in seconds", + Buckets: merge( + metrics.LinearBuckets(0.25, 0.25, 2), // 0.25s, 0.50s + metrics.LinearBuckets(1, 1, 59), // 1s, 2s, 3s, ... 59s + metrics.LinearBuckets(60, 5, 12), // 60s, 65s, 70s, ... 115s + metrics.LinearBuckets(120, 30, 7), // 2min, 2.5min, 3min, ..., 5min + ), + StabilityLevel: metrics.BETA, + }, + ) ) var registerMetrics sync.Once @@ -503,6 +518,7 @@ func Register(collectors ...metrics.StableCollector) { legacyregistry.MustRegister(RunningPodCount) legacyregistry.MustRegister(RunPodSandboxDuration) legacyregistry.MustRegister(RunPodSandboxErrors) + legacyregistry.MustRegister(NetworkProgrammingLatency) for _, collector := range collectors { legacyregistry.CustomMustRegister(collector) } @@ -547,3 +563,11 @@ func SetNodeName(name types.NodeName) { func Blah() metrics.ObserverMetric { return EvictionStatsAge.With(metrics.Labels{"plugins": "ASDf"}) } + +func merge(slices ...[]float64) []float64 { + result := make([]float64, 1) + for _, s := range slices { + result = append(result, s...) + } + return result +} diff --git a/test/instrumentation/testdata/test-stable-metrics-list.yaml b/test/instrumentation/testdata/test-stable-metrics-list.yaml index d6cc66b59aa..da3466d4d9d 100644 --- a/test/instrumentation/testdata/test-stable-metrics-list.yaml +++ b/test/instrumentation/testdata/test-stable-metrics-list.yaml @@ -1,3 +1,89 @@ +- name: network_programming_duration_seconds + subsystem: kube_proxy + help: In Cluster Network Programming Latency in seconds + type: Histogram + stabilityLevel: BETA + buckets: + - 0.25 + - 0.5 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + - 15 + - 16 + - 17 + - 18 + - 19 + - 20 + - 21 + - 22 + - 23 + - 24 + - 25 + - 26 + - 27 + - 28 + - 29 + - 30 + - 31 + - 32 + - 33 + - 34 + - 35 + - 36 + - 37 + - 38 + - 39 + - 40 + - 41 + - 42 + - 43 + - 44 + - 45 + - 46 + - 47 + - 48 + - 49 + - 50 + - 51 + - 52 + - 53 + - 54 + - 55 + - 56 + - 57 + - 58 + - 59 + - 60 + - 65 + - 70 + - 75 + - 80 + - 85 + - 90 + - 95 + - 100 + - 105 + - 110 + - 115 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 - name: certificate_manager_client_ttl_seconds subsystem: kubelet help: Gauge of the TTL (time-to-live) of the Kubelet's client certificate. The value