The Airflow Statsd Exporter not responding typically stems from misconfigured environment variables, network isolation in Docker, or incorrect port mappings. Verify that the STATSD_HOST and STATSD_PORT settings align with your exporter container's actual listening address. Ensure the exporter service is healthy and accessible via curl before assuming a deeper infrastructure failure.
Verifying Container Health and Status
The first step in troubleshooting any unresponsive service within an Apache Airflow deployment is to confirm that the Statsd Exporter container is actually running. In many cases, the container may have crashed due to an invalid configuration file or an out-of-memory error, leaving it in a stopped or restarting state. You can check the status of your containers using the Docker command line interface.
docker ps -a | grep statsd-exporter
If the container is listed as "Exited" or "Restarting," you need to inspect the logs to understand why it failed. Use the following command to view the recent output, which often contains the specific error message causing the crash:
docker logs <container_id_or_name>
Look for errors related to configuration parsing, such as missing mapping files, or permission issues when trying to bind to the required ports. If the container is running but still unresponsive, proceed to verify the internal networking and port bindings.
Checking Network Connectivity and Port Binding
Airflow components communicate over a shared Docker network. If the Statsd Exporter is not responding, it is often because the webserver or scheduler cannot reach the exporter's IP address on the designated port. The default port for Statsd metrics is 9125, while the HTTP exposition endpoint usually runs on 9102. You must ensure these ports are correctly mapped in your docker-compose.yml file.
Inspect your docker-compose.yml configuration for the exporter service. It should look something like this:
services:
statsd-exporter:
image: prom/statsd-exporter
ports:
- "9102:9102"
- "9125:9125/udp"
networks:
- airflow-network
Notice the /udp suffix for port 9125. Statsd primarily uses UDP for sending metrics, so failing to specify the protocol can cause silent failures where the container starts but does not accept incoming metric data. Additionally, verify that all services, including the Airflow webserver and scheduler, are attached to the same network alias. If they are on different networks, they cannot resolve each other by name.
To test connectivity directly, exec into the Airflow webserver container and attempt to curl the exporter. This isolates whether the issue is with the exporter itself or the network path between components.
docker exec -it airflow_webserver_1 bash
curl http://statsd-exporter:9102/metrics
If this returns a connection refused error, check your firewall rules or Docker network configurations. For more insights into Docker networking pitfalls, consider reviewing our guide on Troubleshooting Docker Swarm Networking Issues, as the principles of DNS resolution and port binding apply similarly across Docker environments.
Validating Environment Variables and Configuration
Airflow relies on environment variables to connect to external monitoring tools. The most critical variables for Statsd integration are STATSD_ON, STATSD_HOST, and STATSD_PORT. These must be defined in the environment section of the Airflow scheduler and worker containers in your docker-compose.yml file.
environment:
- AIRFLOW__METRICS__STATSD_ON=True
- AIRFLOW__METRICS__STATSD_HOST=statsd-exporter
- AIRFLOW__METRICS__STATSD_PORT=9125
A common mistake is setting the host to localhost or 127.0.0.1. Inside a Docker container, localhost refers to the container itself, not the host machine or another container. Always use the service name defined in docker-compose.yml as the hostname. If you are using a custom network alias, use that instead.
After updating these variables, you must restart the affected Airflow services for the changes to take effect. Simply reloading the configuration is often insufficient for the Python-based Airflow components to pick up new network endpoints.
Inspecting Prometheus Integration
Statsd Exporter acts as a bridge between the UDP-based Statsd protocol and Prometheus, which expects HTTP GET requests. If Airflow is sending metrics successfully but Prometheus is not receiving them, the issue likely lies in the exporter's configuration map rather than the Airflow connection. Check if the statsd_mapping.conf is being mounted correctly into the exporter container.
volumes:
- ./config/statsd_mapping.conf:/etc/statsd-exporter/mapping.conf
If the mapping file is missing or malformed, the exporter might start but fail to translate incoming Statsd packets into Prometheus-compatible formats. You can verify this by checking the exporter's logs for warnings about invalid metric names or mapping errors. Additionally, ensure that your Prometheus server is configured to scrape the correct endpoint, typically http://statsd-exporter:9102/metrics.
If you encounter issues with resource usage affecting container stability, such as disk space constraints impacting log rotation, refer to our article on Docker Folder Size is Greater than Actual Disk Space to ensure your storage backend isn't causing silent performance degradation.
Frequently Asked Questions
Why is my Statsd Exporter container exiting immediately after starting?
This usually happens due to a misconfigured mapping file or invalid environment variables passed to the exporter. Check the container logs using docker logs to identify the specific syntax error or missing dependency causing the crash.
Can I use TCP instead of UDP for sending Airflow metrics?
While some modern implementations support TCP, the standard Statsd protocol relies on UDP for low-latency, fire-and-forget metric transmission. Switching to TCP requires significant changes to both the exporter configuration and how Airflow sends data, which is generally not recommended for standard setups.
How do I verify if Airflow is actually sending metrics to the exporter?
You can enable debug logging in the Airflow scheduler and worker by setting AIRFLOW__LOGGING__LOGGING_LEVEL=DEBUG. Look for messages indicating successful connections to the Statsd host. Alternatively, monitor the exporter's memory usage or network traffic during task execution to see if data is arriving.
What should I do if the exporter responds to localhost but not from the webserver container?
This indicates a Docker network isolation issue. Ensure that both containers are connected to the same user-defined bridge network. You can also try pinging the exporter service name from within the webserver container to verify DNS resolution is working correctly.
Is it safe to run Statsd Exporter without authentication?
By default, Statsd Exporter exposes its metrics endpoint without authentication, which is suitable for internal Docker networks. However, if you expose the exporter port to the public internet, you should place it behind a reverse proxy with basic auth or restrict access via firewall rules to prevent unauthorized scraping.