mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-15 16:30:55 +01:00
9e5e514faf
Previously the was a race condition when the background goroutine still could try collecting metrics
from already stopped resources after returning from pushmetrics.Stop().
Now the pushmetrics.Stop() waits until the background goroutine is stopped before returning.
This is a follow-up for https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5549
and the commit fe2d9f6646
.
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5548
62 lines
2.5 KiB
Go
62 lines
2.5 KiB
Go
package pushmetrics
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/appmetrics"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
|
"github.com/VictoriaMetrics/metrics"
|
|
)
|
|
|
|
var (
|
|
pushURL = flagutil.NewArrayString("pushmetrics.url", "Optional URL to push metrics exposed at /metrics page. See https://docs.victoriametrics.com/#push-metrics . "+
|
|
"By default, metrics exposed at /metrics page aren't pushed to any remote storage")
|
|
pushInterval = flag.Duration("pushmetrics.interval", 10*time.Second, "Interval for pushing metrics to every -pushmetrics.url")
|
|
pushExtraLabel = flagutil.NewArrayString("pushmetrics.extraLabel", "Optional labels to add to metrics pushed to every -pushmetrics.url . "+
|
|
`For example, -pushmetrics.extraLabel='instance="foo"' adds instance="foo" label to all the metrics pushed to every -pushmetrics.url`)
|
|
pushHeader = flagutil.NewArrayString("pushmetrics.header", "Optional HTTP request header to send to every -pushmetrics.url . "+
|
|
"For example, -pushmetrics.header='Authorization: Basic foobar' adds 'Authorization: Basic foobar' header to every request to every -pushmetrics.url")
|
|
disableCompression = flag.Bool("pushmetrics.disableCompression", false, "Whether to disable request body compression when pushing metrics to every -pushmetrics.url")
|
|
)
|
|
|
|
func init() {
|
|
// The -pushmetrics.url flag can contain basic auth creds, so it mustn't be visible when exposing the flags.
|
|
flagutil.RegisterSecretFlag("pushmetrics.url")
|
|
}
|
|
|
|
var (
|
|
pushCtx, cancelPushCtx = context.WithCancel(context.Background())
|
|
wgDone sync.WaitGroup
|
|
)
|
|
|
|
// Init must be called after logger.Init
|
|
func Init() {
|
|
extraLabels := strings.Join(*pushExtraLabel, ",")
|
|
for _, pu := range *pushURL {
|
|
opts := &metrics.PushOptions{
|
|
ExtraLabels: extraLabels,
|
|
Headers: *pushHeader,
|
|
DisableCompression: *disableCompression,
|
|
WaitGroup: &wgDone,
|
|
}
|
|
if err := metrics.InitPushExtWithOptions(pushCtx, pu, *pushInterval, appmetrics.WritePrometheusMetrics, opts); err != nil {
|
|
logger.Fatalf("cannot initialize pushmetrics: %s", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Stop stops the periodic push of metrics.
|
|
// It is important to stop the push of metrics before disposing resources
|
|
// these metrics attached to. See related https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5548
|
|
//
|
|
// Stop must be called after Init.
|
|
func Stop() {
|
|
cancelPushCtx()
|
|
wgDone.Wait()
|
|
}
|