diff --git a/monitoring/docker-exporter/exporter.py b/monitoring/docker-exporter/exporter.py index 1a98d42..5746a72 100644 --- a/monitoring/docker-exporter/exporter.py +++ b/monitoring/docker-exporter/exporter.py @@ -44,6 +44,29 @@ LAST_CHECK = Gauge( "Last time the update check ran (unix timestamp)" ) + +def set_container_update_metric(container_name, compose_image, running_image, project_name, update_flag): + """Set update metric for a container and log the emitted metric payload.""" + metric_labels = { + "container": container_name, + "compose_image": compose_image or "unknown", + "running_image": running_image, + "com_docker_compose_project": project_name, + } + CONTAINER_UPDATE.labels(**metric_labels).set(update_flag) + logger.info( + "Metric emitted: docker_container_update_available=%s labels=%s", + update_flag, + metric_labels, + ) + + +def set_last_check_metric(): + """Set and log the timestamp for the most recent check cycle.""" + ts = time.time() + LAST_CHECK.set(ts) + logger.info("Metric emitted: docker_image_update_last_check_timestamp=%s", ts) + # --- Persistent Cache --- def load_cache(): if not os.path.exists(CACHE_FILE): @@ -380,6 +403,8 @@ def check_containers(): if client is None: logger.error("Docker client is unavailable; skipping check cycle") return + + set_last_check_metric() CONTAINER_UPDATE.clear() project_name = parse_project_name_from_script(SERVICES_UP_SCRIPT) @@ -409,12 +434,13 @@ def check_containers(): if local_digest and remote_digest and local_digest != remote_digest: update_flag = 1 - CONTAINER_UPDATE.labels( - container=container.name, - compose_image=compose_image or "unknown", + set_container_update_metric( + container_name=container.name, + compose_image=compose_image, running_image=running, - com_docker_compose_project=proj - ).set(update_flag) + project_name=proj, + update_flag=update_flag, + ) def dump_service_image_mapping(): project_name = parse_project_name_from_script(SERVICES_UP_SCRIPT)