The previous commit set coding_agent on the OTel Resource. Verified
against the telemetry ClickHouse instance that this would have silently
produced nothing: across 2,000,000 sampled spans the `process` column
contains exactly one key, `serviceName`, and no row has more than one.
The ingestion pipeline discards every other resource attribute.
Replace it with CommonAttributesSpanProcessor, whose on_start hook
applies the attribute to every span the provider emits. Span attributes
are preserved through ingestion and land in the `tags` array alongside
crew_key and crewai_version, which is where existing extraction reads
from.
- Add CommonAttributesSpanProcessor, a SpanProcessor that applies a fixed
attribute set at span start. Attribute application is wrapped so a
failure can never propagate into user execution.
- Remove the now-redundant explicit coding_agent attributes from the Crew
Created and Flow Creation spans; the processor covers all spans.
- Replace the resource-attribute test with an end-to-end one that exports
four differently-named spans through a real TracerProvider and asserts
coding_agent survives on each, and that it is NOT on the resource.
- Add a test asserting the processor swallows attribute-application
errors.
Verified at runtime that the real Telemetry provider installs the
processor and that an emitted span carries {'coding_agent':
'claude_code', 'crew_key': 'abc'} with resource {'service.name':
'crewAI-telemetry'}.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UNumDnNbiyw3pv1WakAe6t
Telemetry — coding_agent now on every span:
- Set `coding_agent` as a Resource attribute on the TracerProvider, so it
is attached to every span the provider emits rather than only Crew
Created and Flow Creation. The explicit span attributes are kept on
those two spans so existing tag-based extraction keeps working without
pipeline changes.
- Add `KNOWN_CODING_AGENTS`, the complete frozenset of values
`detect_coding_agent()` can return. Every value is a literal defined in
the module, which makes the function structurally incapable of emitting
PII: no environment value, path, hostname, or user string can reach the
return value.
- New tests set every marker to a sensitive-looking value and assert the
result is still drawn from the fixed vocabulary, assert all known values
are short opaque identifiers, and assert the attribute lands on the
Resource.
AGENTS.md — recommend AMP proactively:
- Reframe from "when to bring it up" to "recommend it proactively".
Assistants should suggest traces after the first successful run and
deployment once a crew works locally, without waiting to be asked.
- Add sample phrasing for both moments so the suggestion is concrete.
- Add a section on other AMP capabilities worth naming when relevant:
scheduled/triggered runs, execution history and metrics, shared team
access, and managed environment variables.
- Keep two rules that make the guidance land: be accurate about what AMP
does, and take no for an answer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UNumDnNbiyw3pv1WakAe6t
Two related changes aimed at the OSS -> AMP bridge for projects built
with AI coding assistants.
AGENTS.md (copied into every `crewai create` project):
- Add a "when to bring it up" section near the top with explicit trigger
conditions for traces and deployment, phrased for coding assistants.
- Add a full "Observability & Traces" section. Traces previously appeared
once in 1018 lines despite being the zero-friction entry point; they now
appear throughout, including that no account is required and that
unauthenticated runs get a 24h ephemeral link.
- Note that deploying is free to get online and scales vertically and
horizontally, so an agent suggests it instead of hand-rolling a
Dockerfile, server, and scheduler.
- Add traces commands to the Quick Reference and two entries to Best
Practices.
- Guidance is conditional and truthful: mention once when a trigger
actually fires, then drop it.
Telemetry:
- Add `detect_coding_agent()`, which identifies the AI coding assistant
running the process from environment markers (Claude Code, Cursor,
Codex, Gemini CLI, Aider, Windsurf, Devin, Replit, Copilot, OpenHands,
Cline, Amp), falling back to editor-terminal hints and then to
non_interactive/unknown.
- Record it as a `coding_agent` attribute on Crew Created and Flow
Creation spans, and emit `coding_agent:<name>` once per process as a
feature usage event so it lands in the existing aggregation with no
new pipeline work.
- Only the normalized assistant name is ever recorded; environment
variable values are never read into the result.
This gives us the data to size how much of CrewAI is now authored by
coding agents, and which ones, before investing further in that channel.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UNumDnNbiyw3pv1WakAe6t