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