diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f779d98e899..82ccb7f0c509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,8 @@ Main (unreleased) - Add a `file_watch` block in `loki.source.file` to configure how often to poll files from disk for changes via `min_poll_frequency` and `max_poll_frequency`. In static mode it can be configured in the global `file_watch_config` via `min_poll_frequency` and `max_poll_frequency`. (@wildum) +- Flow: In `prometheus.exporter.blackbox`, allow setting labels for individual targets. (@spartan0x117) + ### Enhancements - Clustering: allow advertise interfaces to be configurable, with the possibility to select all available interfaces. (@wildum) diff --git a/component/prometheus/exporter/blackbox/blackbox.go b/component/prometheus/exporter/blackbox/blackbox.go index 9457b054b84b..6cf006af2aa2 100644 --- a/component/prometheus/exporter/blackbox/blackbox.go +++ b/component/prometheus/exporter/blackbox/blackbox.go @@ -38,6 +38,10 @@ func buildBlackboxTargets(baseTarget discovery.Target, args component.Arguments) a := args.(Arguments) for _, tgt := range a.Targets { target := make(discovery.Target) + // Set extra labels first, meaning that any other labels will override + for k, v := range tgt.Labels { + target[k] = v + } for k, v := range baseTarget { target[k] = v } @@ -62,9 +66,10 @@ var DefaultArguments = Arguments{ // BlackboxTarget defines a target to be used by the exporter. type BlackboxTarget struct { - Name string `river:",label"` - Target string `river:"address,attr"` - Module string `river:"module,attr,optional"` + Name string `river:",label"` + Target string `river:"address,attr"` + Module string `river:"module,attr,optional"` + Labels map[string]string `river:"labels,attr,optional"` } type TargetBlock []BlackboxTarget diff --git a/component/prometheus/exporter/blackbox/blackbox_test.go b/component/prometheus/exporter/blackbox/blackbox_test.go index 1fd149c821d9..ea871d775ba0 100644 --- a/component/prometheus/exporter/blackbox/blackbox_test.go +++ b/component/prometheus/exporter/blackbox/blackbox_test.go @@ -170,3 +170,47 @@ func TestBuildBlackboxTargets(t *testing.T) { require.Equal(t, "http://example.com", targets[0]["__param_target"]) require.Equal(t, "http_2xx", targets[0]["__param_module"]) } + +func TestBuildBlackboxTargetsWithExtraLabels(t *testing.T) { + baseArgs := Arguments{ + ConfigFile: "modules.yml", + Targets: TargetBlock{{ + Name: "target_a", + Target: "http://example.com", + Module: "http_2xx", + Labels: map[string]string{ + "env": "test", + "foo": "bar", + }, + }}, + ProbeTimeoutOffset: 1.0, + } + baseTarget := discovery.Target{ + model.SchemeLabel: "http", + model.MetricsPathLabel: "component/prometheus.exporter.blackbox.default/metrics", + "instance": "prometheus.exporter.blackbox.default", + "job": "integrations/blackbox", + "__meta_agent_integration_name": "blackbox", + "__meta_agent_integration_instance": "prometheus.exporter.blackbox.default", + } + args := component.Arguments(baseArgs) + targets := buildBlackboxTargets(baseTarget, args) + require.Equal(t, 1, len(targets)) + require.Equal(t, "integrations/blackbox/target_a", targets[0]["job"]) + require.Equal(t, "http://example.com", targets[0]["__param_target"]) + require.Equal(t, "http_2xx", targets[0]["__param_module"]) + + require.Equal(t, "test", targets[0]["env"]) + require.Equal(t, "bar", targets[0]["foo"]) + + // Check that the extra labels do not override existing labels + baseArgs.Targets[0].Labels = map[string]string{ + "job": "test", + "instance": "test-instance", + } + args = component.Arguments(baseArgs) + targets = buildBlackboxTargets(baseTarget, args) + require.Equal(t, 1, len(targets)) + require.Equal(t, "integrations/blackbox/target_a", targets[0]["job"]) + require.Equal(t, "prometheus.exporter.blackbox.default", targets[0]["instance"]) +} diff --git a/docs/sources/flow/reference/components/prometheus.exporter.blackbox.md b/docs/sources/flow/reference/components/prometheus.exporter.blackbox.md index e5103cab69c0..494dd273d0a6 100644 --- a/docs/sources/flow/reference/components/prometheus.exporter.blackbox.md +++ b/docs/sources/flow/reference/components/prometheus.exporter.blackbox.md @@ -87,7 +87,7 @@ debug metrics. ### Collect metrics using a blackbox exporter config file This example uses a [`prometheus.scrape` component][scrape] to collect metrics -from `prometheus.exporter.blackbox`: +from `prometheus.exporter.blackbox`. It adds an extra label, `env="dev"`, to the metrics emitted by the `grafana` target. The `example` target does not have any added labels. ```river prometheus.exporter.blackbox "example" { @@ -101,6 +101,9 @@ prometheus.exporter.blackbox "example" { target "grafana" { address = "http://grafana.com" module = "http_2xx" + labels = { + "env": "dev", + } } } @@ -144,6 +147,9 @@ prometheus.exporter.blackbox "example" { target "grafana" { address = "http://grafana.com" module = "http_2xx" + labels = { + "env": "dev", + } } } @@ -171,4 +177,5 @@ Replace the following: - `USERNAME`: The username to use for authentication to the remote_write API. - `PASSWORD`: The password to use for authentication to the remote_write API. + [scrape]: {{< relref "./prometheus.scrape.md" >}}