Path: blob/main/component/discovery/relabel/relabel.go
4096 views
package relabel12import (3"context"4"sync"56"github.com/grafana/agent/component"7flow_relabel "github.com/grafana/agent/component/common/relabel"8"github.com/grafana/agent/component/discovery"9"github.com/prometheus/prometheus/model/labels"10"github.com/prometheus/prometheus/model/relabel"11)1213func init() {14component.Register(component.Registration{15Name: "discovery.relabel",16Args: Arguments{},17Exports: Exports{},1819Build: func(opts component.Options, args component.Arguments) (component.Component, error) {20return New(opts, args.(Arguments))21},22})23}2425// Arguments holds values which are used to configure the discovery.relabel component.26type Arguments struct {27// Targets contains the input 'targets' passed by a service discovery component.28Targets []discovery.Target `river:"targets,attr"`2930// The relabelling rules to apply to each target's label set.31RelabelConfigs []*flow_relabel.Config `river:"rule,block,optional"`32}3334// Exports holds values which are exported by the discovery.relabel component.35type Exports struct {36Output []discovery.Target `river:"output,attr"`37Rules flow_relabel.Rules `river:"rules,attr"`38}3940// Component implements the discovery.relabel component.41type Component struct {42opts component.Options4344mut sync.RWMutex45rcs []*relabel.Config46}4748var _ component.Component = (*Component)(nil)4950// New creates a new discovery.relabel component.51func New(o component.Options, args Arguments) (*Component, error) {52c := &Component{opts: o}5354// Call to Update() to set the output once at the start55if err := c.Update(args); err != nil {56return nil, err57}5859return c, nil60}6162// Run implements component.Component.63func (c *Component) Run(ctx context.Context) error {64<-ctx.Done()65return nil66}6768// Update implements component.Component.69func (c *Component) Update(args component.Arguments) error {70c.mut.Lock()71defer c.mut.Unlock()7273newArgs := args.(Arguments)7475targets := make([]discovery.Target, 0, len(newArgs.Targets))76relabelConfigs := flow_relabel.ComponentToPromRelabelConfigs(newArgs.RelabelConfigs)77c.rcs = relabelConfigs7879for _, t := range newArgs.Targets {80lset := componentMapToPromLabels(t)81lset, keep := relabel.Process(lset, relabelConfigs...)82if keep {83targets = append(targets, promLabelsToComponent(lset))84}85}8687c.opts.OnStateChange(Exports{88Output: targets,89Rules: newArgs.RelabelConfigs,90})9192return nil93}9495func componentMapToPromLabels(ls discovery.Target) labels.Labels {96res := make([]labels.Label, 0, len(ls))97for k, v := range ls {98res = append(res, labels.Label{Name: k, Value: v})99}100101return res102}103104func promLabelsToComponent(ls labels.Labels) discovery.Target {105res := make(map[string]string, len(ls))106for _, l := range ls {107res[l.Name] = l.Value108}109110return res111}112113114