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 }