Monitoring Docker containers with OpenTelemetry means collecting per-container resource and health telemetry through the OpenTelemetry Collector's Docker stats receiver, exported over OTLP, so container metrics sit alongside your traces and logs..
Monitoring Docker containers with OpenTelemetry means collecting per-container resource and health telemetry through the OpenTelemetry Collector's Docker stats receiver, exported over OTLP, so container metrics sit alongside your traces and logs.
For containers running directly on Docker rather than under Kubernetes, the signals that matter are per-container CPU against any CPU quota, memory usage against the container limit, network and block I/O, restart counts, and health-check status. Because containers are ephemeral and are restarted silently, the value is watching these against the container lifecycle, a container that keeps restarting or keeps hitting its memory limit is telling you something the aggregate host metrics hide.
The single most useful number is memory usage as a percentage of the container's limit, because a container that reaches its limit is killed by the kernel without a graceful shutdown, and that is the most common cause of a container that 'just disappears'.
The OpenTelemetry Collector's docker_stats receiver connects to the Docker daemon and reads the same per-container statistics the docker stats view shows, CPU, memory against the limit, network and block I/O, exporting them over OTLP. Container logs are collected with the filelog receiver, and applications inside containers export their own traces and metrics over OTLP as normal.
The access detail to get right is the daemon socket: the Collector needs read access to the Docker socket to call the stats API, so mount it read-only and scope the permission carefully rather than running the Collector with broad privileges.
The signals that explain most container incidents:
| Signal | Source | What it tells you / watch for |
|---|---|---|
container.cpu.utilization | docker_stats | CPU used against the container's quota; sustained saturation shows up as latency, not errors. |
container.memory.percent | docker_stats | Memory used as a fraction of the limit; approaching 100% precedes an OOM kill. |
container.memory.usage.total | docker_stats | Absolute memory; a steady climb without release indicates a leak. |
container.network.io.usage.rx_bytes / tx_bytes | docker_stats | Network throughput per container; a sudden change can flag a runaway or stalled workload. |
container.blockio.io_service_bytes_recursive | docker_stats | Disk I/O per container; heavy I/O can starve co-located containers. |
restart count | daemon / events | Repeated restarts are the signature of a crash loop or a container hitting its limit. |
A Docker dashboard should make a memory or restart problem obvious at the container level. Row one: memory percent of limit per container (the OOM predictor) and CPU utilization per container. Row two: restart counts over time and the top containers by restarts. Row three: network and block I/O per container, so a noisy neighbour starving the host is visible.
# memory headroom per container (near 1.0 = OOM kill risk)
container.memory.percent by (container.name)
# CPU saturation against the container quota
container.cpu.utilization by (container.name)
# block I/O per container (spot the noisy neighbour)
rate(container.blockio.io_service_bytes_recursive[5m]) by (container.name)
A container vanishes and restarts with no graceful shutdown, because it exceeded its memory limit and the kernel killed it. container.memory.percent climbing to 100 just before the restart is the tell. Raise the limit if the workload legitimately needs it, or fix the leak driving usage up.
A container's latency rises while its CPU sits pinned at its quota. Utilization against the quota is saturated even though the host has spare capacity, because the container's CPU limit is throttling it. Raise the limit or right-size the workload.
A container restarts repeatedly, so restart count climbs steadily. The cause is either the application crashing on startup (check the logs the filelog receiver is shipping) or the container being OOM-killed each time it reaches its limit.
Starting thresholds to tune:
| Condition | Signal | Meaning |
|---|---|---|
| container.memory.percent > 90 for 5m | memory | OOM kill imminent. |
| container.cpu.utilization > 90% of quota for 5m | cpu | Throttling; latency will rise. |
| restart count increasing over 10m | stability | Crash loop or repeated OOM. |
| health check failing for 2m | health | Container is up but not serving. |
Ops Singularity's TelemetryOps ingests Docker telemetry over OpenTelemetry, and Sentinel AI resolves container incidents, restarting, rescheduling or applying a fix, through governed Action Tickets. Explore TelemetryOps.
Use the OpenTelemetry Collector's docker_stats receiver to pull per-container CPU, memory, network and I/O metrics from the Docker daemon, and the filelog receiver for container logs.
Per-container CPU and memory against limits, network and block I/O, restart counts, and health-check status, correlated with container lifecycle events.
Bring a real incident. We will show you Sentinel investigate, act and verify end to end, with every action reversible and audited.