istio.io/istio@v0.0.0-20240520182934-d79c90f27776/pilot/pkg/model/telemetry_metric_test.go (about) 1 // Copyright Istio Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package model 16 17 import ( 18 "testing" 19 20 wrappers "google.golang.org/protobuf/types/known/wrapperspb" 21 22 meshconfig "istio.io/api/mesh/v1alpha1" 23 tpb "istio.io/api/telemetry/v1alpha1" 24 "istio.io/istio/pkg/config/mesh" 25 "istio.io/istio/pkg/test/util/assert" 26 ) 27 28 func TestTelemetryMetricsExhaustiveness(t *testing.T) { 29 AssertProvidersHandled(telemetryFilterHandled) 30 } 31 32 func TestMergeMetrics(t *testing.T) { 33 withoutMetricsProviders := mesh.DefaultMeshConfig() 34 withMetricsProviders := mesh.DefaultMeshConfig() 35 withMetricsProviders.DefaultProviders = &meshconfig.MeshConfig_DefaultProviders{ 36 Metrics: []string{"prometheus"}, 37 } 38 39 enablePrometheus := &tpb.Metrics{ 40 Providers: []*tpb.ProviderRef{ 41 {Name: "prometheus"}, 42 }, 43 } 44 disableAll := &tpb.Metrics{ 45 Providers: []*tpb.ProviderRef{ 46 {Name: "prometheus"}, 47 }, 48 Overrides: []*tpb.MetricsOverrides{ 49 { 50 Match: &tpb.MetricSelector{ 51 MetricMatch: &tpb.MetricSelector_Metric{ 52 Metric: tpb.MetricSelector_ALL_METRICS, 53 }, 54 Mode: tpb.WorkloadMode_CLIENT_AND_SERVER, 55 }, 56 Disabled: &wrappers.BoolValue{Value: true}, 57 }, 58 }, 59 } 60 disableAllWithoutMode := &tpb.Metrics{ 61 Providers: []*tpb.ProviderRef{ 62 {Name: "prometheus"}, 63 }, 64 Overrides: []*tpb.MetricsOverrides{ 65 { 66 Match: &tpb.MetricSelector{ 67 MetricMatch: &tpb.MetricSelector_Metric{ 68 Metric: tpb.MetricSelector_ALL_METRICS, 69 }, 70 }, 71 Disabled: &wrappers.BoolValue{Value: true}, 72 }, 73 }, 74 } 75 disableServer := &tpb.Metrics{ 76 Providers: []*tpb.ProviderRef{ 77 {Name: "prometheus"}, 78 }, 79 Overrides: []*tpb.MetricsOverrides{ 80 { 81 Match: &tpb.MetricSelector{ 82 MetricMatch: &tpb.MetricSelector_Metric{ 83 Metric: tpb.MetricSelector_ALL_METRICS, 84 }, 85 Mode: tpb.WorkloadMode_SERVER, 86 }, 87 Disabled: &wrappers.BoolValue{Value: true}, 88 }, 89 }, 90 } 91 disableClient := &tpb.Metrics{ 92 Providers: []*tpb.ProviderRef{ 93 {Name: "prometheus"}, 94 }, 95 Overrides: []*tpb.MetricsOverrides{ 96 { 97 Match: &tpb.MetricSelector{ 98 MetricMatch: &tpb.MetricSelector_Metric{ 99 Metric: tpb.MetricSelector_ALL_METRICS, 100 }, 101 Mode: tpb.WorkloadMode_CLIENT, 102 }, 103 Disabled: &wrappers.BoolValue{Value: true}, 104 }, 105 }, 106 } 107 disableServerAndCustomClient := &tpb.Metrics{ 108 Providers: []*tpb.ProviderRef{ 109 {Name: "prometheus"}, 110 }, 111 Overrides: []*tpb.MetricsOverrides{ 112 { 113 Match: &tpb.MetricSelector{ 114 MetricMatch: &tpb.MetricSelector_Metric{ 115 Metric: tpb.MetricSelector_ALL_METRICS, 116 }, 117 Mode: tpb.WorkloadMode_SERVER, 118 }, 119 Disabled: &wrappers.BoolValue{Value: true}, 120 }, 121 { 122 Match: &tpb.MetricSelector{ 123 MetricMatch: &tpb.MetricSelector_Metric{ 124 Metric: tpb.MetricSelector_REQUEST_COUNT, 125 }, 126 Mode: tpb.WorkloadMode_CLIENT, 127 }, 128 TagOverrides: map[string]*tpb.MetricsOverrides_TagOverride{ 129 "destination_canonical_service": { 130 Operation: tpb.MetricsOverrides_TagOverride_REMOVE, 131 }, 132 }, 133 }, 134 }, 135 } 136 137 cases := []struct { 138 name string 139 metrics []*tpb.Metrics 140 mesh *meshconfig.MeshConfig 141 expected map[string]metricsConfig 142 }{ 143 // without providers 144 { 145 name: "no metrics", 146 mesh: withoutMetricsProviders, 147 expected: nil, 148 }, 149 { 150 name: "enable all metrics", 151 metrics: []*tpb.Metrics{enablePrometheus}, 152 mesh: withoutMetricsProviders, 153 expected: map[string]metricsConfig{ 154 "prometheus": {}, 155 }, 156 }, 157 // with providers 158 { 159 name: "metrics with default providers", 160 mesh: withMetricsProviders, 161 expected: map[string]metricsConfig{ 162 "prometheus": {}, 163 }, 164 }, 165 { 166 name: "disable all metrics", 167 metrics: []*tpb.Metrics{disableAll}, 168 mesh: withMetricsProviders, 169 expected: map[string]metricsConfig{ 170 "prometheus": { 171 ClientMetrics: metricConfig{ 172 Disabled: true, 173 }, 174 ServerMetrics: metricConfig{ 175 Disabled: true, 176 }, 177 }, 178 }, 179 }, 180 { 181 name: "disable all metrics without mode", 182 metrics: []*tpb.Metrics{disableAllWithoutMode}, 183 mesh: withMetricsProviders, 184 expected: map[string]metricsConfig{ 185 "prometheus": { 186 ClientMetrics: metricConfig{ 187 Disabled: true, 188 }, 189 ServerMetrics: metricConfig{ 190 Disabled: true, 191 }, 192 }, 193 }, 194 }, 195 { 196 name: "disable server metrics", 197 metrics: []*tpb.Metrics{disableServer}, 198 mesh: withMetricsProviders, 199 expected: map[string]metricsConfig{ 200 "prometheus": { 201 ServerMetrics: metricConfig{ 202 Disabled: true, 203 }, 204 }, 205 }, 206 }, 207 { 208 name: "disable client metrics", 209 metrics: []*tpb.Metrics{disableClient}, 210 mesh: withMetricsProviders, 211 expected: map[string]metricsConfig{ 212 "prometheus": { 213 ClientMetrics: metricConfig{ 214 Disabled: true, 215 }, 216 }, 217 }, 218 }, 219 { 220 name: "disable server and custom client metrics", 221 metrics: []*tpb.Metrics{disableServerAndCustomClient}, 222 mesh: withMetricsProviders, 223 expected: map[string]metricsConfig{ 224 "prometheus": { 225 ClientMetrics: metricConfig{ 226 Disabled: false, 227 Overrides: []metricsOverride{ 228 { 229 Name: "REQUEST_COUNT", 230 Tags: []tagOverride{ 231 {Name: "destination_canonical_service", Remove: true}, 232 }, 233 }, 234 }, 235 }, 236 ServerMetrics: metricConfig{ 237 Disabled: true, 238 }, 239 }, 240 }, 241 }, 242 } 243 for _, tc := range cases { 244 t.Run(tc.name, func(t *testing.T) { 245 got := mergeMetrics(tc.metrics, tc.mesh) 246 assert.Equal(t, tc.expected, got) 247 }) 248 } 249 }