4.2.3 Implement Code that Emits Custom Metrics

Emit Custom Metrics

EMF (Embedded Metric Format) — Lambda

import json

def handler(event, context):
    print(json.dumps({
        "_aws": {
            "Timestamp": 1705312200000,
            "CloudWatchMetrics": [{
                "Namespace": "MyApp",
                "Dimensions": [["Service"]],
                "Metrics": [{"Name": "ProcessingTime", "Unit": "Milliseconds"}]
            }]
        },
        "Service": "OrderService",
        "ProcessingTime": 150
    }))

PutMetricData — EC2/ECS

import boto3

cw = boto3.client('cloudwatch')
cw.put_metric_data(
    Namespace='MyApp',
    MetricData=[{
        'MetricName': 'ActiveConnections',
        'Value': 42,
        'Unit': 'Count',
        'Dimensions': [{'Name': 'Service', 'Value': 'WebServer'}]
    }]
)

Lambda Powertools

from aws_lambda_powertools import Metrics
from aws_lambda_powertools.metrics import MetricUnit

metrics = Metrics(namespace="MyApp")

@metrics.log_metrics(capture_cold_start_metric=True)
def handler(event, context):
    metrics.add_metric(name="OrdersProcessed", unit=MetricUnit.Count, value=1)

High Resolution Metrics

  • Standard: 60-second granularity
  • High resolution: 1-second granularity
  • StorageResolution=1 in PutMetricData

Exam Tip: EMF = free custom metrics for Lambda. PutMetricData for EC2/ECS. High resolution = 1s granularity. Dimensions = filter/group metrics.