Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/receiver/prometheus/prometheus.go
4096 views
1
// Package prometheus provides an otelcol.receiver.prometheus component.
2
package prometheus
3
4
import (
5
"context"
6
"os"
7
"regexp"
8
"sync"
9
"time"
10
11
"github.com/go-kit/log"
12
"github.com/grafana/agent/component"
13
"github.com/grafana/agent/component/otelcol"
14
"github.com/grafana/agent/component/otelcol/internal/fanoutconsumer"
15
"github.com/grafana/agent/component/otelcol/receiver/prometheus/internal"
16
"github.com/grafana/agent/pkg/build"
17
"github.com/grafana/agent/pkg/util/zapadapter"
18
"github.com/prometheus/prometheus/model/labels"
19
"github.com/prometheus/prometheus/storage"
20
otelcomponent "go.opentelemetry.io/collector/component"
21
otelconfig "go.opentelemetry.io/collector/config"
22
"go.opentelemetry.io/otel/metric"
23
"go.opentelemetry.io/otel/trace"
24
)
25
26
func init() {
27
component.Register(component.Registration{
28
Name: "otelcol.receiver.prometheus",
29
Args: Arguments{},
30
Exports: Exports{},
31
32
Build: func(o component.Options, a component.Arguments) (component.Component, error) {
33
return NewComponent(o, a.(Arguments))
34
},
35
})
36
}
37
38
// Arguments configures the otelcol.receiver.prometheus component.
39
type Arguments struct {
40
// Output configures where to send received data. Required.
41
Output *otelcol.ConsumerArguments `river:"output,block"`
42
}
43
44
// Exports are the set of fields exposed by the otelcol.receiver.prometheus
45
// component.
46
type Exports struct {
47
Receiver storage.Appendable `river:"receiver,attr"`
48
}
49
50
// Component is the otelcol.receiver.prometheus component.
51
type Component struct {
52
log log.Logger
53
opts component.Options
54
55
mut sync.RWMutex
56
cfg Arguments
57
appendable storage.Appendable
58
}
59
60
var _ component.Component = (*Component)(nil)
61
62
// NewComponent creates a new otelcol.receiver.prometheus component.
63
func NewComponent(o component.Options, c Arguments) (*Component, error) {
64
res := &Component{
65
log: o.Logger,
66
opts: o,
67
}
68
69
if err := res.Update(c); err != nil {
70
return nil, err
71
}
72
return res, nil
73
}
74
75
// Run implements Component.
76
func (c *Component) Run(ctx context.Context) error {
77
<-ctx.Done()
78
return nil
79
}
80
81
// Update implements Component.
82
func (c *Component) Update(newConfig component.Arguments) error {
83
c.mut.Lock()
84
defer c.mut.Unlock()
85
86
cfg := newConfig.(Arguments)
87
c.cfg = cfg
88
89
// useStartTimeMetric is used to configure the 'metrics adjuster' in the
90
// prometheusreceiver which is applied whenever a Commit is called.
91
// If set to true, the receiver will utilize a `startTimeMetricAdjuster`
92
// to adjust metric start times based on a start time metric. The start
93
// time metric defaults to `process_start_time_seconds`, but can be
94
// overridden by using this regex.
95
//
96
// gcInterval should be at least as long as the longest scrape interval
97
// used by the upstream scrape configs, plus a delta to avoid race
98
// conditions so that jobs are not getting GC'ed between scrapes.
99
var (
100
useStartTimeMetric = false
101
startTimeMetricRegex *regexp.Regexp
102
103
gcInterval = 5 * time.Minute
104
)
105
settings := otelcomponent.ReceiverCreateSettings{
106
TelemetrySettings: otelcomponent.TelemetrySettings{
107
Logger: zapadapter.New(c.opts.Logger),
108
109
// TODO(tpaschalis): expose tracing and logging statistics.
110
TracerProvider: trace.NewNoopTracerProvider(),
111
MeterProvider: metric.NewNoopMeterProvider(),
112
},
113
114
BuildInfo: otelcomponent.BuildInfo{
115
Command: os.Args[0],
116
Description: "Grafana Agent",
117
Version: build.Version,
118
},
119
}
120
metricsSink := fanoutconsumer.Metrics(cfg.Output.Metrics)
121
122
appendable := internal.NewAppendable(
123
metricsSink,
124
settings,
125
gcInterval,
126
useStartTimeMetric,
127
startTimeMetricRegex,
128
otelconfig.NewComponentID(otelconfig.Type(c.opts.ID)),
129
labels.Labels{},
130
)
131
c.appendable = appendable
132
133
// Export the receiver.
134
c.opts.OnStateChange(Exports{Receiver: c.appendable})
135
136
return nil
137
}
138
139