istio.io/istio@v0.0.0-20240520182934-d79c90f27776/pilot/pkg/networking/telemetry/telemetry_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 telemetry
    16  
    17  import (
    18  	"fmt"
    19  	"testing"
    20  
    21  	"istio.io/istio/pilot/pkg/model"
    22  	"istio.io/istio/pilot/pkg/serviceregistry/provider"
    23  )
    24  
    25  func TestBuildStatPrefix(t *testing.T) {
    26  	tests := []struct {
    27  		name        string
    28  		statPattern string
    29  		host        string
    30  		subsetName  string
    31  		targetPort  int
    32  		port        *model.Port
    33  		attributes  *model.ServiceAttributes
    34  		want        string
    35  	}{
    36  		{
    37  			"Service only pattern",
    38  			"%SERVICE%",
    39  			"reviews.default.svc.cluster.local",
    40  			"",
    41  			0,
    42  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
    43  			&model.ServiceAttributes{
    44  				ServiceRegistry: provider.Kubernetes,
    45  				Name:            "reviews",
    46  				Namespace:       "default",
    47  			},
    48  			"reviews.default",
    49  		},
    50  		{
    51  			"Service only pattern from different namespace",
    52  			"%SERVICE%",
    53  			"reviews.namespace1.svc.cluster.local",
    54  			"",
    55  			0,
    56  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
    57  			&model.ServiceAttributes{
    58  				ServiceRegistry: provider.Kubernetes,
    59  				Name:            "reviews",
    60  				Namespace:       "namespace1",
    61  			},
    62  			"reviews.namespace1",
    63  		},
    64  		{
    65  			"Service with port pattern from different namespace",
    66  			"%SERVICE%.%SERVICE_PORT%",
    67  			"reviews.namespace1.svc.cluster.local",
    68  			"",
    69  			0,
    70  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
    71  			&model.ServiceAttributes{
    72  				ServiceRegistry: provider.Kubernetes,
    73  				Name:            "reviews",
    74  				Namespace:       "namespace1",
    75  			},
    76  			"reviews.namespace1.7443",
    77  		},
    78  		{
    79  			"Service FQDN only pattern",
    80  			"%SERVICE_FQDN%",
    81  			"reviews.default.svc.cluster.local",
    82  			"",
    83  			0,
    84  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
    85  			&model.ServiceAttributes{
    86  				ServiceRegistry: provider.Kubernetes,
    87  				Name:            "reviews",
    88  				Namespace:       "default",
    89  			},
    90  			"reviews.default.svc.cluster.local",
    91  		},
    92  		{
    93  			"Service With Port pattern",
    94  			"%SERVICE%_%SERVICE_PORT%",
    95  			"reviews.default.svc.cluster.local",
    96  			"",
    97  			0,
    98  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
    99  			&model.ServiceAttributes{
   100  				ServiceRegistry: provider.Kubernetes,
   101  				Name:            "reviews",
   102  				Namespace:       "default",
   103  			},
   104  			"reviews.default_7443",
   105  		},
   106  		{
   107  			"Service With Port Name pattern",
   108  			"%SERVICE%_%SERVICE_PORT_NAME%",
   109  			"reviews.default.svc.cluster.local",
   110  			"",
   111  			0,
   112  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   113  			&model.ServiceAttributes{
   114  				ServiceRegistry: provider.Kubernetes,
   115  				Name:            "reviews",
   116  				Namespace:       "default",
   117  			},
   118  			"reviews.default_grpc-svc",
   119  		},
   120  		{
   121  			"Service With Port and Port Name pattern",
   122  			"%SERVICE%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   123  			"reviews.default.svc.cluster.local",
   124  			"",
   125  			0,
   126  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   127  			&model.ServiceAttributes{
   128  				ServiceRegistry: provider.Kubernetes,
   129  				Name:            "reviews",
   130  				Namespace:       "default",
   131  			},
   132  			"reviews.default_grpc-svc_7443",
   133  		},
   134  		{
   135  			"Service FQDN With Port pattern",
   136  			"%SERVICE_FQDN%_%SERVICE_PORT%",
   137  			"reviews.default.svc.cluster.local",
   138  			"",
   139  			0,
   140  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   141  			&model.ServiceAttributes{
   142  				ServiceRegistry: provider.Kubernetes,
   143  				Name:            "reviews",
   144  				Namespace:       "default",
   145  			},
   146  			"reviews.default.svc.cluster.local_7443",
   147  		},
   148  		{
   149  			"Service FQDN With Port Name pattern",
   150  			"%SERVICE_FQDN%_%SERVICE_PORT_NAME%",
   151  			"reviews.default.svc.cluster.local",
   152  			"",
   153  			0,
   154  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   155  			&model.ServiceAttributes{
   156  				ServiceRegistry: provider.Kubernetes,
   157  				Name:            "reviews",
   158  				Namespace:       "default",
   159  			},
   160  			"reviews.default.svc.cluster.local_grpc-svc",
   161  		},
   162  		{
   163  			"Service FQDN With Port and Port Name pattern",
   164  			"%SERVICE_FQDN%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   165  			"reviews.default.svc.cluster.local",
   166  			"",
   167  			0,
   168  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   169  			&model.ServiceAttributes{
   170  				ServiceRegistry: provider.Kubernetes,
   171  				Name:            "reviews",
   172  				Namespace:       "default",
   173  			},
   174  			"reviews.default.svc.cluster.local_grpc-svc_7443",
   175  		},
   176  		{
   177  			"Service FQDN With Empty Subset, Port and Port Name pattern",
   178  			"%SERVICE_FQDN%%SUBSET_NAME%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   179  			"reviews.default.svc.cluster.local",
   180  			"",
   181  			0,
   182  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   183  			&model.ServiceAttributes{
   184  				ServiceRegistry: provider.Kubernetes,
   185  				Name:            "reviews",
   186  				Namespace:       "default",
   187  			},
   188  			"reviews.default.svc.cluster.local_grpc-svc_7443",
   189  		},
   190  		{
   191  			"Service FQDN With Subset, Port and Port Name pattern",
   192  			"%SERVICE_FQDN%.%SUBSET_NAME%.%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   193  			"reviews.default.svc.cluster.local",
   194  			"v1",
   195  			0,
   196  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   197  			&model.ServiceAttributes{
   198  				ServiceRegistry: provider.Kubernetes,
   199  				Name:            "reviews",
   200  				Namespace:       "default",
   201  			},
   202  			"reviews.default.svc.cluster.local.v1.grpc-svc_7443",
   203  		},
   204  		{
   205  			"Service FQDN With Unknown Pattern",
   206  			"%SERVICE_FQDN%.%DUMMY%",
   207  			"reviews.default.svc.cluster.local",
   208  			"v1",
   209  			0,
   210  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   211  			&model.ServiceAttributes{
   212  				ServiceRegistry: provider.Kubernetes,
   213  				Name:            "reviews",
   214  				Namespace:       "default",
   215  			},
   216  			"reviews.default.svc.cluster.local.%DUMMY%",
   217  		},
   218  		{
   219  			"Service FQDN without ServiceRegistry property",
   220  			"%SERVICE_FQDN%",
   221  			"reviews.default.svc.cluster.local",
   222  			"v1",
   223  			0,
   224  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   225  			&model.ServiceAttributes{
   226  				Name:      "reviews",
   227  				Namespace: "default",
   228  			},
   229  			"reviews.default.svc.cluster.local",
   230  		},
   231  		{
   232  			"Service With Port and Port Name pattern With Target Port",
   233  			"%SERVICE%_%SERVICE_PORT_NAME%_%TARGET_PORT%",
   234  			"reviews.default.svc.cluster.local",
   235  			"",
   236  			9443,
   237  			&model.Port{Name: "grpc-svc", Port: 7443, Protocol: "GRPC"},
   238  			&model.ServiceAttributes{
   239  				ServiceRegistry: provider.Kubernetes,
   240  				Name:            "reviews",
   241  				Namespace:       "default",
   242  			},
   243  			"reviews.default_grpc-svc_9443",
   244  		},
   245  	}
   246  
   247  	for _, tt := range tests {
   248  		t.Run(tt.name, func(t *testing.T) {
   249  			got := BuildStatPrefix(tt.statPattern, tt.host, tt.subsetName, tt.port, tt.targetPort, tt.attributes)
   250  			if got != tt.want {
   251  				t.Errorf("BuildStatPrefix:: Expected alt statname %s, but got %s", tt.want, got)
   252  			}
   253  		})
   254  	}
   255  }
   256  
   257  func TestTraceOperation(t *testing.T) {
   258  	tests := []struct {
   259  		host  string
   260  		port  int
   261  		match string
   262  	}{
   263  		{"localhost", 3000, "localhost:3000/*"},
   264  		{"127.0.0.1", 3000, "127.0.0.1:3000/*"},
   265  		{"::1", 3000, "[::1]:3000/*"},
   266  		{"2001:4860:0:2001::68", 3000, "[2001:4860:0:2001::68]:3000/*"},
   267  	}
   268  	for _, tt := range tests {
   269  		t.Run(fmt.Sprint(tt.host), func(t *testing.T) {
   270  			if got := TraceOperation(tt.host, tt.port); got != tt.match {
   271  				t.Fatalf("got %v wanted %v", got, tt.match)
   272  			}
   273  		})
   274  	}
   275  }
   276  
   277  func TestBuildInboundStatPrefix(t *testing.T) {
   278  	tests := []struct {
   279  		name        string
   280  		statPattern string
   281  		tm          FilterChainMetadata
   282  		subset      string
   283  		port        uint32
   284  		portName    string
   285  		want        string
   286  	}{
   287  		{
   288  			"Service only pattern",
   289  			"%SERVICE%",
   290  			FilterChainMetadata{InstanceHostname: "svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   291  			"",
   292  			7443,
   293  			"grpc-svc",
   294  			"reviews.default",
   295  		},
   296  		{
   297  			"Service only pattern with empty service name",
   298  			"%SERVICE%",
   299  			FilterChainMetadata{InstanceHostname: "svc.cluster.local"},
   300  			"",
   301  			7443,
   302  			"grpc-svc",
   303  			"svc.cluster.local",
   304  		},
   305  		{
   306  			"Service only pattern from different namespace",
   307  			"%SERVICE%",
   308  			FilterChainMetadata{InstanceHostname: "reviews.namespace1.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "namespace1"},
   309  			"",
   310  			7443,
   311  			"grpc-svc",
   312  			"reviews.namespace1",
   313  		},
   314  		{
   315  			"Service with port pattern from different namespace",
   316  			"%SERVICE%.%SERVICE_PORT%",
   317  			FilterChainMetadata{InstanceHostname: "reviews.namespace1.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "namespace1"},
   318  			"",
   319  			7443,
   320  			"grpc-svc",
   321  			"reviews.namespace1.7443",
   322  		},
   323  		{
   324  			"Service FQDN only pattern",
   325  			"%SERVICE_FQDN%",
   326  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   327  			"",
   328  			7443,
   329  			"grpc-svc",
   330  			"reviews.default.svc.cluster.local",
   331  		},
   332  		{
   333  			"Service With Port pattern",
   334  			"%SERVICE%_%SERVICE_PORT%",
   335  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   336  			"",
   337  			7443,
   338  			"grpc-svc",
   339  			"reviews.default_7443",
   340  		},
   341  		{
   342  			"Service With Port Name pattern",
   343  			"%SERVICE%_%SERVICE_PORT_NAME%",
   344  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   345  			"",
   346  			7443,
   347  			"grpc-svc",
   348  			"reviews.default_grpc-svc",
   349  		},
   350  		{
   351  			"Service With Port and Port Name pattern",
   352  			"%SERVICE%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   353  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   354  			"",
   355  			7443,
   356  			"grpc-svc",
   357  			"reviews.default_grpc-svc_7443",
   358  		},
   359  		{
   360  			"Service FQDN With Port pattern",
   361  			"%SERVICE_FQDN%_%SERVICE_PORT%",
   362  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   363  			"",
   364  			7443,
   365  			"grpc-svc",
   366  			"reviews.default.svc.cluster.local_7443",
   367  		},
   368  		{
   369  			"Service FQDN With Port Name pattern",
   370  			"%SERVICE_FQDN%_%SERVICE_PORT_NAME%",
   371  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   372  			"",
   373  			7443,
   374  			"grpc-svc",
   375  			"reviews.default.svc.cluster.local_grpc-svc",
   376  		},
   377  		{
   378  			"Service FQDN With Port and Port Name pattern",
   379  			"%SERVICE_FQDN%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   380  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   381  			"",
   382  			7443,
   383  			"grpc-svc",
   384  			"reviews.default.svc.cluster.local_grpc-svc_7443",
   385  		},
   386  		{
   387  			"Service FQDN With Empty Subset, Port and Port Name pattern",
   388  			"%SERVICE_FQDN%%SUBSET_NAME%_%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   389  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   390  			"",
   391  			7443,
   392  			"grpc-svc",
   393  			"reviews.default.svc.cluster.local_grpc-svc_7443",
   394  		},
   395  		{
   396  			"Service FQDN With Subset, Port and Port Name pattern",
   397  			"%SERVICE_FQDN%.%SUBSET_NAME%.%SERVICE_PORT_NAME%_%SERVICE_PORT%",
   398  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   399  			"v1",
   400  			7443,
   401  			"grpc-svc",
   402  			"reviews.default.svc.cluster.local.v1.grpc-svc_7443",
   403  		},
   404  		{
   405  			"Service FQDN With Unknown Pattern",
   406  			"%SERVICE_FQDN%.%DUMMY%",
   407  			FilterChainMetadata{InstanceHostname: "reviews.default.svc.cluster.local", KubernetesServiceName: "reviews", KubernetesServiceNamespace: "default"},
   408  			"",
   409  			7443,
   410  			"grpc-svc",
   411  			"reviews.default.svc.cluster.local.%DUMMY%",
   412  		},
   413  	}
   414  
   415  	for _, tt := range tests {
   416  		t.Run(tt.name, func(t *testing.T) {
   417  			got := BuildInboundStatPrefix(tt.statPattern, tt.tm, tt.subset, tt.port, tt.portName)
   418  			if got != tt.want {
   419  				t.Errorf("BuildInboundStatPrefix:: Expected alt statname %s, but got %s", tt.want, got)
   420  			}
   421  		})
   422  	}
   423  }