Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/discovery/relabel/relabel.go
4096 views
1
package relabel
2
3
import (
4
"context"
5
"sync"
6
7
"github.com/grafana/agent/component"
8
flow_relabel "github.com/grafana/agent/component/common/relabel"
9
"github.com/grafana/agent/component/discovery"
10
"github.com/prometheus/prometheus/model/labels"
11
"github.com/prometheus/prometheus/model/relabel"
12
)
13
14
func init() {
15
component.Register(component.Registration{
16
Name: "discovery.relabel",
17
Args: Arguments{},
18
Exports: Exports{},
19
20
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
21
return New(opts, args.(Arguments))
22
},
23
})
24
}
25
26
// Arguments holds values which are used to configure the discovery.relabel component.
27
type Arguments struct {
28
// Targets contains the input 'targets' passed by a service discovery component.
29
Targets []discovery.Target `river:"targets,attr"`
30
31
// The relabelling rules to apply to each target's label set.
32
RelabelConfigs []*flow_relabel.Config `river:"rule,block,optional"`
33
}
34
35
// Exports holds values which are exported by the discovery.relabel component.
36
type Exports struct {
37
Output []discovery.Target `river:"output,attr"`
38
Rules flow_relabel.Rules `river:"rules,attr"`
39
}
40
41
// Component implements the discovery.relabel component.
42
type Component struct {
43
opts component.Options
44
45
mut sync.RWMutex
46
rcs []*relabel.Config
47
}
48
49
var _ component.Component = (*Component)(nil)
50
51
// New creates a new discovery.relabel component.
52
func New(o component.Options, args Arguments) (*Component, error) {
53
c := &Component{opts: o}
54
55
// Call to Update() to set the output once at the start
56
if err := c.Update(args); err != nil {
57
return nil, err
58
}
59
60
return c, nil
61
}
62
63
// Run implements component.Component.
64
func (c *Component) Run(ctx context.Context) error {
65
<-ctx.Done()
66
return nil
67
}
68
69
// Update implements component.Component.
70
func (c *Component) Update(args component.Arguments) error {
71
c.mut.Lock()
72
defer c.mut.Unlock()
73
74
newArgs := args.(Arguments)
75
76
targets := make([]discovery.Target, 0, len(newArgs.Targets))
77
relabelConfigs := flow_relabel.ComponentToPromRelabelConfigs(newArgs.RelabelConfigs)
78
c.rcs = relabelConfigs
79
80
for _, t := range newArgs.Targets {
81
lset := componentMapToPromLabels(t)
82
lset, keep := relabel.Process(lset, relabelConfigs...)
83
if keep {
84
targets = append(targets, promLabelsToComponent(lset))
85
}
86
}
87
88
c.opts.OnStateChange(Exports{
89
Output: targets,
90
Rules: newArgs.RelabelConfigs,
91
})
92
93
return nil
94
}
95
96
func componentMapToPromLabels(ls discovery.Target) labels.Labels {
97
res := make([]labels.Label, 0, len(ls))
98
for k, v := range ls {
99
res = append(res, labels.Label{Name: k, Value: v})
100
}
101
102
return res
103
}
104
105
func promLabelsToComponent(ls labels.Labels) discovery.Target {
106
res := make(map[string]string, len(ls))
107
for _, l := range ls {
108
res[l.Name] = l.Value
109
}
110
111
return res
112
}
113
114