Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/exporter/blackbox/blackbox_test.go
4096 views
1
package blackbox
2
3
import (
4
"testing"
5
"time"
6
7
"github.com/grafana/agent/component"
8
"github.com/grafana/agent/component/discovery"
9
"github.com/grafana/agent/pkg/river"
10
"github.com/prometheus/common/model"
11
"github.com/stretchr/testify/require"
12
)
13
14
func TestUnmarshalRiver(t *testing.T) {
15
riverCfg := `
16
config_file = "modules.yml"
17
target "target_a" {
18
address = "http://example.com"
19
module = "http_2xx"
20
}
21
target "target_b" {
22
address = "http://grafana.com"
23
module = "http_2xx"
24
}
25
probe_timeout_offset = "0.5s"
26
`
27
var args Arguments
28
err := river.Unmarshal([]byte(riverCfg), &args)
29
require.NoError(t, err)
30
require.Equal(t, "modules.yml", args.ConfigFile)
31
require.Equal(t, 2, len(args.Targets))
32
require.Equal(t, 500*time.Millisecond, args.ProbeTimeoutOffset)
33
require.Contains(t, "target_a", args.Targets[0].Name)
34
require.Contains(t, "http://example.com", args.Targets[0].Target)
35
require.Contains(t, "http_2xx", args.Targets[0].Module)
36
require.Contains(t, "target_b", args.Targets[1].Name)
37
require.Contains(t, "http://grafana.com", args.Targets[1].Target)
38
require.Contains(t, "http_2xx", args.Targets[1].Module)
39
}
40
41
func TestUnmarshalRiverWithInlineConfig(t *testing.T) {
42
riverCfg := `
43
config = "{ modules: { http_2xx: { prober: http, timeout: 5s } } }"
44
45
target "target_a" {
46
address = "http://example.com"
47
module = "http_2xx"
48
}
49
target "target_b" {
50
address = "http://grafana.com"
51
module = "http_2xx"
52
}
53
probe_timeout_offset = "0.5s"
54
`
55
var args Arguments
56
err := river.Unmarshal([]byte(riverCfg), &args)
57
require.NoError(t, err)
58
require.Equal(t, "", args.ConfigFile)
59
require.Equal(t, args.ConfigStruct.Modules["http_2xx"].Prober, "http")
60
require.Equal(t, args.ConfigStruct.Modules["http_2xx"].Timeout, 5*time.Second)
61
require.Equal(t, 2, len(args.Targets))
62
require.Equal(t, 500*time.Millisecond, args.ProbeTimeoutOffset)
63
require.Contains(t, "target_a", args.Targets[0].Name)
64
require.Contains(t, "http://example.com", args.Targets[0].Target)
65
require.Contains(t, "http_2xx", args.Targets[0].Module)
66
require.Contains(t, "target_b", args.Targets[1].Name)
67
require.Contains(t, "http://grafana.com", args.Targets[1].Target)
68
require.Contains(t, "http_2xx", args.Targets[1].Module)
69
}
70
func TestUnmarshalRiverWithInvalidInlineConfig(t *testing.T) {
71
var tests = []struct {
72
testname string
73
cfg string
74
expectedError string
75
}{
76
{
77
"Invalid YAML",
78
`
79
config = "{ modules: { http_2xx: { prober: http, timeout: 5s }"
80
81
target "target_a" {
82
address = "http://example.com"
83
module = "http_2xx"
84
}
85
`,
86
`invalid backbox_exporter config: yaml: line 1: did not find expected ',' or '}'`,
87
},
88
{
89
"Invalid property",
90
`
91
config = "{ module: { http_2xx: { prober: http, timeout: 5s } } }"
92
93
target "target_a" {
94
address = "http://example.com"
95
module = "http_2xx"
96
}
97
`,
98
"invalid backbox_exporter config: yaml: unmarshal errors:\n line 1: field module not found in type config.plain",
99
},
100
{
101
"Define config and config_file",
102
`
103
config_file = "config"
104
config = "{ modules: { http_2xx: { prober: http, timeout: 5s } } }"
105
106
target "target_a" {
107
address = "http://example.com"
108
module = "http_2xx"
109
}
110
`,
111
`config and config_file are mutually exclusive`,
112
},
113
}
114
for _, tt := range tests {
115
t.Run(tt.testname, func(t *testing.T) {
116
var args Arguments
117
require.EqualError(t, river.Unmarshal([]byte(tt.cfg), &args), tt.expectedError)
118
})
119
}
120
}
121
122
func TestConvertConfig(t *testing.T) {
123
args := Arguments{
124
ConfigFile: "modules.yml",
125
Targets: TargetBlock{{Name: "target_a", Target: "http://example.com", Module: "http_2xx"}},
126
ProbeTimeoutOffset: 1 * time.Second,
127
}
128
129
res := args.Convert()
130
require.Equal(t, "modules.yml", res.BlackboxConfigFile)
131
require.Equal(t, 1, len(res.BlackboxTargets))
132
require.Contains(t, "target_a", res.BlackboxTargets[0].Name)
133
require.Contains(t, "http://example.com", res.BlackboxTargets[0].Target)
134
require.Contains(t, "http_2xx", res.BlackboxTargets[0].Module)
135
require.Equal(t, 1.0, res.ProbeTimeoutOffset)
136
}
137
138
func TestConvertTargets(t *testing.T) {
139
targets := TargetBlock{{
140
Name: "target_a",
141
Target: "http://example.com",
142
Module: "http_2xx",
143
}}
144
145
res := targets.Convert()
146
require.Equal(t, 1, len(res))
147
require.Contains(t, "target_a", res[0].Name)
148
require.Contains(t, "http://example.com", res[0].Target)
149
require.Contains(t, "http_2xx", res[0].Module)
150
}
151
152
func TestBuildBlackboxTargets(t *testing.T) {
153
baseArgs := Arguments{
154
ConfigFile: "modules.yml",
155
Targets: TargetBlock{{Name: "target_a", Target: "http://example.com", Module: "http_2xx"}},
156
ProbeTimeoutOffset: 1.0,
157
}
158
baseTarget := discovery.Target{
159
model.SchemeLabel: "http",
160
model.MetricsPathLabel: "component/prometheus.exporter.blackbox.default/metrics",
161
"instance": "prometheus.exporter.blackbox.default",
162
"job": "integrations/blackbox",
163
"__meta_agent_integration_name": "blackbox",
164
"__meta_agent_integration_instance": "prometheus.exporter.blackbox.default",
165
}
166
args := component.Arguments(baseArgs)
167
targets := buildBlackboxTargets(baseTarget, args)
168
require.Equal(t, 1, len(targets))
169
require.Equal(t, "integrations/blackbox/target_a", targets[0]["job"])
170
require.Equal(t, "http://example.com", targets[0]["__param_target"])
171
require.Equal(t, "http_2xx", targets[0]["__param_module"])
172
}
173
174