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:
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user