diff --git a/CHANGELOG.md b/CHANGELOG.md index 689a024df..725b312f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [v2.7.3](https://github.com/traefik/traefik/tree/v2.7.3) (2022-06-29) +[All Commits](https://github.com/traefik/traefik/compare/v2.7.2...v2.7.3) + +**Bug fixes:** +- **[metrics]** Ensure Datadog client is cleanly stopped ([#9137](https://github.com/traefik/traefik/pull/9137) by [jbdoumenjou](https://github.com/jbdoumenjou)) + +**Documentation:** +- **[middleware,k8s/crd]** Add documentation for main, SANs and plugin CRD fields ([#9136](https://github.com/traefik/traefik/pull/9136) by [mloiseleur](https://github.com/mloiseleur)) + ## [v2.8.0-rc2](https://github.com/traefik/traefik/tree/v2.8.0-rc2) (2022-06-27) [All Commits](https://github.com/traefik/traefik/compare/v2.8.0-rc1...v2.8.0-rc2) diff --git a/docs/content/middlewares/http/overview.md b/docs/content/middlewares/http/overview.md index cd358371a..d270ea8c2 100644 --- a/docs/content/middlewares/http/overview.md +++ b/docs/content/middlewares/http/overview.md @@ -153,3 +153,7 @@ http: | [Retry](retry.md) | Automatically retries in case of error | Request lifecycle | | [StripPrefix](stripprefix.md) | Changes the path of the request | Path Modifier | | [StripPrefixRegex](stripprefixregex.md) | Changes the path of the request | Path Modifier | + +## Community Middlewares + +Please take a look at the community-contributed plugins in the [plugin catalog](https://pilot.traefik.io/plugins). diff --git a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml index b804fc422..929fddf7d 100644 --- a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml +++ b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml @@ -204,8 +204,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array @@ -408,8 +411,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array @@ -1300,6 +1306,8 @@ spec: plugin: additionalProperties: x-kubernetes-preserve-unknown-fields: true + description: 'Plugin defines the middleware plugin configuration. + More info: https://doc.traefik.io/traefik/plugins/' type: object rateLimit: description: 'RateLimit holds the rate limit configuration. This middleware diff --git a/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutes.yaml b/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutes.yaml index d79c4539d..b1dbbc4de 100644 --- a/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutes.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutes.yaml @@ -204,8 +204,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array diff --git a/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutetcps.yaml b/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutetcps.yaml index 1be022474..5e83a9bc8 100644 --- a/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutetcps.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.containo.us_ingressroutetcps.yaml @@ -143,8 +143,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array diff --git a/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml b/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml index 58ed8e466..fe4adf111 100644 --- a/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml @@ -729,6 +729,8 @@ spec: plugin: additionalProperties: x-kubernetes-preserve-unknown-fields: true + description: 'Plugin defines the middleware plugin configuration. + More info: https://doc.traefik.io/traefik/plugins/' type: object rateLimit: description: 'RateLimit holds the rate limit configuration. This middleware diff --git a/integration/fixtures/k8s/01-traefik-crd.yml b/integration/fixtures/k8s/01-traefik-crd.yml index b804fc422..929fddf7d 100644 --- a/integration/fixtures/k8s/01-traefik-crd.yml +++ b/integration/fixtures/k8s/01-traefik-crd.yml @@ -204,8 +204,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array @@ -408,8 +411,11 @@ spec: description: Domain holds a domain name with SANs. properties: main: + description: Main defines the main domain name. type: string sans: + description: SANs defines the subject alternative domain + names. items: type: string type: array @@ -1300,6 +1306,8 @@ spec: plugin: additionalProperties: x-kubernetes-preserve-unknown-fields: true + description: 'Plugin defines the middleware plugin configuration. + More info: https://doc.traefik.io/traefik/plugins/' type: object rateLimit: description: 'RateLimit holds the rate limit configuration. This middleware diff --git a/pkg/metrics/datadog.go b/pkg/metrics/datadog.go index 31f8b63eb..62cf9020d 100644 --- a/pkg/metrics/datadog.go +++ b/pkg/metrics/datadog.go @@ -12,8 +12,8 @@ import ( ) var ( - datadogClient *dogstatsd.Dogstatsd - datadogTicker *time.Ticker + datadogClient *dogstatsd.Dogstatsd + datadogLoopCancelFunc context.CancelFunc ) // Metric names consistent with https://github.com/DataDog/integrations-extras/pull/64 @@ -44,6 +44,9 @@ const ( // RegisterDatadog registers the metrics pusher if this didn't happen yet and creates a datadog Registry instance. func RegisterDatadog(ctx context.Context, config *types.Datadog) Registry { + // Ensures there is only one DataDog client sending metrics at any given time. + StopDatadog() + // just to be sure there is a prefix defined if config.Prefix == "" { config.Prefix = defaultMetricsPrefix @@ -54,9 +57,7 @@ func RegisterDatadog(ctx context.Context, config *types.Datadog) Registry { return nil })) - if datadogTicker == nil { - datadogTicker = initDatadogClient(ctx, config) - } + initDatadogClient(ctx, config) registry := &standardRegistry{ configReloadsCounter: datadogClient.NewCounter(ddConfigReloadsName, 1.0), @@ -95,25 +96,26 @@ func RegisterDatadog(ctx context.Context, config *types.Datadog) Registry { return registry } -func initDatadogClient(ctx context.Context, config *types.Datadog) *time.Ticker { +func initDatadogClient(ctx context.Context, config *types.Datadog) { address := config.Address if len(address) == 0 { address = "localhost:8125" } - report := time.NewTicker(time.Duration(config.PushInterval)) + ctx, datadogLoopCancelFunc = context.WithCancel(ctx) safe.Go(func() { - datadogClient.SendLoop(ctx, report.C, "udp", address) + ticker := time.NewTicker(time.Duration(config.PushInterval)) + defer ticker.Stop() + + datadogClient.SendLoop(ctx, ticker.C, "udp", address) }) - - return report } -// StopDatadog stops internal datadogTicker which controls the pushing of metrics to DD Agent and resets it to `nil`. +// StopDatadog stops the Datadog metrics pusher. func StopDatadog() { - if datadogTicker != nil { - datadogTicker.Stop() + if datadogLoopCancelFunc != nil { + datadogLoopCancelFunc() + datadogLoopCancelFunc = nil } - datadogTicker = nil } diff --git a/pkg/provider/kubernetes/crd/traefik/v1alpha1/middleware.go b/pkg/provider/kubernetes/crd/traefik/v1alpha1/middleware.go index 7a80f6d6e..e1c2b680a 100644 --- a/pkg/provider/kubernetes/crd/traefik/v1alpha1/middleware.go +++ b/pkg/provider/kubernetes/crd/traefik/v1alpha1/middleware.go @@ -26,29 +26,31 @@ type Middleware struct { // MiddlewareSpec defines the desired state of a Middleware. type MiddlewareSpec struct { - AddPrefix *dynamic.AddPrefix `json:"addPrefix,omitempty"` - StripPrefix *dynamic.StripPrefix `json:"stripPrefix,omitempty"` - StripPrefixRegex *dynamic.StripPrefixRegex `json:"stripPrefixRegex,omitempty"` - ReplacePath *dynamic.ReplacePath `json:"replacePath,omitempty"` - ReplacePathRegex *dynamic.ReplacePathRegex `json:"replacePathRegex,omitempty"` - Chain *Chain `json:"chain,omitempty"` - IPWhiteList *dynamic.IPWhiteList `json:"ipWhiteList,omitempty"` - Headers *dynamic.Headers `json:"headers,omitempty"` - Errors *ErrorPage `json:"errors,omitempty"` - RateLimit *RateLimit `json:"rateLimit,omitempty"` - RedirectRegex *dynamic.RedirectRegex `json:"redirectRegex,omitempty"` - RedirectScheme *dynamic.RedirectScheme `json:"redirectScheme,omitempty"` - BasicAuth *BasicAuth `json:"basicAuth,omitempty"` - DigestAuth *DigestAuth `json:"digestAuth,omitempty"` - ForwardAuth *ForwardAuth `json:"forwardAuth,omitempty"` - InFlightReq *dynamic.InFlightReq `json:"inFlightReq,omitempty"` - Buffering *dynamic.Buffering `json:"buffering,omitempty"` - CircuitBreaker *CircuitBreaker `json:"circuitBreaker,omitempty"` - Compress *dynamic.Compress `json:"compress,omitempty"` - PassTLSClientCert *dynamic.PassTLSClientCert `json:"passTLSClientCert,omitempty"` - Retry *Retry `json:"retry,omitempty"` - ContentType *dynamic.ContentType `json:"contentType,omitempty"` - Plugin map[string]apiextensionv1.JSON `json:"plugin,omitempty"` + AddPrefix *dynamic.AddPrefix `json:"addPrefix,omitempty"` + StripPrefix *dynamic.StripPrefix `json:"stripPrefix,omitempty"` + StripPrefixRegex *dynamic.StripPrefixRegex `json:"stripPrefixRegex,omitempty"` + ReplacePath *dynamic.ReplacePath `json:"replacePath,omitempty"` + ReplacePathRegex *dynamic.ReplacePathRegex `json:"replacePathRegex,omitempty"` + Chain *Chain `json:"chain,omitempty"` + IPWhiteList *dynamic.IPWhiteList `json:"ipWhiteList,omitempty"` + Headers *dynamic.Headers `json:"headers,omitempty"` + Errors *ErrorPage `json:"errors,omitempty"` + RateLimit *RateLimit `json:"rateLimit,omitempty"` + RedirectRegex *dynamic.RedirectRegex `json:"redirectRegex,omitempty"` + RedirectScheme *dynamic.RedirectScheme `json:"redirectScheme,omitempty"` + BasicAuth *BasicAuth `json:"basicAuth,omitempty"` + DigestAuth *DigestAuth `json:"digestAuth,omitempty"` + ForwardAuth *ForwardAuth `json:"forwardAuth,omitempty"` + InFlightReq *dynamic.InFlightReq `json:"inFlightReq,omitempty"` + Buffering *dynamic.Buffering `json:"buffering,omitempty"` + CircuitBreaker *CircuitBreaker `json:"circuitBreaker,omitempty"` + Compress *dynamic.Compress `json:"compress,omitempty"` + PassTLSClientCert *dynamic.PassTLSClientCert `json:"passTLSClientCert,omitempty"` + Retry *Retry `json:"retry,omitempty"` + ContentType *dynamic.ContentType `json:"contentType,omitempty"` + // Plugin defines the middleware plugin configuration. + // More info: https://doc.traefik.io/traefik/plugins/ + Plugin map[string]apiextensionv1.JSON `json:"plugin,omitempty"` } // +k8s:deepcopy-gen=true diff --git a/pkg/types/domains.go b/pkg/types/domains.go index b13fbbd2f..3d62adb50 100644 --- a/pkg/types/domains.go +++ b/pkg/types/domains.go @@ -8,7 +8,9 @@ import ( // Domain holds a domain name with SANs. type Domain struct { - Main string `description:"Default subject name." json:"main,omitempty" toml:"main,omitempty" yaml:"main,omitempty"` + // Main defines the main domain name. + Main string `description:"Default subject name." json:"main,omitempty" toml:"main,omitempty" yaml:"main,omitempty"` + // SANs defines the subject alternative domain names. SANs []string `description:"Subject alternative names." json:"sans,omitempty" toml:"sans,omitempty" yaml:"sans,omitempty"` } diff --git a/script/gcg/traefik-bugfix.toml b/script/gcg/traefik-bugfix.toml index f941b7419..dec99d1f1 100644 --- a/script/gcg/traefik-bugfix.toml +++ b/script/gcg/traefik-bugfix.toml @@ -4,11 +4,11 @@ RepositoryName = "traefik" OutputType = "file" FileName = "traefik_changelog.md" -# example new bugfix v2.7.2 +# example new bugfix v2.7.3 CurrentRef = "v2.7" -PreviousRef = "v2.7.1" +PreviousRef = "v2.7.2" BaseBranch = "v2.7" -FutureCurrentRefName = "v2.7.2" +FutureCurrentRefName = "v2.7.3" ThresholdPreviousRef = 10 ThresholdCurrentRef = 10