Merge pull request #10 from beatz174-bit/codex/check-docker-exporter.py-for-excessive-requests

Reduce upstream registry lookups in docker exporter
This commit is contained in:
beatz174-bit
2026-04-07 22:21:46 +10:00
committed by GitHub
+33 -13
View File
@@ -411,6 +411,9 @@ def check_containers():
svc_map = parse_compose_services(compose_files, project_name, project_root) svc_map = parse_compose_services(compose_files, project_name, project_root)
containers = client.containers.list() containers = client.containers.list()
pending_metrics = []
remote_targets = set()
for container in containers: for container in containers:
proj = container.labels.get("com.docker.compose.project") proj = container.labels.get("com.docker.compose.project")
if not proj: if not proj:
@@ -423,30 +426,47 @@ def check_containers():
if svc in svc_map: if svc in svc_map:
compose_image = svc_map[svc]["image"] compose_image = svc_map[svc]["image"]
update_flag = 0
local_digest = get_local_digest(running) local_digest = get_local_digest(running)
remote_target = compose_image or running remote_target = compose_image or running
remote_digest = get_remote_digest(remote_target)
# If we cannot determine a local digest, we cannot compare and should
# avoid spending a registry lookup for this container.
if local_digest:
remote_targets.add(remote_target)
pending_metrics.append({
"container_name": container.name,
"service": svc,
"compose_image": compose_image,
"running_image": running,
"project_name": proj,
"remote_target": remote_target,
"local_digest": local_digest,
})
remote_digests = {target: get_remote_digest(target) for target in remote_targets}
for payload in pending_metrics:
local_digest = payload["local_digest"]
remote_target = payload["remote_target"]
remote_digest = remote_digests.get(remote_target)
update_flag = 1 if (local_digest and remote_digest and local_digest != remote_digest) else 0
logger.info( logger.info(
"Digest comparison: container=%s service=%s running=%s target=%s local=%s remote=%s", "Digest comparison: container=%s service=%s running=%s target=%s local=%s remote=%s",
container.name, payload["container_name"],
svc, payload["service"],
running, payload["running_image"],
remote_target, remote_target,
local_digest, local_digest,
remote_digest, remote_digest,
) )
if local_digest and remote_digest and local_digest != remote_digest:
update_flag = 1
set_container_update_metric( set_container_update_metric(
container_name=container.name, container_name=payload["container_name"],
compose_image=compose_image, compose_image=payload["compose_image"],
running_image=running, running_image=payload["running_image"],
project_name=proj, project_name=payload["project_name"],
update_flag=update_flag, update_flag=update_flag,
) )