diff --git a/swh/core/statsd.py b/swh/core/statsd.py --- a/swh/core/statsd.py +++ b/swh/core/statsd.py @@ -57,6 +57,7 @@ import logging import os from random import random +import re import socket import threading from time import monotonic @@ -221,6 +222,14 @@ ) continue k, v = tag.split(":", 1) + + # look for a possible env var substitution, using $NAME or ${NAME} format + m = re.match(r"^[$]([{])?(?P\w+)(?(1)[}]|)$", v) + if m: + envvar = m.group("envvar") + if envvar in os.environ: + v = os.environ[envvar] + self.constant_tags[k] = v if constant_tags: diff --git a/swh/core/tests/test_statsd.py b/swh/core/tests/test_statsd.py --- a/swh/core/tests/test_statsd.py +++ b/swh/core/tests/test_statsd.py @@ -428,6 +428,21 @@ assert statsd.socket.recv() == "gt:123.4|g|#age:45,country:china" +def test_tags_from_environment_with_substitution(monkeypatch): + monkeypatch.setenv("HOSTNAME", "sweethome") + monkeypatch.setenv("PORT", "42") + monkeypatch.setenv( + "STATSD_TAGS", "country:china,age:45,host:$HOSTNAME,port:${PORT}" + ) + statsd = Statsd() + statsd._socket = FakeSocket() + statsd.gauge("gt", 123.4) + assert ( + statsd.socket.recv() + == "gt:123.4|g|#age:45,country:china,host:sweethome,port:42" + ) + + def test_tags_from_environment_and_constant(monkeypatch): monkeypatch.setenv("STATSD_TAGS", "country:china,age:45") statsd = Statsd(constant_tags={"country": "canada"})