A multipart guide. What does it take to run an agent in production — observe it, scale it, deploy it, test it, evolve it — across ten frameworks spanning Python, TypeScript, .NET, Java, Go, and Rust? This index orients you across five chapters, each focused on a different operational axis, with source-grounded comparisons and practical takeaways.
Six observations that frame the rest of the guide.
Six frameworks ship direct OpenTelemetry SDK dependencies; the other four reach OTel through a bridge (Micrometer, tracing-opentelemetry, LangSmith). Every framework gets there.
Genkit Go and Rig cold-start in 20–80 ms; .NET AOT and Quarkus native in tens to low hundreds; Mastra on edge runtimes ~50–100 ms; Python frameworks all 2–4 seconds.
Cloudflare Workers, Vercel Edge, and Deno Deploy require JavaScript or WASM. Of the ten, only Mastra ships turnkey edge deployment.
LangChain, ADK, Mastra, MS Agent Framework, Genkit Go ship mature eval frameworks; CrewAI ships an experimental one. LLM-as-judge is in every one of them.
LangChain (50+ vector stores), LangGraph (state-as-memory), CrewAI (scoped + LanceDB), ADK (Session + Memory services), Mastra (thread-scoped Memory with semantic recall), LangChain4j (window-based + ~30 stores).
Seven frameworks land at "Low effort to swap a default" — nearly every component is an abstract base class, interface, or trait. CrewAI, SK, and Genkit Go land at moderate friction.
Pick a chapter by the operational lens you care about. Each ships a comparison across all ten frameworks plus a six-card cheat sheet at the end.
What each framework emits and how it integrates with OpenTelemetry, vendor dashboards, and structured logging.
What knobs each framework gives you to make agents feel fast at the request level.
Where each framework can run, how fast it boots, how big the artifact ships.
How each framework supports unit tests, golden-set quality regression, and replay of past runs.
The day-2 surfaces — where config comes from, how easy it is to swap defaults, what memory ships, and how sessions get isolated.
Chapter 1 also has a companion deep dive — Execution Telemetry Depth: when an agent misbehaves in production, can you see the full ReAct loop (prompt, visible reasoning, tool args, result)? And is that visibility free, flag-gated, or vendor-locked?
Five Python frameworks plus five non-Python representatives — one each for TypeScript, .NET, Java, Go, and Rust.
One headline observation per chapter, per framework. For nuance, every chapter has a "What this means in practice" card that synthesises the comparison.
| Framework | Observability | Performance | Deployment | Testing | Configuration |
|---|---|---|---|---|---|
| LangChainPython | Callbacks → LangSmith bridge to OTel | Batch + cache + parallel async | Long-running server; ~2–4 s cold start | 5 fake-LLM variants + comprehensive evals | LangChain Hub for prompt versioning |
| LangGraphPython | Inherits LangChain callbacks | Auto-parallel ToolNode | langgraph dev / up CLI | Replay via checkpointer state | thread_id native multi-tenancy |
| CrewAIPython | Native OTel; flat-but-named spans | RPMController throttle | Long-running server; stateful | Experimental eval module | Scoped Memory + LanceDB |
| Google ADKPython | Native OTel + Gen AI semconv | Streaming-first async generator | Cloud Run / Vertex AI native | Eval cases + replay | YAML LlmAgentConfig |
| Semantic KernelPython | OTel decorators + Meter | Async-first; serial tools | FastAPI / ASP.NET host | No eval framework | Per-kernel ChatHistory |
| MastraTypeScript | Native OTel + 9 vendor packages | Vercel AI SDK SSE-ready | Edge runtime turnkey; ~50–100 ms cold | 12 eval scorers + LLM-as-judge | threadId + Memory class |
| MS Agent Framework.NET | ActivitySource + Gen AI semconv v1.37 | IAsyncEnumerable streaming | AOT ~200 ms; ASP.NET Core host | MEAI Evaluation integration | DI + appsettings + workflows |
| LangChain4jJava | Listener + Micrometer bridge | Virtual-thread parallel tools (Java 21+) | Quarkus native ~50 ms; Spring Boot | ChatModelMock (experimental) | chatMemoryProvider callback |
| GenkitGo | Native OTel; slog structured logs | Goroutines; SSE handler bundled | Single Go binary; ~30–80 ms cold | Plugin evaluators (DeepEqual / Regex / Jsonata) | .prompt files; hot reload |
| RigRust | tracing-opentelemetry bridge | Tokio Stream traits | Single Rust binary; ~20–60 ms cold | Trait-based test impls | Builder + rig-memory crate |