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  }