Path: blob/main/component/otelcol/receiver/prometheus/prometheus.go
4096 views
// Package prometheus provides an otelcol.receiver.prometheus component.1package prometheus23import (4"context"5"os"6"regexp"7"sync"8"time"910"github.com/go-kit/log"11"github.com/grafana/agent/component"12"github.com/grafana/agent/component/otelcol"13"github.com/grafana/agent/component/otelcol/internal/fanoutconsumer"14"github.com/grafana/agent/component/otelcol/receiver/prometheus/internal"15"github.com/grafana/agent/pkg/build"16"github.com/grafana/agent/pkg/util/zapadapter"17"github.com/prometheus/prometheus/model/labels"18"github.com/prometheus/prometheus/storage"19otelcomponent "go.opentelemetry.io/collector/component"20otelconfig "go.opentelemetry.io/collector/config"21"go.opentelemetry.io/otel/metric"22"go.opentelemetry.io/otel/trace"23)2425func init() {26component.Register(component.Registration{27Name: "otelcol.receiver.prometheus",28Args: Arguments{},29Exports: Exports{},3031Build: func(o component.Options, a component.Arguments) (component.Component, error) {32return NewComponent(o, a.(Arguments))33},34})35}3637// Arguments configures the otelcol.receiver.prometheus component.38type Arguments struct {39// Output configures where to send received data. Required.40Output *otelcol.ConsumerArguments `river:"output,block"`41}4243// Exports are the set of fields exposed by the otelcol.receiver.prometheus44// component.45type Exports struct {46Receiver storage.Appendable `river:"receiver,attr"`47}4849// Component is the otelcol.receiver.prometheus component.50type Component struct {51log log.Logger52opts component.Options5354mut sync.RWMutex55cfg Arguments56appendable storage.Appendable57}5859var _ component.Component = (*Component)(nil)6061// NewComponent creates a new otelcol.receiver.prometheus component.62func NewComponent(o component.Options, c Arguments) (*Component, error) {63res := &Component{64log: o.Logger,65opts: o,66}6768if err := res.Update(c); err != nil {69return nil, err70}71return res, nil72}7374// Run implements Component.75func (c *Component) Run(ctx context.Context) error {76<-ctx.Done()77return nil78}7980// Update implements Component.81func (c *Component) Update(newConfig component.Arguments) error {82c.mut.Lock()83defer c.mut.Unlock()8485cfg := newConfig.(Arguments)86c.cfg = cfg8788// useStartTimeMetric is used to configure the 'metrics adjuster' in the89// prometheusreceiver which is applied whenever a Commit is called.90// If set to true, the receiver will utilize a `startTimeMetricAdjuster`91// to adjust metric start times based on a start time metric. The start92// time metric defaults to `process_start_time_seconds`, but can be93// overridden by using this regex.94//95// gcInterval should be at least as long as the longest scrape interval96// used by the upstream scrape configs, plus a delta to avoid race97// conditions so that jobs are not getting GC'ed between scrapes.98var (99useStartTimeMetric = false100startTimeMetricRegex *regexp.Regexp101102gcInterval = 5 * time.Minute103)104settings := otelcomponent.ReceiverCreateSettings{105TelemetrySettings: otelcomponent.TelemetrySettings{106Logger: zapadapter.New(c.opts.Logger),107108// TODO(tpaschalis): expose tracing and logging statistics.109TracerProvider: trace.NewNoopTracerProvider(),110MeterProvider: metric.NewNoopMeterProvider(),111},112113BuildInfo: otelcomponent.BuildInfo{114Command: os.Args[0],115Description: "Grafana Agent",116Version: build.Version,117},118}119metricsSink := fanoutconsumer.Metrics(cfg.Output.Metrics)120121appendable := internal.NewAppendable(122metricsSink,123settings,124gcInterval,125useStartTimeMetric,126startTimeMetricRegex,127otelconfig.NewComponentID(otelconfig.Type(c.opts.ID)),128labels.Labels{},129)130c.appendable = appendable131132// Export the receiver.133c.opts.OnStateChange(Exports{Receiver: c.appendable})134135return nil136}137138139