CloudWatch Application Signals & Service Maps
A trace tells you what happened in one request. A service map tells you what happens across every request, aggregated: which services call which, how often, how fast, and how reliably.
Search across all documentation pages
A trace tells you what happened in one request. A service map tells you what happens across every request, aggregated: which services call which, how often, how fast, and how reliably.
CloudWatch Application Signals is AWS's newer APM-style (application performance monitoring) feature that builds exactly that view. It consumes the trace data your services already emit - from X-Ray or OpenTelemetry - and turns it into a visual service map plus SLO-style metrics like latency and availability, without you writing a new instrumentation layer.
This page describes Application Signals conceptually and how it relates to the tracing work covered earlier in this section, since the SDK-level enablement details are still evolving and worth verifying against current docs before you rely on them.
The pattern: Application Signals is enabled at the service/platform level (via the CloudWatch console or a discovery mechanism for your compute platform), not by adding a new package to your SDK code. Your existing tracing setup - X-Ray or OpenTelemetry - is what feeds it.
# --- Python (boto3) ---
# Application Signals builds on the same X-Ray instrumentation you already have.
# The SDK-level code is unchanged - this is the same pattern as the X-Ray page.
from aws_xray_sdk.core import patch
import boto3
patch(["boto3"]) # traced calls here are what Application Signals visualizes
orders = boto3.client("dynamodb")
orders.get_item(TableName="Orders", Key={"id": {"S": "order-42"}})
# Enablement of Application Signals itself happens at the platform/console level -
# verify the exact current steps for your compute platform (Lambda, ECS, EKS) against AWS docs.// --- TypeScript (AWS SDK v3) ---
// Application Signals builds on the same tracing instrumentation you already have.
// The SDK-level code is unchanged - this is the same pattern as the X-Ray page.
import AWSXRay from "aws-xray-sdk-core";
import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb";
const orders = AWSXRay.captureAWSv3Client(new DynamoDBClient({}));
await orders.send(new GetItemCommand({ TableName: "Orders", Key: { id: { S: "order-42" } } }));
// Enablement of Application Signals itself happens at the platform/console level -
// verify the exact current steps for your compute platform against AWS docs.When to reach for this:
Since Application Signals is a console/platform-level feature built from existing trace data, the "working example" here is conceptual: what you would see, not new code to write.
# --- Python (boto3) ---
# No new SDK code - Application Signals reads the trace data your instrumented
# calls already produce. The instrumentation is identical to the X-Ray or
# OpenTelemetry pages in this section.
from aws_xray_sdk.core import xray_recorder, patch
import boto3
patch(["boto3"])
ddb = boto3.client("dynamodb")
@xray_recorder.capture("checkout_flow")
def checkout_flow(order_id: str):
return ddb.get_item(TableName="Orders", Key={"id": {"S": order_id}})
# This subsegment becomes one edge on the resulting service map:
# checkout-service -> DynamoDB, with its own latency and error rate.// --- TypeScript (AWS SDK v3) ---
// No new SDK code - Application Signals reads the trace data your instrumented
// calls already produce, the same instrumentation shown in the X-Ray page.
import AWSXRay from "aws-xray-sdk-core";
import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb";
const ddb = AWSXRay.captureAWSv3Client(new DynamoDBClient({}));
export async function checkoutFlow(orderId: string) {
return ddb.send(new GetItemCommand({ TableName: "Orders", Key: { id: { S: orderId } } }));
// This subsegment becomes one edge on the resulting service map:
// checkout-service -> DynamoDB, with its own latency and error rate.
}What this demonstrates:
pip install. Fix: check the current AWS documentation for your specific compute platform's enablement path rather than assuming a single universal step.| Alternative | Use When | Don't Use When |
|---|---|---|
| CloudWatch Application Signals (this page) | You want an aggregated service map/SLO view built from existing traces | You have not instrumented tracing yet, or need per-request detail |
| Reading raw X-Ray traces | You need fine-grained, per-request timing detail | You want an aggregated, at-a-glance dependency view |
| Reading raw OpenTelemetry traces in a third-party APM | You are already standardized on a non-AWS observability backend | You want the tightest native AWS console integration |
| Structured logs alone | Debugging one specific failed call | You need to see cross-service dependency health at all |
No dedicated Application Signals SDK call is required at the code level - it consumes the X-Ray or OpenTelemetry trace data your service already produces. Enablement is largely a platform/console-level step.
An aggregated service map across many requests, with latency and error rate per dependency edge, plus SLO-style metrics - a higher-level view than any single trace provides.
AWS has been extending Application Signals to consume OpenTelemetry data alongside X-Ray, though the exact current support and setup steps are worth confirming against AWS's documentation for your platform.
There is no trace data for it to visualize, so the service map will be empty or incomplete. Instrument X-Ray or OpenTelemetry tracing on your SDK calls first.
No, it is a starting point. Use the map to spot which dependency looks unhealthy in aggregate, then drop into individual traces for the specific request-level detail behind that pattern.
Because Application Signals' enablement mechanics (console configuration, discovery, per-platform agents) are newer and have changed since launch. Verify the current steps for your compute platform against AWS's own documentation rather than a fixed snapshot.
Stack versions: This page was written for boto3 1.43.x (Python 3.10+) and the AWS SDK for JavaScript v3 (Node.js 18+).
Reviewed by Chris St. John·Last updated Jul 23, 2026