DataDog and StatsD Metrics Support
* Added support for DataDog and StatsD monitoring * Added documentation
This commit is contained in:
parent
cd28e7b24f
commit
69c628b626
39 changed files with 3921 additions and 13 deletions
|
@ -437,6 +437,14 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration {
|
|||
Prometheus: &types.Prometheus{
|
||||
Buckets: types.Buckets{0.1, 0.3, 1.2, 5},
|
||||
},
|
||||
Datadog: &types.Datadog{
|
||||
Address: "localhost:8125",
|
||||
PushInterval: "10s",
|
||||
},
|
||||
StatsD: &types.Statsd{
|
||||
Address: "localhost:8125",
|
||||
PushInterval: "10s",
|
||||
},
|
||||
}
|
||||
|
||||
// default Marathon
|
||||
|
|
|
@ -157,6 +157,7 @@ func (server *Server) Close() {
|
|||
os.Exit(1)
|
||||
}
|
||||
}(ctx)
|
||||
stopMetricsClients(server.globalConfiguration)
|
||||
server.stopLeadership()
|
||||
server.routinesPool.Cleanup()
|
||||
close(server.configurationChan)
|
||||
|
@ -198,6 +199,7 @@ func (server *Server) setupServerEntryPoint(newServerEntryPointName string, newS
|
|||
if server.accessLoggerMiddleware != nil {
|
||||
serverMiddlewares = append(serverMiddlewares, server.accessLoggerMiddleware)
|
||||
}
|
||||
initializeMetricsClients(server.globalConfiguration)
|
||||
metrics := newMetrics(server.globalConfiguration, newServerEntryPointName)
|
||||
if metrics != nil {
|
||||
serverMiddlewares = append(serverMiddlewares, middlewares.NewMetricsWrapper(metrics))
|
||||
|
@ -1060,18 +1062,52 @@ func (*Server) configureBackends(backends map[string]*types.Backend) {
|
|||
// Note that given there is no metrics instrumentation configured, it will return nil.
|
||||
func newMetrics(globalConfig GlobalConfiguration, name string) middlewares.Metrics {
|
||||
metricsEnabled := globalConfig.Web != nil && globalConfig.Web.Metrics != nil
|
||||
if metricsEnabled && globalConfig.Web.Metrics.Prometheus != nil {
|
||||
metrics, _, err := middlewares.NewPrometheus(name, globalConfig.Web.Metrics.Prometheus)
|
||||
if err != nil {
|
||||
log.Errorf("Error creating Prometheus Metrics implementation: %s", err)
|
||||
return nil
|
||||
if metricsEnabled {
|
||||
// Create MultiMetric
|
||||
metrics := []middlewares.Metrics{}
|
||||
|
||||
if globalConfig.Web.Metrics.Prometheus != nil {
|
||||
metric, _, err := middlewares.NewPrometheus(name, globalConfig.Web.Metrics.Prometheus)
|
||||
if err != nil {
|
||||
log.Errorf("Error creating Prometheus metrics implementation: %s", err)
|
||||
}
|
||||
log.Debug("Configured Prometheus metrics")
|
||||
metrics = append(metrics, metric)
|
||||
}
|
||||
return metrics
|
||||
if globalConfig.Web.Metrics.Datadog != nil {
|
||||
metric := middlewares.NewDataDog(name)
|
||||
log.Debugf("Configured DataDog metrics pushing to %s once every %s", globalConfig.Web.Metrics.Datadog.Address, globalConfig.Web.Metrics.Datadog.PushInterval)
|
||||
metrics = append(metrics, metric)
|
||||
}
|
||||
if globalConfig.Web.Metrics.StatsD != nil {
|
||||
metric := middlewares.NewStatsD(name)
|
||||
log.Debugf("Configured StatsD metrics pushing to %s once every %s", globalConfig.Web.Metrics.StatsD.Address, globalConfig.Web.Metrics.StatsD.PushInterval)
|
||||
metrics = append(metrics, metric)
|
||||
}
|
||||
|
||||
return middlewares.NewMultiMetrics(metrics)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func initializeMetricsClients(globalConfig GlobalConfiguration) {
|
||||
metricsEnabled := globalConfig.Web != nil && globalConfig.Web.Metrics != nil
|
||||
if metricsEnabled {
|
||||
if globalConfig.Web.Metrics.Datadog != nil {
|
||||
middlewares.InitDatadogClient(globalConfig.Web.Metrics.Datadog)
|
||||
}
|
||||
if globalConfig.Web.Metrics.StatsD != nil {
|
||||
middlewares.InitStatsdClient(globalConfig.Web.Metrics.StatsD)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func stopMetricsClients(globalConfig GlobalConfiguration) {
|
||||
middlewares.StopDatadogClient()
|
||||
middlewares.StopStatsdClient()
|
||||
}
|
||||
|
||||
func registerRetryMiddleware(
|
||||
httpHandler http.Handler,
|
||||
globalConfig GlobalConfiguration,
|
||||
|
|
|
@ -443,8 +443,8 @@ func TestNewMetrics(t *testing.T) {
|
|||
|
||||
metricsImpl := newMetrics(tc.globalConfig, "test1")
|
||||
if metricsImpl != nil {
|
||||
if _, ok := metricsImpl.(*middlewares.Prometheus); !ok {
|
||||
t.Errorf("invalid metricsImpl type, got %T want %T", metricsImpl, &middlewares.Prometheus{})
|
||||
if _, ok := metricsImpl.(*middlewares.MultiMetrics); !ok {
|
||||
t.Errorf("invalid metricsImpl type, got %T want %T", metricsImpl, &middlewares.MultiMetrics{})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue