Manage observability at entrypoint and router level
Co-authored-by: Kevin Pollet <pollet.kevin@gmail.com>
This commit is contained in:
parent
9588e51146
commit
b1934231ca
58 changed files with 1216 additions and 303 deletions
|
@ -12,6 +12,10 @@ spec:
|
|||
- match: Host(`foo.com`) && PathPrefix(`/bar`)
|
||||
kind: Rule
|
||||
priority: 12
|
||||
observability:
|
||||
accessLogs: true
|
||||
tracing: true
|
||||
metrics: true
|
||||
services:
|
||||
- name: whoami
|
||||
port: 80
|
||||
|
|
|
@ -114,12 +114,13 @@ 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,
|
||||
Middlewares: mds,
|
||||
Priority: route.Priority,
|
||||
RuleSyntax: route.Syntax,
|
||||
EntryPoints: ingressRoute.Spec.EntryPoints,
|
||||
Rule: route.Match,
|
||||
Service: serviceName,
|
||||
Observability: route.Observability,
|
||||
}
|
||||
|
||||
if ingressRoute.Spec.TLS != nil {
|
||||
|
|
|
@ -1688,6 +1688,11 @@ func TestLoadIngressRoutes(t *testing.T) {
|
|||
Service: "default-test-route-6b204d94623b3df4370c",
|
||||
Rule: "Host(`foo.com`) && PathPrefix(`/bar`)",
|
||||
Priority: 12,
|
||||
Observability: &dynamic.RouterObservabilityConfig{
|
||||
AccessLogs: pointer(true),
|
||||
Tracing: pointer(true),
|
||||
Metrics: pointer(true),
|
||||
},
|
||||
},
|
||||
},
|
||||
Middlewares: map[string]*dynamic.Middleware{},
|
||||
|
|
|
@ -43,6 +43,9 @@ type Route struct {
|
|||
// Middlewares defines the list of references to Middleware resources.
|
||||
// More info: https://doc.traefik.io/traefik/v3.2/routing/providers/kubernetes-crd/#kind-middleware
|
||||
Middlewares []MiddlewareRef `json:"middlewares,omitempty"`
|
||||
// Observability defines the observability configuration for a router.
|
||||
// More info: https://doc.traefik.io/traefik/v3.2/routing/routers/#observability
|
||||
Observability *dynamic.RouterObservabilityConfig `json:"observability,omitempty"`
|
||||
}
|
||||
|
||||
// TLS holds the TLS configuration.
|
||||
|
|
|
@ -1102,6 +1102,11 @@ func (in *Route) DeepCopyInto(out *Route) {
|
|||
*out = make([]MiddlewareRef, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Observability != nil {
|
||||
in, out := &in.Observability, &out.Observability
|
||||
*out = new(dynamic.RouterObservabilityConfig)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -22,12 +22,13 @@ type RouterConfig struct {
|
|||
|
||||
// RouterIng is the router's configuration from annotations.
|
||||
type RouterIng struct {
|
||||
PathMatcher string `json:"pathMatcher,omitempty"`
|
||||
EntryPoints []string `json:"entryPoints,omitempty"`
|
||||
Middlewares []string `json:"middlewares,omitempty"`
|
||||
Priority int `json:"priority,omitempty"`
|
||||
RuleSyntax string `json:"ruleSyntax,omitempty"`
|
||||
TLS *dynamic.RouterTLSConfig `json:"tls,omitempty" label:"allowEmpty"`
|
||||
PathMatcher string `json:"pathMatcher,omitempty"`
|
||||
EntryPoints []string `json:"entryPoints,omitempty"`
|
||||
Middlewares []string `json:"middlewares,omitempty"`
|
||||
Priority int `json:"priority,omitempty"`
|
||||
RuleSyntax string `json:"ruleSyntax,omitempty"`
|
||||
TLS *dynamic.RouterTLSConfig `json:"tls,omitempty" label:"allowEmpty"`
|
||||
Observability *dynamic.RouterObservabilityConfig `json:"observability,omitempty" label:"allowEmpty"`
|
||||
}
|
||||
|
||||
// SetDefaults sets the default values.
|
||||
|
|
|
@ -18,20 +18,23 @@ func Test_parseRouterConfig(t *testing.T) {
|
|||
{
|
||||
desc: "router annotations",
|
||||
annotations: map[string]string{
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.rulesyntax": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.rulesyntax": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.observability.accessLogs": "true",
|
||||
"traefik.ingress.kubernetes.io/router.observability.metrics": "true",
|
||||
"traefik.ingress.kubernetes.io/router.observability.tracing": "true",
|
||||
},
|
||||
expected: &RouterConfig{
|
||||
Router: &RouterIng{
|
||||
|
@ -54,6 +57,11 @@ func Test_parseRouterConfig(t *testing.T) {
|
|||
},
|
||||
Options: "foobar",
|
||||
},
|
||||
Observability: &dynamic.RouterObservabilityConfig{
|
||||
AccessLogs: pointer(true),
|
||||
Tracing: pointer(true),
|
||||
Metrics: pointer(true),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -182,35 +190,41 @@ func Test_convertAnnotations(t *testing.T) {
|
|||
{
|
||||
desc: "router annotations",
|
||||
annotations: map[string]string{
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.rulesyntax": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.rulesyntax": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.observability.accessLogs": "true",
|
||||
"traefik.ingress.kubernetes.io/router.observability.metrics": "true",
|
||||
"traefik.ingress.kubernetes.io/router.observability.tracing": "true",
|
||||
},
|
||||
expected: map[string]string{
|
||||
"traefik.foo": "bar",
|
||||
"traefik.router.pathmatcher": "foobar",
|
||||
"traefik.router.entrypoints": "foobar,foobar",
|
||||
"traefik.router.middlewares": "foobar,foobar",
|
||||
"traefik.router.priority": "42",
|
||||
"traefik.router.rulesyntax": "foobar",
|
||||
"traefik.router.tls": "true",
|
||||
"traefik.router.tls.certresolver": "foobar",
|
||||
"traefik.router.tls.domains[0].main": "foobar",
|
||||
"traefik.router.tls.domains[0].sans": "foobar,foobar",
|
||||
"traefik.router.tls.domains[1].main": "foobar",
|
||||
"traefik.router.tls.domains[1].sans": "foobar,foobar",
|
||||
"traefik.router.tls.options": "foobar",
|
||||
"traefik.foo": "bar",
|
||||
"traefik.router.pathmatcher": "foobar",
|
||||
"traefik.router.entrypoints": "foobar,foobar",
|
||||
"traefik.router.middlewares": "foobar,foobar",
|
||||
"traefik.router.priority": "42",
|
||||
"traefik.router.rulesyntax": "foobar",
|
||||
"traefik.router.tls": "true",
|
||||
"traefik.router.tls.certresolver": "foobar",
|
||||
"traefik.router.tls.domains[0].main": "foobar",
|
||||
"traefik.router.tls.domains[0].sans": "foobar,foobar",
|
||||
"traefik.router.tls.domains[1].main": "foobar",
|
||||
"traefik.router.tls.domains[1].sans": "foobar,foobar",
|
||||
"traefik.router.tls.options": "foobar",
|
||||
"traefik.router.observability.accessLogs": "true",
|
||||
"traefik.router.observability.metrics": "true",
|
||||
"traefik.router.observability.tracing": "true",
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
|
@ -18,6 +18,9 @@ metadata:
|
|||
traefik.ingress.kubernetes.io/router.tls.domains.1.main: example.com
|
||||
traefik.ingress.kubernetes.io/router.tls.domains.1.sans: one.example.com,two.example.com
|
||||
traefik.ingress.kubernetes.io/router.tls.options: foobar
|
||||
traefik.ingress.kubernetes.io/router.observability.accesslogs: "true"
|
||||
traefik.ingress.kubernetes.io/router.observability.metrics: "true"
|
||||
traefik.ingress.kubernetes.io/router.observability.tracing: "true"
|
||||
|
||||
spec:
|
||||
rules:
|
||||
|
|
|
@ -293,6 +293,7 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl
|
|||
rt.EntryPoints = rtConfig.Router.EntryPoints
|
||||
rt.Middlewares = rtConfig.Router.Middlewares
|
||||
rt.TLS = rtConfig.Router.TLS
|
||||
rt.Observability = rtConfig.Router.Observability
|
||||
}
|
||||
|
||||
p.applyRouterTransform(ctxIngress, rt, ingress)
|
||||
|
@ -619,10 +620,8 @@ func (p *Provider) loadRouter(rule netv1.IngressRule, pa netv1.HTTPIngressPath,
|
|||
rt.Priority = rtConfig.Router.Priority
|
||||
rt.EntryPoints = rtConfig.Router.EntryPoints
|
||||
rt.Middlewares = rtConfig.Router.Middlewares
|
||||
|
||||
if rtConfig.Router.TLS != nil {
|
||||
rt.TLS = rtConfig.Router.TLS
|
||||
}
|
||||
rt.TLS = rtConfig.Router.TLS
|
||||
rt.Observability = rtConfig.Router.Observability
|
||||
}
|
||||
|
||||
var rules []string
|
||||
|
|
|
@ -115,6 +115,11 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
|
|||
},
|
||||
Options: "foobar",
|
||||
},
|
||||
Observability: &dynamic.RouterObservabilityConfig{
|
||||
AccessLogs: pointer(true),
|
||||
Tracing: pointer(true),
|
||||
Metrics: pointer(true),
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: map[string]*dynamic.Service{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue