Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/exporter/blackbox/blackbox.go
4096 views
1
package blackbox
2
3
import (
4
"errors"
5
"fmt"
6
"time"
7
8
blackbox_config "github.com/prometheus/blackbox_exporter/config"
9
"gopkg.in/yaml.v2"
10
11
"github.com/grafana/agent/component"
12
"github.com/grafana/agent/component/discovery"
13
"github.com/grafana/agent/component/prometheus/exporter"
14
"github.com/grafana/agent/pkg/integrations"
15
"github.com/grafana/agent/pkg/integrations/blackbox_exporter"
16
)
17
18
func init() {
19
component.Register(component.Registration{
20
Name: "prometheus.exporter.blackbox",
21
Args: Arguments{},
22
Exports: exporter.Exports{},
23
Build: exporter.NewMultiTarget(createExporter, "blackbox", buildBlackboxTargets),
24
})
25
}
26
27
func createExporter(opts component.Options, args component.Arguments) (integrations.Integration, error) {
28
a := args.(Arguments)
29
return a.Convert().NewIntegration(opts.Logger)
30
}
31
32
// buildBlackboxTargets creates the exporter's discovery targets based on the defined blackbox targets.
33
func buildBlackboxTargets(baseTarget discovery.Target, args component.Arguments) []discovery.Target {
34
var targets []discovery.Target
35
36
a := args.(Arguments)
37
for _, tgt := range a.Targets {
38
target := make(discovery.Target)
39
for k, v := range baseTarget {
40
target[k] = v
41
}
42
43
target["job"] = target["job"] + "/" + tgt.Name
44
target["__param_target"] = tgt.Target
45
if tgt.Module != "" {
46
target["__param_module"] = tgt.Module
47
}
48
49
targets = append(targets, target)
50
}
51
52
return targets
53
}
54
55
// DefaultArguments holds non-zero default options for Arguments when it is
56
// unmarshaled from river.
57
var DefaultArguments = Arguments{
58
ProbeTimeoutOffset: 500 * time.Millisecond,
59
}
60
61
// BlackboxTarget defines a target to be used by the exporter.
62
type BlackboxTarget struct {
63
Name string `river:",label"`
64
Target string `river:"address,attr"`
65
Module string `river:"module,attr,optional"`
66
}
67
68
type TargetBlock []BlackboxTarget
69
70
// Convert converts the component's TargetBlock to a slice of integration's BlackboxTarget.
71
func (t TargetBlock) Convert() []blackbox_exporter.BlackboxTarget {
72
targets := make([]blackbox_exporter.BlackboxTarget, 0, len(t))
73
for _, target := range t {
74
targets = append(targets, blackbox_exporter.BlackboxTarget{
75
Name: target.Name,
76
Target: target.Target,
77
Module: target.Module,
78
})
79
}
80
return targets
81
}
82
83
type Arguments struct {
84
ConfigFile string `river:"config_file,attr,optional"`
85
Config string `river:"config,attr,optional"`
86
Targets TargetBlock `river:"target,block"`
87
ProbeTimeoutOffset time.Duration `river:"probe_timeout_offset,attr,optional"`
88
ConfigStruct blackbox_config.Config
89
}
90
91
// UnmarshalRiver implements River unmarshalling for Arguments.
92
func (a *Arguments) UnmarshalRiver(f func(interface{}) error) error {
93
*a = DefaultArguments
94
95
type args Arguments
96
if err := f((*args)(a)); err != nil {
97
return err
98
}
99
100
if a.ConfigFile != "" && a.Config != "" {
101
return errors.New("config and config_file are mutually exclusive")
102
}
103
104
err := yaml.UnmarshalStrict([]byte(a.Config), &a.ConfigStruct)
105
if err != nil {
106
return fmt.Errorf("invalid backbox_exporter config: %s", err)
107
}
108
109
return nil
110
}
111
112
// Convert converts the component's Arguments to the integration's Config.
113
func (a *Arguments) Convert() *blackbox_exporter.Config {
114
return &blackbox_exporter.Config{
115
BlackboxConfigFile: a.ConfigFile,
116
BlackboxConfig: a.ConfigStruct,
117
BlackboxTargets: a.Targets.Convert(),
118
ProbeTimeoutOffset: a.ProbeTimeoutOffset.Seconds(),
119
}
120
}
121
122