data "aws_region" "current" {}
resource "aws_lambda_function" "x-ray_lambda" {
  ...
  
  runtime          = "python3.12"
  environment {
    variables = {
      POWERTOOLS_LOG_LEVEL = "INFO"
      POWERTOOLS_SERVICE_NAME = "sample_app"
    }
  }
  logging_config {
    log_format = "JSON"
  }
  tracing_config {
    mode = "Active"
  }
  layers = [
    "arn:aws:lambda:${data.aws_region.current.name}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:2"
  ]
}

# lambda policy
...
statement {
    effect = "Allow"
    actions = [
      "xray:PutTraceSegments",
      "xray:PutTelemetryRecords"
    ]
    resources = ["*"]
  }
  ...
  

Logger

Before

{
    "timestamp": "2024-10-19T15:17:48Z",
    "level": "INFO",
    "message": "1/n=0.3333333333333333",
    "logger": "sample",
    "requestId": "bfcf2cdc-3915-59e4-89f6-7351f6c37c7d"
}
{
    "timestamp": "2024-10-19T15:17:48Z",
    "level": "ERROR",
    "message": "Divid error",
    "logger": "sample",
    "stackTrace": [
        "  File \"/var/task/sample.py\", line 33, in handler\n    logger.info(f\"{1/n=}\")\n                   ~^~\n"
    ],
    "errorType": "ZeroDivisionError",
    "errorMessage": "division by zero",
    "requestId": "bfb3d7f1-bec1-54a2-9d89-887c7117a029",
    "location": "/var/task/sample.py:handler:35"
}

After

from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.typing import LambdaContext

import json

logger = Logger()

@logger.inject_lambda_context
def handler(data: dict, context: LambdaContext):
    sub(data)
    ...
from aws_lambda_powertools import Logger
logger = Logger()

def sub(data):
    ...
{
    "level": "INFO",
    "location": "handler:35",
    "message": "1/n=0.3333333333333333",
    "timestamp": "2024-10-19 15:29:41,214+0000",
    "service": "service_undefined",
    "cold_start": true,
    "function_name": "x-ray_sample_function",
    "function_memory_size": "128",
    "function_arn": "arn:aws:lambda:us-east-1:533266996794:function:x-ray_sample_function",
    "function_request_id": "ee386a0f-98da-5e83-b882-35824a43f472",
    "xray_trace_id": "1-6713d064-e2a43f0c608d9cfa324553e5"
}
{
    "level": "ERROR",
    "location": "handler:37",
    "message": "Divid error",
    "timestamp": "2024-10-19 15:29:41,213+0000",
    "service": "service_undefined",
    "cold_start": true,
    "function_name": "x-ray_sample_function",
    "function_memory_size": "128",
    "function_arn": "arn:aws:lambda:us-east-1:533266996794:function:x-ray_sample_function",
    "function_request_id": "ee386a0f-98da-5e83-b882-35824a43f472",
    "exception": "Traceback (most recent call last):\n  File \"/var/task/sample.py\", line 35, in handler\n    logger.info(f\"{1/n=}\")\n                   ~^~\nZeroDivisionError: division by zero",
    "exception_name": "ZeroDivisionError",
    "stack_trace": {
        "type": "ZeroDivisionError",
        "value": "division by zero",
        "module": "builtins",
        "frames": [
            {
                "file": "/var/task/sample.py",
                "line": 35,
                "function": "handler",
                "statement": "logger.info(f\"{1/n=}\")"
            }
        ]
    },
    "xray_trace_id": "1-6713d064-e2a43f0c608d9cfa324553e5"
}

Tracer

https://docs.powertools.aws.dev/lambda/python/latest/core/tracer/

from aws_lambda_powertools import Tracer
from aws_lambda_powertools.utilities.typing import LambdaContext

tracer = Tracer()

@tracer.capture_lambda_handler
def handler(data: dict, context: LambdaContext):
    ....

image.png

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-services-sns.html