53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
|
package metrics
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// PushConfig is config for pushing registered metrics to the given URL with the given Interval.
|
||
|
//
|
||
|
// URL and Interval are required fields
|
||
|
type PushConfig struct {
|
||
|
// URL defines URL where metrics would be pushed.
|
||
|
URL string
|
||
|
// Interval determines the frequency of pushing metrics.
|
||
|
Interval time.Duration
|
||
|
|
||
|
// Headers contain optional http request Headers
|
||
|
Headers http.Header
|
||
|
// ExtraLabels may contain comma-separated list of `label="value"` labels, which will be added
|
||
|
// to all the metrics before pushing them to URL.
|
||
|
ExtraLabels string
|
||
|
// WriteMetricsFn is a callback to write metrics to w in Prometheus text exposition format without timestamps and trailing comments.
|
||
|
// See https://github.com/prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#text-based-format
|
||
|
WriteMetricsFn func(w io.Writer)
|
||
|
|
||
|
pushURL *url.URL
|
||
|
}
|
||
|
|
||
|
// Validate validates correctness of PushConfig fields
|
||
|
func (pc *PushConfig) Validate() error {
|
||
|
if pc.Interval <= 0 {
|
||
|
return fmt.Errorf("invalid Interval=%s: must be positive", pc.Interval)
|
||
|
}
|
||
|
if err := validateTags(pc.ExtraLabels); err != nil {
|
||
|
return fmt.Errorf("invalid ExtraLabels=%q: %w", pc.ExtraLabels, err)
|
||
|
}
|
||
|
pu, err := url.Parse(pc.URL)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("cannot parse URL=%q: %w", pc.URL, err)
|
||
|
}
|
||
|
if pu.Scheme != "http" && pu.Scheme != "https" {
|
||
|
return fmt.Errorf("unsupported scheme in URL=%q; expecting 'http' or 'https'", pc.URL)
|
||
|
}
|
||
|
if pu.Host == "" {
|
||
|
return fmt.Errorf("missing host in URL=%q", pc.URL)
|
||
|
}
|
||
|
pc.pushURL = pu
|
||
|
return nil
|
||
|
}
|