diff --git a/monitoring/docker-exporter/exporter.py b/monitoring/docker-exporter/exporter.py index 0dcf6f9..48ef7c6 100644 --- a/monitoring/docker-exporter/exporter.py +++ b/monitoring/docker-exporter/exporter.py @@ -411,6 +411,9 @@ def check_containers(): svc_map = parse_compose_services(compose_files, project_name, project_root) containers = client.containers.list() + pending_metrics = [] + remote_targets = set() + for container in containers: proj = container.labels.get("com.docker.compose.project") if not proj: @@ -423,30 +426,47 @@ def check_containers(): if svc in svc_map: compose_image = svc_map[svc]["image"] - update_flag = 0 - local_digest = get_local_digest(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( "Digest comparison: container=%s service=%s running=%s target=%s local=%s remote=%s", - container.name, - svc, - running, + payload["container_name"], + payload["service"], + payload["running_image"], remote_target, local_digest, remote_digest, ) - if local_digest and remote_digest and local_digest != remote_digest: - update_flag = 1 - set_container_update_metric( - container_name=container.name, - compose_image=compose_image, - running_image=running, - project_name=proj, + container_name=payload["container_name"], + compose_image=payload["compose_image"], + running_image=payload["running_image"], + project_name=payload["project_name"], update_flag=update_flag, )