diff --git a/contrib/database/sql/metrics.go b/contrib/database/sql/metrics.go index d8ff4ed266..10a4b18566 100644 --- a/contrib/database/sql/metrics.go +++ b/contrib/database/sql/metrics.go @@ -10,6 +10,7 @@ import ( "time" "gopkg.in/DataDog/dd-trace-go.v1/internal" + "gopkg.in/DataDog/dd-trace-go.v1/internal/contribroutines" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" "gopkg.in/DataDog/dd-trace-go.v1/internal/log" ) @@ -35,18 +36,26 @@ var interval = 10 * time.Second // the caller should always ensure that db & statsd are non-nil func pollDBStats(statsd internal.StatsdClient, db *sql.DB) { log.Debug("DB stats will be gathered and sent every %v.", interval) - for range time.NewTicker(interval).C { - log.Debug("Reporting DB.Stats metrics...") - stat := db.Stats() - statsd.Gauge(MaxOpenConnections, float64(stat.MaxOpenConnections), []string{}, 1) - statsd.Gauge(OpenConnections, float64(stat.OpenConnections), []string{}, 1) - statsd.Gauge(InUse, float64(stat.InUse), []string{}, 1) - statsd.Gauge(Idle, float64(stat.Idle), []string{}, 1) - statsd.Gauge(WaitCount, float64(stat.WaitCount), []string{}, 1) - statsd.Timing(WaitDuration, stat.WaitDuration, []string{}, 1) - statsd.Gauge(MaxIdleClosed, float64(stat.MaxIdleClosed), []string{}, 1) - statsd.Gauge(MaxIdleTimeClosed, float64(stat.MaxIdleTimeClosed), []string{}, 1) - statsd.Gauge(MaxLifetimeClosed, float64(stat.MaxLifetimeClosed), []string{}, 1) + stop := contribroutines.GetStopChan() + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + log.Debug("Reporting DB.Stats metrics...") + stat := db.Stats() + statsd.Gauge(MaxOpenConnections, float64(stat.MaxOpenConnections), []string{}, 1) + statsd.Gauge(OpenConnections, float64(stat.OpenConnections), []string{}, 1) + statsd.Gauge(InUse, float64(stat.InUse), []string{}, 1) + statsd.Gauge(Idle, float64(stat.Idle), []string{}, 1) + statsd.Gauge(WaitCount, float64(stat.WaitCount), []string{}, 1) + statsd.Timing(WaitDuration, stat.WaitDuration, []string{}, 1) + statsd.Gauge(MaxIdleClosed, float64(stat.MaxIdleClosed), []string{}, 1) + statsd.Gauge(MaxIdleTimeClosed, float64(stat.MaxIdleTimeClosed), []string{}, 1) + statsd.Gauge(MaxLifetimeClosed, float64(stat.MaxLifetimeClosed), []string{}, 1) + case <-stop: + return + } } } diff --git a/ddtrace/tracer/tracer.go b/ddtrace/tracer/tracer.go index 89277045de..ad9263be32 100644 --- a/ddtrace/tracer/tracer.go +++ b/ddtrace/tracer/tracer.go @@ -24,6 +24,7 @@ import ( globalinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" appsecConfig "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" + "gopkg.in/DataDog/dd-trace-go.v1/internal/contribroutines" "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname" "gopkg.in/DataDog/dd-trace-go.v1/internal/log" @@ -710,6 +711,7 @@ func (t *tracer) Stop() { if t.logFile != nil { t.logFile.Close() } + contribroutines.Stop() } // Inject uses the configured or default TextMap Propagator. diff --git a/internal/contribroutines/contribroutines.go b/internal/contribroutines/contribroutines.go new file mode 100644 index 0000000000..423718e23c --- /dev/null +++ b/internal/contribroutines/contribroutines.go @@ -0,0 +1,11 @@ +package contribroutines + +var stop chan struct{} + +func Stop() { + close(stop) +} + +func GetStopChan() chan struct{} { + return stop +}