Skip to main content

aws-observability

Investigates root causes on the Omni context graph (service dependencies) and Intelligence insights; builds, configures, debugs, tunes AWS observability - operator-symptom questions, detecting Omni vs classic CloudWatch. CloudWatch on a reporting service: fleet health views, Log Insights, metric/composite/anomaly alarms, custom metrics/EMF, dashboards, X-Ray/ADOT tracing, canaries, CloudTrail, Dynamic Instrumentation (live breakpoints), and Application Signals service map. CloudWatch Omni on an existing Space: SQL over logs/traces, PromQL, Omni dashboards, alerts and Slack notifications, programmatic/IaC access (API/SDK/CLI/CFN), driving Omni from a coding agent or skills, AI agent quality from traces - on-demand and online evaluation of live traffic, incl. setting it up, readback, evaluators. For first-time setup - creating an Omni Space, granting access, ingestion, or ADOT instrumentation for Application Signals or Omni - use setting-up-cloudwatch-observability. Not for app logging or threat detection.

Source facts

Repository
aws/agent-toolkit-for-aws
Last source activity
October 27, 2026 at 13:41
Detected SKILL.md language
English
Stars
3,335
Forks
420

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
54 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
aws-observability
description
Investigates root causes on the Omni context graph (service dependencies) and Intelligence insights; builds, configures, debugs, tunes AWS observability - operator-symptom questions, detecting Omni vs classic CloudWatch. CloudWatch on a reporting service: fleet health views, Log Insights, metric/composite/anomaly alarms, custom metrics/EMF, dashboards, X-Ray/ADOT tracing, canaries, CloudTrail, Dynamic Instrumentation (live breakpoints), and Application Signals service map. CloudWatch Omni on an existing Space: SQL over logs/traces, PromQL, Omni dashboards, alerts and Slack notifications, programmatic/IaC access (API/SDK/CLI/CFN), driving Omni from a coding agent or skills, AI agent quality from traces - on-demand and online evaluation of live traffic, incl. setting it up, readback, evaluators. For first-time setup - creating an Omni Space, granting access, ingestion, or ADOT instrumentation for Application Signals or Omni - use setting-up-cloudwatch-observability. Not for app logging or threat detection.
metadata
{"version":"10"}
# AWS Observability ## Overview Domain expertise for AWS observability across metrics, logs, and traces, for **two products** that share the CloudWatch name but are separate services with separate control planes, data models, and APIs: | | CloudWatch | CloudWatch Omni | |---|---|---| | **What it is** | Log groups, metric namespaces, alarms, Log Insights, X-Ray, Application Signals | Application Observability / Agent Observability. A **Space** per account per Region is the access boundary over the account's CloudWatch **Dataset** (OpenTelemetry logs, traces, and metrics); the Dataset is a CloudWatch resource the Space reads, not something the Space contains | | **Control plane** | `aws cloudwatch`, `aws logs`, `aws xray`, `aws application-signals` | `aws cloudwatchomni` (endpoint prefix `cloudwatch-omni`, signing name `cloudwatch`) | | **Query** | Log Insights query language; GetMetricData | SQL over `logs.default` / `traces.default`; PromQL over metrics; named views | | **Notify** | Alarms (metric, composite, anomaly) | **Alerts** (SQL/PromQL rule, contributors, OK/WARNING/CRITICAL/NODATA) | | **Topology** | Application Signals service map | **Context graph** (GetContextGraph) | | **Access** | IAM only | Domain → Space → **access grants** and **access profiles** (set up in `setting-up-cloudwatch-observability`) | | **Only here** | Dynamic Instrumentation, Synthetics canaries, CloudTrail auditing, EMF | Agent-quality evaluation, views, context graph | | **First-time setup** | Application Signals onboarding — ADOT auto-instrumentation, the `amazon-cloudwatch-observability` add-on, ServiceEvents, CI/CD metadata | Domain → Space → grants → telemetry in → plain-ADOT instrumentation | | **References** | `references/cloudwatch/` | `references/cloudwatch-omni/` | **This skill covers *using* both products, never setting either one up.** Both first-time setup paths above live in **`setting-up-cloudwatch-observability`** (same two-folder split); route there rather than describing an onboarding procedure from memory. Enabling Omni does not replace CloudWatch; log groups, metrics, and alarms keep working, and most customers use both. **Works best with** the [AWS MCP server](https://docs.aws.amazon.com/aws-mcp/) — enables running CLI commands, querying CloudWatch, and validating configurations directly. All guidance also works with standard AWS CLI access. **Note:** Reference files contain specific runtime versions, quota values, and feature matrices that may change. When precision matters (e.g. deploying to production, choosing a runtime, or checking a quota), confirm values against current AWS documentation rather than relying solely on the values in these files. ## Scope guard — is this an observability request? This skill owns the scope decision for every request routed to it, and this section is its sole home. **If a request is NOT about AWS observability with CloudWatch or CloudWatch Omni (weather, trivia, general chit-chat, non-observability coding), decline it in one sentence: state plainly that it is out of scope, never fabricate an answer, and never claim a false capability limitation (no "no internet access", no "no weather data") — the reason is simply that it is out of scope. Then redirect by naming what this skill does cover: querying CloudWatch and CloudWatch Omni logs, traces, and metrics, building dashboards, configuring alerts, investigating a service, or agent evaluation.** Do **not** attempt the off-topic task, and do **not** call a tool or run a query in pursuit of it. Keep it brief: no lecture, no long refusal. ## Step 0 — CloudWatch or CloudWatch Omni? Decide this before routing. The natural wording ("set up an alert for high latency", "build a dashboard", "query my logs") does not say which product the customer means. 1. **The customer names the product** — "Omni", "Application Observability", "Agent Observability", a Space, Domain, Dataset, access grant, `spaceId`, `cloudwatch-omni`, Omni SQL, PromQL, views, context graph, evaluators, agent evaluation / scoring traces / online or continuous evaluation / `gen_ai.evaluation`, and OTel span vocabulary (`traces.default`, `logs.default`, spans, `durationNano`, `status.code`, resource attributes, `service.name`) → **Omni**. "Log Insights", "log group", "metric namespace", "CloudWatch alarm", "metric alarm", "composite alarm", "anomaly alarm", "X-Ray", "Application Signals", "canary", "CloudTrail", "Dynamic Instrumentation" → **CloudWatch**. A "log group" named inside an agent-evaluation request is the online-evaluation data source to verify, not a CloudWatch signal. A bare "alarm" (or "alert") with no other product signal is ambiguous — fall through to rule 3 and probe: a Space → Omni alert ([alerts.md](references/cloudwatch-omni/alerts.md)); no Space → CloudWatch alarm ([cloudwatch/alarms.md](references/cloudwatch/alarms.md)). Exception: a "PromQL **alarm**" is a CloudWatch alarm on OTel metrics ([cloudwatch/alarms.md](references/cloudwatch/alarms.md)) — "alarm" wins over "PromQL". 2. **Knowledge or how-to question** ("what is an Omni alert", "does Omni have an API", "how do alerts differ from alarms") → answer from the reference files directly. Do **not** probe the account, and do not divert to the other product. Whether a capability exists is a fact about the product, not the account. [concepts.md](references/cloudwatch-omni/concepts.md) carries the full feature-equivalence matrix. 2a. **Authoring / how-to alert request** — "create / set up / write an Omni alert that fires when X", "how should I alert on Y" — with no Space or Region supplied and no go-ahead to actually create it, is a **HOW-TO** request. Deliver the authoring guidance (the alert row of "Must-state checklists" below, then [alerts.md](references/cloudwatch-omni/alerts.md)) **FIRST**, from the reference files. Do **NOT** stall on a Region/Space clarifying question and do **NOT** fall back to a CloudWatch alarm for a request that explicitly says "Omni alert". Probe the account only once the user supplies a Space/Region or asks you to create it. 2b. **A telemetry object is already in the prompt** — the user pastes, or the UI passes as context, a span, trace, log record, or query result and asks what it means, what errors it has, or how long it took. This is **not** a live-data request: do not probe the account, run a query, or ask the user to fetch it again. Read it in place per the "Reading a span or trace you already have" section of [query/sql-logs-traces.md](references/cloudwatch-omni/query/sql-logs-traces.md) and state every item in its must-state list. 2c. **A query request whose live result is empty or unreachable** ("show me the slowest spans", "which traces failed") is still answered with the **methodology** — the exact query and the field rules that make it correct (see the must-state callouts in [query/sql-logs-traces.md](references/cloudwatch-omni/query/sql-logs-traces.md)). Zero rows, a wrong-Region Space, or an unreachable endpoint is reported as a finding alongside the query, never as the whole answer. 3. **Request that must act on live data, and the wording is ambiguous** (not a Step 0.5 content question, which is answered from the catalog) → probe the target Region first: ``` aws cloudwatchomni list-domains aws cloudwatchomni list-spaces --region <target-region> --query "items[?region=='<target-region>']" # account-global; filter to the Region ``` - `list-spaces` is **account-global** (the `--region` flag only selects the endpoint), so filter its result to the target Region as shown rather than reading a non-empty list as proof; a Space is one per account per Region. See `references/cloudwatch-omni/concepts.md` for the full Region-probe rationale. - A Domain and a Space in that Region (a non-empty filtered list) → **Omni**. - No Space in that Region (an empty filtered list) → **CloudWatch**: alarms → [cloudwatch/alarms.md](references/cloudwatch/alarms.md), dashboards → [cloudwatch/dashboards.md](references/cloudwatch/dashboards.md), queries → [cloudwatch/log-insights.md](references/cloudwatch/log-insights.md), metrics → [cloudwatch/metrics.md](references/cloudwatch/metrics.md). If the customer explicitly asked for Omni and has no Space, that is a first-time setup — see step 4. - The probe itself errors ("not yet supported", unknown service, endpoint does not resolve) → the CLI/SDK model in use lacks `cloudwatchomni`. That is **not** evidence Omni is absent and must not be reported as "Omni is unavailable". The customer's installed AWS CLI/SDK most likely predates the service. If the request carried **any** Omni signal, give the customer the upgrade command to run (AWS CLI v2 reinstall or `brew upgrade awscli`; `pip install -U boto3 botocore`) and have them re-run `aws cloudwatchomni list-domains` — exact steps in [programmatic-access.md](references/cloudwatch-omni/programmatic-access.md). **Never run a package-manager upgrade or installer on the host yourself** (`brew`, `pip install -U`, `.pkg`/MSI); it mutates the customer's machine beyond the request and can break unrelated tooling — hand over the command and continue with the guidance. Never substitute a CloudWatch or X-Ray command for an Omni request. If the request carried **no** Omni signal, do not block on the upgrade. When you are already going back to the customer for missing inputs (for example an alert's threshold and period), ask which product they want in that same question: say the Space probe could not run on this CLI, describe both options, and build neither until they answer. When the request is fully specified or says not to ask, proceed on the CloudWatch path (the pre-Omni default) and mention the upgrade only in passing. - Still inconclusive → ask the customer. 4. **First-time setup, on EITHER product** → **STOP and route to the `setting-up-cloudwatch-observability` skill.** This skill covers a service or Space that already reports and holds no onboarding procedure for either product, so there is nothing here to fall back on: not Omni setup (creating a Domain or Space, granting access, ingestion, forwarding, Slack, instrumenting an app or AI agent for a Space) and not CloudWatch setup (**onboarding a service to Application Signals** — ADOT auto-instrumentation, the `amazon-cloudwatch-observability` add-on, monitored service, ServiceEvents, CI/CD metadata, the per-platform enablement guides). Any instrumentation / ADOT / collector request is a setup request either way; the setup skill owns the product decision too, so hand the whole request over rather than probing `list-spaces` yourself. Application Signals **once it is reporting** — service map, alarms on its metrics, Dynamic Instrumentation debugging — belongs here. **Under-specified alert requests:** When an alert or alarm request names what to watch (a symptom or a service) but not the inputs it needs — the threshold value and the evaluation period — ask for those rather than inventing them. Notifications are optional (per alerts.md), so ask for a notification destination only if the user wants to be notified. This holds on both paths (an Omni alert or a CloudWatch alarm). **Under-specified dashboard requests:** When a dashboard request names what to show but not which metrics, panels, or layout, ground those against the data and confirm the panel set rather than inventing panels; a dashboard has no threshold, period, or notification. For ANY dashboard authoring/save request, also open [dashboards.md](references/cloudwatch-omni/dashboards.md) and surface its "Facts you MUST surface when building or saving an Omni dashboard" checklist (see "Must-state checklists" below). Which signals or panels a named resource type needs is a Step 0.5 catalog question, not a dashboards-file question. ### Step 0.5 — Service-health investigation (routing) A large share of real questions are phrased as an operator symptom, not as a tool: "is my `<service>` throttled / slow / erroring / unhealthy," "which of my `<service>`s are `<symptom>`," "what's the health of my `<service>`," "what does `<service>` depend on and which is broken," "what signals / what should be on a dashboard or view for `<service>`." These are **observability-data questions. Start from the telemetry**, and answer with the *methodology* (the correct signals, aggregation, scoping, and caveats) even when you also pull live numbers and even when no matching resource exists in the account. Telemetry shows the symptom. The cause is often a configured value, so when the question is why something fails, also read the configuration of the resources involved, for example an API Gateway integration timeout, an SQS visibility timeout, or a Lambda timeout or event source mapping. A read-only or "logs only" role can usually still call these Get and Describe APIs. Make the call and report AccessDenied if it happens. Route by the symptom, then **open the reference and surface every applicable item in its "facts you MUST surface" checklist** — the checklist is the output contract, and it lives in the reference file, not here: - A **metric symptom about one AWS service** (throttling, latency, error rate, restarts, saturation, "what signals should it get", which signals or panels a named resource type needs on a dashboard or view) → [query/promql-metrics.md](references/cloudwatch-omni/query/promql-metrics.md). Open its **"Service-health question — facts you MUST surface"** section and surface every applicable item. Dashboard or view wording does not send this to either dashboards file (neither carries the signal facts) nor to rule 3's probe — it is a content question. - **"What does `<service>` depend on / what's broken downstream" / blast radius / who is affected / which direction do I walk the graph / what do `CALLS`, `ACCESSES`, `RUNS_ON` mean** → [context-graph.md](references/cloudwatch-omni/context-graph.md). Open its **"Dependency / blast-radius question — facts you MUST surface"** section and surface every applicable item. A slowness or error symptom phrased in terms of the graph, dependencies, or edge types routes here, not to the metric bullet above. - **A health VERDICT for a service ("is `<service>` healthy", "health summary of `<service>`") or a dependency map WITH ROLES ("what does `<service>` depend on and what role does each play", "which services call `<service>`")** → [service-health.md](references/cloudwatch-omni/service-health.md). Open its **"Service health & dependency question — facts you MUST surface"** section and surface every applicable item — it owns the combined verdict and the role-labelled dependency map, and defers the per-resource signal catalog and blast radius elsewhere. A bare single-service metric symptom, or a "what signals / panels does `<resource type>` need" or fleet-health-**view** ask, routes to the promql-metrics bullet above; a pure blast-radius / direction / edge-semantics question routes to the context-graph bullet. - **System status, a root-cause / triage symptom, or a past incident** — "is anything wrong right now?", "what's wrong with `<service>`", "why is `<service>` slow or erroring", "what changed since `<time>`", "users reported errors between X and Y — which service is the single most likely root cause", or any mention of insights, observations, or anomalies (a *cause* ask, not a single-signal health verdict or a dependency list) → [intelligence.md](references/cloudwatch-omni/intelligence.md): start from Omni Intelligence insights and observations, then use the context graph and queries to confirm. Its own "Scope and neighbours" section states which asks it hands back to the bullets above. - **Individual slow or failing spans / traces** ("slowest spans for `<service>`", "which traces failed") are trace **SQL**, not a metric aggregate → [query/sql-logs-traces.md](references/cloudwatch-omni/query/sql-logs-traces.md). Open its **"Span Duration"** and **"Finding failed spans"** sections and state every item in their must-state callouts — a request about a service's latency or error *rate* (an aggregate signal) is the PromQL bullet above instead. - **A failure being investigated from logs** ("is this only failing for X?", "how many errors?", "what is the root cause?") → [investigation.md](references/cloudwatch/investigation.md). Read every page and every scope before counting, and check the root cause against every fact before reporting it. ### Must-state checklists — the output contract Four Omni tasks carry a checklist the **answer text** must carry, not just the plan. Open the reference and surface every item relevant to the request; the reference holds the per-item detail and is the source of truth, so do not restate it here. | Task | Open | Section to surface | |---|---|---| | Authoring or advising on an Omni **alert** | [alerts.md](references/cloudwatch-omni/alerts.md) | "Facts you MUST surface when authoring an alert" | | Scoring traces, choosing an evaluator, reading stored scores, online/continuous evaluation, evaluation datasets, turning scores into agent changes | [agent-evaluation.md](references/cloudwatch-omni/agent-evaluation.md) | every **"tell the user ALL of this"** callout | | Exploring **traces** — one trace by id, comparing runs, finding traces by their spans, slowest traces, trace fields, agent sessions, token cost, what changed between two windows | [query/trace-exploration.md](references/cloudwatch-omni/query/trace-exploration.md) | every **"state … in the answer"** callout | | Authoring, saving, reading back, or debugging an Omni **dashboard** | [dashboards.md](references/cloudwatch-omni/dashboards.md) | "Facts you MUST surface when building or saving an Omni dashboard" | ## Routing — CloudWatch (`references/cloudwatch/`) | User need | Action | |-----------|--------| | Enabling/onboarding a service to Application Signals (auto-instrumentation, the `amazon-cloudwatch-observability` add-on, monitored service), propagating ServiceEvents git/deployment metadata through CI/CD, or the per-platform × per-language enablement steps | **STOP** — this is first-time CloudWatch setup and no reference here covers it. Route to the **`setting-up-cloudwatch-observability`** skill | | Writing Log Insights queries (pipe-delimited syntax: fields, filter, stats, sort, parse, display) | Read [log-insights.md](references/cloudwatch/log-insights.md). If StartQuery rejects the window as before the log group's creation time, read the same window with FilterLogEvents. See Known issues 11 there | | Configuring alarms (metric, composite, anomaly) | Read [alarms.md](references/cloudwatch/alarms.md). For an Omni **alert**, see the Omni table | | Publishing custom metrics or using EMF | Read [metrics.md](references/cloudwatch/metrics.md) | | X-Ray / ADOT tracing **behaviour** — X-Ray-SDK-vs-ADOT choice, trace and segment structure, annotations vs metadata, sampling rules, collector pipeline config, X-Ray→OTel migration traps | Read [tracing.md](references/cloudwatch/tracing.md). Onboarding an un-instrumented service is the setup skill's job (see the first row) | | Building CloudWatch dashboards (widget mechanics; which signals a given AWS service needs is Step 0.5) | Read [dashboards.md](references/cloudwatch/dashboards.md) | | Debugging observability issues | Read [troubleshooting.md](references/cloudwatch/troubleshooting.md) — starts with the 5 most common fixes |
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub