Reduce registry calls in docker exporter checks
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user