import boto3 from datetime import datetime from threading import Thread, Semaphore import logging from botocore.config import Config cw = boto3.client("cloudwatch", config=Config(region_name="us-east-1")) sema = Semaphore(8) def put_queue_wait_metric(queue_name, value): call_time = datetime.now() res = sema.acquire(blocking=False) if not res: logging.info("Not putting cloudwatch metric - too many threads") return def thunk(): try: cw.put_metric_data( Namespace="composer", MetricData=[ { "MetricName": "queue_wait_time", "Dimensions": [{"Name": "queue_name", "Value": queue_name}], "Timestamp": call_time, "Value": value, "Unit": "Seconds", } ], ) except Exception as e: logging.warning(f"Failed to put cloudwatch metric: {e}") finally: sema.release() Thread(target=thunk, daemon=True).start()