GitHub user apoorva-01 added a comment to the discussion: How to define custom 
metrics

Yeah, that's basically the supported way. In Airflow 3 the metrics client moved 
to the task SDK, and the import you wrote is the right one:

```python
from airflow.sdk.observability import stats

stats.gauge("my_service.queue_depth", 42)
stats.incr("my_service.processed")
stats.decr("my_service.in_flight")
stats.timing("my_service.batch_ms", 1234)      # ms or a timedelta
with stats.timer("my_service.batch"):          # times the block
    ...
```

`from airflow.stats import Stats` still works but it's deprecated now (it just 
warns and forwards to the same place), so the `airflow.sdk.observability` path 
is the one to use going forward.

The one gotcha that trips people up: these calls are no-ops unless you actually 
have a metrics backend turned on. Out of the box nothing is emitting, so your 
gauge goes nowhere and it looks broken. Turn one on in config:

```ini
[metrics]
statsd_on = True
statsd_host = localhost
statsd_port = 8125
statsd_prefix = airflow
```

or the OpenTelemetry equivalent with `otel_on = True`.

Also watch `[metrics] metrics_allow_list` / `metrics_block_list` if you've set 
them. Allow-list is prefix-matched, so if it's configured and your 
`my_service.*` prefix isn't in it, the custom metric gets filtered out silently 
(and if you set an allow-list, the block-list is ignored entirely). Signatures 
if you need the rest: `incr/decr(stat, count=None, rate=None, *, tags=...)`, 
`gauge(stat, value, *, tags=...)`, all take a `tags` dict for dimensional 
metrics.

Agree a dedicated "Custom Metrics" section in metrics.rst would help, this 
comes up a lot.

GitHub link: 
https://github.com/apache/airflow/discussions/69096#discussioncomment-17523512

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: [email protected]

Reply via email to