From b8629858f4c5626c3e861229b19c97dc8c295da8 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Thu, 19 Oct 2023 15:50:53 +0200 Subject: [PATCH 01/13] feat(kuma-cp): use stable hashes for outbound cluster names Signed-off-by: Mike Beaumont --- pkg/xds/generator/outbound_proxy_generator.go | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/pkg/xds/generator/outbound_proxy_generator.go b/pkg/xds/generator/outbound_proxy_generator.go index 1a85a66eddf8..43b3260df0c4 100644 --- a/pkg/xds/generator/outbound_proxy_generator.go +++ b/pkg/xds/generator/outbound_proxy_generator.go @@ -17,6 +17,7 @@ import ( envoy_clusters "github.com/kumahq/kuma/pkg/xds/envoy/clusters" envoy_listeners "github.com/kumahq/kuma/pkg/xds/envoy/listeners" envoy_names "github.com/kumahq/kuma/pkg/xds/envoy/names" + "github.com/kumahq/kuma/pkg/xds/envoy/tags" envoy_tags "github.com/kumahq/kuma/pkg/xds/envoy/tags" ) @@ -27,19 +28,6 @@ const OriginOutbound = "outbound" type OutboundProxyGenerator struct{} -// Whenever `split` is specified in the TrafficRoute which has more than kuma.io/service tag -// We generate a separate Envoy cluster with _X_ suffix. SplitCounter ensures that we have different X for every split in one Dataplane -// Each split is distinct for the whole Dataplane so we can avoid accidental cluster overrides. -type splitCounter struct { - counter int -} - -func (s *splitCounter) getAndIncrement() int { - counter := s.counter - s.counter++ - return counter -} - func (g OutboundProxyGenerator) Generate(ctx context.Context, xdsCtx xds_context.Context, proxy *model.Proxy) (*model.ResourceSet, error) { hasMeshRoutes := len(proxy.Policies.Dynamic[v1alpha1.MeshHTTPRouteType].ToRules.Rules) > 0 @@ -55,12 +43,11 @@ func (g OutboundProxyGenerator) Generate(ctx context.Context, xdsCtx xds_context // For one outbound we pick one traffic route so LB and Timeout are the same. // If we have same split in many HTTP matches we can use the same cluster with different weight clusterCache := map[string]string{} - splitCounter := &splitCounter{} for _, outbound := range outbounds { // Determine the list of destination subsets // For one outbound listener it may contain many subsets (ex. TrafficRoute to many destinations) - routes := g.determineRoutes(proxy, outbound, clusterCache, splitCounter, xdsCtx.Mesh.Resource.ZoneEgressEnabled()) + routes := g.determineRoutes(proxy, outbound, clusterCache, xdsCtx.Mesh.Resource.ZoneEgressEnabled()) clusters := routes.Clusters() protocol := InferProtocol(proxy, clusters) @@ -340,7 +327,6 @@ func (OutboundProxyGenerator) determineRoutes( proxy *model.Proxy, outbound *mesh_proto.Dataplane_Networking_Outbound, clusterCache map[string]string, - splitCounter *splitCounter, hasEgress bool, ) envoy_common.Routes { var routes envoy_common.Routes @@ -368,11 +354,7 @@ func (OutboundProxyGenerator) determineRoutes( continue } - name := service - - if len(destination.GetDestination()) > 1 { - name = envoy_names.GetSplitClusterName(service, splitCounter.getAndIncrement()) - } + name, _ := tags.Tags(destination.Destination).DestinationClusterName(nil) if mesh, ok := destination.Destination[mesh_proto.MeshTag]; ok { // The name should be distinct to the service & mesh combination From ce56d7ce2cf3cd8ee1de4cfd2762db46a2142a81 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Fri, 20 Oct 2023 11:22:24 +0200 Subject: [PATCH 02/13] test: update Signed-off-by: Mike Beaumont --- .../outbound-proxy/03.envoy.golden.yaml | 32 ++++++++--------- .../outbound-proxy/04.envoy.golden.yaml | 36 +++++++++---------- .../outbound-proxy/05.envoy.golden.yaml | 8 ++--- .../outbound-proxy/06.envoy.golden.yaml | 8 ++--- .../outbound-proxy/08.envoy.golden.yaml | 24 ++++++------- .../outbound-proxy/09.envoy.golden.yaml | 10 +++--- .../cluster-dots.envoy.golden.yaml | 8 ++--- 7 files changed, 63 insertions(+), 63 deletions(-) diff --git a/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml index 160fc212f654..294343d935ea 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml @@ -97,7 +97,7 @@ resources: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: db-_0_ +- name: db-c182dd9f4bf584d7 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -105,14 +105,14 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: db-_0_ + name: db-c182dd9f4bf584d7 type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: db-_1_ +- name: db-f7d9086d4169338b resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -120,7 +120,7 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: db-_1_ + name: db-f7d9086d4169338b type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -253,42 +253,42 @@ resources: address: 192.168.0.2 portValue: 8082 loadBalancingWeight: 1 -- name: db-_0_ +- name: db-c182dd9f4bf584d7 resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: db-_0_ + clusterName: db-c182dd9f4bf584d7 endpoints: - lbEndpoints: - endpoint: address: socketAddress: address: 192.168.0.3 - portValue: 5432 + portValue: 5433 loadBalancingWeight: 1 metadata: filterMetadata: envoy.lb: - role: master + role: replica envoy.transport_socket_match: - role: master -- name: db-_1_ + role: replica +- name: db-f7d9086d4169338b resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: db-_1_ + clusterName: db-f7d9086d4169338b endpoints: - lbEndpoints: - endpoint: address: socketAddress: address: 192.168.0.3 - portValue: 5433 + portValue: 5432 loadBalancingWeight: 1 metadata: filterMetadata: envoy.lb: - role: replica + role: master envoy.transport_socket_match: - role: replica + role: master - name: outbound:127.0.0.1:18080 resource: '@type': type.googleapis.com/envoy.config.listener.v3.Listener @@ -498,9 +498,9 @@ resources: statPrefix: db weightedClusters: clusters: - - name: db-_0_ + - name: db-f7d9086d4169338b weight: 10 - - name: db-_1_ + - name: db-c182dd9f4bf584d7 weight: 90 metadata: filterMetadata: diff --git a/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml index 06bb451479f0..3ade85604124 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml @@ -128,7 +128,7 @@ resources: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: db-_0_ +- name: db-c182dd9f4bf584d7 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -136,7 +136,7 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: db-_0_ + name: db-c182dd9f4bf584d7 transportSocket: name: envoy.transport_sockets.tls typedConfig: @@ -160,14 +160,14 @@ resources: sdsConfig: ads: {} resourceApiVersion: V3 - sni: db{mesh=mesh1,role=master} + sni: db{mesh=mesh1,role=replica} type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: db-_1_ +- name: db-f7d9086d4169338b resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -175,7 +175,7 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: db-_1_ + name: db-f7d9086d4169338b transportSocket: name: envoy.transport_sockets.tls typedConfig: @@ -199,7 +199,7 @@ resources: sdsConfig: ads: {} resourceApiVersion: V3 - sni: db{mesh=mesh1,role=replica} + sni: db{mesh=mesh1,role=master} type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -296,42 +296,42 @@ resources: address: 192.168.0.2 portValue: 8082 loadBalancingWeight: 1 -- name: db-_0_ +- name: db-c182dd9f4bf584d7 resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: db-_0_ + clusterName: db-c182dd9f4bf584d7 endpoints: - lbEndpoints: - endpoint: address: socketAddress: address: 192.168.0.3 - portValue: 5432 + portValue: 5433 loadBalancingWeight: 1 metadata: filterMetadata: envoy.lb: - role: master + role: replica envoy.transport_socket_match: - role: master -- name: db-_1_ + role: replica +- name: db-f7d9086d4169338b resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: db-_1_ + clusterName: db-f7d9086d4169338b endpoints: - lbEndpoints: - endpoint: address: socketAddress: address: 192.168.0.3 - portValue: 5433 + portValue: 5432 loadBalancingWeight: 1 metadata: filterMetadata: envoy.lb: - role: replica + role: master envoy.transport_socket_match: - role: replica + role: master - name: outbound:127.0.0.1:18080 resource: '@type': type.googleapis.com/envoy.config.listener.v3.Listener @@ -455,9 +455,9 @@ resources: statPrefix: db weightedClusters: clusters: - - name: db-_0_ + - name: db-f7d9086d4169338b weight: 10 - - name: db-_1_ + - name: db-c182dd9f4bf584d7 weight: 90 metadata: filterMetadata: diff --git a/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml index 64ff0a1bbfad..b286bf01c6e8 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml @@ -1,10 +1,10 @@ resources: -- name: es-_0_ +- name: es-be7aaa8dde77c2c8 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s loadAssignment: - clusterName: es-_0_ + clusterName: es-be7aaa8dde77c2c8 endpoints: - lbEndpoints: - endpoint: @@ -19,7 +19,7 @@ resources: kuma.io/protocol: http envoy.transport_socket_match: kuma.io/protocol: http - name: es-_0_ + name: es-be7aaa8dde77c2c8 type: STATIC typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -63,7 +63,7 @@ resources: prefix: / route: autoHostRewrite: true - cluster: es-_0_ + cluster: es-be7aaa8dde77c2c8 timeout: 0s statPrefix: es streamIdleTimeout: 0s diff --git a/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml index 6ef7109a046f..dba90d2d0b00 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml @@ -1,10 +1,10 @@ resources: -- name: es2-_0_ +- name: es2-ff6df687ce12e5f4 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 100s loadAssignment: - clusterName: es2-_0_ + clusterName: es2-ff6df687ce12e5f4 endpoints: - lbEndpoints: - endpoint: @@ -19,7 +19,7 @@ resources: kuma.io/protocol: http2 envoy.transport_socket_match: kuma.io/protocol: http2 - name: es2-_0_ + name: es2-ff6df687ce12e5f4 type: STATIC typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -63,7 +63,7 @@ resources: prefix: / route: autoHostRewrite: true - cluster: es2-_0_ + cluster: es2-ff6df687ce12e5f4 timeout: 102s statPrefix: es2 streamIdleTimeout: 0s diff --git a/pkg/xds/generator/testdata/outbound-proxy/08.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/08.envoy.golden.yaml index 3f8e45714918..bc138b956011 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/08.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/08.envoy.golden.yaml @@ -1,10 +1,10 @@ resources: -- name: es2-_0_ +- name: es2-b5516780eaf1ed13 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s loadAssignment: - clusterName: es2-_0_ + clusterName: es2-b5516780eaf1ed13 endpoints: - lbEndpoints: - endpoint: @@ -19,7 +19,7 @@ resources: kuma.io/protocol: http2 envoy.transport_socket_match: kuma.io/protocol: http2 - name: es2-_0_ + name: es2-b5516780eaf1ed13 type: STATIC typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -28,12 +28,12 @@ resources: idleTimeout: 0s explicitHttpConfig: http2ProtocolOptions: {} -- name: es2-_1_ +- name: es2-d79214c8b3a5805b resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s loadAssignment: - clusterName: es2-_1_ + clusterName: es2-d79214c8b3a5805b endpoints: - lbEndpoints: - endpoint: @@ -48,7 +48,7 @@ resources: kuma.io/protocol: http2 envoy.transport_socket_match: kuma.io/protocol: http2 - name: es2-_1_ + name: es2-d79214c8b3a5805b type: STATIC typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -95,9 +95,9 @@ resources: timeout: 0s weightedClusters: clusters: - - name: es2-_0_ + - name: es2-b5516780eaf1ed13 weight: 10 - - name: es2-_1_ + - name: es2-d79214c8b3a5805b weight: 90 statPrefix: es2 streamIdleTimeout: 0s @@ -145,9 +145,9 @@ resources: timeout: 0s weightedClusters: clusters: - - name: es2-_0_ + - name: es2-b5516780eaf1ed13 weight: 10 - - name: es2-_1_ + - name: es2-d79214c8b3a5805b weight: 90 statPrefix: es2 streamIdleTimeout: 0s @@ -195,9 +195,9 @@ resources: timeout: 0s weightedClusters: clusters: - - name: es2-_0_ + - name: es2-b5516780eaf1ed13 weight: 10 - - name: es2-_1_ + - name: es2-d79214c8b3a5805b weight: 90 statPrefix: es2 streamIdleTimeout: 0s diff --git a/pkg/xds/generator/testdata/outbound-proxy/09.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/09.envoy.golden.yaml index d8adf8440c55..820236137ebf 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/09.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/09.envoy.golden.yaml @@ -1,5 +1,5 @@ resources: -- name: api-http-_0__mesh2 +- name: api-http-5637c619d2781fec_mesh2 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -7,7 +7,7 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: api-http-_0__mesh2 + name: api-http-5637c619d2781fec_mesh2 outlierDetection: enforcingConsecutive5xx: 100 enforcingConsecutiveGatewayFailure: 0 @@ -46,10 +46,10 @@ resources: idleTimeout: 0s explicitHttpConfig: http2ProtocolOptions: {} -- name: api-http-_0__mesh2 +- name: api-http-5637c619d2781fec_mesh2 resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: api-http-_0__mesh2 + clusterName: api-http-5637c619d2781fec_mesh2 endpoints: - lbEndpoints: - endpoint: @@ -108,7 +108,7 @@ resources: - match: prefix: / route: - cluster: api-http-_0__mesh2 + cluster: api-http-5637c619d2781fec_mesh2 timeout: 0s statPrefix: api-http streamIdleTimeout: 0s diff --git a/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml index c50ce505825e..a259408cb243 100644 --- a/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml +++ b/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml @@ -15,7 +15,7 @@ resources: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: db-_0_ +- name: db-104dbb63d60dfdfa resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster connectTimeout: 10s @@ -23,7 +23,7 @@ resources: edsConfig: ads: {} resourceApiVersion: V3 - name: db-_0_ + name: db-104dbb63d60dfdfa type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: @@ -42,7 +42,7 @@ resources: address: 192.168.0.1 portValue: 8082 loadBalancingWeight: 1 -- name: db-_0_ +- name: db-104dbb63d60dfdfa resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment clusterName: db @@ -79,7 +79,7 @@ resources: - name: envoy.filters.network.tcp_proxy typedConfig: '@type': type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy - cluster: db-_0_ + cluster: db-104dbb63d60dfdfa idleTimeout: 0s statPrefix: db_kuma-system metadata: From e779c9b82dde606fed73449a06edb2a86b603bac Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Fri, 20 Oct 2023 14:05:31 +0200 Subject: [PATCH 03/13] feat(Mesh*Route): use hashes for cluster names Signed-off-by: Mike Beaumont --- .../policies/core/xds/meshroute/listeners.go | 56 +++++-------------- .../plugin/v1alpha1/listeners.go | 6 +- .../meshtcproute/plugin/v1alpha1/listeners.go | 3 +- 3 files changed, 17 insertions(+), 48 deletions(-) diff --git a/pkg/plugins/policies/core/xds/meshroute/listeners.go b/pkg/plugins/policies/core/xds/meshroute/listeners.go index 55900c3207b3..57357eecfec3 100644 --- a/pkg/plugins/policies/core/xds/meshroute/listeners.go +++ b/pkg/plugins/policies/core/xds/meshroute/listeners.go @@ -10,50 +10,13 @@ import ( plugins_xds "github.com/kumahq/kuma/pkg/plugins/policies/core/xds" "github.com/kumahq/kuma/pkg/util/pointer" envoy_common "github.com/kumahq/kuma/pkg/xds/envoy" - envoy_names "github.com/kumahq/kuma/pkg/xds/envoy/names" + "github.com/kumahq/kuma/pkg/xds/envoy/tags" envoy_tags "github.com/kumahq/kuma/pkg/xds/envoy/tags" ) -// SplitCounter -// Whenever `split` is specified in the TrafficRoute which has more than -// kuma.io/service tag we generate a separate Envoy cluster with _X_ suffix. -// SplitCounter ensures that we have different X for every split in one -// Dataplane. Each split is distinct for the whole Dataplane so we can avoid -// accidental cluster overrides. -type SplitCounter struct { - counter int -} - -func (s *SplitCounter) GetAndIncrement() int { - counter := s.counter - s.counter++ - return counter -} - -func GetClusterName( - name string, - tags map[string]string, - sc *SplitCounter, -) string { - if len(tags) > 0 { - name = envoy_names.GetSplitClusterName(name, sc.GetAndIncrement()) - } - - // The mesh tag is present here if this destination is generated - // from a cross-mesh MeshGateway listener virtual outbound. - // It is not part of the service tags. - if mesh, ok := tags[mesh_proto.MeshTag]; ok { - // The name should be distinct to the service & mesh combination - name = fmt.Sprintf("%s_%s", name, mesh) - } - - return name -} - func MakeTCPSplit( proxy *core_xds.Proxy, clusterCache map[common_api.TargetRefHash]string, - sc *SplitCounter, servicesAcc envoy_common.ServicesAccumulator, refs []common_api.BackendRef, ) []envoy_common.Split { @@ -66,7 +29,6 @@ func MakeTCPSplit( core_mesh.ProtocolHTTP2: {}, }, clusterCache, - sc, servicesAcc, refs, ) @@ -75,7 +37,6 @@ func MakeTCPSplit( func MakeHTTPSplit( proxy *core_xds.Proxy, clusterCache map[common_api.TargetRefHash]string, - sc *SplitCounter, servicesAcc envoy_common.ServicesAccumulator, refs []common_api.BackendRef, ) []envoy_common.Split { @@ -86,7 +47,6 @@ func MakeHTTPSplit( core_mesh.ProtocolHTTP2: {}, }, clusterCache, - sc, servicesAcc, refs, ) @@ -96,7 +56,6 @@ func makeSplit( proxy *core_xds.Proxy, protocols map[core_mesh.Protocol]struct{}, clusterCache map[common_api.TargetRefHash]string, - sc *SplitCounter, servicesAcc envoy_common.ServicesAccumulator, refs []common_api.BackendRef, ) []envoy_common.Split { @@ -118,7 +77,18 @@ func makeSplit( return nil } - clusterName := GetClusterName(ref.Name, ref.Tags, sc) + clusterName, _ := tags.Tags(ref.Tags). + WithTags(mesh_proto.ServiceTag, ref.Name). + DestinationClusterName(nil) + + // The mesh tag is present here if this destination is generated + // from a cross-mesh MeshGateway listener virtual outbound. + // It is not part of the service tags. + if mesh, ok := ref.Tags[mesh_proto.MeshTag]; ok { + // The name should be distinct to the service & mesh combination + clusterName = fmt.Sprintf("%s_%s", clusterName, mesh) + } + isExternalService := plugins_xds.HasExternalService(proxy.Routing, service) refHash := ref.TargetRef.Hash() diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/listeners.go b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/listeners.go index 8a8963923083..579aa2253cb2 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/listeners.go +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/listeners.go @@ -28,7 +28,6 @@ func generateListeners( servicesAcc envoy_common.ServicesAccumulator, ) (*core_xds.ResourceSet, error) { resources := core_xds.NewResourceSet() - splitCounter := &meshroute_xds.SplitCounter{} // ClusterCache (cluster hash -> cluster name) protects us from creating excessive amount of clusters. // For one outbound we pick one traffic route so LB and Timeout are the same. // If we have same split in many HTTP matches we can use the same cluster with different weight @@ -52,14 +51,15 @@ func generateListeners( protocol := plugins_xds.InferProtocol(proxy.Routing, serviceName) var routes []xds.OutboundRoute for _, route := range prepareRoutes(rules, serviceName, protocol) { - split := meshroute_xds.MakeHTTPSplit(proxy, clusterCache, splitCounter, servicesAcc, route.BackendRefs) + split := meshroute_xds.MakeHTTPSplit(proxy, clusterCache, servicesAcc, route.BackendRefs) if split == nil { continue } for _, filter := range route.Filters { if filter.Type == api.RequestMirrorType { // we need to create a split for the mirror backend - _ = meshroute_xds.MakeHTTPSplit(proxy, clusterCache, splitCounter, servicesAcc, + _ = meshroute_xds.MakeHTTPSplit( + proxy, clusterCache, servicesAcc, []common_api.BackendRef{{ TargetRef: filter.RequestMirror.BackendRef, Weight: pointer.To[uint](1), // any non-zero value diff --git a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/listeners.go b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/listeners.go index 99a61220001a..daf9afa668ca 100644 --- a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/listeners.go +++ b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/listeners.go @@ -26,7 +26,6 @@ func generateListeners( // For one outbound we pick one traffic route, so LB and Timeout are // the same. clusterCache := map[common_api.TargetRefHash]string{} - sc := &meshroute_xds.SplitCounter{} networking := proxy.Dataplane.Spec.GetNetworking() routing := proxy.Routing toRulesHTTP := proxy.Policies.Dynamic[meshhttproute_api.MeshHTTPRouteType]. @@ -42,7 +41,7 @@ func generateListeners( continue } - splits := meshroute_xds.MakeTCPSplit(proxy, clusterCache, sc, servicesAccumulator, backendRefs) + splits := meshroute_xds.MakeTCPSplit(proxy, clusterCache, servicesAccumulator, backendRefs) filterChain := buildFilterChain(proxy, serviceName, splits) listener, err := buildOutboundListener(proxy, outbound, filterChain) From f71182251dd29b28317bccba89d6101e3127a8da Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Fri, 20 Oct 2023 14:06:15 +0200 Subject: [PATCH 04/13] refactor: simplify DestinationClusterName Signed-off-by: Mike Beaumont --- pkg/xds/envoy/tags/match.go | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/pkg/xds/envoy/tags/match.go b/pkg/xds/envoy/tags/match.go index 318f04a8dd40..80e740355e04 100644 --- a/pkg/xds/envoy/tags/match.go +++ b/pkg/xds/envoy/tags/match.go @@ -9,6 +9,7 @@ import ( mesh_proto "github.com/kumahq/kuma/api/mesh/v1alpha1" core_policy "github.com/kumahq/kuma/pkg/core/policy" + "github.com/kumahq/kuma/pkg/util/maps" ) const TagsHeaderName = "x-kuma-tags" @@ -18,44 +19,29 @@ type Tags map[string]string // DestinationClusterName generates a unique cluster name for the // destination. identifyingTags are useful for adding extra metadata outside of just tags. Tags must at least contain `kuma.io/service` func (t Tags) DestinationClusterName( - identifyingTags map[string]string, + additionalIdentifyingTags map[string]string, ) (string, error) { serviceName := t[mesh_proto.ServiceTag] if serviceName == "" { return "", fmt.Errorf("missing %s tag", mesh_proto.ServiceTag) } + // If there's no tags other than serviceName just return the serviceName - if len(identifyingTags) == 0 && len(t) == 1 { + if len(additionalIdentifyingTags) == 0 && len(t) == 1 { return serviceName, nil } // If cluster is splitting the target service with selector tags, // hash the tag names to generate a unique cluster name. - var keys []string - for k := range t { - keys = append(keys, k) - } - - sort.Strings(keys) - h := sha256.New() - // destination tags from route - for _, k := range keys { + for _, k := range maps.SortedKeys(t) { h.Write([]byte(k)) h.Write([]byte(t[k])) } - - keys = []string{} - for k := range identifyingTags { - keys = append(keys, k) - } - sort.Strings(keys) - - // identifyingTags contains listener, meshGateway and Dataplane tags - for _, k := range keys { + for _, k := range maps.SortedKeys(additionalIdentifyingTags) { h.Write([]byte(k)) - h.Write([]byte(identifyingTags[k])) + h.Write([]byte(additionalIdentifyingTags[k])) } // The qualifier is 16 hex digits. Unscientifically balancing the length From a46c062f927d88ce18e55677356f0ebca35d468b Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Fri, 20 Oct 2023 15:11:35 +0200 Subject: [PATCH 05/13] test: update Signed-off-by: Mike Beaumont --- .../plugin/v1alpha1/testdata/basic.clusters.golden.yaml | 4 ++-- .../plugin/v1alpha1/testdata/basic.endpoints.golden.yaml | 4 ++-- .../plugin/v1alpha1/testdata/basic.listeners.golden.yaml | 8 ++++---- .../v1alpha1/testdata/request-mirror.clusters.golden.yaml | 4 ++-- .../testdata/request-mirror.endpoints.golden.yaml | 4 ++-- .../testdata/request-mirror.listeners.golden.yaml | 4 ++-- .../v1alpha1/testdata/split-traffic.clusters.golden.yaml | 8 ++++---- .../v1alpha1/testdata/split-traffic.endpoints.golden.yaml | 8 ++++---- .../v1alpha1/testdata/split-traffic.listeners.golden.yaml | 4 ++-- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.clusters.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.clusters.golden.yaml index 5e6ab8da35fb..e4f02503a01f 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.clusters.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.clusters.golden.yaml @@ -13,14 +13,14 @@ resources: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: backend-_0_ +- name: backend-c72efb5be46fae6b resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster edsClusterConfig: edsConfig: ads: {} resourceApiVersion: V3 - name: backend-_0_ + name: backend-c72efb5be46fae6b type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.endpoints.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.endpoints.golden.yaml index 1c5dc494ede6..c5fe3a5c67f1 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.endpoints.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.endpoints.golden.yaml @@ -33,10 +33,10 @@ resources: envoy.transport_socket_match: kuma.io/protocol: http region: us -- name: backend-_0_ +- name: backend-c72efb5be46fae6b resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: backend-_0_ + clusterName: backend-c72efb5be46fae6b endpoints: - lbEndpoints: - endpoint: diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.listeners.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.listeners.golden.yaml index f70de6e11949..3fbbbf39ac30 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.listeners.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/basic.listeners.golden.yaml @@ -44,25 +44,25 @@ resources: path: /v2 name: BRLj9+uPP4C2xD2r8YkH/x30Vn34XWSc48Fj/pHZdTw= route: - cluster: backend-_0_ + cluster: backend-c72efb5be46fae6b timeout: 0s - match: prefix: /v2/ name: BRLj9+uPP4C2xD2r8YkH/x30Vn34XWSc48Fj/pHZdTw= route: - cluster: backend-_0_ + cluster: backend-c72efb5be46fae6b timeout: 0s - match: path: /v3 name: BRLj9+uPP4C2xD2r8YkH/x30Vn34XWSc48Fj/pHZdTw= route: - cluster: backend-_0_ + cluster: backend-c72efb5be46fae6b timeout: 0s - match: prefix: /v3/ name: BRLj9+uPP4C2xD2r8YkH/x30Vn34XWSc48Fj/pHZdTw= route: - cluster: backend-_0_ + cluster: backend-c72efb5be46fae6b timeout: 0s - match: prefix: / diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.clusters.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.clusters.golden.yaml index f3f80b0d9d2a..de52ad9b3855 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.clusters.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.clusters.golden.yaml @@ -13,14 +13,14 @@ resources: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: payments-_0_ +- name: payments-9f43ffb3c22f8c19 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster edsClusterConfig: edsConfig: ads: {} resourceApiVersion: V3 - name: payments-_0_ + name: payments-9f43ffb3c22f8c19 type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.endpoints.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.endpoints.golden.yaml index ccd9d8000cf2..7a56838b1228 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.endpoints.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.endpoints.golden.yaml @@ -19,10 +19,10 @@ resources: envoy.transport_socket_match: kuma.io/protocol: http region: us -- name: payments-_0_ +- name: payments-9f43ffb3c22f8c19 resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: payments-_0_ + clusterName: payments-9f43ffb3c22f8c19 endpoints: - lbEndpoints: - endpoint: diff --git a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.listeners.golden.yaml b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.listeners.golden.yaml index 328cc657f447..e23d17a5aa78 100644 --- a/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.listeners.golden.yaml +++ b/pkg/plugins/policies/meshhttproute/plugin/v1alpha1/testdata/request-mirror.listeners.golden.yaml @@ -34,7 +34,7 @@ resources: route: cluster: backend requestMirrorPolicies: - - cluster: payments-_0_ + - cluster: payments-9f43ffb3c22f8c19 runtimeFraction: defaultValue: denominator: TEN_THOUSAND @@ -47,7 +47,7 @@ resources: route: cluster: backend requestMirrorPolicies: - - cluster: payments-_0_ + - cluster: payments-9f43ffb3c22f8c19 runtimeFraction: defaultValue: denominator: TEN_THOUSAND diff --git a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.clusters.golden.yaml b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.clusters.golden.yaml index 1d3b7290d5fb..1ea626277155 100644 --- a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.clusters.golden.yaml +++ b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.clusters.golden.yaml @@ -1,26 +1,26 @@ resources: -- name: backend-_0_ +- name: backend-bb38a94289f18fb9 resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster edsClusterConfig: edsConfig: ads: {} resourceApiVersion: V3 - name: backend-_0_ + name: backend-bb38a94289f18fb9 type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicitHttpConfig: http2ProtocolOptions: {} -- name: backend-_1_ +- name: backend-c72efb5be46fae6b resource: '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster edsClusterConfig: edsConfig: ads: {} resourceApiVersion: V3 - name: backend-_1_ + name: backend-c72efb5be46fae6b type: EDS typedExtensionProtocolOptions: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: diff --git a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.endpoints.golden.yaml b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.endpoints.golden.yaml index 66584c16e9f1..815ee6bf849d 100644 --- a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.endpoints.golden.yaml +++ b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.endpoints.golden.yaml @@ -1,8 +1,8 @@ resources: -- name: backend-_0_ +- name: backend-bb38a94289f18fb9 resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: backend-_0_ + clusterName: backend-bb38a94289f18fb9 endpoints: - lbEndpoints: - endpoint: @@ -19,10 +19,10 @@ resources: envoy.transport_socket_match: kuma.io/protocol: tcp region: eu -- name: backend-_1_ +- name: backend-c72efb5be46fae6b resource: '@type': type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment - clusterName: backend-_1_ + clusterName: backend-c72efb5be46fae6b endpoints: - lbEndpoints: - endpoint: diff --git a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.listeners.golden.yaml b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.listeners.golden.yaml index 2bc01d864035..d88082de359e 100644 --- a/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.listeners.golden.yaml +++ b/pkg/plugins/policies/meshtcproute/plugin/v1alpha1/testdata/split-traffic.listeners.golden.yaml @@ -14,9 +14,9 @@ resources: statPrefix: backend weightedClusters: clusters: - - name: backend-_0_ + - name: backend-bb38a94289f18fb9 weight: 40 - - name: backend-_1_ + - name: backend-c72efb5be46fae6b weight: 15 - name: other-backend weight: 15 From 97e78d6defe9c93412579d93c1048b06580e7cec Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 10:11:49 +0200 Subject: [PATCH 06/13] refactor: use new split cluster name format in policies Signed-off-by: Mike Beaumont --- pkg/plugins/policies/core/xds/clusters.go | 12 ++++-------- pkg/xds/envoy/tags/match.go | 9 ++++++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pkg/plugins/policies/core/xds/clusters.go b/pkg/plugins/policies/core/xds/clusters.go index 9a11a511a062..16f5ae3c2cfb 100644 --- a/pkg/plugins/policies/core/xds/clusters.go +++ b/pkg/plugins/policies/core/xds/clusters.go @@ -1,8 +1,6 @@ package xds import ( - "regexp" - envoy_cluster "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3" envoy_resource "github.com/envoyproxy/go-control-plane/pkg/resource/v3" @@ -11,12 +9,11 @@ import ( "github.com/kumahq/kuma/pkg/core/xds" core_xds "github.com/kumahq/kuma/pkg/core/xds" "github.com/kumahq/kuma/pkg/plugins/runtime/gateway/metadata" + "github.com/kumahq/kuma/pkg/xds/envoy/tags" "github.com/kumahq/kuma/pkg/xds/generator" envoy_common "github.com/kumahq/kuma/pkg/xds/generator" ) -var splitClusterRegex = regexp.MustCompile("(.*)(-_[0-9+]_$)") - type Clusters struct { Inbound map[string]*envoy_cluster.Cluster Outbound map[string]*envoy_cluster.Cluster @@ -55,12 +52,11 @@ func GatherClusters(rs *xds.ResourceSet) Clusters { } func ServiceFromClusterName(name string) string { - matchedGroups := splitClusterRegex.FindStringSubmatch(name) - if len(matchedGroups) == 3 { - return matchedGroups[1] - } else { + matchedGroups := tags.SplitClusterRegex.FindStringSubmatch(name) + if len(matchedGroups) == 0 { return name } + return matchedGroups[1] } func GatherTargetedClusters( diff --git a/pkg/xds/envoy/tags/match.go b/pkg/xds/envoy/tags/match.go index 80e740355e04..68b1155526e3 100644 --- a/pkg/xds/envoy/tags/match.go +++ b/pkg/xds/envoy/tags/match.go @@ -4,6 +4,7 @@ import ( "crypto/sha256" "errors" "fmt" + "regexp" "sort" "strings" @@ -14,6 +15,11 @@ import ( const TagsHeaderName = "x-kuma-tags" +// Format of split cluster name and regex for parsing it, see usages +const SplitClusterFmtString = "%s-%x" + +var SplitClusterRegex = regexp.MustCompile("(.*)-[[:xdigit:]]{16}$") + type Tags map[string]string // DestinationClusterName generates a unique cluster name for the @@ -46,7 +52,8 @@ func (t Tags) DestinationClusterName( // The qualifier is 16 hex digits. Unscientifically balancing the length // of the hex against the likelihood of collisions. - return fmt.Sprintf("%s-%x", serviceName, h.Sum(nil)[:8]), nil + // Note: policy configuration is sensitive to this format! + return fmt.Sprintf(SplitClusterFmtString, serviceName, h.Sum(nil)[:8]), nil } func (t Tags) WithoutTags(tags ...string) Tags { From fda0b66f28b9cd2e39a80431d476c2ca81f33f27 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 10:13:57 +0200 Subject: [PATCH 07/13] test(MeshCircuitBreaker): adjust for new cluster names Signed-off-by: Mike Beaumont --- .../meshcircuitbreaker/plugin/v1alpha1/plugin_test.go | 4 ++-- ..._cluster_0_connection_limits_outlier_detection.golden.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go index b26e6a7fbaf6..c05d462c2eab 100644 --- a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go +++ b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go @@ -378,9 +378,9 @@ var _ = Describe("MeshCircuitBreaker", func() { Resource: test_xds.ClusterWithName("other-service"), }, { - Name: "other-service-_0_", + Name: "other-service-5ab6003f", Origin: generator.OriginOutbound, - Resource: test_xds.ClusterWithName("other-service-_0_"), + Resource: test_xds.ClusterWithName("other-service-5ab6003f"), }, }, toRules: core_rules.ToRules{ diff --git a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml index 951103f816c1..d08b1e321fdf 100644 --- a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml +++ b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml @@ -5,7 +5,7 @@ circuitBreakers: maxPendingRequests: 3333 maxRequests: 4444 maxRetries: 5555 -name: other-service-_0_ +name: other-service-5ab6003f outlierDetection: baseEjectionTime: 8s consecutive5xx: 12 From d9c284419d22383e76365be70138feab06a0bbb8 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Fri, 20 Oct 2023 17:34:03 +0200 Subject: [PATCH 08/13] test(e2e): fix cluster name dependent assertions Signed-off-by: Mike Beaumont --- test/e2e_env/universal/meshhealthcheck/policy.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/test/e2e_env/universal/meshhealthcheck/policy.go b/test/e2e_env/universal/meshhealthcheck/policy.go index 3500b9f90584..39524967b899 100644 --- a/test/e2e_env/universal/meshhealthcheck/policy.go +++ b/test/e2e_env/universal/meshhealthcheck/policy.go @@ -3,6 +3,7 @@ package meshhealthcheck import ( "encoding/base64" "fmt" + "strings" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -450,20 +451,12 @@ spec: // update HealthCheck policy to check for another status code Expect(YamlUniversal(healthCheck(meshName, "are-you-healthy", "500"))(universal.Cluster)).To(Succeed()) - // wait cluster 'test-server-_0_' to be marked as unhealthy + // wait for both split clusters to be marked as unhealthy Eventually(func(g Gomega) { - cmd := []string{"/bin/bash", "-c", "\"curl localhost:9901/clusters | grep test-server-_0_\""} + cmd := []string{"/bin/bash", "-c", `"curl --silent localhost:9901/clusters | grep -c 'test-server-.*health_flags::/failed_active_hc'"`} stdout, _, err := universal.Cluster.Exec("", "", "dp-demo-client", cmd...) g.Expect(err).ToNot(HaveOccurred()) - g.Expect(stdout).To(ContainSubstring("health_flags::/failed_active_hc")) - }, "30s", "500ms").Should(Succeed()) - - // wait cluster 'test-server-_1_' to be marked as unhealthy - Eventually(func(g Gomega) { - cmd := []string{"/bin/bash", "-c", "\"curl localhost:9901/clusters | grep test-server-_1_\""} - stdout, _, err := universal.Cluster.Exec("", "", "dp-demo-client", cmd...) - g.Expect(err).ToNot(HaveOccurred()) - g.Expect(stdout).To(ContainSubstring("health_flags::/failed_active_hc")) + g.Expect(strings.TrimSpace(stdout)).To(Equal("2")) }, "30s", "500ms").Should(Succeed()) // check that test-server is unhealthy From 1189000c6d1b658a38af64d16fdabe87d3b98fe3 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 12:05:56 +0200 Subject: [PATCH 09/13] fix(metrics): adjust hijacker Signed-off-by: Mike Beaumont --- app/kuma-dp/pkg/dataplane/metrics/merge.go | 41 +++++++++------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/app/kuma-dp/pkg/dataplane/metrics/merge.go b/app/kuma-dp/pkg/dataplane/metrics/merge.go index 7adb4ab85a10..cd35414a032c 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/merge.go +++ b/app/kuma-dp/pkg/dataplane/metrics/merge.go @@ -54,14 +54,14 @@ func MergeClusters(in io.Reader, out io.Writer) error { func handleClusterMetric(metricFamily *io_prometheus_client.MetricFamily) error { // metricsByClusterNames returns the data in the following format: // 'cluster_name' -> - // - metric1{envoy_cluster_name="cluster_name-_0_",label1="value1"} 10 - // - metric1{envoy_cluster_name="cluster_name-_1_",label1="value1"} 20 - // - metric1{envoy_cluster_name="cluster_name-_2_",label1="value1"} 30 + // - metric1{envoy_cluster_name="cluster_name-5fb50345",label1="value1"} 10 + // - metric1{envoy_cluster_name="cluster_name-cfb50345",label1="value1"} 20 + // - metric1{envoy_cluster_name="cluster_name-409aedd1",label1="value1"} 30 // 'another_cluster_name' -> - // - metric1{envoy_cluster_name="another_cluster_name-_0_",response_code="200"} 10 - // - metric1{envoy_cluster_name="another_cluster_name-_0_",response_code="401"} 20 - // - metric1{envoy_cluster_name="another_cluster_name-_1_",response_code="200"} 30 - // - metric1{envoy_cluster_name="another_cluster_name-_2_",response_code="503"} 40 + // - metric1{envoy_cluster_name="another_cluster_name-5fb50345",response_code="200"} 10 + // - metric1{envoy_cluster_name="another_cluster_name-5fb50345",response_code="401"} 20 + // - metric1{envoy_cluster_name="another_cluster_name-cfb50345",response_code="200"} 30 + // - metric1{envoy_cluster_name="another_cluster_name-409aedd1",response_code="503"} 40 metricsByClusterName, err := metricsByClusterNames(metricFamily.Metric) if err != nil { return err @@ -331,28 +331,21 @@ func getHttpPrefix(metric *io_prometheus_client.Metric) (string, bool) { return "", false } -// splitClusterMatch marches cluster names generated by envoy_names.GetSplitClusterName. -var splitClusterMatch = regexp.MustCompile(`(?P.*)-_[0-9]+_$`) - -// gwClusterMatch marches cluster names generated by DestinationClusterName. -var gwClusterMatch = regexp.MustCompile(`(?P.*)-[[:xdigit:]]+$`) +// clusterMatch marches cluster names generated by DestinationClusterName. +var clusterMatch = regexp.MustCompile(`(?P.*)-[[:xdigit:]]{16}$`) // isMergeableClusterName cracks the given cluster name and returns the // prefix if it is mergeable. func isMergeableClusterName(clusterName string) (string, bool) { - for _, re := range []*regexp.Regexp{splitClusterMatch, gwClusterMatch} { - matches := re.FindStringSubmatch(clusterName) - if matches == nil { - continue - } - - prefixIndex := re.SubexpIndex("prefix") - if prefixIndex == -1 { - continue - } + matches := clusterMatch.FindStringSubmatch(clusterName) + if matches == nil { + return "", false + } - return matches[prefixIndex], true + prefixIndex := clusterMatch.SubexpIndex("prefix") + if prefixIndex == -1 { + return "", false } - return "", false + return matches[prefixIndex], true } From 213eb471b4c2ffd8459aac380e75d46df41a9659 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 12:17:46 +0200 Subject: [PATCH 10/13] test(metrics): adjust Signed-off-by: Mike Beaumont --- .../pkg/dataplane/metrics/merge_test.go | 3 +- .../counter-and-noncluster-metrics.in | 12 +- .../metrics/testdata/counter-sparse.in | 14 +- .../metrics/testdata/counter-status-codes.in | 8 +- .../metrics/testdata/counter-with-labels.in | 44 +++--- .../pkg/dataplane/metrics/testdata/counter.in | 12 +- .../pkg/dataplane/metrics/testdata/gauge.in | 18 +-- .../dataplane/metrics/testdata/histogram.in | 132 +++++++++--------- .../pkg/dataplane/metrics/testdata/summary.in | 30 ++-- .../pkg/dataplane/metrics/testdata/untyped.in | 12 +- pkg/xds/envoy/names/resource_names.go | 4 - 11 files changed, 142 insertions(+), 147 deletions(-) diff --git a/app/kuma-dp/pkg/dataplane/metrics/merge_test.go b/app/kuma-dp/pkg/dataplane/metrics/merge_test.go index c3909e808c92..6e05adc9d6ba 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/merge_test.go +++ b/app/kuma-dp/pkg/dataplane/metrics/merge_test.go @@ -11,7 +11,6 @@ import ( . "github.com/onsi/gomega" mesh_proto "github.com/kumahq/kuma/api/mesh/v1alpha1" - envoy_names "github.com/kumahq/kuma/pkg/xds/envoy/names" envoy "github.com/kumahq/kuma/pkg/xds/envoy/tags" ) @@ -83,7 +82,7 @@ var _ = Describe("Merge", func() { var _ = Describe("Detect mergable clusters", func() { It("should crack split cluster names", func() { - clusterName := envoy_names.GetSplitClusterName("foo-service", 99) + clusterName := "foo-service-5bac935803abcdd1" Expect(clusterName).ToNot(BeEmpty()) name, ok := isMergeableClusterName(clusterName) diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-and-noncluster-metrics.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-and-noncluster-metrics.in index c3e53e4291a1..a1489e227025 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-and-noncluster-metrics.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-and-noncluster-metrics.in @@ -22,9 +22,9 @@ envoy_tcp_downstream_cx_rx_bytes_buffered{envoy_tcp_prefix="outbound_passthrough envoy_cluster_assignment_stale{envoy_cluster_name="access_log_sink"} 11 envoy_cluster_assignment_stale{envoy_cluster_name="ads_cluster"} 12 envoy_cluster_assignment_stale{envoy_cluster_name="demo-client"} 13 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 101 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 102 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 101 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 102 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 103 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv4"} 14 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv6"} 15 envoy_cluster_assignment_stale{envoy_cluster_name="kuma_envoy_admin"} 16 @@ -36,9 +36,9 @@ envoy_cluster_assignment_stale{envoy_cluster_name="outbound_passthrough_ipv6"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="access_log_sink"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="ads_cluster"} 2 envoy_cluster_assignment_timeout_received{envoy_cluster_name="demo-client"} 3 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 201 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 202 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 203 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 201 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 202 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 203 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv4"} 4 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv6"} 5 envoy_cluster_assignment_timeout_received{envoy_cluster_name="kuma_envoy_admin"} 6 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-sparse.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-sparse.in index 7f6ac5335701..ca6dfc01dc64 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-sparse.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-sparse.in @@ -2,10 +2,10 @@ envoy_cluster_assignment_stale{envoy_cluster_name="access_log_sink"} 11 envoy_cluster_assignment_stale{envoy_cluster_name="ads_cluster"} 12 envoy_cluster_assignment_stale{envoy_cluster_name="demo-client"} 13 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 102 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_4_"} 103 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_7_"} 103 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_9_"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 102 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 103 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv4"} 14 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv6"} 15 envoy_cluster_assignment_stale{envoy_cluster_name="kuma_envoy_admin"} 16 @@ -17,9 +17,9 @@ envoy_cluster_assignment_stale{envoy_cluster_name="outbound_passthrough_ipv6"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="access_log_sink"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="ads_cluster"} 2 envoy_cluster_assignment_timeout_received{envoy_cluster_name="demo-client"} 3 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_10_"} 201 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_11_"} 202 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_20_"} 203 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 201 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 202 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 203 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv4"} 4 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv6"} 5 envoy_cluster_assignment_timeout_received{envoy_cluster_name="kuma_envoy_admin"} 6 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-status-codes.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-status-codes.in index c4e3805ade7a..c9fc7bbb52d0 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-status-codes.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-status-codes.in @@ -1,6 +1,6 @@ # TYPE envoy_cluster_external_upstream_rq counter -envoy_cluster_external_upstream_rq{envoy_response_code="200",envoy_cluster_name="backend_kuma-demo_svc_3001-_0_"} 14 -envoy_cluster_external_upstream_rq{envoy_response_code="404",envoy_cluster_name="backend_kuma-demo_svc_3001-_0_"} 2 -envoy_cluster_external_upstream_rq{envoy_response_code="200",envoy_cluster_name="backend_kuma-demo_svc_3001-_1_"} 24 -envoy_cluster_external_upstream_rq{envoy_response_code="404",envoy_cluster_name="backend_kuma-demo_svc_3001-_1_"} 12 +envoy_cluster_external_upstream_rq{envoy_response_code="200",envoy_cluster_name="backend_kuma-demo_svc_3001-0382aaf295add2eb"} 14 +envoy_cluster_external_upstream_rq{envoy_response_code="404",envoy_cluster_name="backend_kuma-demo_svc_3001-0382aaf295add2eb"} 2 +envoy_cluster_external_upstream_rq{envoy_response_code="200",envoy_cluster_name="backend_kuma-demo_svc_3001-fe04929f294bcdea"} 24 +envoy_cluster_external_upstream_rq{envoy_response_code="404",envoy_cluster_name="backend_kuma-demo_svc_3001-fe04929f294bcdea"} 12 envoy_cluster_external_upstream_rq{envoy_response_code="200",envoy_cluster_name="kuma_envoy_admin"} 255 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-with-labels.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-with-labels.in index 5007b5918143..c161476e4a2a 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-with-labels.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter-with-labels.in @@ -2,9 +2,9 @@ envoy_cluster_assignment_stale{envoy_cluster_name="access_log_sink",custom_label="value1"} 11 envoy_cluster_assignment_stale{envoy_cluster_name="ads_cluster",custom_label="value1"} 12 envoy_cluster_assignment_stale{envoy_cluster_name="demo-client",custom_label="value1"} 13 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",custom_label="value1"} 101 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",custom_label="value1"} 102 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",custom_label="value1"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",custom_label="value1"} 101 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",custom_label="value1"} 102 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff",custom_label="value1"} 103 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv4",custom_label="value1"} 14 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv6",custom_label="value1"} 15 envoy_cluster_assignment_stale{envoy_cluster_name="kuma_envoy_admin",custom_label="value1"} 16 @@ -16,9 +16,9 @@ envoy_cluster_assignment_stale{envoy_cluster_name="outbound_passthrough_ipv6",cu envoy_cluster_assignment_timeout_received{envoy_cluster_name="access_log_sink",custom_label="value2"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="ads_cluster",custom_label="value2"} 2 envoy_cluster_assignment_timeout_received{envoy_cluster_name="demo-client",custom_label="value2"} 3 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",custom_label="value2"} 201 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",custom_label="value2"} 202 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",custom_label="value2"} 203 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",custom_label="value2"} 201 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",custom_label="value2"} 202 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff",custom_label="value2"} 203 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv4",custom_label="value2"} 4 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv6",custom_label="value2"} 5 envoy_cluster_assignment_timeout_received{envoy_cluster_name="kuma_envoy_admin",custom_label="value2"} 6 @@ -27,21 +27,21 @@ envoy_cluster_assignment_timeout_received{envoy_cluster_name="outbound_passthrou envoy_cluster_assignment_timeout_received{envoy_cluster_name="outbound_passthrough_ipv6",custom_label="value2"} 9 # TYPE response_codes counter -response_codes{response_code="200",envoy_cluster_name="backend-_0_"} 1 -response_codes{response_code="404",envoy_cluster_name="backend-_0_"} 2 -response_codes{response_code="500",envoy_cluster_name="backend-_0_"} 3 -response_codes{response_code="503",envoy_cluster_name="backend-_0_"} 4 -response_codes{response_code="200",envoy_cluster_name="backend-_1_"} 10 -response_codes{response_code="404",envoy_cluster_name="backend-_1_"} 20 -response_codes{response_code="500",envoy_cluster_name="backend-_1_"} 30 -response_codes{response_code="401",envoy_cluster_name="backend-_1_"} 40 -response_codes{response_code="200",envoy_cluster_name="frontend-_1_"} 300 -response_codes{response_code="401",envoy_cluster_name="frontend-_2_"} 400 +response_codes{response_code="200",envoy_cluster_name="backend-fe04929f294bcdea"} 1 +response_codes{response_code="404",envoy_cluster_name="backend-fe04929f294bcdea"} 2 +response_codes{response_code="500",envoy_cluster_name="backend-fe04929f294bcdea"} 3 +response_codes{response_code="503",envoy_cluster_name="backend-fe04929f294bcdea"} 4 +response_codes{response_code="200",envoy_cluster_name="backend-0382aaf295add2eb"} 10 +response_codes{response_code="404",envoy_cluster_name="backend-0382aaf295add2eb"} 20 +response_codes{response_code="500",envoy_cluster_name="backend-0382aaf295add2eb"} 30 +response_codes{response_code="401",envoy_cluster_name="backend-0382aaf295add2eb"} 40 +response_codes{response_code="200",envoy_cluster_name="frontend-0382aaf295add2eb"} 300 +response_codes{response_code="401",envoy_cluster_name="frontend-0382aaf295add2eb"} 400 # TYPE several_labels counter -several_labels{envoy_cluster_name="backend-_0_",l1="v11",l2="v12",l3="v13"} 1 -several_labels{envoy_cluster_name="backend-_0_",l1="v21",l2="v22",l3="v23"} 2 -several_labels{envoy_cluster_name="backend-_0_",l1="v31",l2="v32",l3="v33"} 3 -several_labels{envoy_cluster_name="backend-_1_",l1="v11",l2="v12",l3="v13"} 10 -several_labels{envoy_cluster_name="backend-_1_",l1="v21",l2="v22",l3="v23"} 20 -several_labels{envoy_cluster_name="backend-_1_",l1="v31",l2="v32",l3="v33"} 30 +several_labels{envoy_cluster_name="backend-fe04929f294bcdea",l1="v11",l2="v12",l3="v13"} 1 +several_labels{envoy_cluster_name="backend-fe04929f294bcdea",l1="v21",l2="v22",l3="v23"} 2 +several_labels{envoy_cluster_name="backend-fe04929f294bcdea",l1="v31",l2="v32",l3="v33"} 3 +several_labels{envoy_cluster_name="backend-0382aaf295add2eb",l1="v11",l2="v12",l3="v13"} 10 +several_labels{envoy_cluster_name="backend-0382aaf295add2eb",l1="v21",l2="v22",l3="v23"} 20 +several_labels{envoy_cluster_name="backend-0382aaf295add2eb",l1="v31",l2="v32",l3="v33"} 30 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter.in index 8ba7773fcafc..939335b7590a 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/counter.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/counter.in @@ -2,9 +2,9 @@ envoy_cluster_assignment_stale{envoy_cluster_name="access_log_sink"} 11 envoy_cluster_assignment_stale{envoy_cluster_name="ads_cluster"} 12 envoy_cluster_assignment_stale{envoy_cluster_name="demo-client"} 13 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 101 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 102 -envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 103 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 101 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 102 +envoy_cluster_assignment_stale{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 103 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv4"} 14 envoy_cluster_assignment_stale{envoy_cluster_name="inbound_passthrough_ipv6"} 15 envoy_cluster_assignment_stale{envoy_cluster_name="kuma_envoy_admin"} 16 @@ -19,9 +19,9 @@ envoy_http_downstream_rq_total{envoy_http_conn_manager_prefix="default_gateway"} envoy_cluster_assignment_timeout_received{envoy_cluster_name="access_log_sink"} 1 envoy_cluster_assignment_timeout_received{envoy_cluster_name="ads_cluster"} 2 envoy_cluster_assignment_timeout_received{envoy_cluster_name="demo-client"} 3 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 201 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 202 -envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 203 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 201 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 202 +envoy_cluster_assignment_timeout_received{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 203 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv4"} 4 envoy_cluster_assignment_timeout_received{envoy_cluster_name="inbound_passthrough_ipv6"} 5 envoy_cluster_assignment_timeout_received{envoy_cluster_name="kuma_envoy_admin"} 6 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/gauge.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/gauge.in index bdcbc4835471..b8b76b19ca01 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/gauge.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/gauge.in @@ -2,9 +2,9 @@ envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="access_log_sink"} 1 envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="ads_cluster"} 2 envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="demo-client"} 3 -envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 100 -envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 110 -envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 120 +envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 100 +envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 110 +envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 120 envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="inbound_passthrough_ipv4"} 4 envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="inbound_passthrough_ipv6"} 5 envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="kuma_envoy_admin"} 6 @@ -16,9 +16,9 @@ envoy_cluster_circuit_breakers_default_cx_open{envoy_cluster_name="outbound_pass envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="access_log_sink"} 21 envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="ads_cluster"} 22 envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="demo-client"} 23 -envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 200 -envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 210 -envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 220 +envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 200 +envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 210 +envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 220 envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="inbound_passthrough_ipv4"} 24 envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="inbound_passthrough_ipv6"} 25 envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="kuma_envoy_admin"} 26 @@ -30,9 +30,9 @@ envoy_cluster_circuit_breakers_default_cx_pool_open{envoy_cluster_name="outbound envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="access_log_sink"} 31 envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="ads_cluster"} 32 envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="demo-client"} 33 -envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 300 -envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 310 -envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 320 +envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 300 +envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 310 +envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 320 envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="inbound_passthrough_ipv4"} 34 envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="inbound_passthrough_ipv6"} 35 envoy_cluster_circuit_breakers_default_rq_open{envoy_cluster_name="kuma_envoy_admin"} 36 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/histogram.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/histogram.in index 1f63595de71b..c777fa0bd8ff 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/histogram.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/histogram.in @@ -65,72 +65,72 @@ envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="demo-client",le= envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="demo-client",le="+Inf"} 0 envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="demo-client"} 0 envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="demo-client"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="0.5"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="1"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="5"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="10"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="25"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="50"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="100"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="250"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="1000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="2500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="5000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="10000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="30000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="60000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="300000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="1800000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="3600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",le="+Inf"} 4 -envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 27.6499999999999985789145284798 -envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="0.5"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="1"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="5"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="10"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="25"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="50"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="100"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="250"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="1000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="2500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="5000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="10000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="30000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="60000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="300000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="1800000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="3600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",le="+Inf"} 4 -envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 30.6499999999999985789145284798 -envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="0.5"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="1"} 0 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="5"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="10"} 3 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="25"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="50"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="100"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="250"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="1000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="2500"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="5000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="10000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="30000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="60000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="300000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="1800000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="3600000"} 4 -envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",le="+Inf"} 4 -envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 27.6499999999999985789145284798 -envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="0.5"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="1"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="5"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="10"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="25"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="50"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="100"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="250"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="1000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="2500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="5000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="10000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="30000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="60000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="300000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="1800000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="3600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb",le="+Inf"} 4 +envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 27.6499999999999985789145284798 +envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="0.5"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="1"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="5"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="10"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="25"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="50"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="100"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="250"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="1000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="2500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="5000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="10000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="30000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="60000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="300000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="1800000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="3600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",le="+Inf"} 4 +envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 30.6499999999999985789145284798 +envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="0.5"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="1"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="5"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="10"} 3 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="25"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="50"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="100"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="250"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="1000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="2500"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="5000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="10000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="30000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="60000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="300000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="1800000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="3600000"} 4 +envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",le="+Inf"} 4 +envoy_cluster_upstream_cx_connect_ms_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 27.6499999999999985789145284798 +envoy_cluster_upstream_cx_connect_ms_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 4 envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="inbound_passthrough_ipv4",le="0.5"} 0 envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="inbound_passthrough_ipv4",le="1"} 0 envoy_cluster_upstream_cx_connect_ms_bucket{envoy_cluster_name="inbound_passthrough_ipv4",le="5"} 0 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/summary.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/summary.in index d4227fd06845..6404f43ad8b0 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/summary.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/summary.in @@ -1,16 +1,16 @@ # TYPE custom_metric_seconds summary -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",quantile="0.5"} 2 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",quantile="0.9"} 5 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_",quantile="0.99"} 20 -custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 1000 -custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 500 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",quantile="0.5"} 3 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",quantile="0.9"} 6 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_",quantile="0.99"} 11 -custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 600 -custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 100 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",quantile="0.5"} 4 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",quantile="0.9"} 7 -custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_",quantile="0.99"} 13 -custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 800 -custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 200 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",quantile="0.5"} 2 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",quantile="0.9"} 5 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea",quantile="0.99"} 20 +custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 1000 +custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-fe04929f294bcdea"} 500 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff",quantile="0.5"} 3 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff",quantile="0.9"} 6 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff",quantile="0.99"} 11 +custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 600 +custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 100 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",quantile="0.5"} 4 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",quantile="0.9"} 7 +custom_metric_seconds{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb",quantile="0.99"} 13 +custom_metric_seconds_sum{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 800 +custom_metric_seconds_count{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 200 diff --git a/app/kuma-dp/pkg/dataplane/metrics/testdata/untyped.in b/app/kuma-dp/pkg/dataplane/metrics/testdata/untyped.in index 7aea038ec526..7667a30f8049 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/testdata/untyped.in +++ b/app/kuma-dp/pkg/dataplane/metrics/testdata/untyped.in @@ -2,9 +2,9 @@ custom_metrics{envoy_cluster_name="access_log_sink"} 11 custom_metrics{envoy_cluster_name="ads_cluster"} 12 custom_metrics{envoy_cluster_name="demo-client"} 13 -custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 101 -custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 102 -custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 103 +custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 101 +custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 102 +custom_metrics{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 103 custom_metrics{envoy_cluster_name="inbound_passthrough_ipv4"} 14 custom_metrics{envoy_cluster_name="inbound_passthrough_ipv6"} 15 custom_metrics{envoy_cluster_name="kuma_envoy_admin"} 16 @@ -16,9 +16,9 @@ custom_metrics{envoy_cluster_name="outbound_passthrough_ipv6"} 19 custom_metrics_2{envoy_cluster_name="access_log_sink"} 1 custom_metrics_2{envoy_cluster_name="ads_cluster"} 2 custom_metrics_2{envoy_cluster_name="demo-client"} 3 -custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-_0_"} 201 -custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-_1_"} 202 -custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-_2_"} 203 +custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-0382aaf295add2eb"} 201 +custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-94bcdea309bceaff"} 202 +custom_metrics_2{envoy_cluster_name="echo-server_kuma-test_svc_8080-369bce2d30623ffb"} 203 custom_metrics_2{envoy_cluster_name="inbound_passthrough_ipv4"} 4 custom_metrics_2{envoy_cluster_name="inbound_passthrough_ipv6"} 5 custom_metrics_2{envoy_cluster_name="kuma_envoy_admin"} 6 diff --git a/pkg/xds/envoy/names/resource_names.go b/pkg/xds/envoy/names/resource_names.go index 40db9712996e..e30ba858973c 100644 --- a/pkg/xds/envoy/names/resource_names.go +++ b/pkg/xds/envoy/names/resource_names.go @@ -27,10 +27,6 @@ func GetLocalClusterName(port uint32) string { return Join("localhost", formatPort(port)) } -func GetSplitClusterName(service string, idx int) string { - return fmt.Sprintf("%s-_%d_", service, idx) -} - func GetPortForLocalClusterName(cluster string) (uint32, error) { parts := strings.Split(cluster, Separator) if len(parts) != 2 { From 58db4762c0f8eba36bcb5292441f71864d05d02d Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 16:12:58 +0200 Subject: [PATCH 11/13] test(MeshCircuitBreaker): use correct number of hex digits for cluster Signed-off-by: Mike Beaumont --- .../meshcircuitbreaker/plugin/v1alpha1/plugin_test.go | 4 ++-- ..._cluster_0_connection_limits_outlier_detection.golden.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go index c05d462c2eab..f61f05297af4 100644 --- a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go +++ b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin_test.go @@ -378,9 +378,9 @@ var _ = Describe("MeshCircuitBreaker", func() { Resource: test_xds.ClusterWithName("other-service"), }, { - Name: "other-service-5ab6003f", + Name: "other-service-5ab6003f460fabce", Origin: generator.OriginOutbound, - Resource: test_xds.ClusterWithName("other-service-5ab6003f"), + Resource: test_xds.ClusterWithName("other-service-5ab6003f460fabce"), }, }, toRules: core_rules.ToRules{ diff --git a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml index d08b1e321fdf..812383d9ec44 100644 --- a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml +++ b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/testdata/outbound_split_cluster_0_connection_limits_outlier_detection.golden.yaml @@ -5,7 +5,7 @@ circuitBreakers: maxPendingRequests: 3333 maxRequests: 4444 maxRetries: 5555 -name: other-service-5ab6003f +name: other-service-5ab6003f460fabce outlierDetection: baseEjectionTime: 8s consecutive5xx: 12 From 1936405649adb6182b83db4edfc57fe4cb59ec13 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 17:37:46 +0200 Subject: [PATCH 12/13] refactor: keep regex and format string private to package Signed-off-by: Mike Beaumont --- pkg/plugins/policies/core/xds/clusters.go | 10 +--------- pkg/plugins/policies/core/xds/endpoints.go | 5 +++-- pkg/xds/envoy/tags/match.go | 14 +++++++++++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/pkg/plugins/policies/core/xds/clusters.go b/pkg/plugins/policies/core/xds/clusters.go index 16f5ae3c2cfb..b460f22f2488 100644 --- a/pkg/plugins/policies/core/xds/clusters.go +++ b/pkg/plugins/policies/core/xds/clusters.go @@ -33,7 +33,7 @@ func GatherClusters(rs *xds.ResourceSet) Clusters { switch res.Origin { case generator.OriginOutbound: - serviceName := ServiceFromClusterName(cluster.Name) + serviceName := tags.ServiceFromClusterName(cluster.Name) if serviceName != cluster.Name { // first group is service name and second split number clusters.OutboundSplit[serviceName] = append(clusters.OutboundSplit[serviceName], cluster) @@ -51,14 +51,6 @@ func GatherClusters(rs *xds.ResourceSet) Clusters { return clusters } -func ServiceFromClusterName(name string) string { - matchedGroups := tags.SplitClusterRegex.FindStringSubmatch(name) - if len(matchedGroups) == 0 { - return name - } - return matchedGroups[1] -} - func GatherTargetedClusters( outbounds []*mesh_proto.Dataplane_Networking_Outbound, outboundSplitClusters map[string][]*envoy_cluster.Cluster, diff --git a/pkg/plugins/policies/core/xds/endpoints.go b/pkg/plugins/policies/core/xds/endpoints.go index 483b1baa6e86..6e9caccd67e7 100644 --- a/pkg/plugins/policies/core/xds/endpoints.go +++ b/pkg/plugins/policies/core/xds/endpoints.go @@ -6,6 +6,7 @@ import ( envoy_resource "github.com/envoyproxy/go-control-plane/pkg/resource/v3" "github.com/kumahq/kuma/pkg/core/xds" + "github.com/kumahq/kuma/pkg/xds/envoy/tags" "github.com/kumahq/kuma/pkg/xds/generator" "github.com/kumahq/kuma/pkg/xds/generator/egress" ) @@ -20,7 +21,7 @@ func GatherEndpoints(rs *xds.ResourceSet) EndpointMap { } cla := res.Resource.(*endpointv3.ClusterLoadAssignment) - serviceName := ServiceFromClusterName(cla.ClusterName) + serviceName := tags.ServiceFromClusterName(cla.ClusterName) em[serviceName] = append(em[serviceName], cla) } for _, res := range rs.Resources(envoy_resource.ClusterType) { @@ -29,7 +30,7 @@ func GatherEndpoints(rs *xds.ResourceSet) EndpointMap { } cluster := res.Resource.(*clusterv3.Cluster) - serviceName := ServiceFromClusterName(cluster.Name) + serviceName := tags.ServiceFromClusterName(cluster.Name) if cluster.LoadAssignment != nil { em[serviceName] = append(em[serviceName], cluster.LoadAssignment) } diff --git a/pkg/xds/envoy/tags/match.go b/pkg/xds/envoy/tags/match.go index 68b1155526e3..891b23bb6c9c 100644 --- a/pkg/xds/envoy/tags/match.go +++ b/pkg/xds/envoy/tags/match.go @@ -16,12 +16,20 @@ import ( const TagsHeaderName = "x-kuma-tags" // Format of split cluster name and regex for parsing it, see usages -const SplitClusterFmtString = "%s-%x" +const splitClusterFmtString = "%s-%x" -var SplitClusterRegex = regexp.MustCompile("(.*)-[[:xdigit:]]{16}$") +var splitClusterRegex = regexp.MustCompile("(.*)-[[:xdigit:]]{16}$") type Tags map[string]string +func ServiceFromClusterName(name string) string { + matchedGroups := splitClusterRegex.FindStringSubmatch(name) + if len(matchedGroups) == 0 { + return name + } + return matchedGroups[1] +} + // DestinationClusterName generates a unique cluster name for the // destination. identifyingTags are useful for adding extra metadata outside of just tags. Tags must at least contain `kuma.io/service` func (t Tags) DestinationClusterName( @@ -53,7 +61,7 @@ func (t Tags) DestinationClusterName( // The qualifier is 16 hex digits. Unscientifically balancing the length // of the hex against the likelihood of collisions. // Note: policy configuration is sensitive to this format! - return fmt.Sprintf(SplitClusterFmtString, serviceName, h.Sum(nil)[:8]), nil + return fmt.Sprintf(splitClusterFmtString, serviceName, h.Sum(nil)[:8]), nil } func (t Tags) WithoutTags(tags ...string) Tags { From 0da38f1a160f60d3c67fbce00faf85d468dc5021 Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Mon, 23 Oct 2023 17:39:21 +0200 Subject: [PATCH 13/13] docs: improve comments Signed-off-by: Mike Beaumont --- app/kuma-dp/pkg/dataplane/metrics/merge.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/kuma-dp/pkg/dataplane/metrics/merge.go b/app/kuma-dp/pkg/dataplane/metrics/merge.go index cd35414a032c..3270c0963099 100644 --- a/app/kuma-dp/pkg/dataplane/metrics/merge.go +++ b/app/kuma-dp/pkg/dataplane/metrics/merge.go @@ -54,14 +54,14 @@ func MergeClusters(in io.Reader, out io.Writer) error { func handleClusterMetric(metricFamily *io_prometheus_client.MetricFamily) error { // metricsByClusterNames returns the data in the following format: // 'cluster_name' -> - // - metric1{envoy_cluster_name="cluster_name-5fb50345",label1="value1"} 10 - // - metric1{envoy_cluster_name="cluster_name-cfb50345",label1="value1"} 20 - // - metric1{envoy_cluster_name="cluster_name-409aedd1",label1="value1"} 30 + // - metric1{envoy_cluster_name="cluster_name-5fb50345cfb50345",label1="value1"} 10 + // - metric1{envoy_cluster_name="cluster_name-cfb50345409aedd1",label1="value1"} 20 + // - metric1{envoy_cluster_name="cluster_name-409aedd15fb50345",label1="value1"} 30 // 'another_cluster_name' -> - // - metric1{envoy_cluster_name="another_cluster_name-5fb50345",response_code="200"} 10 - // - metric1{envoy_cluster_name="another_cluster_name-5fb50345",response_code="401"} 20 - // - metric1{envoy_cluster_name="another_cluster_name-cfb50345",response_code="200"} 30 - // - metric1{envoy_cluster_name="another_cluster_name-409aedd1",response_code="503"} 40 + // - metric1{envoy_cluster_name="another_cluster_name-5fb50345cfb50345",response_code="200"} 10 + // - metric1{envoy_cluster_name="another_cluster_name-5fb50345cfb50345",response_code="401"} 20 + // - metric1{envoy_cluster_name="another_cluster_name-cfb50345409aedd1",response_code="200"} 30 + // - metric1{envoy_cluster_name="another_cluster_name-409aedd15fb50345",response_code="503"} 40 metricsByClusterName, err := metricsByClusterNames(metricFamily.Metric) if err != nil { return err @@ -331,7 +331,7 @@ func getHttpPrefix(metric *io_prometheus_client.Metric) (string, bool) { return "", false } -// clusterMatch marches cluster names generated by DestinationClusterName. +// clusterMatch matches cluster names generated by DestinationClusterName. var clusterMatch = regexp.MustCompile(`(?P.*)-[[:xdigit:]]{16}$`) // isMergeableClusterName cracks the given cluster name and returns the