diff --git a/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md b/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md index ea92f0d34f..fe5a26f329 100644 --- a/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md +++ b/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md @@ -384,6 +384,10 @@ Below the fields displayed with the generic CLF format: | `TLSVersion` | The TLS version used by the connection (e.g. `1.2`) (if connection is TLS). | | `TLSCipher` | The TLS cipher used by the connection (e.g. `TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA`) (if connection is TLS). | | `TLSClientSubject` | The string representation of the TLS client certificate's Subject (e.g. `CN=username,O=organization`). | +| `KubernetesIngressNamespace` | The namespace of the Kubernetes Ingress resource the router handles. Only available with the Kubernetes Ingress and Kubernetes Ingress Nginx providers. | +| `KubernetesIngressName` | The name of the Kubernetes Ingress resource the router handles. Only available with the Kubernetes Ingress and Kubernetes Ingress Nginx providers. | +| `KubernetesServiceName` | The name of the Kubernetes Service associated with the Ingress the router handles. Only available with the Kubernetes Ingress and Kubernetes Ingress Nginx providers. | +| `KubernetesServicePort` | The port of the Kubernetes Service associated with the Ingress the router handles. Only available with the Kubernetes Ingress and Kubernetes Ingress Nginx providers. | ### Log Rotation diff --git a/integration/k8s_test.go b/integration/k8s_test.go index 2c70d6adbb..df2c28724a 100644 --- a/integration/k8s_test.go +++ b/integration/k8s_test.go @@ -111,13 +111,13 @@ func (s *K8sSuite) TestGatewayConfiguration() { s.testConfiguration("testdata/rawdata-gateway.json", "8080") } -func (s *K8sSuite) TestIngressclass() { +func (s *K8sSuite) TestIngressClass() { s.traefikCmd(withConfigFile("fixtures/k8s_ingressclass.toml")) s.testConfiguration("testdata/rawdata-ingressclass.json", "8080") } -func (s *K8sSuite) TestDisableIngressclassLookup() { +func (s *K8sSuite) TestDisableIngressClassLookup() { s.traefikCmd(withConfigFile("fixtures/k8s_ingressclass_disabled.toml")) s.testConfiguration("testdata/rawdata-ingressclass-disabled.json", "8080") diff --git a/integration/testdata/rawdata-ingress-label-selector.json b/integration/testdata/rawdata-ingress-label-selector.json index a4081171c1..c4203aa7e2 100644 --- a/integration/testdata/rawdata-ingress-label-selector.json +++ b/integration/testdata/rawdata-ingress-label-selector.json @@ -47,13 +47,21 @@ "web" ], "service": "default-whoami-http", - "rule": "Host(`whoami.test`) \u0026\u0026 PathPrefix(`/whoami`)", + "rule": "Host(\"whoami.test\") \u0026\u0026 PathPrefix(\"/whoami\")", "priority": 44, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "test.ingress", + "serviceName": "whoami", + "servicePort": "http" + } + } }, "status": "enabled", "using": [ diff --git a/integration/testdata/rawdata-ingress.json b/integration/testdata/rawdata-ingress.json index a317099fb8..b4498b43fe 100644 --- a/integration/testdata/rawdata-ingress.json +++ b/integration/testdata/rawdata-ingress.json @@ -47,13 +47,21 @@ "web" ], "service": "default-whoami-http", - "rule": "Host(`whoami.test.https`) \u0026\u0026 PathPrefix(`/whoami`)", + "rule": "Host(\"whoami.test.https\") \u0026\u0026 PathPrefix(\"/whoami\")", "priority": 50, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "test.ingress.https", + "serviceName": "whoami", + "servicePort": "http" + } + } }, "status": "enabled", "using": [ @@ -65,13 +73,21 @@ "web" ], "service": "default-whoami-http", - "rule": "Host(`whoami.test`) \u0026\u0026 PathPrefix(`/whoami`)", + "rule": "Host(\"whoami.test\") \u0026\u0026 PathPrefix(\"/whoami\")", "priority": 44, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "test.ingress", + "serviceName": "whoami", + "servicePort": "http" + } + } }, "status": "enabled", "using": [ @@ -83,13 +99,21 @@ "web" ], "service": "default-whoami-80", - "rule": "Host(`whoami.test.drop`) \u0026\u0026 PathPrefix(`/drop`)", + "rule": "Host(\"whoami.test.drop\") \u0026\u0026 PathPrefix(\"/drop\")", "priority": 47, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "whoami-drop-route", + "serviceName": "whoami", + "servicePort": "80" + } + } }, "status": "enabled", "using": [ @@ -101,13 +125,21 @@ "web" ], "service": "default-whoami-80", - "rule": "Host(`whoami.test.keep`) \u0026\u0026 PathPrefix(`/keep`)", + "rule": "Host(\"whoami.test.keep\") \u0026\u0026 PathPrefix(\"/keep\")", "priority": 47, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "whoami-keep-route", + "serviceName": "whoami", + "servicePort": "80" + } + } }, "status": "enabled", "using": [ diff --git a/integration/testdata/rawdata-ingressclass.json b/integration/testdata/rawdata-ingressclass.json index c860c8862d..2874aafcdb 100644 --- a/integration/testdata/rawdata-ingressclass.json +++ b/integration/testdata/rawdata-ingressclass.json @@ -47,13 +47,21 @@ "web" ], "service": "default-whoami-80", - "rule": "Host(`whoami.test.keep`) \u0026\u0026 PathPrefix(`/keep`)", + "rule": "Host(\"whoami.test.keep\") \u0026\u0026 PathPrefix(\"/keep\")", "priority": 47, "observability": { "accessLogs": true, "metrics": true, "tracing": true, - "traceVerbosity": "minimal" + "traceVerbosity": "minimal", + "metadata": { + "ingress": { + "namespace": "default", + "ingressName": "whoami-keep-route", + "serviceName": "whoami", + "servicePort": "80" + } + } }, "status": "enabled", "using": [ diff --git a/pkg/config/dynamic/http_config.go b/pkg/config/dynamic/http_config.go index 1a8aeb31aa..cf716d5948 100644 --- a/pkg/config/dynamic/http_config.go +++ b/pkg/config/dynamic/http_config.go @@ -168,6 +168,10 @@ type RouterObservabilityConfig struct { // +kubebuilder:validation:Enum=minimal;detailed // +kubebuilder:default=minimal TraceVerbosity otypes.TracingVerbosity `json:"traceVerbosity,omitempty" toml:"traceVerbosity,omitempty" yaml:"traceVerbosity,omitempty" export:"true"` + + // Metadata holds the metadata for this router. + // Metadata cannot be user-defined for now. + Metadata *ObservabilityMetadata `json:"metadata,omitempty" toml:"-" yaml:"-" label:"-" file:"-" kv:"-"` } // SetDefaults Default values for a RouterObservabilityConfig. @@ -177,6 +181,23 @@ func (r *RouterObservabilityConfig) SetDefaults() { // +k8s:deepcopy-gen=true +// ObservabilityMetadata holds the observability metadata configuration. +type ObservabilityMetadata struct { + Ingress *KubernetesIngressMetadata `json:"ingress,omitempty" toml:"-" yaml:"-" label:"-" file:"-" kv:"-"` +} + +// +k8s:deepcopy-gen=true + +// KubernetesIngressMetadata holds the Kubernetes Ingress metadata. +type KubernetesIngressMetadata struct { + Namespace string `json:"namespace,omitempty"` + IngressName string `json:"ingressName,omitempty"` + ServiceName string `json:"serviceName,omitempty"` + ServicePort string `json:"servicePort,omitempty"` +} + +// +k8s:deepcopy-gen=true + // Mirroring holds the Mirroring configuration. type Mirroring struct { Service string `json:"service,omitempty" toml:"service,omitempty" yaml:"service,omitempty" export:"true"` diff --git a/pkg/config/dynamic/zz_generated.deepcopy.go b/pkg/config/dynamic/zz_generated.deepcopy.go index 5eb1d5488b..b470070274 100644 --- a/pkg/config/dynamic/zz_generated.deepcopy.go +++ b/pkg/config/dynamic/zz_generated.deepcopy.go @@ -957,6 +957,22 @@ func (in *InFlightReq) DeepCopy() *InFlightReq { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubernetesIngressMetadata) DeepCopyInto(out *KubernetesIngressMetadata) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubernetesIngressMetadata. +func (in *KubernetesIngressMetadata) DeepCopy() *KubernetesIngressMetadata { + if in == nil { + return nil + } + out := new(KubernetesIngressMetadata) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Message) DeepCopyInto(out *Message) { *out = *in @@ -1245,6 +1261,27 @@ func (in *Model) DeepCopy() *Model { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObservabilityMetadata) DeepCopyInto(out *ObservabilityMetadata) { + *out = *in + if in.Ingress != nil { + in, out := &in.Ingress, &out.Ingress + *out = new(KubernetesIngressMetadata) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObservabilityMetadata. +func (in *ObservabilityMetadata) DeepCopy() *ObservabilityMetadata { + if in == nil { + return nil + } + out := new(ObservabilityMetadata) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PassTLSClientCert) DeepCopyInto(out *PassTLSClientCert) { *out = *in @@ -1614,6 +1651,11 @@ func (in *RouterObservabilityConfig) DeepCopyInto(out *RouterObservabilityConfig *out = new(bool) **out = **in } + if in.Metadata != nil { + in, out := &in.Metadata, &out.Metadata + *out = new(ObservabilityMetadata) + (*in).DeepCopyInto(*out) + } return } diff --git a/pkg/middlewares/accesslog/logdata.go b/pkg/middlewares/accesslog/logdata.go index c9010fdd61..4d7aee2d3e 100644 --- a/pkg/middlewares/accesslog/logdata.go +++ b/pkg/middlewares/accesslog/logdata.go @@ -87,6 +87,17 @@ const ( OTelTraceID = "trace_id" // OTelSpanID is the OTel-conformant log attribute for the span identifier. OTelSpanID = "span_id" + + // Kubernetes Ingress fields. + + // KubernetesIngressNamespace is the namespace of the Kubernetes Ingress resource the router handles. + KubernetesIngressNamespace = "KubernetesIngressNamespace" + // KubernetesIngressName is the name of the Kubernetes Ingress resource the router handles. + KubernetesIngressName = "KubernetesIngressName" + // KubernetesServiceName is the name of the Kubernetes service associated with Ingress the router handles. + KubernetesServiceName = "KubernetesServiceName" + // KubernetesServicePort is the port of the Kubernetes service associated with Ingress the router handles. + KubernetesServicePort = "KubernetesServicePort" ) // These are written out in the default case when no config is provided to specify keys of interest. @@ -94,11 +105,21 @@ var defaultCoreKeys = [...]string{ StartUTC, Duration, RouterName, + ServiceAddr, ServiceName, ServiceURL, + ClientAddr, ClientHost, ClientPort, ClientUsername, + GzipRatio, + StartLocal, + Overhead, + RetryAttempts, + TLSVersion, + TLSCipher, + TLSClientSubject, + RequestAddr, RequestHost, RequestPort, RequestMethod, @@ -121,18 +142,6 @@ func init() { for _, k := range defaultCoreKeys { allCoreKeys[k] = struct{}{} } - allCoreKeys[ServiceAddr] = struct{}{} - allCoreKeys[ClientAddr] = struct{}{} - allCoreKeys[RequestAddr] = struct{}{} - allCoreKeys[GzipRatio] = struct{}{} - allCoreKeys[StartLocal] = struct{}{} - allCoreKeys[Overhead] = struct{}{} - allCoreKeys[RetryAttempts] = struct{}{} - allCoreKeys[TLSVersion] = struct{}{} - allCoreKeys[TLSCipher] = struct{}{} - allCoreKeys[TLSClientSubject] = struct{}{} - allCoreKeys[OTelTraceID] = struct{}{} - allCoreKeys[OTelSpanID] = struct{}{} } // CoreLogData holds the fields computed from the request/response. diff --git a/pkg/middlewares/accesslog/logger.go b/pkg/middlewares/accesslog/logger.go index f0c8300910..c5eca1228c 100644 --- a/pkg/middlewares/accesslog/logger.go +++ b/pkg/middlewares/accesslog/logger.go @@ -204,6 +204,15 @@ func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request, next http }, } + if metadata := observability.GetObservabilityMetadata(req.Context()); metadata != nil { + if metadata.Ingress != nil { + logDataTable.Core[KubernetesIngressNamespace] = metadata.Ingress.Namespace + logDataTable.Core[KubernetesIngressName] = metadata.Ingress.IngressName + logDataTable.Core[KubernetesServiceName] = metadata.Ingress.ServiceName + logDataTable.Core[KubernetesServicePort] = metadata.Ingress.ServicePort + } + } + if span := trace.SpanFromContext(req.Context()); span != nil { spanContext := span.SpanContext() if spanContext.HasTraceID() && spanContext.HasSpanID() { diff --git a/pkg/middlewares/accesslog/logger_test.go b/pkg/middlewares/accesslog/logger_test.go index 557f1ef0c4..8bd07c0626 100644 --- a/pkg/middlewares/accesslog/logger_test.go +++ b/pkg/middlewares/accesslog/logger_test.go @@ -25,6 +25,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ptypes "github.com/traefik/paerser/types" + "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/middlewares/capture" "github.com/traefik/traefik/v3/pkg/middlewares/observability" otypes "github.com/traefik/traefik/v3/pkg/observability/types" @@ -452,7 +453,7 @@ func TestLoggerHeaderFields(t *testing.T) { func TestCommonLogger(t *testing.T) { logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) config := &otypes.AccessLog{FilePath: logFilePath, Format: CommonFormat} - doLogging(t, config, false) + doLogging(t, config, false, false) logData, err := os.ReadFile(logFilePath) require.NoError(t, err) @@ -464,7 +465,7 @@ func TestCommonLogger(t *testing.T) { func TestCommonLoggerWithBufferingSize(t *testing.T) { logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) config := &otypes.AccessLog{FilePath: logFilePath, Format: CommonFormat, BufferingSize: 1024} - doLogging(t, config, false) + doLogging(t, config, false, false) // wait a bit for the buffer to be written in the file. time.Sleep(50 * time.Millisecond) @@ -479,7 +480,7 @@ func TestCommonLoggerWithBufferingSize(t *testing.T) { func TestLoggerGenericCLF(t *testing.T) { logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) config := &otypes.AccessLog{FilePath: logFilePath, Format: GenericCLFFormat} - doLogging(t, config, false) + doLogging(t, config, false, false) logData, err := os.ReadFile(logFilePath) require.NoError(t, err) @@ -491,7 +492,7 @@ func TestLoggerGenericCLF(t *testing.T) { func TestLoggerGenericCLFWithBufferingSize(t *testing.T) { logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) config := &otypes.AccessLog{FilePath: logFilePath, Format: GenericCLFFormat, BufferingSize: 1024} - doLogging(t, config, false) + doLogging(t, config, false, false) // wait a bit for the buffer to be written in the file. time.Sleep(50 * time.Millisecond) @@ -541,6 +542,7 @@ func TestLoggerJSON(t *testing.T) { config *otypes.AccessLog tls bool tracing bool + metadata bool expected map[string]func(t *testing.T, value any) }{ { @@ -626,6 +628,50 @@ func TestLoggerJSON(t *testing.T) { OTelSpanID: assertString("0100000000000000"), }, }, + { + desc: "default config with metadata", + config: &otypes.AccessLog{ + FilePath: "", + Format: JSONFormat, + }, + metadata: true, + expected: map[string]func(t *testing.T, value any){ + RequestContentSize: assertFloat64(0), + RequestHost: assertString(testHostname), + RequestAddr: assertString(testHostname), + RequestMethod: assertString(testMethod), + RequestPath: assertString(testPath), + RequestProtocol: assertString(testProto), + RequestScheme: assertString(testScheme), + RequestPort: assertString("-"), + DownstreamStatus: assertFloat64(float64(testStatus)), + DownstreamContentSize: assertFloat64(float64(len(testContent))), + OriginContentSize: assertFloat64(float64(len(testContent))), + OriginStatus: assertFloat64(float64(testStatus)), + RequestRefererHeader: assertString(testReferer), + RequestUserAgentHeader: assertString(testUserAgent), + RouterName: assertString(testRouterName), + ServiceURL: assertString(testServiceName), + ClientUsername: assertString(testUsername), + ClientHost: assertString(testHostname), + ClientPort: assertString(strconv.Itoa(testPort)), + ClientAddr: assertString(fmt.Sprintf("%s:%d", testHostname, testPort)), + "level": assertString("info"), + "msg": assertString(""), + "downstream_Content-Type": assertString("text/plain; charset=utf-8"), + RequestCount: assertFloat64NotZero(), + Duration: assertFloat64NotZero(), + Overhead: assertFloat64NotZero(), + RetryAttempts: assertFloat64(float64(testRetryAttempts)), + "time": assertNotEmpty(), + "StartLocal": assertNotEmpty(), + "StartUTC": assertNotEmpty(), + KubernetesIngressNamespace: assertString("test-namespace"), + KubernetesIngressName: assertString("test-ingress"), + KubernetesServiceName: assertString("test-service"), + KubernetesServicePort: assertString("test-port"), + }, + }, { desc: "default config, with TLS request", config: &otypes.AccessLog{ @@ -788,9 +834,9 @@ func TestLoggerJSON(t *testing.T) { test.config.FilePath = logFilePath if test.tls { - doLoggingTLS(t, test.config, test.tracing) + doLoggingTLS(t, test.config, test.tracing, test.metadata) } else { - doLogging(t, test.config, test.tracing) + doLogging(t, test.config, test.tracing, test.metadata) } logData, err := os.ReadFile(logFilePath) @@ -1062,7 +1108,7 @@ func TestNewLogHandlerOutputStdout(t *testing.T) { file, restoreStdout := captureStdout(t) defer restoreStdout() - doLogging(t, test.config, false) + doLogging(t, test.config, false, false) written, err := os.ReadFile(file.Name()) require.NoError(t, err, "unable to read captured stdout from file") @@ -1150,7 +1196,7 @@ func captureStdout(t *testing.T) (out *os.File, restoreStdout func()) { return file, restoreStdout } -func doLoggingTLSOpt(t *testing.T, config *otypes.AccessLog, enableTLS, tracing bool) { +func doLoggingTLSOpt(t *testing.T, config *otypes.AccessLog, enableTLS, tracing, metadata bool) { t.Helper() logger, err := NewHandler(t.Context(), config) require.NoError(t, err) @@ -1199,9 +1245,22 @@ func doLoggingTLSOpt(t *testing.T, config *otypes.AccessLog, enableTLS, tracing // Injection of the observability variables in the request context. chain = chain.Append(func(next http.Handler) (http.Handler, error) { - return observability.WithObservabilityHandler(next, observability.Observability{ + obs := observability.Observability{ AccessLogsEnabled: true, - }), nil + } + + if metadata { + obs.Metadata = &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "test-namespace", + IngressName: "test-ingress", + ServiceName: "test-service", + ServicePort: "test-port", + }, + } + } + + return observability.WithObservabilityHandler(next, obs), nil }) chain = chain.Append(logger.AliceConstructor()) @@ -1211,16 +1270,16 @@ func doLoggingTLSOpt(t *testing.T, config *otypes.AccessLog, enableTLS, tracing handler.ServeHTTP(httptest.NewRecorder(), req) } -func doLoggingTLS(t *testing.T, config *otypes.AccessLog, tracing bool) { +func doLoggingTLS(t *testing.T, config *otypes.AccessLog, tracing, metadata bool) { t.Helper() - doLoggingTLSOpt(t, config, true, tracing) + doLoggingTLSOpt(t, config, true, tracing, metadata) } -func doLogging(t *testing.T, config *otypes.AccessLog, tracing bool) { +func doLogging(t *testing.T, config *otypes.AccessLog, tracing, metadata bool) { t.Helper() - doLoggingTLSOpt(t, config, false, tracing) + doLoggingTLSOpt(t, config, false, tracing, metadata) } func logWriterTestHandlerFunc(rw http.ResponseWriter, r *http.Request) { diff --git a/pkg/middlewares/observability/observability.go b/pkg/middlewares/observability/observability.go index a02ca292dc..b9f63e94f7 100644 --- a/pkg/middlewares/observability/observability.go +++ b/pkg/middlewares/observability/observability.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" + "github.com/traefik/traefik/v3/pkg/config/dynamic" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" ) @@ -19,6 +20,7 @@ type Observability struct { SemConvMetricsEnabled bool TracingEnabled bool DetailedTracingEnabled bool + Metadata *dynamic.ObservabilityMetadata } // WithObservabilityHandler sets the observability state in the context for the next handler. @@ -64,6 +66,15 @@ func DetailedTracingEnabled(ctx context.Context) bool { return ok && obs.DetailedTracingEnabled } +// GetObservabilityMetadata returns the observability metadata. +func GetObservabilityMetadata(ctx context.Context) *dynamic.ObservabilityMetadata { + obs, ok := ctx.Value(observabilityKey).(Observability) + if ok { + return obs.Metadata + } + return nil +} + // SetStatusErrorf flags the span as in error and log an event. func SetStatusErrorf(ctx context.Context, format string, args ...any) { if span := trace.SpanFromContext(ctx); span != nil { diff --git a/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/route.go b/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/route.go index bdb04f4d3e..59adbc6ca2 100644 --- a/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/route.go +++ b/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/route.go @@ -26,10 +26,6 @@ THE SOFTWARE. package v1alpha1 -import ( - dynamic "github.com/traefik/traefik/v3/pkg/config/dynamic" -) - // RouteApplyConfiguration represents a declarative configuration of the Route type for use // with apply. // @@ -58,7 +54,7 @@ type RouteApplyConfiguration struct { Middlewares []MiddlewareRefApplyConfiguration `json:"middlewares,omitempty"` // Observability defines the observability configuration for a router. // More info: https://doc.traefik.io/traefik/v3.7/reference/routing-configuration/http/routing/observability/ - Observability *dynamic.RouterObservabilityConfig `json:"observability,omitempty"` + Observability *RouterObservabilityConfigApplyConfiguration `json:"observability,omitempty"` } // RouteApplyConfiguration constructs a declarative configuration of the Route type for use with @@ -128,7 +124,7 @@ func (b *RouteApplyConfiguration) WithMiddlewares(values ...*MiddlewareRefApplyC // WithObservability sets the Observability field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Observability field is set to the value of the last call. -func (b *RouteApplyConfiguration) WithObservability(value dynamic.RouterObservabilityConfig) *RouteApplyConfiguration { - b.Observability = &value +func (b *RouteApplyConfiguration) WithObservability(value *RouterObservabilityConfigApplyConfiguration) *RouteApplyConfiguration { + b.Observability = value return b } diff --git a/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/routerobservabilityconfig.go b/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/routerobservabilityconfig.go new file mode 100644 index 0000000000..59520c082d --- /dev/null +++ b/pkg/provider/kubernetes/crd/generated/applyconfiguration/traefikio/v1alpha1/routerobservabilityconfig.go @@ -0,0 +1,85 @@ +/* +The MIT License (MIT) + +Copyright (c) 2016-2020 Containous SAS; 2020-2026 Traefik Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + types "github.com/traefik/traefik/v3/pkg/observability/types" +) + +// RouterObservabilityConfigApplyConfiguration represents a declarative configuration of the RouterObservabilityConfig type for use +// with apply. +// +// RouterObservabilityConfig holds the observability configuration for a router. +// More info: https://doc.traefik.io/traefik/v3.7/reference/routing-configuration/http/routing/observability/ +type RouterObservabilityConfigApplyConfiguration struct { + // AccessLogs enables access logs for this router. + AccessLogs *bool `json:"accessLogs,omitempty"` + // Metrics enables metrics for this router. + Metrics *bool `json:"metrics,omitempty"` + // Tracing enables tracing for this router. + Tracing *bool `json:"tracing,omitempty"` + // TraceVerbosity defines the verbosity level of the tracing for this router. + TraceVerbosity *types.TracingVerbosity `json:"traceVerbosity,omitempty"` +} + +// RouterObservabilityConfigApplyConfiguration constructs a declarative configuration of the RouterObservabilityConfig type for use with +// apply. +func RouterObservabilityConfig() *RouterObservabilityConfigApplyConfiguration { + return &RouterObservabilityConfigApplyConfiguration{} +} + +// WithAccessLogs sets the AccessLogs field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AccessLogs field is set to the value of the last call. +func (b *RouterObservabilityConfigApplyConfiguration) WithAccessLogs(value bool) *RouterObservabilityConfigApplyConfiguration { + b.AccessLogs = &value + return b +} + +// WithMetrics sets the Metrics field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metrics field is set to the value of the last call. +func (b *RouterObservabilityConfigApplyConfiguration) WithMetrics(value bool) *RouterObservabilityConfigApplyConfiguration { + b.Metrics = &value + return b +} + +// WithTracing sets the Tracing field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Tracing field is set to the value of the last call. +func (b *RouterObservabilityConfigApplyConfiguration) WithTracing(value bool) *RouterObservabilityConfigApplyConfiguration { + b.Tracing = &value + return b +} + +// WithTraceVerbosity sets the TraceVerbosity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TraceVerbosity field is set to the value of the last call. +func (b *RouterObservabilityConfigApplyConfiguration) WithTraceVerbosity(value types.TracingVerbosity) *RouterObservabilityConfigApplyConfiguration { + b.TraceVerbosity = &value + return b +} diff --git a/pkg/provider/kubernetes/crd/generated/applyconfiguration/utils.go b/pkg/provider/kubernetes/crd/generated/applyconfiguration/utils.go index 082e745a88..de36fd858d 100644 --- a/pkg/provider/kubernetes/crd/generated/applyconfiguration/utils.go +++ b/pkg/provider/kubernetes/crd/generated/applyconfiguration/utils.go @@ -118,6 +118,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &traefikiov1alpha1.RootCAApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("Route"): return &traefikiov1alpha1.RouteApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("RouterObservabilityConfig"): + return &traefikiov1alpha1.RouterObservabilityConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("RouteTCP"): return &traefikiov1alpha1.RouteTCPApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("RouteUDP"): diff --git a/pkg/provider/kubernetes/crd/kubernetes_http.go b/pkg/provider/kubernetes/crd/kubernetes_http.go index bec8285a1d..054592e1cc 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_http.go +++ b/pkg/provider/kubernetes/crd/kubernetes_http.go @@ -122,14 +122,22 @@ func (p *Provider) loadIngressRouteConfiguration(ctx context.Context, client Cli } r := &dynamic.Router{ - Middlewares: mds, - Priority: route.Priority, - RuleSyntax: route.Syntax, - EntryPoints: ingressRoute.Spec.EntryPoints, - Rule: route.Match, - Service: serviceName, - Observability: route.Observability, - ParentRefs: parentRouterNames, + Middlewares: mds, + Priority: route.Priority, + RuleSyntax: route.Syntax, + EntryPoints: ingressRoute.Spec.EntryPoints, + Rule: route.Match, + Service: serviceName, + ParentRefs: parentRouterNames, + } + + if route.Observability != nil { + r.Observability = &dynamic.RouterObservabilityConfig{ + AccessLogs: route.Observability.AccessLogs, + Metrics: route.Observability.Metrics, + Tracing: route.Observability.Tracing, + TraceVerbosity: route.Observability.TraceVerbosity, + } } if ingressRoute.Spec.TLS != nil { diff --git a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go index 52733b871d..3c4d13ddb3 100644 --- a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go +++ b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go @@ -2,6 +2,7 @@ package v1alpha1 import ( "github.com/traefik/traefik/v3/pkg/config/dynamic" + otypes "github.com/traefik/traefik/v3/pkg/observability/types" "github.com/traefik/traefik/v3/pkg/types" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" @@ -54,7 +55,22 @@ type Route struct { Middlewares []MiddlewareRef `json:"middlewares,omitempty"` // Observability defines the observability configuration for a router. // More info: https://doc.traefik.io/traefik/v3.7/reference/routing-configuration/http/routing/observability/ - Observability *dynamic.RouterObservabilityConfig `json:"observability,omitempty"` + Observability *RouterObservabilityConfig `json:"observability,omitempty"` +} + +// RouterObservabilityConfig holds the observability configuration for a router. +// More info: https://doc.traefik.io/traefik/v3.7/reference/routing-configuration/http/routing/observability/ +type RouterObservabilityConfig struct { + // AccessLogs enables access logs for this router. + AccessLogs *bool `json:"accessLogs,omitempty" toml:"accessLogs,omitempty" yaml:"accessLogs,omitempty" export:"true"` + // Metrics enables metrics for this router. + Metrics *bool `json:"metrics,omitempty" toml:"metrics,omitempty" yaml:"metrics,omitempty" export:"true"` + // Tracing enables tracing for this router. + Tracing *bool `json:"tracing,omitempty" toml:"tracing,omitempty" yaml:"tracing,omitempty" export:"true"` + // TraceVerbosity defines the verbosity level of the tracing for this router. + // +kubebuilder:validation:Enum=minimal;detailed + // +kubebuilder:default=minimal + TraceVerbosity otypes.TracingVerbosity `json:"traceVerbosity,omitempty" toml:"traceVerbosity,omitempty" yaml:"traceVerbosity,omitempty" export:"true"` } // TLS holds the TLS configuration. diff --git a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go index feb3dedfab..10098f252d 100644 --- a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go @@ -1382,7 +1382,7 @@ func (in *Route) DeepCopyInto(out *Route) { } if in.Observability != nil { in, out := &in.Observability, &out.Observability - *out = new(dynamic.RouterObservabilityConfig) + *out = new(RouterObservabilityConfig) (*in).DeepCopyInto(*out) } return @@ -1449,6 +1449,37 @@ func (in *RouteUDP) DeepCopy() *RouteUDP { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RouterObservabilityConfig) DeepCopyInto(out *RouterObservabilityConfig) { + *out = *in + if in.AccessLogs != nil { + in, out := &in.AccessLogs, &out.AccessLogs + *out = new(bool) + **out = **in + } + if in.Metrics != nil { + in, out := &in.Metrics, &out.Metrics + *out = new(bool) + **out = **in + } + if in.Tracing != nil { + in, out := &in.Tracing, &out.Tracing + *out = new(bool) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouterObservabilityConfig. +func (in *RouterObservabilityConfig) DeepCopy() *RouterObservabilityConfig { + if in == nil { + return nil + } + out := new(RouterObservabilityConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) { *out = *in diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go index f86ffd684c..6b5de19c6a 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes.go @@ -417,24 +417,36 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration return conf } + obs := &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + // No ingress and no service port with the global default backend. + Namespace: p.defaultBackendServiceNamespace, + ServiceName: p.defaultBackendServiceName, + }, + }, + } + // Add the default backend service router to the configuration. conf.HTTP.Routers[defaultBackendName] = &dynamic.Router{ EntryPoints: p.NonTLSEntryPoints, Rule: `PathPrefix("/")`, // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. - RuleSyntax: "default", - Priority: math.MinInt32, - Service: defaultBackendName, + RuleSyntax: "default", + Priority: math.MinInt32, + Service: defaultBackendName, + Observability: obs, } conf.HTTP.Routers[defaultBackendTLSName] = &dynamic.Router{ EntryPoints: p.TLSEntryPoints, Rule: `PathPrefix("/")`, // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. - RuleSyntax: "default", - Priority: math.MinInt32, - Service: defaultBackendName, - TLS: &dynamic.RouterTLSConfig{}, + RuleSyntax: "default", + Priority: math.MinInt32, + Service: defaultBackendName, + TLS: &dynamic.RouterTLSConfig{}, + Observability: obs, } conf.HTTP.Services[defaultBackendName] = svc @@ -586,9 +598,10 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration } var defaultBackendService *dynamic.Service + var defaultBackendObs *dynamic.RouterObservabilityConfig if ingress.Spec.DefaultBackend != nil && ingress.Spec.DefaultBackend.Service != nil { var err error - defaultBackendService, err = p.buildService(ingress.Namespace, *ingress.Spec.DefaultBackend, namedServersTransport, ingress.IngressConfig) + defaultBackendService, err = p.buildService(ingress.Namespace, *ingress.Spec.DefaultBackend, &namedServersTransport, ingress.IngressConfig) if err != nil { logger.Error(). Str("serviceName", ingress.Spec.DefaultBackend.Service.Name). @@ -596,6 +609,17 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration Err(err). Msg("Cannot create default backend service") } + + defaultBackendObs = &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: ingress.Namespace, + IngressName: ingress.Name, + ServiceName: ingress.Spec.DefaultBackend.Service.Name, + ServicePort: portString(ingress.Spec.DefaultBackend.Service.Port), + }, + }, + } } if defaultBackendService != nil && len(ingress.Spec.Rules) == 0 { @@ -603,9 +627,10 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration EntryPoints: p.NonTLSEntryPoints, Rule: `PathPrefix("/")`, // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. - RuleSyntax: "default", - Priority: math.MinInt32, - Service: defaultBackendName, + RuleSyntax: "default", + Priority: math.MinInt32, + Service: defaultBackendName, + Observability: defaultBackendObs, } if err := p.applyMiddlewares(ingress, defaultBackendName, "", "", ingress.Spec.DefaultBackend, hosts, rt, conf, ""); err != nil { @@ -624,6 +649,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration TLS: &dynamic.RouterTLSConfig{ Options: clientAuthTLSOptionName, }, + Observability: defaultBackendObs, } if err := p.applyMiddlewares(ingress, defaultBackendTLSName, "", "", ingress.Spec.DefaultBackend, hosts, rtTLS, conf, ""); err != nil { @@ -632,10 +658,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration conf.HTTP.Routers[defaultBackendTLSName] = rtTLS - if namedServersTransport != nil && defaultBackendService.LoadBalancer != nil { - defaultBackendService.LoadBalancer.ServersTransport = namedServersTransport.Name - conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport - } + conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport conf.HTTP.Services[defaultBackendName] = defaultBackendService } @@ -695,8 +718,9 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration EntryPoints: p.NonTLSEntryPoints, Rule: fmt.Sprintf("Host(%q)", rule.Host), // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. - RuleSyntax: "default", - Service: key, + RuleSyntax: "default", + Service: key, + Observability: defaultBackendObs, } if err := p.applyMiddlewares(ingress, key, "", "", ingress.Spec.DefaultBackend, hosts, rt, conf, serverSnippets[rule.Host]); err != nil { @@ -714,6 +738,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration TLS: &dynamic.RouterTLSConfig{ Options: clientAuthTLSOptionName, }, + Observability: defaultBackendObs, } if err := p.applyMiddlewares(ingress, key+"-tls", "", "", ingress.Spec.DefaultBackend, hosts, rtTLS, conf, serverSnippets[rule.Host]); err != nil { @@ -722,11 +747,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration conf.HTTP.Routers[key+"-tls"] = rtTLS - if namedServersTransport != nil && defaultBackendService.LoadBalancer != nil { - defaultBackendService.LoadBalancer.ServersTransport = namedServersTransport.Name - conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport - } - + conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport conf.HTTP.Services[key] = defaultBackendService } @@ -746,9 +767,20 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration continue } + pathObs := &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: ingress.Namespace, + IngressName: ingress.Name, + ServiceName: pa.Backend.Service.Name, + ServicePort: portString(pa.Backend.Service.Port), + }, + }, + } + // TODO: if no service, do not add middlewares and 503. serviceName := provider.Normalize(ingress.Namespace + "-" + ingress.Name + "-" + pa.Backend.Service.Name + "-" + portString(pa.Backend.Service.Port)) - service, err := p.buildService(ingress.Namespace, pa.Backend, namedServersTransport, ingress.IngressConfig) + service, err := p.buildService(ingress.Namespace, pa.Backend, &namedServersTransport, ingress.IngressConfig) if err != nil { logger.Error(). Str("serviceName", pa.Backend.Service.Name). @@ -769,7 +801,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration canaryBackend, hasCanaryBackend := canaryBackends[canaryBackendKey(ingress.Namespace, *pa.Backend.Service)] if hasCanaryBackend { canaryServiceName = serviceName + "-canary" - canaryService, err = p.buildService(ingress.Namespace, *canaryBackend.IngressBackend, namedServersTransport, ingress.IngressConfig) + canaryService, err = p.buildService(ingress.Namespace, *canaryBackend.IngressBackend, &namedServersTransport, ingress.IngressConfig) if err != nil { logger.Error(). Str("serviceName", canaryBackend.IngressBackend.Service.Name). @@ -795,8 +827,9 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration EntryPoints: p.NonTLSEntryPoints, Rule: buildRule(ctxIngress, rule.Host, pa, ingress.IngressConfig, hosts, hostsWithUseRegex), // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. - RuleSyntax: "default", - Service: serviceName, + RuleSyntax: "default", + Service: serviceName, + Observability: pathObs, } routerKey := provider.Normalize(fmt.Sprintf("%s-%s-rule-%d-path-%d", ingress.Namespace, ingress.Name, ri, pi)) @@ -811,6 +844,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration TLS: &dynamic.RouterTLSConfig{ Options: clientAuthTLSOptionName, }, + Observability: pathObs, } routerKeyTLS := routerKey + "-tls" @@ -838,11 +872,11 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration if hasCanaryBackend && canaryBackend.RequiresCanaryRouter() { canaryRouterKey := routerKey + "-canary" canaryRouter := &dynamic.Router{ - EntryPoints: rt.EntryPoints, - Rule: canaryBackend.AppendCanaryRule(rt.Rule), - RuleSyntax: rt.RuleSyntax, - Service: canaryServiceName, - TLS: rt.TLS, + EntryPoints: rt.EntryPoints, + Rule: canaryBackend.AppendCanaryRule(rt.Rule), + RuleSyntax: rt.RuleSyntax, + Service: canaryServiceName, + Observability: pathObs, } conf.HTTP.Routers[canaryRouterKey] = canaryRouter @@ -853,11 +887,12 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration // default TLS router canaryRouterKeyTLS := canaryRouterKey + "-tls" canaryRouterTLS := &dynamic.Router{ - EntryPoints: rtTLS.EntryPoints, - Rule: canaryBackend.AppendCanaryRule(rtTLS.Rule), - RuleSyntax: rtTLS.RuleSyntax, - Service: canaryServiceName, - TLS: rtTLS.TLS, + EntryPoints: rtTLS.EntryPoints, + Rule: canaryBackend.AppendCanaryRule(rtTLS.Rule), + RuleSyntax: rtTLS.RuleSyntax, + Service: canaryServiceName, + TLS: rtTLS.TLS, + Observability: pathObs, } conf.HTTP.Routers[canaryRouterKeyTLS] = canaryRouterTLS @@ -869,11 +904,11 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration if hasCanaryBackend && canaryBackend.RequiresNonCanaryRouter() { nonCanaryRouterKey := routerKey + "-non-canary" nonCanaryRouter := &dynamic.Router{ - EntryPoints: rt.EntryPoints, - Rule: canaryBackend.AppendNonCanaryRule(rt.Rule), - RuleSyntax: rt.RuleSyntax, - Service: serviceName, - TLS: rt.TLS, + EntryPoints: rt.EntryPoints, + Rule: canaryBackend.AppendNonCanaryRule(rt.Rule), + RuleSyntax: rt.RuleSyntax, + Service: serviceName, + Observability: pathObs, } conf.HTTP.Routers[nonCanaryRouterKey] = nonCanaryRouter @@ -884,11 +919,12 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration // default TLS router nonCanaryRouterKeyTLS := nonCanaryRouterKey + "-tls" nonCanaryRouterTLS := &dynamic.Router{ - EntryPoints: rtTLS.EntryPoints, - Rule: canaryBackend.AppendNonCanaryRule(rtTLS.Rule), - RuleSyntax: rtTLS.RuleSyntax, - Service: serviceName, - TLS: rtTLS.TLS, + EntryPoints: rtTLS.EntryPoints, + Rule: canaryBackend.AppendNonCanaryRule(rtTLS.Rule), + RuleSyntax: rtTLS.RuleSyntax, + Service: serviceName, + TLS: rtTLS.TLS, + Observability: pathObs, } conf.HTTP.Routers[nonCanaryRouterKeyTLS] = nonCanaryRouterTLS @@ -897,9 +933,7 @@ func (p *Provider) loadConfiguration(ctx context.Context) *dynamic.Configuration } } - if namedServersTransport != nil { - conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport - } + conf.HTTP.ServersTransports[namedServersTransport.Name] = namedServersTransport.ServersTransport } } } @@ -945,11 +979,11 @@ func (p *Provider) isIngressValid(ingress ingress) error { return nil } -func (p *Provider) buildServersTransport(ctx context.Context, namespace, name string, cfg IngressConfig) (*namedServersTransport, error) { +func (p *Provider) buildServersTransport(ctx context.Context, namespace, name string, cfg IngressConfig) (namedServersTransport, error) { proxyConnectTimeout := ptr.Deref(cfg.ProxyConnectTimeout, p.ProxyConnectTimeout) proxyReadTimeout := ptr.Deref(cfg.ProxyReadTimeout, p.ProxyReadTimeout) proxySendTimeout := ptr.Deref(cfg.ProxySendTimeout, p.ProxySendTimeout) - nst := &namedServersTransport{ + nst := namedServersTransport{ Name: provider.Normalize(namespace + "-" + name), ServersTransport: &dynamic.ServersTransport{ ForwardingTimeouts: &dynamic.ForwardingTimeouts{ @@ -982,17 +1016,17 @@ func (p *Provider) buildServersTransport(ctx context.Context, namespace, name st if sslSecret := ptr.Deref(cfg.ProxySSLSecret, ""); sslSecret != "" { parts := strings.Split(sslSecret, "/") if len(parts) != 2 { - return nil, fmt.Errorf("malformed proxy SSL secret: %s, expected namespace/name", sslSecret) + return namedServersTransport{}, fmt.Errorf("malformed proxy SSL secret: %s, expected namespace/name", sslSecret) } secretNamespace, secretName := parts[0], parts[1] if !p.AllowCrossNamespaceResources && secretNamespace != namespace { - return nil, fmt.Errorf("cross-namespace proxy ssl secret is not allowed: secret %s/%s is not from ingress namespace %q", secretName, secretNamespace, namespace) + return namedServersTransport{}, fmt.Errorf("cross-namespace proxy ssl secret is not allowed: secret %s/%s is not from ingress namespace %q", secretName, secretNamespace, namespace) } blocks, err := p.certificateBlocks(secretNamespace, secretName) if err != nil { - return nil, fmt.Errorf("getting certificate blocks: %w", err) + return namedServersTransport{}, fmt.Errorf("getting certificate blocks: %w", err) } if blocks.CA != nil { @@ -1299,7 +1333,7 @@ func (p *Provider) applyMiddlewares(ingress ingress, routerKey, rulePath, ruleHo return fmt.Errorf("applying custom HTTP errors: %w", err) } applyAppRootConfiguration(routerKey, ingress.IngressConfig, rt, conf) - applyFromToWwwRedirect(hosts, ruleHost, routerKey, ingress.IngressConfig, rt, conf) + applyFromToWwwRedirect(hosts, ruleHost, routerKey, ingress, backend, rt, conf) applyRedirect(routerKey, ingress.IngressConfig, rt, conf) if err := p.applyBasicAuthConfiguration(ingress.Namespace, routerKey, ingress.IngressConfig, rt, conf); err != nil { @@ -1645,8 +1679,8 @@ func applyAppRootConfiguration(routerName string, ingressConfig IngressConfig, r rt.Middlewares = append(rt.Middlewares, appRootMiddlewareName) } -func applyFromToWwwRedirect(hosts map[string]bool, ruleHost, routerName string, ingressConfig IngressConfig, rt *dynamic.Router, conf *dynamic.Configuration) { - if ingressConfig.FromToWwwRedirect == nil || !*ingressConfig.FromToWwwRedirect { +func applyFromToWwwRedirect(hosts map[string]bool, ruleHost, routerName string, ingress ingress, backend *netv1.IngressBackend, rt *dynamic.Router, conf *dynamic.Configuration) { + if ingress.IngressConfig.FromToWwwRedirect == nil || !*ingress.IngressConfig.FromToWwwRedirect { return } @@ -1676,6 +1710,16 @@ func applyFromToWwwRedirect(hosts map[string]bool, ruleHost, routerName string, }, } + ingressMetadata := &dynamic.KubernetesIngressMetadata{ + Namespace: ingress.Namespace, + IngressName: ingress.Name, + } + + if backend != nil && backend.Service != nil { + ingressMetadata.ServiceName = backend.Service.Name + ingressMetadata.ServicePort = portString(backend.Service.Port) + } + wwwRedirectRouter := &dynamic.Router{ EntryPoints: rt.EntryPoints, Rule: newRule, @@ -1685,6 +1729,11 @@ func applyFromToWwwRedirect(hosts map[string]bool, ruleHost, routerName string, Middlewares: []string{fromToWwwRedirectMiddlewareName}, Service: rt.Service, TLS: rt.TLS, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: ingressMetadata, + }, + }, } conf.HTTP.Routers[routerName+"-from-to-www-redirect"] = wwwRedirectRouter } diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go index b96ee45d00..8b8d91e1b7 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go @@ -78,6 +78,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -85,6 +95,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-cross-namespace-headers-rule-0-path-0-custom-headers", "default-ingress-with-cross-namespace-headers-rule-0-path-0-retry"}, RuleSyntax: "default", Service: "default-ingress-with-cross-namespace-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-custom-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -92,7 +112,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-tls-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -100,7 +130,17 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-cross-namespace-headers-rule-0-path-0-tls-custom-headers", "default-ingress-with-cross-namespace-headers-rule-0-path-0-tls-retry"}, RuleSyntax: "default", Service: "default-ingress-with-cross-namespace-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -226,6 +266,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -233,6 +283,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-cross-namespace-headers-rule-0-path-0-custom-headers", "default-ingress-with-cross-namespace-headers-rule-0-path-0-retry"}, Service: "default-ingress-with-cross-namespace-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-custom-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -240,7 +300,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-tls-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -248,7 +318,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-cross-namespace-headers-rule-0-path-0-tls-custom-headers", "default-ingress-with-cross-namespace-headers-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-cross-namespace-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -375,12 +455,32 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0": { EntryPoints: []string{"http"}, Rule: `Host("cross-namespace.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-cross-namespace-headers-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-custom-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -388,14 +488,34 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-custom-headers-rule-0-path-0-tls-custom-headers", "default-ingress-with-custom-headers-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-custom-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-cross-namespace-headers-rule-0-path-0-tls": { EntryPoints: []string{"https"}, Rule: `Host("cross-namespace.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-cross-namespace-headers-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cross-namespace-headers", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -502,6 +622,16 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Middlewares: []string{"default-ingress-with-no-annotation-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-no-annotation-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-no-annotation", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-no-annotation-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -509,6 +639,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-no-annotation-rule-0-path-0-retry"}, Service: "default-ingress-with-no-annotation-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-no-annotation", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -586,6 +726,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-basicauth-rule-0-path-0-basic-auth", "default-ingress-with-basicauth-rule-0-path-0-retry"}, Service: "default-ingress-with-basicauth-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-basicauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-basicauth-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -593,7 +743,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-basicauth-rule-0-path-0-tls-basic-auth", "default-ingress-with-basicauth-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-basicauth-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-basicauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -678,6 +838,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-forwardauth-rule-0-path-0-snippet", "default-ingress-with-forwardauth-rule-0-path-0-retry"}, Service: "default-ingress-with-forwardauth-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-forwardauth-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -685,7 +855,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-forwardauth-rule-0-path-0-tls-snippet", "default-ingress-with-forwardauth-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-forwardauth-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -797,6 +977,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-forwardauth-snippet-rule-0-path-0-snippet", "default-ingress-with-forwardauth-snippet-rule-0-path-0-retry"}, Service: "default-ingress-with-forwardauth-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-forwardauth-snippet-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -804,7 +994,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-forwardauth-snippet-rule-0-path-0-tls-snippet", "default-ingress-with-forwardauth-snippet-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-forwardauth-snippet-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -896,6 +1096,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-without-auth-rule-0-path-0-snippet", "default-ingress-without-auth-rule-0-path-0-retry"}, Service: "default-ingress-without-auth-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-auth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-without-auth-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -904,6 +1114,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-without-auth-rule-0-path-0-tls-snippet", "default-ingress-without-auth-rule-0-path-0-tls-retry"}, Service: "default-ingress-without-auth-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-auth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -979,6 +1199,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-global-auth-disabled-rule-0-path-0-retry"}, Service: "default-ingress-with-global-auth-disabled-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-global-auth-disabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-global-auth-disabled-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -987,6 +1217,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-global-auth-disabled-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-global-auth-disabled-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-global-auth-disabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1048,6 +1288,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-forwardauth-rule-0-path-0-snippet", "default-ingress-with-forwardauth-rule-0-path-0-retry"}, Service: "default-ingress-with-forwardauth-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-forwardauth-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1056,6 +1306,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-forwardauth-rule-0-path-0-tls-snippet", "default-ingress-with-forwardauth-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-forwardauth-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-forwardauth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1136,6 +1396,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-without-auth-rule-0-path-0-retry"}, Service: "default-ingress-without-auth-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-auth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-without-auth-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1144,6 +1414,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-without-auth-rule-0-path-0-tls-retry"}, Service: "default-ingress-without-auth-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-auth", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1206,6 +1486,16 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Middlewares: []string{"default-ingress-with-ssl-redirect-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-ssl-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-ssl-redirect-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -1213,6 +1503,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-ssl-redirect-rule-0-path-0-retry"}, Service: "default-ingress-with-ssl-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-without-ssl-redirect-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -1220,6 +1520,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-without-ssl-redirect-rule-0-path-0-retry"}, Service: "default-ingress-without-ssl-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-without-ssl-redirect-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1228,6 +1538,16 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Middlewares: []string{"default-ingress-without-ssl-redirect-rule-0-path-0-tls-retry"}, Service: "default-ingress-without-ssl-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-without-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-force-ssl-redirect-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -1235,6 +1555,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-force-ssl-redirect-rule-0-path-0-retry"}, Service: "default-ingress-with-force-ssl-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-force-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-force-ssl-redirect-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1242,7 +1572,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-force-ssl-redirect-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-force-ssl-redirect-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-force-ssl-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1438,6 +1778,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-sticky-rule-0-path-0-retry"}, Service: "default-ingress-with-sticky-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-sticky", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-sticky-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1445,7 +1795,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-sticky-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-sticky-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-sticky", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1527,6 +1887,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-ssl-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-ssl-whoami-tls-443", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-ssl", + ServiceName: "whoami-tls", + ServicePort: "443", + }, + }, + }, }, "default-ingress-with-proxy-ssl-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1534,7 +1904,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-ssl-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-ssl-whoami-tls-443", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-ssl", + ServiceName: "whoami-tls", + ServicePort: "443", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1606,6 +1986,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-cors-rule-0-path-0-cors", "default-ingress-with-cors-rule-0-path-0-retry"}, Service: "default-ingress-with-cors-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-cors-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1613,7 +2003,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-cors-rule-0-path-0-tls-cors", "default-ingress-with-cors-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-cors-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-cors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1702,6 +2102,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-service-upstream-rule-0-path-0-retry"}, Service: "default-ingress-with-service-upstream-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-service-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-service-upstream-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1709,7 +2119,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-service-upstream-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-service-upstream-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-service-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1775,6 +2195,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-upstream-vhost-rule-0-path-0-vhost", "default-ingress-with-upstream-vhost-rule-0-path-0-retry"}, Service: "default-ingress-with-upstream-vhost-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-upstream-vhost", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-upstream-vhost-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1782,7 +2212,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-upstream-vhost-rule-0-path-0-tls-vhost", "default-ingress-with-upstream-vhost-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-upstream-vhost-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-upstream-vhost", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1861,6 +2301,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-no-rewrite-target-rule-0-path-0-retry"}, Service: "default-ingress-with-x-forwarded-prefix-no-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-no-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-x-forwarded-prefix-no-rewrite-target-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1868,7 +2318,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-no-rewrite-target-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-x-forwarded-prefix-no-rewrite-target-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-no-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -1937,6 +2397,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-rule-0-path-0-rewrite-target", "default-ingress-with-x-forwarded-prefix-rule-0-path-0-retry"}, Service: "default-ingress-with-x-forwarded-prefix-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -1944,6 +2414,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0-rewrite-target", "default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0-retry"}, Service: "default-ingress-with-x-forwarded-prefix-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -1951,6 +2431,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0-rewrite-target", "default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0-retry"}, Service: "default-ingress-with-x-forwarded-prefix-three-groups-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-three-groups", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-x-forwarded-prefix-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1958,7 +2448,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-rule-0-path-0-tls-rewrite-target", "default-ingress-with-x-forwarded-prefix-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-x-forwarded-prefix-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1966,7 +2466,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0-tls-rewrite-target", "default-ingress-with-x-forwarded-prefix-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-x-forwarded-prefix-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -1974,7 +2484,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0-tls-rewrite-target", "default-ingress-with-x-forwarded-prefix-three-groups-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-x-forwarded-prefix-three-groups-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-x-forwarded-prefix-three-groups", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -2157,6 +2677,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-with-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -2164,7 +2694,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -2233,6 +2773,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-a-with-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-a-with-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-b-without-use-regex-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -2240,6 +2790,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-b-without-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-b-without-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-a-with-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -2247,7 +2807,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-a-with-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-a-with-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-b-without-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -2255,7 +2825,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-b-without-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-b-without-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -2360,6 +2940,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-a-with-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-a-with-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-b-without-use-regex-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -2367,6 +2957,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-b-without-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-b-without-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-a-with-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -2374,7 +2974,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-a-with-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-a-with-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-b-without-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -2382,7 +2992,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-b-without-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-b-without-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -2486,6 +3106,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-rule-0-path-0-rewrite-target", "default-ingress-with-rewrite-target-rule-0-path-0-retry"}, }, "default-ingress-with-rewrite-target-rule-0-path-0-tls": { @@ -2493,6 +3123,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-rule-0-path-0-tls-rewrite-target", "default-ingress-with-rewrite-target-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2501,6 +3141,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target-no-regex.localhost") && (Path("/something") || PathPrefix("/something/"))`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-no-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-no-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-no-regex-rule-0-path-0-retry"}, }, "default-ingress-with-rewrite-target-no-regex-rule-0-path-0-tls": { @@ -2508,6 +3158,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target-no-regex.localhost") && (Path("/something") || PathPrefix("/something/"))`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-no-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-no-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-no-regex-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2625,6 +3285,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target-no-regex.localhost") && Path("/original")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-no-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-no-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-rewrite-target-no-regex-rule-0-path-0-rewrite-target", "default-ingress-with-rewrite-target-no-regex-rule-0-path-0-retry", @@ -2635,6 +3305,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target-no-regex.localhost") && Path("/original")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-no-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-no-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-rewrite-target-no-regex-rule-0-path-0-tls-rewrite-target", "default-ingress-with-rewrite-target-no-regex-rule-0-path-0-tls-retry", @@ -2719,6 +3399,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("shared.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-a-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-a-with-rewrite-target-rule-0-path-0-rewrite-target", "default-ingress-a-with-rewrite-target-rule-0-path-0-retry"}, }, "default-ingress-b-without-rewrite-target-rule-0-path-0": { @@ -2726,6 +3416,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("shared.localhost") && PathRegexp("(?i)^/static")`, RuleSyntax: "default", Service: "default-ingress-b-without-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-b-without-rewrite-target-rule-0-path-0-retry"}, }, "default-ingress-a-with-rewrite-target-rule-0-path-0-tls": { @@ -2733,6 +3433,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("shared.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-a-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-a-with-rewrite-target-rule-0-path-0-tls-rewrite-target", "default-ingress-a-with-rewrite-target-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2741,6 +3451,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("shared.localhost") && PathRegexp("(?i)^/static")`, RuleSyntax: "default", Service: "default-ingress-b-without-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-b-without-rewrite-target-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2842,6 +3562,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-a-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-a-with-rewrite-target-rule-0-path-0-rewrite-target", "default-ingress-a-with-rewrite-target-rule-0-path-0-retry"}, }, "default-ingress-b-without-rewrite-target-rule-0-path-0": { @@ -2849,6 +3579,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("no-rewrite.localhost") && (Path("/static") || PathPrefix("/static/"))`, RuleSyntax: "default", Service: "default-ingress-b-without-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-b-without-rewrite-target-rule-0-path-0-retry"}, }, "default-ingress-a-with-rewrite-target-rule-0-path-0-tls": { @@ -2856,6 +3596,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-a-with-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-a-with-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-a-with-rewrite-target-rule-0-path-0-tls-rewrite-target", "default-ingress-a-with-rewrite-target-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2864,6 +3614,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("no-rewrite.localhost") && (Path("/static") || PathPrefix("/static/"))`, RuleSyntax: "default", Service: "default-ingress-b-without-rewrite-target-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-b-without-rewrite-target", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-b-without-rewrite-target-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -2965,6 +3725,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-use-regex-false-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-use-regex-false", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-use-regex-false-rule-0-path-0-rewrite-target", "default-ingress-with-rewrite-target-use-regex-false-rule-0-path-0-retry"}, }, "default-ingress-with-rewrite-target-use-regex-false-rule-0-path-0-tls": { @@ -2972,6 +3742,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("rewrite-target.localhost") && PathRegexp("(?i)^/something(/|$)(.*)")`, RuleSyntax: "default", Service: "default-ingress-with-rewrite-target-use-regex-false-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-rewrite-target-use-regex-false", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-rewrite-target-use-regex-false-rule-0-path-0-tls-rewrite-target", "default-ingress-with-rewrite-target-use-regex-false-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -3045,6 +3825,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("app-root.localhost") && (Path("/bar") || PathPrefix("/bar/"))`, RuleSyntax: "default", Service: "default-ingress-with-app-root-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-app-root", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-app-root-rule-0-path-0-app-root", "default-ingress-with-app-root-rule-0-path-0-retry"}, }, "default-ingress-with-app-root-rule-0-path-0-tls": { @@ -3052,6 +3842,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("app-root.localhost") && (Path("/bar") || PathPrefix("/bar/"))`, RuleSyntax: "default", Service: "default-ingress-with-app-root-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-app-root", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-app-root-rule-0-path-0-tls-app-root", "default-ingress-with-app-root-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -3134,6 +3934,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-app-root-rule-0-path-0-retry"}, Service: "default-ingress-with-app-root-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-app-root", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-app-root-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3141,7 +3951,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-app-root-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-app-root-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-app-root", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3210,12 +4030,32 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-retry"}, Service: "default-ingress-with-www-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-www-host-rule-0-path-0-from-to-www-redirect": { EntryPoints: []string{"http"}, Rule: `Host("host.localhost")`, RuleSyntax: "default", Service: "default-ingress-with-www-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-from-to-www-redirect"}, }, "default-ingress-with-www-host-rule-0-path-0-tls": { @@ -3224,13 +4064,33 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-www-host-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-www-host-rule-0-path-0-tls-from-to-www-redirect": { EntryPoints: []string{"https"}, Rule: `Host("host.localhost")`, RuleSyntax: "default", Service: "default-ingress-with-www-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-tls-from-to-www-redirect"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -3315,12 +4175,32 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-host-rule-0-path-0-retry"}, Service: "default-ingress-with-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-host-rule-0-path-0-from-to-www-redirect": { EntryPoints: []string{"http"}, Rule: `Host("www.host.localhost")`, RuleSyntax: "default", Service: "default-ingress-with-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-host-rule-0-path-0-from-to-www-redirect"}, }, "default-ingress-with-host-rule-0-path-0-tls": { @@ -3329,13 +4209,33 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-host-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-host-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-host-rule-0-path-0-tls-from-to-www-redirect": { EntryPoints: []string{"https"}, Rule: `Host("www.host.localhost")`, RuleSyntax: "default", Service: "default-ingress-with-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-host-rule-0-path-0-tls-from-to-www-redirect"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -3420,6 +4320,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-host-rule-0-path-0-retry"}, Service: "default-ingress-with-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-www-host-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -3427,6 +4337,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-retry"}, Service: "default-ingress-with-www-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-host-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3434,7 +4354,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-host-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-host-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-www-host-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3442,7 +4372,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-www-host-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-www-host-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-www-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3547,6 +4487,14 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Priority: math.MinInt32, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + ServiceName: "whoami", + }, + }, + }, }, "default-backend-tls": { EntryPoints: []string{"https"}, @@ -3555,6 +4503,14 @@ func TestLoadIngresses(t *testing.T) { Priority: math.MinInt32, TLS: &dynamic.RouterTLSConfig{}, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + ServiceName: "whoami", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{}, @@ -3602,6 +4558,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-single-ip-rule-0-path-0-allowed-source-range", "default-ingress-with-whitelist-single-ip-rule-0-path-0-retry"}, Service: "default-ingress-with-whitelist-single-ip-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-single-ip", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-whitelist-single-ip-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3609,7 +4575,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-single-ip-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-whitelist-single-ip-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-whitelist-single-ip-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-single-ip", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3688,6 +4664,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-single-cidr-rule-0-path-0-allowed-source-range", "default-ingress-with-whitelist-single-cidr-rule-0-path-0-retry"}, Service: "default-ingress-with-whitelist-single-cidr-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-single-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-whitelist-single-cidr-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3695,7 +4681,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-single-cidr-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-whitelist-single-cidr-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-whitelist-single-cidr-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-single-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3774,6 +4770,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-multiple-ip-and-cidr-rule-0-path-0-allowed-source-range", "default-ingress-with-whitelist-multiple-ip-and-cidr-rule-0-path-0-retry"}, Service: "default-ingress-with-whitelist-multiple-ip-and-cidr-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-multiple-ip-and-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-whitelist-multiple-ip-and-cidr-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3781,7 +4787,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-multiple-ip-and-cidr-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-whitelist-multiple-ip-and-cidr-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-whitelist-multiple-ip-and-cidr-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-multiple-ip-and-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3860,6 +4876,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-empty-rule-0-path-0-retry"}, Service: "default-ingress-with-whitelist-empty-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-empty", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-whitelist-empty-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3867,7 +4893,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-whitelist-empty-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-whitelist-empty-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-whitelist-empty", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -3936,6 +4972,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-empty-rule-0-path-0-retry"}, Service: "default-ingress-with-allowlist-empty-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-empty", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-allowlist-empty-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -3943,7 +4989,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-empty-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-allowlist-empty-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-empty", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -4012,6 +5068,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-single-ip-rule-0-path-0-allowed-source-range", "default-ingress-with-allowlist-single-ip-rule-0-path-0-retry"}, Service: "default-ingress-with-allowlist-single-ip-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-single-ip", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-allowlist-single-ip-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -4019,7 +5085,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-single-ip-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-allowlist-single-ip-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-allowlist-single-ip-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-single-ip", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -4098,6 +5174,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-single-cidr-rule-0-path-0-allowed-source-range", "default-ingress-with-allowlist-single-cidr-rule-0-path-0-retry"}, Service: "default-ingress-with-allowlist-single-cidr-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-single-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-allowlist-single-cidr-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -4105,7 +5191,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-single-cidr-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-allowlist-single-cidr-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-allowlist-single-cidr-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-single-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -4184,6 +5280,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-multiple-ip-and-cidr-rule-0-path-0-allowed-source-range", "default-ingress-with-allowlist-multiple-ip-and-cidr-rule-0-path-0-retry"}, Service: "default-ingress-with-allowlist-multiple-ip-and-cidr-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-multiple-ip-and-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-allowlist-multiple-ip-and-cidr-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -4191,7 +5297,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-allowlist-multiple-ip-and-cidr-rule-0-path-0-tls-allowed-source-range", "default-ingress-with-allowlist-multiple-ip-and-cidr-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-allowlist-multiple-ip-and-cidr-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-allowlist-multiple-ip-and-cidr", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -4272,6 +5388,14 @@ func TestLoadIngresses(t *testing.T) { Service: "default-ingress-with-access-log-enabled-whoami-80", Observability: &dynamic.RouterObservabilityConfig{ AccessLogs: ptr.To(true), + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-enabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, }, }, "default-ingress-with-access-log-enabled-rule-0-path-0-tls": { @@ -4283,6 +5407,14 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Observability: &dynamic.RouterObservabilityConfig{ AccessLogs: ptr.To(true), + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-enabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, }, }, "default-ingress-with-access-log-disabled-rule-0-path-0": { @@ -4293,6 +5425,14 @@ func TestLoadIngresses(t *testing.T) { Service: "default-ingress-with-access-log-disabled-whoami-80", Observability: &dynamic.RouterObservabilityConfig{ AccessLogs: ptr.To(false), + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-disabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, }, }, "default-ingress-with-access-log-disabled-rule-0-path-0-tls": { @@ -4304,6 +5444,14 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Observability: &dynamic.RouterObservabilityConfig{ AccessLogs: ptr.To(false), + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-disabled", + ServiceName: "whoami", + ServicePort: "80", + }, + }, }, }, "default-ingress-with-access-log-default-rule-0-path-0": { @@ -4312,6 +5460,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-access-log-default-rule-0-path-0-retry"}, Service: "default-ingress-with-access-log-default-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-default", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-access-log-default-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -4320,6 +5478,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-access-log-default-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-access-log-default-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-access-log-default", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -4423,6 +5591,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-permanent-redirect-rule-0-path-0-tls": { @@ -4430,6 +5608,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4513,6 +5701,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-permanent-redirect-rule-0-path-0-tls": { @@ -4520,6 +5718,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4603,6 +5811,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-permanent-redirect-rule-0-path-0-tls": { @@ -4610,6 +5828,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("permanent-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-permanent-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-permanent-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-permanent-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-permanent-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4693,6 +5921,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-redirect-rule-0-path-0-redirect", "default-ingress-with-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-redirect-rule-0-path-0-tls": { @@ -4700,6 +5938,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4783,6 +6031,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-temporal-redirect-rule-0-path-0-tls": { @@ -4790,6 +6048,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4873,6 +6141,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-temporal-redirect-rule-0-path-0-tls": { @@ -4880,6 +6158,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -4963,6 +6251,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-retry"}, }, "default-ingress-with-temporal-redirect-rule-0-path-0-tls": { @@ -4970,6 +6268,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("temporal-redirect.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-temporal-redirect-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-temporal-redirect", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-temporal-redirect-rule-0-path-0-tls-redirect", "default-ingress-with-temporal-redirect-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -5054,6 +6362,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-timeout-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -5061,7 +6379,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5126,6 +6454,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-timeout-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -5133,7 +6471,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5198,6 +6546,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-timeout-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -5205,7 +6563,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-timeout-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-timeout-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5271,6 +6639,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-secret-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-auth-tls-secret-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-secret", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, TLS: &dynamic.RouterTLSConfig{ Options: "default-ingress-with-auth-tls-secret-default-ca-secret", }, @@ -5281,6 +6659,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-secret-rule-0-path-0-retry"}, Service: "default-ingress-with-auth-tls-secret-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-secret", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5383,6 +6771,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-verify-client-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-auth-tls-verify-client-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-verify-client", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, TLS: &dynamic.RouterTLSConfig{ Options: "default-ingress-with-auth-tls-verify-client-default-ca-secret", }, @@ -5393,6 +6791,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-verify-client-rule-0-path-0-retry"}, Service: "default-ingress-with-auth-tls-verify-client-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-verify-client", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5493,6 +6901,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-and-default-backend-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors-and-default-backend", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-custom-http-errors-and-default-backend-rule-0-path-0-custom-http-errors", "default-ingress-with-custom-http-errors-and-default-backend-rule-0-path-0-retry"}, }, "default-ingress-with-custom-http-errors-and-default-backend-rule-0-path-0-tls": { @@ -5500,6 +6918,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-and-default-backend-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors-and-default-backend", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-custom-http-errors-and-default-backend-rule-0-path-0-tls-custom-http-errors", "default-ingress-with-custom-http-errors-and-default-backend-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -5624,6 +7052,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-custom-http-errors-rule-0-path-0-custom-http-errors", "default-ingress-with-custom-http-errors-rule-0-path-0-retry", @@ -5634,6 +7072,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-custom-http-errors-rule-0-path-0-tls-custom-http-errors", "default-ingress-with-custom-http-errors-rule-0-path-0-tls-retry", @@ -5646,6 +7094,14 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Priority: math.MinInt32, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + ServiceName: "whoami-b", + }, + }, + }, }, "default-backend-tls": { EntryPoints: []string{"https"}, @@ -5654,6 +7110,14 @@ func TestLoadIngresses(t *testing.T) { Priority: math.MinInt32, TLS: &dynamic.RouterTLSConfig{}, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + ServiceName: "whoami-b", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -5762,6 +7226,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-custom-http-errors-rule-0-path-0-retry"}, }, "default-ingress-with-custom-http-errors-rule-0-path-0-tls": { @@ -5769,6 +7243,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-custom-http-errors-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-custom-http-errors", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-custom-http-errors-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -5834,6 +7318,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-default-backend-annotation-empty-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-default-backend-annotation", + ServiceName: "empty", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-default-backend-annotation-rule-0-path-0-retry"}, }, "default-ingress-with-default-backend-annotation-rule-0-path-0-tls": { @@ -5841,6 +7335,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-default-backend-annotation-empty-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-default-backend-annotation", + ServiceName: "empty", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-default-backend-annotation-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -5911,6 +7415,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-body-size-rule-0-path-0-buffering", "default-ingress-with-proxy-body-size-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-body-size-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-body-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-body-size-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -5918,7 +7432,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-body-size-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-body-size-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-body-size-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-body-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6003,6 +7527,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-client-body-buffer-size-rule-0-path-0-buffering", "default-ingress-with-client-body-buffer-size-rule-0-path-0-retry"}, Service: "default-ingress-with-client-body-buffer-size-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-client-body-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-client-body-buffer-size-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6010,7 +7544,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-client-body-buffer-size-rule-0-path-0-tls-buffering", "default-ingress-with-client-body-buffer-size-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-client-body-buffer-size-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-client-body-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6095,6 +7639,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-body-size-and-client-body-buffer-size-rule-0-path-0-buffering", "default-ingress-with-proxy-body-size-and-client-body-buffer-size-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-body-size-and-client-body-buffer-size-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-body-size-and-client-body-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-body-size-and-client-body-buffer-size-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6102,7 +7656,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-body-size-and-client-body-buffer-size-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-body-size-and-client-body-buffer-size-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-body-size-and-client-body-buffer-size-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-body-size-and-client-body-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6187,6 +7751,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffer-size-rule-0-path-0-buffering", "default-ingress-with-proxy-buffer-size-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-buffer-size-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-buffer-size-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6194,7 +7768,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffer-size-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-buffer-size-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-buffer-size-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffer-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6281,6 +7865,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffers-number-rule-0-path-0-buffering", "default-ingress-with-proxy-buffers-number-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-buffers-number-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffers-number", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-buffers-number-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6288,7 +7882,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffers-number-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-buffers-number-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-buffers-number-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffers-number", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6375,6 +7979,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffer-size-and-number-rule-0-path-0-buffering", "default-ingress-with-proxy-buffer-size-and-number-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-buffer-size-and-number-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffer-size-and-number", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-buffer-size-and-number-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6382,7 +7996,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-buffer-size-and-number-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-buffer-size-and-number-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-buffer-size-and-number-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-buffer-size-and-number", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6469,6 +8093,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-max-temp-file-size-rule-0-path-0-buffering", "default-ingress-with-proxy-max-temp-file-size-rule-0-path-0-retry"}, Service: "default-ingress-with-proxy-max-temp-file-size-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-max-temp-file-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-max-temp-file-size-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -6476,7 +8110,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-proxy-max-temp-file-size-rule-0-path-0-tls-buffering", "default-ingress-with-proxy-max-temp-file-size-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-proxy-max-temp-file-size-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-max-temp-file-size", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -6563,6 +8207,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-server-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-server-snippet-rule-0-path-0-snippet", "default-ingress-with-server-snippet-rule-0-path-0-retry", @@ -6573,6 +8227,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-server-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-server-snippet-rule-0-path-0-tls-snippet", "default-ingress-with-server-snippet-rule-0-path-0-tls-retry", @@ -6652,6 +8316,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-configuration-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-configuration-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-configuration-snippet-rule-0-path-0-snippet", "default-ingress-with-configuration-snippet-rule-0-path-0-retry", @@ -6662,6 +8336,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-configuration-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-configuration-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-configuration-snippet-rule-0-path-0-tls-snippet", "default-ingress-with-configuration-snippet-rule-0-path-0-tls-retry", @@ -6741,6 +8425,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-both-snippets-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-both-snippets", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-both-snippets-rule-0-path-0-snippet", "default-ingress-with-both-snippets-rule-0-path-0-retry", @@ -6751,6 +8445,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-both-snippets-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-both-snippets", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-both-snippets-rule-0-path-0-tls-snippet", "default-ingress-with-both-snippets-rule-0-path-0-tls-retry", @@ -6898,6 +8602,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-server-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-server-snippet-rule-0-path-0-snippet", "default-ingress-with-server-snippet-rule-0-path-0-retry"}, }, "default-ingress-with-server-snippet-rule-0-path-0-tls": { @@ -6905,6 +8619,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-server-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-server-snippet-rule-0-path-0-tls-snippet", "default-ingress-with-server-snippet-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -6981,6 +8705,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-configuration-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-configuration-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-configuration-snippet-rule-0-path-0-snippet", "default-ingress-with-configuration-snippet-rule-0-path-0-retry"}, }, "default-ingress-with-configuration-snippet-rule-0-path-0-tls": { @@ -6988,6 +8722,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-configuration-snippet-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-configuration-snippet", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-configuration-snippet-rule-0-path-0-tls-snippet", "default-ingress-with-configuration-snippet-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7064,6 +8808,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-both-snippets-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-both-snippets", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-both-snippets-rule-0-path-0-snippet", "default-ingress-with-both-snippets-rule-0-path-0-retry"}, }, "default-ingress-with-both-snippets-rule-0-path-0-tls": { @@ -7071,6 +8825,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("snippet.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-both-snippets-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-both-snippets", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-both-snippets-rule-0-path-0-tls-snippet", "default-ingress-with-both-snippets-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7150,6 +8914,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-pass-certificate-to-upstream-rule-0-path-0-tls-pass-certificate-to-upstream", "default-ingress-with-auth-tls-pass-certificate-to-upstream-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-auth-tls-pass-certificate-to-upstream-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-pass-certificate-to-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, TLS: &dynamic.RouterTLSConfig{ Options: "default-ingress-with-auth-tls-pass-certificate-to-upstream-default-ca-secret", }, @@ -7160,6 +8934,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-auth-tls-pass-certificate-to-upstream-rule-0-path-0-retry"}, Service: "default-ingress-with-auth-tls-pass-certificate-to-upstream-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-auth-tls-pass-certificate-to-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -7267,6 +9051,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-next-upstream-off-rule-0-path-0": { @@ -7274,12 +9068,32 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-off-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-off", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-proxy-next-upstream-rule-0-path-0-tls": { EntryPoints: []string{"https"}, Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7288,7 +9102,17 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-off-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-off", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -7378,6 +9202,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-tries-unlimited-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-tries-unlimited", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-tries-unlimited-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-next-upstream-tries-rule-0-path-0": { @@ -7385,6 +9219,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-tries-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-tries", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-tries-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-next-upstream-tries-unlimited-rule-0-path-0-tls": { @@ -7392,6 +9236,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-tries-unlimited-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-tries-unlimited", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-tries-unlimited-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7400,6 +9254,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-tries-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-tries", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-tries-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7497,6 +9361,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-timeout-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-timeout-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-next-upstream-timeout-rule-0-path-0-tls": { @@ -7504,6 +9378,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-next-upstream-timeout-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-next-upstream-timeout", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-next-upstream-timeout-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7572,6 +9456,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-server-alias-rule-0-path-0-retry"}, Service: "default-ingress-with-server-alias-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-alias", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-server-alias-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -7579,7 +9473,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-server-alias-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-server-alias-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-server-alias", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -7649,6 +9553,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-primary-ingress-rule-0-path-0-retry"}, Service: "default-primary-ingress-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "primary-ingress", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-alias-ingress-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -7656,6 +9570,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-alias-ingress-rule-0-path-0-retry"}, Service: "default-alias-ingress-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "alias-ingress", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-primary-ingress-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -7663,7 +9587,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-primary-ingress-rule-0-path-0-tls-retry"}, Service: "default-primary-ingress-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "primary-ingress", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-alias-ingress-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -7671,7 +9605,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-alias-ingress-rule-0-path-0-tls-retry"}, Service: "default-alias-ingress-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "alias-ingress", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -7767,6 +9711,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("proxy-http-version.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-http-version-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-http-version", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-http-version-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-http-version-rule-0-path-0-tls": { @@ -7774,6 +9728,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("proxy-http-version.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-http-version-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-http-version", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-http-version-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7840,6 +9804,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("proxy-http-version-unsupported.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-http-version-unsupported-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-http-version-unsupported", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-http-version-unsupported-rule-0-path-0-retry"}, }, "default-ingress-with-proxy-http-version-unsupported-rule-0-path-0-tls": { @@ -7847,6 +9821,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("proxy-http-version-unsupported.localhost") && Path("/")`, RuleSyntax: "default", Service: "default-ingress-with-proxy-http-version-unsupported-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-proxy-http-version-unsupported", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-proxy-http-version-unsupported-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7912,6 +9896,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-upstream-hash-by-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-upstream-hash-by", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-upstream-hash-by-rule-0-path-0-retry"}, }, "default-ingress-with-upstream-hash-by-rule-0-path-0-tls": { @@ -7919,6 +9913,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("whoami.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-upstream-hash-by-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-upstream-hash-by", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-upstream-hash-by-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -7985,6 +9989,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-rule-0-path-0-retry"}, }, "default-ingress-with-canary-rule-0-path-0-tls": { @@ -7992,6 +10006,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8093,6 +10117,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-and-sticky-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-and-sticky", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-and-sticky-rule-0-path-0-retry"}, }, "default-ingress-with-canary-and-sticky-rule-0-path-0-tls": { @@ -8100,6 +10134,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-and-sticky-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-and-sticky", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-and-sticky-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8237,6 +10281,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-weight-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-weight-rule-0-path-0-retry"}, }, "default-ingress-with-canary-weight-rule-0-path-0-tls": { @@ -8244,6 +10298,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-weight-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-weight-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8345,6 +10409,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-header-rule-0-path-0-canary": { @@ -8352,6 +10426,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-by-header-rule-0-path-0-tls": { @@ -8359,6 +10443,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8367,6 +10461,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-rule-0-path-0-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8478,6 +10582,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-value-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-value", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-value-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-header-value-rule-0-path-0-canary": { @@ -8485,6 +10599,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "bar"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-value-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-value", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-value-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-by-header-value-rule-0-path-0-tls": { @@ -8492,6 +10616,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-value-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-value", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-value-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8500,6 +10634,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "bar"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-value-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-value", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-value-rule-0-path-0-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8611,6 +10755,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-pattern-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-pattern", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-pattern-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-header-pattern-rule-0-path-0-canary": { @@ -8618,6 +10772,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (HeaderRegexp("Foo", "bar(.*)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-pattern-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-pattern", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-pattern-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-by-header-pattern-rule-0-path-0-tls": { @@ -8625,6 +10789,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-pattern-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-pattern", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-pattern-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8633,6 +10807,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (HeaderRegexp("Foo", "bar(.*)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-pattern-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-pattern", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-pattern-rule-0-path-0-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8744,6 +10928,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-misconfigured-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-misconfigured", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-misconfigured-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-header-misconfigured-rule-0-path-0-tls": { @@ -8751,6 +10945,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-misconfigured-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-misconfigured", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-misconfigured-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8852,6 +11056,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-cookie-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-cookie", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-cookie-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-cookie-rule-0-path-0-canary": { @@ -8859,6 +11073,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (HeaderRegexp("Cookie", "(^|;\\s*)foo=always(;|$)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-cookie-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-cookie", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-cookie-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-by-cookie-rule-0-path-0-tls": { @@ -8866,6 +11090,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-cookie-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-cookie", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-cookie-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8874,6 +11108,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (HeaderRegexp("Cookie", "(^|;\\s*)foo=always(;|$)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-cookie-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-cookie", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-cookie-rule-0-path-0-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -8985,6 +11229,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-retry"}, }, "default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-canary": { @@ -8992,6 +11246,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always") || (HeaderRegexp("Cookie", "(^|;\\s*)foo=always(;|$)") && !Header("Foo", "never")))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-non-canary": { @@ -8999,6 +11263,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "never") || HeaderRegexp("Cookie", "(^|;\\s*)foo=never(;|$)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-non-canary-retry"}, }, "default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-tls": { @@ -9006,6 +11280,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -9014,6 +11298,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always") || (HeaderRegexp("Cookie", "(^|;\\s*)foo=always(;|$)") && !Header("Foo", "never")))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -9022,6 +11316,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "never") || HeaderRegexp("Cookie", "(^|;\\s*)foo=never(;|$)"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-by-header-and-cookie-and-weight-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-by-header-and-cookie-and-weight", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-by-header-and-cookie-and-weight-rule-0-path-0-non-canary-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -9143,6 +11447,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-rule-0-path-0-app-root", "default-ingress-with-canary-middlewares-rule-0-path-0-retry", @@ -9153,6 +11467,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-rule-0-path-0-canary-app-root", "default-ingress-with-canary-middlewares-rule-0-path-0-canary-retry", @@ -9163,6 +11487,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-rule-0-path-0-tls-app-root", "default-ingress-with-canary-middlewares-rule-0-path-0-tls-retry", @@ -9174,6 +11508,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-rule-0-path-0-canary-tls-app-root", "default-ingress-with-canary-middlewares-rule-0-path-0-canary-tls-retry", @@ -9312,6 +11656,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-non-matching-canary-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-non-matching-canary", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-non-matching-canary-rule-0-path-0-retry"}, }, "default-ingress-with-non-matching-canary-rule-0-path-0-tls": { @@ -9319,6 +11673,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-non-matching-canary-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-non-matching-canary", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-non-matching-canary-rule-0-path-0-tls-retry"}, TLS: &dynamic.RouterTLSConfig{}, }, @@ -9389,6 +11753,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-and-tls-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares-and-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-app-root", "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-retry"}, }, "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary": { @@ -9396,6 +11770,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-and-tls-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares-and-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{"default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-app-root", "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-retry"}, }, "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-tls": { @@ -9403,6 +11787,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `Host("production.localhost") && PathPrefix("/")`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-and-tls-whoami-80-wrr", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares-and-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-tls-app-root", "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-tls-retry", @@ -9414,6 +11808,16 @@ func TestLoadIngresses(t *testing.T) { Rule: `(Host("production.localhost") && PathPrefix("/")) && (Header("Foo", "always"))`, RuleSyntax: "default", Service: "default-ingress-with-canary-middlewares-and-tls-whoami-80-canary", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-canary-middlewares-and-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, Middlewares: []string{ "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-tls-app-root", "default-ingress-with-canary-middlewares-and-tls-rule-0-path-0-canary-tls-retry", @@ -9548,6 +11952,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rps-rule-0-path-0-limit-rps", "default-ingress-with-limit-rps-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-rps-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rps", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-rps-zero-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -9555,6 +11969,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rps-zero-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-rps-zero-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rps-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-rps-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9562,7 +11986,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rps-rule-0-path-0-tls-limit-rps", "default-ingress-with-limit-rps-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-rps-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rps", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-limit-rps-zero-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9570,7 +12004,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rps-zero-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-rps-zero-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rps-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -9681,6 +12125,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rpm-rule-0-path-0-limit-rpm", "default-ingress-with-limit-rpm-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-rpm-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rpm", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-rpm-zero-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -9688,6 +12142,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rpm-zero-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-rpm-zero-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rpm-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-rpm-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9695,7 +12159,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rpm-rule-0-path-0-tls-limit-rpm", "default-ingress-with-limit-rpm-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-rpm-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rpm", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, "default-ingress-with-limit-rpm-zero-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9703,7 +12177,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-rpm-zero-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-rpm-zero-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-rpm-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -9811,6 +12295,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-burst-multiplier-rule-0-path-0-limit-rps", "default-ingress-with-limit-burst-multiplier-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-burst-multiplier-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-burst-multiplier", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-burst-multiplier-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9819,6 +12313,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-limit-burst-multiplier-rule-0-path-0-tls-limit-rps", "default-ingress-with-limit-burst-multiplier-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-burst-multiplier-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-burst-multiplier", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0": { EntryPoints: []string{"http"}, @@ -9826,6 +12330,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0-limit-rps", "default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0-retry"}, Service: "default-ingress-with-limit-burst-multiplier-zero-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-burst-multiplier-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9834,6 +12348,16 @@ func TestLoadIngresses(t *testing.T) { Middlewares: []string{"default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0-tls-limit-rps", "default-ingress-with-limit-burst-multiplier-zero-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-limit-burst-multiplier-zero-whoami-80", TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-limit-burst-multiplier-zero", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -9928,6 +12452,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-use-regex-rule-0-path-0-retry"}, Service: "default-ingress-with-use-regex-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-use-regex-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -9935,7 +12469,17 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-use-regex-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-use-regex-whoami-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-use-regex", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -9996,6 +12540,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-wildcard-host-rule-0-path-0-retry"}, Service: "default-ingress-with-wildcard-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-wildcard-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-wildcard-host-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -10004,6 +12558,16 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Middlewares: []string{"default-ingress-with-wildcard-host-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-wildcard-host-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-wildcard-host", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ @@ -10069,6 +12633,16 @@ func TestLoadIngresses(t *testing.T) { RuleSyntax: "default", Middlewares: []string{"default-ingress-with-wildcard-host-tls-rule-0-path-0-retry"}, Service: "default-ingress-with-wildcard-host-tls-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-wildcard-host-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, "default-ingress-with-wildcard-host-tls-rule-0-path-0-tls": { EntryPoints: []string{"https"}, @@ -10077,6 +12651,16 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.RouterTLSConfig{}, Middlewares: []string{"default-ingress-with-wildcard-host-tls-rule-0-path-0-tls-retry"}, Service: "default-ingress-with-wildcard-host-tls-whoami-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "ingress-with-wildcard-host-tls", + ServiceName: "whoami", + ServicePort: "80", + }, + }, + }, }, }, Middlewares: map[string]*dynamic.Middleware{ diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index 0a595000cb..7d670ce22f 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -306,13 +306,29 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl RuleSyntax: "default", Priority: math.MinInt32, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: ingress.Namespace, + IngressName: ingress.Name, + ServiceName: ingress.Spec.DefaultBackend.Service.Name, + ServicePort: portString(ingress.Spec.DefaultBackend.Service.Port), + }, + }, + }, } if rtConfig != nil && rtConfig.Router != nil { rt.EntryPoints = rtConfig.Router.EntryPoints rt.Middlewares = rtConfig.Router.Middlewares rt.TLS = rtConfig.Router.TLS - rt.Observability = rtConfig.Router.Observability + + if rtConfig.Router.Observability != nil { + rt.Observability.AccessLogs = rtConfig.Router.Observability.AccessLogs + rt.Observability.Metrics = rtConfig.Router.Observability.Metrics + rt.Observability.Tracing = rtConfig.Router.Observability.Tracing + rt.Observability.TraceVerbosity = rtConfig.Router.Observability.TraceVerbosity + } } p.applyRouterTransform(ctxIngress, rt, ingress) @@ -358,16 +374,10 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl continue } - portString := pa.Backend.Service.Port.Name - - if len(pa.Backend.Service.Port.Name) == 0 { - portString = strconv.Itoa(int(pa.Backend.Service.Port.Number)) - } - - serviceName := provider.Normalize(ingress.Namespace + "-" + pa.Backend.Service.Name + "-" + portString) + serviceName := provider.Normalize(ingress.Namespace + "-" + pa.Backend.Service.Name + "-" + portString(pa.Backend.Service.Port)) conf.HTTP.Services[serviceName] = service - rt := p.loadRouter(rule, pa, rtConfig, serviceName) + rt := p.loadRouter(ingress, rule, pa, rtConfig, serviceName) p.applyRouterTransform(ctxIngress, rt, ingress) @@ -689,9 +699,19 @@ func (p *Provider) loadService(client Client, namespace string, backend netv1.In return svc, nil } -func (p *Provider) loadRouter(rule netv1.IngressRule, pa netv1.HTTPIngressPath, rtConfig *RouterConfig, serviceName string) *dynamic.Router { +func (p *Provider) loadRouter(ingress *netv1.Ingress, rule netv1.IngressRule, pa netv1.HTTPIngressPath, rtConfig *RouterConfig, serviceName string) *dynamic.Router { rt := &dynamic.Router{ Service: serviceName, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: ingress.Namespace, + IngressName: ingress.Name, + ServiceName: pa.Backend.Service.Name, + ServicePort: portString(pa.Backend.Service.Port), + }, + }, + }, } if rtConfig != nil && rtConfig.Router != nil { @@ -700,7 +720,13 @@ func (p *Provider) loadRouter(rule netv1.IngressRule, pa netv1.HTTPIngressPath, rt.EntryPoints = rtConfig.Router.EntryPoints rt.Middlewares = rtConfig.Router.Middlewares rt.TLS = rtConfig.Router.TLS - rt.Observability = rtConfig.Router.Observability + + if rtConfig.Router.Observability != nil { + rt.Observability.AccessLogs = rtConfig.Router.Observability.AccessLogs + rt.Observability.Metrics = rtConfig.Router.Observability.Metrics + rt.Observability.Tracing = rtConfig.Router.Observability.Tracing + rt.Observability.TraceVerbosity = rtConfig.Router.Observability.TraceVerbosity + } } var rules []string @@ -928,3 +954,10 @@ func throttleEvents(ctx context.Context, throttleDuration time.Duration, pool *s return eventsChanBuffered } + +func portString(port netv1.ServiceBackendPort) string { + if port.Name == "" { + return strconv.Itoa(int(port.Number)) + } + return port.Name +} diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index 4a4f2e9698..7be35de784 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -73,6 +73,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -129,6 +138,13 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { Tracing: pointer(true), Metrics: pointer(true), TraceVerbosity: otypes.MinimalVerbosity, + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, }, }, }, @@ -172,10 +188,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-foo": { Rule: `PathPrefix("/foo")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -209,10 +243,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar-bar-41871576e140babe40bd": { Rule: `Host("*.bar") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-bar-bar-605945111a3c9f84dc65": { Rule: `Host("bar") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -246,10 +298,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-foo-bar-930f0e8b221e60bc7ab7": { Rule: `PathPrefix("/foo/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-foo-bar-207cc2245cb31ba18e29": { Rule: `PathPrefix("/foo-bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -283,10 +353,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-foo": { Rule: `PathPrefix("/foo")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -320,6 +408,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -353,6 +450,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-example-com": { Rule: `Host("example.com")`, Service: "testing-example-com-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "example-com", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -383,10 +489,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-traefik-tchouk-foo": { Rule: `Host("traefik.tchouk") && PathPrefix("/foo")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -420,10 +544,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-traefik-courgette-carotte": { Rule: `Host("traefik.courgette") && PathPrefix("/carotte")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -457,10 +599,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-traefik-courgette-carotte": { Rule: `Host("traefik.courgette") && PathPrefix("/carotte")`, Service: "testing-service2-8082", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service2", + ServicePort: "8082", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -512,6 +672,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -591,6 +760,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { RuleSyntax: "default", Service: "default-backend", Priority: math.MinInt32, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -624,6 +802,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -657,6 +844,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -690,6 +886,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -723,10 +928,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, "testing-traefik-tchouk-foo": { Rule: `Host("traefik.tchouk") && PathPrefix("/foo")`, Service: "testing-service1-carotte", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "carotte", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -777,6 +1000,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -810,10 +1042,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, "toto-toto-traefik-tchouk-bar": { Rule: `Host("toto.traefik.tchouk") && PathPrefix("/bar")`, Service: "toto-service1-tchouk", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "toto", + ServiceName: "service1", + ServicePort: "tchouk", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -884,6 +1134,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-traefik-port-port": { Rule: `Host("traefik.port") && PathPrefix("/port")`, Service: "testing-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -914,7 +1173,16 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-example-com": { Rule: `Host("example.com")`, Service: "testing-example-com-80", - TLS: &dynamic.RouterTLSConfig{}, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "example-com", + ServicePort: "80", + }, + }, + }, + TLS: &dynamic.RouterTLSConfig{}, }, }, Services: map[string]*dynamic.Service{ @@ -955,6 +1223,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-443", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "443", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -988,6 +1265,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-8443", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8443", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1022,6 +1308,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-8443", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8443", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1057,6 +1352,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { RuleSyntax: "default", Service: "default-backend", Priority: math.MinInt32, + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1090,6 +1394,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1163,6 +1476,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-foobar-com-bar": { Rule: `Host("*.foobar.com") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1196,6 +1518,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-foobar-com-bar": { Rule: `HostRegexp("{subdomain:[a-zA-Z0-9-]+}.foobar.com") && PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1228,10 +1559,28 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-foo": { Rule: `PathPrefix("/foo")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1263,6 +1612,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-foo": { Rule: `PathPrefix("/foo")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1293,6 +1651,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1323,6 +1690,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `Path("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1353,6 +1729,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `Path("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1383,6 +1768,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `Path("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1413,6 +1807,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1446,6 +1849,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1479,6 +1891,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1509,6 +1930,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1565,6 +1995,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-foobar", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "foobar", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1607,6 +2046,16 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { RuleSyntax: "default", Priority: math.MinInt32, Service: "default-backend", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + IngressName: "defaultbackend", + ServiceName: "defaultservice", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1637,6 +2086,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1678,6 +2136,15 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { "testing-bar": { Rule: `(Path("/bar") || PathPrefix("/bar/"))`, Service: "testing-service1-80", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "80", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1752,6 +2219,15 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1782,6 +2258,16 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) { "testing-example-com-bar": { Rule: `PathPrefix("/bar")`, Service: "testing-service-bar-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + IngressName: "example.com", + ServiceName: "service-bar", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1813,6 +2299,16 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) { "testing-example-com-foo": { Rule: `PathPrefix("/foo")`, Service: "testing-service-foo-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + IngressName: "example.com", + ServiceName: "service-foo", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1866,6 +2362,15 @@ func TestLoadConfigurationFromIngressesWithNativeLB(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -1916,6 +2421,15 @@ func TestLoadConfigurationFromIngressesWithNodePortLB(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -2154,6 +2668,15 @@ func TestLoadConfigurationFromIngressesWithNativeLBByDefault(t *testing.T) { "testing-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "testing-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "testing", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -2182,6 +2705,16 @@ func TestLoadConfigurationFromIngressesWithNativeLBByDefault(t *testing.T) { "default-global-native-lb-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "default-service1-8080", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "global-native-lb", + ServiceName: "service1", + ServicePort: "8080", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ @@ -2210,6 +2743,16 @@ func TestLoadConfigurationFromIngressesWithNativeLBByDefault(t *testing.T) { "default-global-native-lb-traefik-tchouk-bar": { Rule: `Host("traefik.tchouk") && PathPrefix("/bar")`, Service: "default-native-disabled-svc-web", + Observability: &dynamic.RouterObservabilityConfig{ + Metadata: &dynamic.ObservabilityMetadata{ + Ingress: &dynamic.KubernetesIngressMetadata{ + Namespace: "default", + IngressName: "global-native-lb", + ServiceName: "native-disabled-svc", + ServicePort: "web", + }, + }, + }, }, }, Services: map[string]*dynamic.Service{ diff --git a/pkg/server/middleware/observability.go b/pkg/server/middleware/observability.go index 0ffe34165a..41a0ffe677 100644 --- a/pkg/server/middleware/observability.go +++ b/pkg/server/middleware/observability.go @@ -132,6 +132,7 @@ func (o *ObservabilityMgr) observabilityContextHandler(next http.Handler, intern SemConvMetricsEnabled: o.shouldMeterSemConv(internal, config), TracingEnabled: o.shouldTrace(internal, config, otypes.MinimalVerbosity), DetailedTracingEnabled: o.shouldTrace(internal, config, otypes.DetailedVerbosity), + Metadata: config.Metadata, }) }