2019-11-14 15:40:05 +00:00
package middleware
import (
"context"
"github.com/containous/alice"
2020-09-16 13:46:04 +00:00
"github.com/traefik/traefik/v2/pkg/log"
"github.com/traefik/traefik/v2/pkg/metrics"
"github.com/traefik/traefik/v2/pkg/middlewares/accesslog"
2022-09-12 15:10:09 +00:00
"github.com/traefik/traefik/v2/pkg/middlewares/capture"
2020-09-16 13:46:04 +00:00
metricsmiddleware "github.com/traefik/traefik/v2/pkg/middlewares/metrics"
mTracing "github.com/traefik/traefik/v2/pkg/middlewares/tracing"
"github.com/traefik/traefik/v2/pkg/tracing"
2019-11-14 15:40:05 +00:00
)
// ChainBuilder Creates a middleware chain by entry point. It is used for middlewares that are created almost systematically and that need to be created before all others.
type ChainBuilder struct {
metricsRegistry metrics . Registry
accessLoggerMiddleware * accesslog . Handler
tracer * tracing . Tracing
}
// NewChainBuilder Creates a new ChainBuilder.
2022-10-27 14:08:06 +00:00
func NewChainBuilder ( metricsRegistry metrics . Registry , accessLoggerMiddleware * accesslog . Handler , tracer * tracing . Tracing ) * ChainBuilder {
2019-11-14 15:40:05 +00:00
return & ChainBuilder {
metricsRegistry : metricsRegistry ,
accessLoggerMiddleware : accessLoggerMiddleware ,
2022-09-12 15:10:09 +00:00
tracer : tracer ,
2019-11-14 15:40:05 +00:00
}
}
// Build a middleware chain by entry point.
func ( c * ChainBuilder ) Build ( ctx context . Context , entryPointName string ) alice . Chain {
chain := alice . New ( )
2022-10-27 14:08:06 +00:00
if c . accessLoggerMiddleware != nil || c . metricsRegistry != nil && ( c . metricsRegistry . IsEpEnabled ( ) || c . metricsRegistry . IsRouterEnabled ( ) || c . metricsRegistry . IsSvcEnabled ( ) ) {
chain = chain . Append ( capture . Wrap )
2022-09-12 15:10:09 +00:00
}
2019-11-14 15:40:05 +00:00
if c . accessLoggerMiddleware != nil {
chain = chain . Append ( accesslog . WrapHandler ( c . accessLoggerMiddleware ) )
}
if c . tracer != nil {
chain = chain . Append ( mTracing . WrapEntryPointHandler ( ctx , c . tracer , entryPointName ) )
}
if c . metricsRegistry != nil && c . metricsRegistry . IsEpEnabled ( ) {
chain = chain . Append ( metricsmiddleware . WrapEntryPointHandler ( ctx , c . metricsRegistry , entryPointName ) )
}
2022-02-14 16:18:08 +00:00
return chain
2019-11-14 15:40:05 +00:00
}
// Close accessLogger and tracer.
func ( c * ChainBuilder ) Close ( ) {
if c . accessLoggerMiddleware != nil {
if err := c . accessLoggerMiddleware . Close ( ) ; err != nil {
log . WithoutContext ( ) . Errorf ( "Could not close the access log file: %s" , err )
}
}
if c . tracer != nil {
c . tracer . Close ( )
}
}