Caution
Grafana Agent has reached End-of-Life (EOL) on November 1, 2025. Agent is no longer receiving vendor support and will no longer receive security or bug fixes. Current users of Agent Static mode, Agent Flow mode, and Agent Operator should proceed with migrating to Grafana Alloy. If you have already migrated to Alloy, no further action is required. Read more about why we recommend migrating to Grafana Alloy.
Important: This documentation is about an older version. It's relevant only to the release noted, many of the features and functions have been updated or replaced. Please view the current version.
discovery.relabel
In Flow, targets are defined as sets of key-value pairs called labels.
discovery.relabel rewrites the label set of the input targets by applying one
or more relabeling rules. If no rules are defined, then the input targets are
exported as-is.
The most common use of discovery.relabel is to filter targets or standardize
the target label set that is passed to a downstream component. The rule
blocks are applied to the label set of each target in order of their appearance
in the configuration file. The configured rules can be retrieved by calling the
function in the rules export field.
Target labels which start with a double underscore __ are considered
internal, and may be removed by other Flow components prior to telemetry
collection. To retain any of these labels, use a labelmap action to remove
the prefix, or remap them to a different name. Service discovery mechanisms
usually group their labels under __meta_*. For example, the
discovery.kubernetes component populates a set of __meta_kubernetes_* labels
to provide information about the discovered Kubernetes resources. If a
relabeling rule needs to store a label value temporarily, for example as the
input to a subsequent step, use the __tmp label name prefix, as it is
guaranteed to never be used.
Multiple discovery.relabel components can be specified by giving them
different labels.
Usage
discovery.relabel "LABEL" {
targets = TARGET_LIST
rule {
...
}
...
}Arguments
The following arguments are supported:
Blocks
The following blocks are supported inside the definition of
discovery.relabel:
rule block
The rule block contains the definition of any relabeling rules that can be
applied to an input metric. If more than one rule block is defined, the
transformations are applied in top-down order.
The following arguments can be used to configure a rule. All arguments are
optional. Omitted fields take their default values.
Here’s a list of the available actions, along with a brief description of their usage.
replace- Matchesregexto the concatenated labels. If there’s a match, it replaces the content of thetarget_labelusing the contents of thereplacementfield.keep- Keeps metrics whereregexmatches the string extracted using thesource_labelsandseparator.drop- Drops metrics whereregexmatches the string extracted using thesource_labelsandseparator.hashmod- Hashes the concatenated labels, calculates its modulomodulusand writes the result to thetarget_label.labelmap- Matchesregexagainst all label names. Any labels that match are renamed according to the contents of thereplacementfield.labeldrop- Matchesregexagainst all label names. Any labels that match are removed from the metric’s label set.labelkeep- Matchesregexagainst all label names. Any labels that don’t match are removed from the metric’s label set.
Finally, note that the regex capture groups can be referred to using either the
$CAPTURE_GROUP_NUMBER or ${CAPTURE_GROUP_NUMBER} notation.
Exported fields
The following fields are exported and can be referenced by other components:
Component health
discovery.relabel is only reported as unhealthy when given an invalid
configuration. In those cases, exported fields retain their last healthy
values.
Debug information
discovery.relabel does not expose any component-specific debug information.
Debug metrics
discovery.relabel does not expose any component-specific debug metrics.
Example
discovery.relabel "keep_backend_only" {
targets = [
{ "__meta_foo" = "foo", "__address__" = "localhost", "instance" = "one", "app" = "backend" },
{ "__meta_bar" = "bar", "__address__" = "localhost", "instance" = "two", "app" = "database" },
{ "__meta_baz" = "baz", "__address__" = "localhost", "instance" = "three", "app" = "frontend" },
]
rule {
source_labels = ["__address__", "instance"]
separator = "/"
target_label = "destination"
action = "replace"
}
rule {
source_labels = ["app"]
action = "keep"
regex = "backend"
}
}


