Evaluations & Auditability
Scoring agent quality on the traces you already emit
- Distinguish observability (what happened / how fast / what cost / where it failed) from evaluation (was it correct / helpful / safe), and explain why both ride the same OTEL traces
- Configure online evaluation to sample a percentage of production traces and read the scores in the GenAI Observability dashboard with no code changes
- Map the 13 built-in evaluators across Session, Trace, and Tool levels, plus trajectory-match and custom evaluators
- Explain how Evaluations consumes OTEL traces with GenAI semantic conventions from a Runtime endpoint or a CloudWatch log group, including Strands and LangGraph traces
- Build the auditability story: durable request/response logs plus trace and session IDs to CloudWatch Logs / S3 / Firehose, CloudTrail, and sensitive-data filtering
- Confirm the GA status of Evaluations (GA on March 31 2026), and treat its region coverage and pricing as volatile facts to verify against the live AWS source
Observability tells you what happened, how fast, what it cost, and where it failed. Evaluations answer a different question — was the agent correct, helpful, and safe? AgentCore Evaluations rides the exact same OTEL traces you already emit, samples a configurable percentage of production traffic, and scores it with 13 built-in evaluators (plus trajectory and custom) with no code changes. This lesson connects that quality layer to the durable request/response audit trail that lands in CloudWatch Logs, S3, or Data Firehose.
- 1Two questions, one stream of traces
- 2Online evaluation: sample a % of traces, no code changes
- 3The 13 built-in evaluators, by level
- 4How Evaluations reads your traces
- 5Auditability: the durable record behind every score
- 6Cost model and the gotchas worth knowing
Two questions, one stream of traces
By the time you reach this lesson you already have Observability wired up: AgentCore auto-instruments your Runtime-hosted agent with OpenTelemetry, spans land in CloudWatch as aws/spans, and the GenAI Observability dashboard shows you sessions, latency, token usage, and error breakdowns. That tells you a great deal — but it only answers operational questions.
There is a second class of question it does not answer:
| Pillar | The question it answers | Example signals |
|---|---|---|
| Observability | What happened? How fast? What did it cost? Where did it fail? | Latency, Session Count, token usage, InvocationError.Validation, error trajectory |
| Evaluation | Was it correct? Helpful? Safe? | Goal Success Rate, Correctness, Faithfulness, Harmfulness, Tool Selection Accuracy |
A trace can be perfectly healthy by every operational metric — 200 ms latency, no throttles, clean span tree — and still be wrong: the agent hallucinated a refund policy, picked the wrong tool, or answered a question it should have refused. Latency cannot see that. Quality scoring can.
The key architectural insight is that both pillars ride the same OTEL traces. You do not emit a second, separate telemetry stream for evaluation. Observability is the data foundation; Evaluations is a consumer that reads those traces, applies LLM-as-a-judge and deterministic scorers, and writes the resulting scores back into the same Observability dashboard. Nothing new to instrument.
Key insight
The framing to memorize
Observability = "what happened / how fast / what cost / where it failed." Evaluation = "was it correct / helpful / safe." Same traces, two lenses. If you can recite this split you understand the relationship between the two services.
Watch out
Now GA — but still verify regions and pricing
AgentCore Evaluations launched in public preview at re:Invent 2025 and reached GA on March 31 2026 (online + on-demand evaluation, 13 built-in evaluators, custom evaluators, Observability integration, and nine launch regions). Region coverage and pricing remain [VOLATILE] — confirm your deploy region and the live numbers on the official AWS source before depending on it. See https://aws.amazon.com/about-aws/whats-new/2026/03/agentcore-evaluations-generally-available/ and the AWS What's New feed.
Online evaluation: sample a % of traces, no code changes
The headline workflow is online evaluation. Instead of building a separate offline test harness, you tell AgentCore to sample a configurable percentage of the traces your agent is already producing in production, score that sample, and surface the scores in the Observability dashboard. The critical property for a Builder: no code changes to the agent. Because evaluation rides the existing OTEL traces, you are not adding a judge call to your hot path or redeploying.
Conceptually the loop is:
Production traffic
|
v
AgentCore Runtime --(OTEL traces, GenAI semantic conventions)--> CloudWatch (aws/spans)
| |
| sample X% of traces
| v
| AgentCore Evaluations
| (built-in + custom evaluators)
| |
+<------------------ scores written back to the GenAI dashboard ------+The sampling percentage is the dial that controls cost versus signal. Evaluators are themselves LLM-backed for the judgment-based scores, so a higher sample rate means more judge tokens. The AgentCore CLI exposes evaluators as a first-class resource you can attach to a project:
# New AgentCore CLI (@aws/agentcore) — evaluator is an attachable resource
agentcore add evaluator
agentcore deploy
# Inspect traces the evaluators will score
agentcore traces listYou then read results in CloudWatch under the GenAI Observability surface (the same #gen-ai-observability view, Bedrock AgentCore tab) where you already view sessions and traces — the scores appear alongside the trajectory and timeline for each sampled session.
Tip
Start with a low sample rate
Online evaluation runs LLM judges over sampled traffic, and the built-in evaluators bill per input + output token (custom evaluators bill per 1k evals) — all numbers are [VOLATILE], verify https://aws.amazon.com/bedrock/agentcore/pricing/. Begin with a small sampling percentage to validate that the evaluators are catching real quality regressions before you turn the dial up across high-volume traffic.
Note
Online vs offline
Online evaluation scores live production traces on a sample basis. That is the no-code-change path this lesson focuses on. You can also run evaluators over a curated dataset offline (a regression suite), but the sampling-the-real-traffic model is what makes Evaluations distinct from a hand-rolled eval script.
The 13 built-in evaluators, by level
AgentCore ships 13 built-in evaluators organized by the level of the trace they score. Picking the right level matters: a session-level metric judges the whole conversation, a trace-level metric judges a single turn's response, and a tool-level metric judges the agent's tool-use decisions.
| Level | What it scores | Built-in evaluators |
|---|---|---|
| Session | The whole multi-turn session against the user's goal | Goal Success Rate |
| Trace | A single turn / response | Helpfulness, Correctness, Coherence, Conciseness, Faithfulness, Harmfulness, Instruction Following, Response Relevance, Context Relevance, Refusal, Stereotyping |
| Tool | The agent's tool-use behavior | Tool Selection Accuracy, Tool Parameter Accuracy |
Beyond those, two more categories round out coverage:
- Trajectory match — did the agent take the expected path through tools/steps? Variants: Exact Order Match, In-Order Match, and Any Order Match. Use these when the sequence of actions matters (e.g. "check inventory before charging the card").
- Custom evaluators — define your own scorer for domain rules the built-ins do not cover (e.g. "did the agent cite a knowledge-base article ID?").
A few of these deserve a Builder's attention because they map to real failure modes:
- Faithfulness vs Correctness — Faithfulness asks "is the answer grounded in the context the agent was given?" (the anti-hallucination check), while Correctness asks "is the answer actually right?". A RAG agent can be faithful to a wrong document.
- Harmfulness, Stereotyping, Refusal — the safety triad.
Refusalflags when the agent declined; pairing it withHarmfulnesstells you whether refusals are protecting users or just being unhelpful. - Tool Selection Accuracy / Tool Parameter Accuracy — the two tool-level scorers separate "called the wrong tool" from "called the right tool with bad arguments," which are very different bugs to fix.
Example
Choosing levels for a support agent
For a customer-support agent: use Goal Success Rate (session) to track whether tickets actually get resolved, Faithfulness + Correctness (trace) to catch hallucinated policies, Harmfulness + Refusal (trace) for safety, and Tool Selection Accuracy (tool) to verify it reaches for the refund tool only when eligible. Add a custom evaluator for any company-specific rule, and an In-Order Match trajectory check if certain steps must precede others.
How Evaluations reads your traces
Evaluations does not invent its own data format — it reads OTEL traces that follow the GenAI semantic conventions. Those conventions standardize how an agent's LLM calls, tool invocations, and inputs/outputs appear as span attributes, which is what lets a generic evaluator understand a trace it has never seen before.
There are two sources it can read from:
- A Runtime endpoint — your agent deployed on AgentCore Runtime, auto-instrumented, emitting traces as part of normal operation.
- A CloudWatch log group — traces already collected in CloudWatch (e.g.
aws/spansvia Transaction Search, or a vended-log delivery group), including agents running outside Runtime that you instrumented with ADOT.
Because it operates at the OTEL layer, Evaluations is framework-agnostic: it consumes Strands and LangGraph traces (also OpenInference-format traces) as long as they emit the GenAI semantic conventions. For Strands you must enable the OTEL extra so the framework actually emits traces:
# Strands agent — emit OTEL traces that Evaluations can read
# pip install 'strands-agents[otel]'
from strands import Agent
agent = Agent() # Runtime auto-instruments; traces carry GenAI semantic conventionsThe non-negotiable prerequisite is the same one from the Observability setup lesson: CloudWatch Transaction Search must be enabled first so spans are searchable, and the framework must actually be emitting traces (the strands-agents[otel] extra or an auto-instrumentor). If no traces flow, there is nothing to sample and nothing to score.
Watch out
No traces, no evaluation
Evaluations is a consumer of telemetry. If your framework is not emitting OTEL traces (forgot strands-agents[otel] / an auto-instrumentor), or Transaction Search was never enabled, the dashboard will be empty and online evaluation has nothing to sample. Verify traces appear in the GenAI Observability view before wiring up evaluators.
Auditability: the durable record behind every score
A quality score is only trustworthy if you can go back and inspect the exact interaction it scored. AgentCore's auditability story is built on the same telemetry plumbing.
Durable request/response logs. AgentCore Runtime emits APPLICATION_LOGS that capture the full request_payload and response_payload for each invocation, stamped with trace_id, span_id, and session_id. That means every score the evaluator produces is correlatable back to the literal input the agent received and the literal output it returned, joined by trace and session IDs.
Durable destinations. These logs and spans are durable and can be delivered to CloudWatch Logs, Amazon S3, or Amazon Data Firehose via vended-log delivery — so you can retain an audit trail for as long as compliance requires:
# Vended-log delivery: send Runtime application logs to a destination (CWL / S3 / Firehose)
aws logs put-delivery-source \
--name my-agent-app-logs \
--resource-arn <agent-runtime-arn> \
--log-type APPLICATION_LOGS
aws logs put-delivery-destination \
--name my-agent-dest \
--delivery-destination-configuration 'destinationResourceArn=<s3-or-firehose-or-loggroup-arn>'
aws logs create-delivery \
--delivery-source-name my-agent-app-logs \
--delivery-destination-arn <delivery-destination-arn>The default Runtime log group is /aws/bedrock-agentcore/runtimes/<agent_id>-<endpoint>/...; non-Runtime resources use /aws/vendedlogs/bedrock-agentcore/{resource-type}/APPLICATION_LOGS/{resource-id}.
Control-plane audit via CloudTrail. Operational/management actions against AgentCore (creating runtimes, attaching evaluators, etc.) are recorded in AWS CloudTrail, giving you a who-did-what trail separate from the data-plane request/response logs.
Filter sensitive data — this is on you. Because APPLICATION_LOGS capture full request/response payloads, they will capture PII and secrets unless you filter them before emission. This is the single most important auditability gotcha: a durable, queryable record of every prompt and response is exactly what an auditor wants and exactly what a breach wants. Strip or redact sensitive fields in your agent before they reach the log payload.
Watch out
PII leaks into APPLICATION_LOGS by default
Full request_payload / response_payload capture is a feature for auditability and a liability for privacy. AWS explicitly warns: filter sensitive data before emission. Combine least-privilege IAM on the log destinations with redaction in the agent. Do not assume the logs are safe to share just because they live in your account.
Tip
Correlate scores back to evidence
When an evaluator flags a low Faithfulness score, pivot from the score in the GenAI dashboard to the session via session.id, then to the exact request_payload/response_payload in APPLICATION_LOGS using the matching trace_id/span_id. That join is what turns 'the agent scored poorly' into 'here is the exact turn where it hallucinated.'
Cost model and the gotchas worth knowing
Evaluations is consumption-priced, and the dimensions matter for how aggressively you sample.
- Built-in evaluators bill per input + output token consumed by the judge model.
- Custom evaluators bill per 1,000 evaluations.
All concrete rates are [VOLATILE] — teach the dimension, verify the number at https://aws.amazon.com/bedrock/agentcore/pricing/. (As of writing the pricing page lists built-in at roughly per-thousand-token rates and custom at a per-1k-evals rate — confirm the live figures before budgeting.)
Observability itself has no service-specific charge — its telemetry is billed at standard CloudWatch rates (Transaction Search first 1% of indexed spans free, then per indexed span; plus Logs ingestion/storage). So your total quality-and-audit bill is: CloudWatch (the trace/log substrate) + Evaluations (the scoring on top).
The gotchas that bite Builders:
- Sampling rate drives cost. Online evaluation runs judges over sampled traffic; a high sample rate over high-volume traffic multiplies judge tokens. Tune deliberately.
- No traces, no scores. Evaluations cannot score what was never emitted — confirm Transaction Search is on and the framework emits OTEL.
- PII in logs. Covered above — filter before emission.
- GA since March 31 2026. Still confirm region availability and pricing before depending on it in production governance.
- Don't conflate the two pillars. A green Observability dashboard (low latency, no errors) is not a quality guarantee; only evaluators answer correct/helpful/safe.
Key insight
The whole stack, in one sentence
You instrument once (OTEL), it lands in CloudWatch (Observability, billed at CloudWatch rates), Evaluations samples and scores it (billed per token / per 1k evals), and the durable request/response logs give you the audit trail behind every score — with CloudTrail covering the control plane and you owning PII redaction.
Try it: Score your agent's quality on the traces you already emit
Goal: turn the traces from your Observability setup into quality scores, then trace a low score back to the exact interaction that produced it. (Confirm AgentCore Evaluations is available in your region first — it reached GA on March 31 2026 across nine launch regions; check the live status and pricing.)
-
Confirm traces are flowing. You should already have an agent on AgentCore Runtime emitting OTEL traces (Strands users: ensure
strands-agents[otel]is installed). Open CloudWatch ->#gen-ai-observability-> the Bedrock AgentCore tab and verify you see sessions and trace trajectories. If the view is empty, you have nothing to evaluate — fix the trace emission and that Transaction Search is enabled before continuing. -
Attach an evaluator with online evaluation. Using the AgentCore CLI, run
agentcore add evaluatorand choose a small set to start: a Session evaluator (Goal Success Rate), two Trace evaluators (Faithfulness + Harmfulness), and one Tool evaluator (Tool Selection Accuracy). Set a low sampling percentage (e.g. a few percent) so judge-token cost stays small while you validate. Thenagentcore deploy. Note that you changed zero lines of agent code. -
Generate scored traffic. Invoke the agent several times with
agentcore invoke, including at least one prompt designed to make it slip — e.g. ask about a policy that is not in its context (to probe Faithfulness) and one borderline-unsafe request (to probe Harmfulness/Refusal). -
Read the scores. Back in the GenAI Observability dashboard, find the sampled sessions and inspect the per-level scores beside each trace's trajectory and timeline. Identify your lowest Faithfulness score.
-
Pivot to the evidence. From the low-scoring session, capture its
session.id, then queryAPPLICATION_LOGS(default group/aws/bedrock-agentcore/runtimes/<agent_id>-<endpoint>/...) for the matchingtrace_id/span_idand read the literalrequest_payloadandresponse_payload. Confirm the score matches what the agent actually did. -
Harden the audit trail. Set up a vended-log delivery (
aws logs put-delivery-source --log-type APPLICATION_LOGS,put-delivery-destination,create-delivery) to durably ship those logs to an S3 bucket. Then identify one field in the payload that is PII or a secret and describe (or implement) how you would redact it before emission — because AgentCore does not do this for you. -
Reflect (3-4 sentences). Which evaluator caught a real problem your latency/error dashboard could not have? What sampling percentage would you run in production, and why? What is your PII-redaction plan? And note the region availability and pricing of Evaluations as you found them on the live AWS page.
Key takeaways
- 1Observability and Evaluations are two lenses on the SAME OTEL traces: observability = what happened / how fast / what cost / where it failed; evaluation = was it correct / helpful / safe. Observability is the data foundation; Evaluations consumes it.
- 2Online evaluation samples a configurable percentage of production traces and scores them in the GenAI Observability dashboard with NO code changes — you are not adding a judge to the hot path.
- 3There are 13 built-in evaluators across three levels: Session (Goal Success Rate); Trace (Helpfulness, Correctness, Coherence, Conciseness, Faithfulness, Harmfulness, Instruction Following, Response Relevance, Context Relevance, Refusal, Stereotyping); Tool (Tool Selection Accuracy, Tool Parameter Accuracy) — plus trajectory-match (Exact/In-Order/Any Order) and custom evaluators.
- 4Evaluations reads OTEL traces with GenAI semantic conventions from a Runtime endpoint or a CloudWatch log group, is framework-agnostic, and consumes Strands and LangGraph traces (Strands needs the `strands-agents[otel]` extra; Transaction Search must be enabled first).
- 5Auditability rides durable APPLICATION_LOGS that capture full request_payload/response_payload plus trace_id/span_id/session_id, deliverable to CloudWatch Logs, S3, or Data Firehose, with CloudTrail for control-plane actions.
- 6You MUST filter PII and secrets before emission — APPLICATION_LOGS capture full payloads by default, which is great for audit and dangerous for privacy.
- 7Status: public preview at re:Invent 2025, GA on March 31 2026 (online + on-demand, 13 built-in evaluators, 9 launch regions) — confirm your region and pricing on the live AWS source. Built-in evaluators bill per in+out token, custom per 1k evals (numbers [VOLATILE]); Observability adds no charge beyond standard CloudWatch rates.
Quiz
Lock in what you learned
Check your understanding
0 / 4 answered
1.Your Observability dashboard shows a session with 180 ms latency, zero throttles, and a clean span tree, yet a customer complained the agent gave a wrong refund policy. What does this tell you about the two pillars?
2.What is the defining characteristic of AgentCore's ONLINE evaluation workflow?
3.A RAG agent confidently answers using a document that is itself outdated and wrong. Which built-in evaluator distinction matters most here?
4.You are setting up auditability so every evaluator score can be traced back to evidence. Which statement is correct?
Go deeper
Hand-picked sources to keep learning
The primary deep-dive on the 13 built-in evaluators and online evaluation. For GA status (March 31 2026), regions, and pricing, cross-check the AWS What's New GA post and the pricing page.
The first-party GA announcement (March 31 2026): online + on-demand evaluation, 13 built-in evaluators, custom evaluators, Observability integration, and the nine launch regions. The authoritative source for the status.
The data foundation Evaluations rides on: OTEL traces, the GenAI dashboard, and the trace/session model.
Telemetry model, APPLICATION_LOGS, vended-log delivery to CloudWatch Logs / S3 / Firehose, and Transaction Search setup.
The #gen-ai-observability dashboard, Sessions/Trace views, and raw CloudWatch log-group locations.
[VOLATILE] Evaluations bills per in+out token (built-in) / per 1k evals (custom); Observability is pass-through to CloudWatch. Verify the live numbers.
Where Evaluations sits among the AgentCore modules — now listed in the Core services table (GA since March 31 2026).