<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog - Sematext Community</title>
	<atom:link href="https://sematext.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://sematext.com/blog/</link>
	<description>Solr / Elasticsearch Experts - Search &#38; Big Data Analytics</description>
	<lastBuildDate>Tue, 08 Sep 2026 19:42:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.7</generator>

<image>
	<url>https://sematext.com/wp-content/uploads/2024/12/cropped-ST-favicon-32x32.png</url>
	<title>Blog - Sematext Community</title>
	<link>https://sematext.com/blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI Observability: What Should You Monitor in AI Applications?</title>
		<link>https://sematext.com/blog/ai-observability-what-should-you-monitor-in-ai-applications/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Mon, 07 Sep 2026 14:57:36 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI agents]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=71077</guid>

					<description><![CDATA[<p>What is AI Observability AI observability is often described as “monitoring LLMs”, but that definition is way too narrow. There is so much more that AI applications do that needs monitoring. A production AI application can involve an LLM, multiple model providers, prompts, embeddings, vector databases, RAG pipelines, agents, tools, external APIs, memory, guardrails, GPUs, [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/ai-observability-what-should-you-monitor-in-ai-applications/">AI Observability: What Should You Monitor in AI Applications?</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 id="what-is-ai-observability">What is AI Observability</h2>
<p>AI observability is often described as “monitoring LLMs”, but that definition is way too narrow. There is so much more that AI applications do that needs monitoring.</p>
<p>A production AI application can involve an LLM, multiple model providers, prompts, embeddings, vector databases, RAG pipelines, agents, tools, external APIs, memory, guardrails, GPUs, and traditional application infrastructure. An AI application can also be perfectly healthy from an infrastructure perspective while producing inaccurate, unsafe, expensive, or completely useless results.</p>
<p>All these are aspects of AI that could and should be observed.</p>
<p>In traditional IT observability we asked questions such as: Is the application available? Is it fast? Are there errors? Are resources healthy? For AI observability we have to go further: What did the AI do? Why did it do it? Was the result good? Was it safe? How much did it cost? And did it actually accomplish what the user wanted?</p>
<p>In this article, I explore the different dimensions of AI observability and the tools available for monitoring them.</p>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;"><strong style="color: #991b1b;"><br>
Note:</strong></strong>All tools mentioned in this article I have actually covered in the recently published <a href="https://sematext.com/blog/best-ai-agent-monitoring-tools/">Best AI Agent Monitoring Tools: Reviews &amp; Comparisons</a>, so if you want to learn more about any one of them, that’s where you’ll find each of them reviewed and compared to others.
</div>
<h2 id="1-ai-infrastructure"><b>1. AI Infrastructure</b></h2>
<p>At the foundation is the infrastructure running your AI workloads.</p>
<p>For self-hosted models, this includes the usual infrastructure metrics (CPU, memory, disk, network, availability…), but also GPU utilization, GPU memory, accelerator utilization, model-loading time, batch sizes, queue depth, and concurrency. GPU utilization is particularly important because an expensive GPU that spends most of its time idle is an expensive resource that’s not doing much work.</p>
<p>Model-serving performance also introduces metrics that aren’t particularly common in traditional application monitoring. <b>Time to first token (TTFT), time between tokens, tokens per second, queueing time, and total generation time</b> can have a direct impact on user experience.</p>
<p>Tools such as <b>Datadog</b>, <b>New Relic</b>, and <b>Dynatrace</b> can monitor the infrastructure and application components surrounding AI workloads. For organizations running their own GPU infrastructure, specialized GPU monitoring can be added to provide deeper visibility into accelerator utilization and performance.</p>
<h2 id="2-llm-requests-and-responses"><b>2. LLM Requests and Responses</b></h2>
<p>Every call to an LLM is an important observable event.</p>
<p>You want to know which model was called, which provider served the request, how long it took, whether it succeeded, how many input and output tokens were consumed, what parameters were used, and why generation stopped. This is the AI equivalent of monitoring or tracing HTTP requests or database queries, but with considerably more semantic information.</p>
<p>This data is particularly useful when something changes. A new model version may increase latency. A prompt change may double token consumption. A provider may start returning more errors. A model that looked inexpensive during development may become surprisingly expensive in production.</p>
<p><b>Langfuse</b> provides open-source LLM tracing with visibility into requests, responses, latency, tokens, and costs. <b>W&amp;B Weave</b> provides similar tracing capabilities and connects LLM calls to evaluations and experiments, making it easier to understand not just how an individual request performed but whether changes to the application improved it.</p>
<h2 id="3-end-to-end-ai-traces"><b>3. End-to-End AI Traces</b></h2>
<p>A user request rarely results in a single model call.</p>
<p>Consider a customer asking an AI assistant a question. The application might retrieve some documents, send them to an LLM, have the LLM decide to call a tool, invoke an external API, send the result back to the model, make another model call, and finally generate the answer.</p>
<p>A single LLM trace isn’t enough to understand this. You need an <b>end-to-end trace</b> showing the entire execution path and the relationships between its individual operations. That allows you to answer questions such as <i>Why did this request take 15 seconds?</i>, <i>Which model call was responsible?</i>, or <i>Why did the agent call this API?</i></p>
<p>While there are commercial tools built around tracing and evaluation of AI applications, OpenTelemetry is also becoming increasingly relevant here. Its emerging <a href="https://github.com/open-telemetry/semantic-conventions-genai" target="_blank" rel="noopener noreferrer">GenAI conventions </a>provide a standardized way to represent AI operations alongside traditional distributed traces.</p>
<h2 id="4-prompts-and-context"><b>4. Prompts and Context</b></h2>
<p>With conventional software, developers generally think of code as the program.</p>
<p>With LLM applications, <b>the prompt is part of the program</b>.</p>
<p>Changing a system prompt, adding an instruction, modifying a few-shot example, changing the conversation history, or altering the model parameters can dramatically change application behavior. Consequently, observing which prompt was used and even which version of that prompt was used, is essential for debugging.</p>
<p>Context is equally important. To be meaningful, a production trace may need to show the system instructions, conversation history, retrieved documents, user context, tool descriptions, and other information supplied to the model.</p>
<p>This information can contain sensitive data, so prompt and context observability needs appropriate access controls, redaction, and retention policies.</p>
<p><b>Langfuse</b> combines observability with prompt management and versioning, making it possible to associate production traces with the prompt version that generated them. <b>Arize Phoenix</b> also provides prompt management and experimentation capabilities. <b>Sematext AI Agent Watch</b> looks for Personally Identifiable Information (PII) in prompts.</p>
<h2 id="5-ai-output-quality"><b>5. AI Output Quality</b></h2>
<p>This is where AI observability starts to diverge significantly from traditional observability.</p>
<p>A conventional application can return HTTP 200 and still be wrong, but in most applications a successful response provides a reasonably strong indication that the operation worked. With AI, a perfectly successful API request can produce a completely useless answer.</p>
<p>AI observability therefore needs to measure things such as <b>correctness, relevance, completeness, helpfulness, instruction-following, and format compliance</b>.</p>
<p>Some of these properties can be evaluated deterministically. Others require reference answers, human evaluation, specialized models, or LLM-as-a-judge techniques. The important point is that an AI system needs to be observed at the level of <b>behavior and outcomes</b>, not just infrastructure.</p>
<p>We need to evaluate the quality of AI outputs for the same reason that traditional information retrieval systems. For comparison, there we had very <a href="https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)" target="_blank" rel="noopener noreferrer">established metrics like precision, recall, mean reciprocal rank, and normalized discounted cumulative gain</a>, etc.</p>
<p><b>Arize Phoenix</b> provides evaluators that can be applied to production traces, including LLM-as-a-judge evaluations. <b>W&amp;B Weave</b> similarly supports custom scorers and LLM judges, allowing teams to continuously evaluate production behavior.</p>
<h2 id="6-hallucinations-and-groundedness"><b>6. Hallucinations and Groundedness</b></h2>
<p>Few things are more important to monitor in generative AI than hallucinations.</p>
<p>As we’ve all seen, an LLM can produce an answer that sounds authoritative and convincing while being completely fabricated. Monitoring hallucinations means determining whether the answer is supported by the information available to the model and whether the claims it makes are consistent with that information.</p>
<p>This is particularly important for RAG applications. When an answer is wrong, you want to know whether the problem was retrieval, generation, or both. Did the system retrieve the wrong documents? Did it retrieve the right documents but fail to use them? Or did the model simply invent information despite having the correct context?</p>
<p><b>Ragas</b> is an open-source framework focused heavily on evaluating RAG applications, including metrics around faithfulness and answer relevance. <b>Arize Phoenix</b> provides RAG and grounding-related evaluations that can be connected directly to application traces.</p>
<h2 id="7-rag-and-retrieval"><b>7. RAG and Retrieval</b></h2>
<p>Similar to the above, for every retrieval operation, you may want to know the query that was generated, which documents or chunks were returned, their relevance scores, how many were retrieved, which ones actually made it into the prompt, and how long retrieval took.</p>
<p>This lets you distinguish between <i>“the LLM couldn’t answer the question”</i> and <i>“the information required to answer the question was never retrieved.”</i></p>
<p>You can also monitor the components underneath retrieval: embedding generation, embedding-model versions, chunking strategies, vector search latency, filtering, reranking, and retrieval relevance. Changes to any of these can affect the final answer even when the LLM itself hasn’t changed.</p>
<p><b>Arize Phoenix</b> provides tracing and evaluation for RAG pipelines, while <b>W&amp;B Weave</b> can trace retrieval operations and evaluate the quality of retrieved information alongside the generated answer.</p>
<h2 id="8-ai-agents"><b>8. AI Agents</b></h2>
<p>AI agents make observability considerably more complicated.</p>
<p>A conventional LLM application might send a prompt and receive an answer. An agent can decide what to do next, and that can include a whole bunch of things. It can call a tool, inspect the result, make another decision, call another tool, retry an operation, delegate to another agent, and eventually take an action.</p>
<p>For agents, observability therefore needs to capture the <b>trajectory</b> of an execution: what decisions were made, what tools were selected, what arguments were supplied, what results came back, how many iterations occurred, and how the agent ultimately reached its outcome.</p>
<p>This is one of the areas where AI observability is evolving particularly quickly and <b>Sematext AI Agent Watch</b> excels at capturing this.</p>
<h2 id="9-tool-calls-and-actions"><b>9. Tool Calls and Actions</b></h2>
<p>Tools deserve special attention because they turn AI from something that generates text into something that can <b>do things</b>, and that opens a whole new can of security worms.</p>
<p>An agent might have access to a database, browser, CRM, ticketing system, email, internal API, payment system, or cloud infrastructure. AI observability solutions have to be able to show which tools were invoked, when they were invoked, what arguments were passed, what they returned, and whether the action succeeded.</p>
<p>Tool monitoring is also where AI observability starts overlapping heavily with security.</p>
<p>An agent might make a technically valid API call but use the wrong API, access data it shouldn’t access, repeatedly retry an expensive operation, or perform an action that violates organizational policy. Monitoring tool usage creates both an operational record and a behavioral baseline.</p>
<p><b>Sematext AI Agent Watch, Langfuse</b>, <b>LangSmith</b>, and <b>Arize Phoenix</b> all expose tool calls as part of AI execution traces. OpenTelemetry is also working toward standardized semantic conventions for tool execution, making tool calls increasingly interoperable with traditional distributed tracing.</p>
<h2 id="10-ai-memory-and-state"><b>10. AI Memory and State</b></h2>
<p>Many agentic applications maintain state between interactions.</p>
<p>That state might contain conversation history, user information, summaries, retrieved facts, intermediate results, or persistent agent memory. Observability should show what was written to memory, what was subsequently retrieved, and how that information affected the agent’s behavior.</p>
<p>Memory creates some unusual failure modes. An agent can remember something that is wrong, retrieve stale information, accumulate excessive context, expose information from one user to another, or become increasingly expensive as its context grows.</p>
<p><b>Langfuse</b> and <b>LangSmith</b> can incorporate application state and intermediate operations into their traces. OpenTelemetry’s emerging GenAI conventions also recognize memory operations as an observable part of AI application execution.</p>
<h2 id="11-token-usage-and-cost"><b>11. Token Usage and Cost</b></h2>
<p>Every model call potentially has a price attached to it. This aspect of AI monitoring is probably the most familiar to everyone because we all experienced the need for this information the moment we started using AI tools and paying for them.</p>
<p>Observability should therefore track input tokens, output tokens, model-specific costs, cost per request, cost per user, cost per application, and cost over time. For agentic applications, it can be particularly useful to identify which steps in an agent trajectory are consuming the most tokens and money.</p>
<p>I should note that cost monitoring isn’t merely an accounting exercise. It is not of interest only to the CFO and the company management. Unexpected token consumption can reveal poorly designed prompts, unnecessarily large context windows, inefficient RAG pipelines, or agents caught in loops. As such, having insight into token usage and cost also matters for engineering teams. Especially if they want to preempt having their managers or CFOs on their backs.</p>
<p><b>Langfuse</b> has token and cost tracking built directly into its LLM observability capabilities. <b>W&amp;B Weave</b> exposes token usage and cost alongside traces and evaluations, making it possible to correlate cost with latency and quality. LLM token usage and cost monitoring is also built into <b>Sematext AI Agent Watch</b>, plus it allows pricing comparison across all known models, not just those used in your organization or by your AI applications.</p>
<h2 id="12-model-and-prompt-drift"><b>12. Model and Prompt Drift</b></h2>
<p>How many new models and model versions have we seen in the last 12 months? It would take me a while to list them all. Well, no, I could just ask AI, couldn’t I? But my point is that AI applications don’t stay static, far from it.</p>
<p>Models are upgraded. Providers change model versions. Prompts evolve. Retrieval data changes. Fine-tuned models are retrained. User populations change. All of these can and do alter application behavior.</p>
<p>Observability therefore needs to identify behavioral changes over time and help correlate those changes with what changed in the system. A sudden decline in answer quality may have nothing to do with application code, it could be the result of a model update or a change to the retrieval dataset.</p>
<p><b>W&amp;B Weave</b> provides versioning and experiment tracking for models, prompts, datasets, and other components of AI applications. <b>MLflow</b> provides open-source tracking of models, experiments, versions, and deployments, making it particularly useful for organizations operating both traditional ML and generative AI systems.</p>
<h2 id="13-ai-security"><b>13. AI Security</b></h2>
<p>AI introduces an entirely new class of security problems. We have already seen some, like zero-day vulnerabilities being discovered (which is all fine until the wrong people do that first).</p>
<p>These include <b>prompt injection, jailbreaks, sensitive-data exposure, malicious inputs, unsafe outputs, data exfiltration, excessive permissions, tool abuse, and attacks against AI supply chains</b>.</p>
<p>Security observability needs to monitor not only what users send to the AI system but also what the AI system attempts to do. For an agent, that can mean detecting unusual tool sequences, attempts to access sensitive resources, policy violations, or behavior that deviates from established patterns.</p>
<p>This AI security monitoring is one of the key foci of <b>Sematext AI Agent Watch</b>. <b>Lakera</b> focuses on runtime protection for generative AI applications, including threats such as prompt injection and sensitive-data exposure. <b>NVIDIA NeMo Guardrails</b> is an open-source framework for implementing programmable controls around AI applications. <b>Protect AI</b> focuses more broadly on security across the machine-learning and AI software supply chain.</p>
<h2 id="14-ai-inventory-and-governance"><b>14. AI Inventory and Governance</b></h2>
<p>There is one final problem that becomes increasingly important as organizations deploy, knowingly or not, AI at scale:</p>
<p><b>Do you actually know what AI you have running?</b></p>
<p>An organization may have dozens or hundreds of models, LLM applications, AI agents, MCP servers, vector databases, and autonomous workflows. Some may have been formally approved. Others may have been deployed by individual engineering teams or employees without centralized visibility.</p>
<p>AI observability therefore increasingly overlaps with AI governance. Organizations need to know which models and agents exist, who owns them, which models they use, what data they can access, what tools they can invoke, and what policies govern their behavior.</p>
<p>This is especially important for autonomous agents. Traditional monitoring asks whether a service is healthy. AI governance asks a different question:</p>
<p><b>Is this AI allowed to be doing what it is doing?</b></p>
<h2 id="15-responsible-ai"><b>15. Responsible AI</b></h2>
<p>This may feel a little abstract to some readers, and it’s rather different from the more “techy” aspects of AI monitoring, but it is really important at the level of our global society. AI systems can fail in ways that aren’t captured by conventional notions of correctness.</p>
<p>Depending on the application, teams may need to monitor toxicity, harmful content, bias, inappropriate refusals, unfair treatment of different user groups, or systematic differences in model performance.</p>
<p>These properties are usually best monitored through continuous evaluation of production traffic, combined with segmentation and human review. The goal isn’t simply to find one problematic response. It is to discover patterns.</p>
<p><b>Arize Phoenix</b> supports automated evaluations, human annotations, and user feedback, allowing safety and quality signals to be attached to individual traces. <b>W&amp;B Weave</b> supports production monitors that can use evaluators and LLM judges to score live application behavior for characteristics such as correctness, helpfulness, and other application-specific criteria.</p>
<h2 id="16-user-feedback-and-business-outcomes"><b>16. User Feedback and Business Outcomes</b></h2>
<p>Ultimately, AI systems are deployed to accomplish something useful. Without that, what’s the point?</p>
<p>That might mean answering a customer’s question, resolving a support case, helping a developer write code, recommending a product, detecting fraud, or completing an agentic workflow. AI observability should therefore connect AI telemetry to <b>real-world outcomes</b>.</p>
<p>This is easier said that done, but at the end of the day we want to be able to answer questions such as: Did the user accept the answer? Did they ask the same question again? Did they correct the AI? Did they escalate to a human? Did the recommendation result in a purchase? Did the coding agent actually produce working code?</p>
<p><b>W&amp;B Weave</b> supports collecting human feedback and associating it with application traces. <b>Arize Phoenix</b> likewise supports human annotations and user feedback, allowing teams to connect subjective assessments with the exact AI execution that produced them.</p>
<h2 id="bringing-ai-observability-together"><b>Bringing AI Observability Together</b></h2>
<p>These 16 dimensions can seem like a lot… and, in my opinion, they are indeed a lot. That’s because modern AI applications are a lot more complicated than simply calling an LLM API. The good news is that all of these are more or less optional. Sort of. ;)</p>
<p>I grouped all the angles of AI monitoring into four layers that I think are a useful way to think about the landscape:</p>
<p><b>First is infrastructure observability:</b> GPUs, CPU, memory, network, availability, latency, throughput, and model-serving performance.</p>
<p><b>Second is AI execution and security observability:</b> model calls, prompts, tokens, context, retrieval, embeddings, tool calls, agents, memory, and end-to-end traces.</p>
<p><b>Third is AI quality and safety observability:</b> hallucinations, groundedness, correctness, relevance, bias, toxicity, security violations, and other behavioral characteristics.</p>
<p><b>Finally, there is outcome observability:</b> cost, user satisfaction, task completion, conversion, business impact, and governance.</p>
<p>The first layer looks a lot like traditional observability. The higher you go, the more AI-specific the problems become. And that’s the fundamental difference between monitoring an AI application and monitoring a conventional application.</p>
<p>Traditional observability can tell you that <b>the system is running, how fast (think performance metrics) and what it did (think log messages)</b>.</p>
<p>AI observability needs to tell you <b>what the AI did, why it did it, whether it was correct and safe, how much it cost, and whether it accomplished what you wanted</b>.</p>
<p>That is a much bigger problem and a much more interesting one. This is why we are seeing the mushrooming of AI monitoring solutions covering various angles of AI that I described here.</p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/ai-observability-what-should-you-monitor-in-ai-applications/">AI Observability: What Should You Monitor in AI Applications?</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Best AI Agent Monitoring Tools in 2026: Reviews &#038; Comparisons</title>
		<link>https://sematext.com/blog/best-ai-agent-monitoring-tools/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Tue, 01 Sep 2026 14:05:48 +0000</pubDate>
				<category><![CDATA[AI agents]]></category>
		<category><![CDATA[infrastructure monitoring]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Tools & comparisons]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ai agents]]></category>
		<category><![CDATA[Infrastructure Monitoring]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=71062</guid>

					<description><![CDATA[<p>While doing research for this post I realized there are really a few different categories of AI (agent) monitoring. Even what exactly we mean by “AI agent” needs to be specified because currently, due to these concepts still being relatively new, the terminology is still hazy and in flux. I plan on writing about all [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/best-ai-agent-monitoring-tools/">Best AI Agent Monitoring Tools in 2026: Reviews &#038; Comparisons</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>While doing research for this post I realized there are really a few different categories of AI (agent) monitoring. Even what exactly we mean by “AI agent” needs to be specified because currently, due to these concepts still being relatively new, the terminology is still hazy and in flux. I plan on writing about all that in more detail in a separate post.</p>
<h2 id="what-are-ai-agents">What are AI Agents?</h2>
<p>Let’s define this first. For the purposes of this post we can think of them as applications that are “clients” of LLM models through providers of AI services, such as OpenAI, Anthropic, and so on. These AI agents are popping up like mushrooms after the rain and are becoming real production software. They are no longer just chatbots that answer questions, but systems that can call APIs, execute shell commands, read and modify files, query databases, browse the web, send messages, and delegate work to other agents.</p>
<p>That radically changes the monitoring problem and actually adds a whole new bucket of things one ought to monitor now.</p>
<p>When you run a normal application in production, you mostly want to know whether it is available, fast, and error-free. With AI agents running everywhere now, those questions still matter, but they’re no longer enough. An agent can be technically healthy while doing something completely wrong.</p>
<p>It can successfully call every API and still misunderstand the task. It can spend hundreds of dollars on model calls because it got stuck in a loop. It can select the wrong tool, expose information it shouldn’t, or take an action that nobody explicitly intended it to take.</p>
<p>And there is another problem that I think will become increasingly important: <b>sometimes the organization may not even know that an AI agent is running on its infrastructure.</b></p>
<p>That is why I think “AI agent monitoring” is really becoming two related but distinct categories:</p>
<ol>
<li aria-level="1"><b>Monitoring the AI application you intentionally built</b>, including traces, model calls, latency, cost, and quality.</li>
<li aria-level="1"><b>Discovering and monitoring autonomous agents running on your infrastructure</b>, including what they are doing and whether they create security or governance risks.</li>
</ol>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">Most of the tools in this article are primarily focused on the first problem. A smaller number are beginning to address the second. Serious organizations will eventually need both.</strong></div>
<h2 id="what-is-ai-agent-monitoring">What is AI agent monitoring?</h2>
<p>AI agent monitoring sits somewhere between several things we already know from software engineering, but it isn’t exactly the same as any one of them:</p>
<ul>
<li aria-level="1"><b>Application performance monitoring (APM).</b> Agents are still software, so you need to know whether they’re slow, failing, retrying excessively, or consuming unreasonable amounts of CPU, memory, or other resources. Traditional application monitoring covers part of this problem, but it usually can’t explain <i>why</i> an agent decided to take a particular action.</li>
<li aria-level="1"><b>Distributed tracing.</b> A useful agent trace is more than a request flowing through microservices. An agent might call an LLM, decide to invoke a tool, inspect the result, call another model, delegate work to another agent, and repeat the process several times. You want to be able to reconstruct that chain and understand how one decision led to the next.</li>
<li aria-level="1"><b>LLM observability.</b> This adds visibility into things traditional tracing doesn’t normally care about: prompts, model responses, token consumption, model selection, context size, and inference costs. This is essential when the model itself is part of the application’s decision-making process.</li>
<li aria-level="1"><b>Evaluation and testing.</b> With traditional software, I can often write a deterministic test: given input X, expect output Y. Agents are different. They may take different paths and still produce acceptable results, or they may successfully complete every API call while producing a completely wrong answer. Monitoring should therefore include some way of measuring quality, not just whether the software crashed.</li>
<li aria-level="1"><b>Security monitoring.</b> This is the area I think will become much more important as agents get more autonomy. Once an agent can execute commands, read files, access APIs, use credentials, browse the web, or communicate with other systems, you absolutely need visibility into what it is actually doing—not just what it was <i>supposed</i> to do, but what it did, which commands it called, while files it read, created, deleted or modified, which information is sent out and where, and so on.</li>
<li aria-level="1"><b>Infrastructure monitoring.</b> Finally, there is a very practical problem that most AI observability tools don’t solve: how do I know which agents are running in the first place? An organization may have agents running on developer machines, servers, containers, CI/CD infrastructure, or Kubernetes clusters without a central inventory of them.</li>
</ul>
<p>That combination is what makes AI agent monitoring different from simply adding another dashboard to an existing observability stack.</p>
<p>So for those two distinct categories I described earlier, there are also two fundamentally different questions we want monitoring to answer.</p>
<p>The first is:</p>
<p><b>Is my agent working correctly?</b></p>
<p>For that, we care about the agent’s execution path. What did it decide? Which model did it call? Which tools did it use? Where did it fail? How long did it take? How much did it cost? The first four bullets from the above list are all about this.</p>
<p>The second question is more uncomfortable:</p>
<p><b>What AI agents are actually running in my environment, and what are they doing?</b></p>
<p>That means being able to determine whether an agent is accessing files, executing shell commands, connecting to external systems, using credentials, or behaving in ways that violate security policies. That’s what the last two bullet points are about.</p>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">Most products in this category are very good at the first problem. Much fewer address the second. And the second problem is clearly going to become increasingly important.</strong></div>
<h2 id="why-ai-agent-monitoring-is-important">Why AI agent monitoring is important</h2>
<p>The obvious reason for monitoring agents (in that first category mentioned above) is debugging. Agents are complicated systems. When something goes wrong, you need to understand what happened.</p>
<p>But I think the bigger reason will increasingly be security. That’s that second category.</p>
<p>We are giving software systems capabilities that we would traditionally give only to trusted applications or humans. Agents can access production systems, use credentials, execute commands, modify files, communicate with external services, and sometimes make decisions with relatively little human intervention.</p>
<p>That creates a muuuuuuuch larger attack surface.</p>
<p>Recent security incidents involving major AI organizations and AI infrastructure, including <a href="https://openai.com/index/hugging-face-incident-and-the-road-ahead/" target="_blank" rel="noopener noreferrer">incidents affecting organizations such as OpenAI and the broader open-source AI ecosystem around Hugging Face</a>, are reminders that AI infrastructure is not somehow separate from normal security problems. It contains credentials, proprietary models, sensitive data, source code, APIs, and increasingly powerful workloads. Keep in mind that whatever you read about incidents like the one from OpenAI/Hugging Face is likely not the full scope of the incident. Not everything is shared. Especially when it may hurt those organizations. Too much interest, too much money is at stake.</p>
<p>At the same time, research into autonomous agents is showing behavior that should make engineers pay attention. In controlled environments, agents have found unexpected ways around constraints, coordinated with other agents, left persistent information for other agents, exploited loopholes in their environments, and, in some evaluations, attempted to hide or preserve behavior when their goals conflicted with being shut down or modified.</p>
<p>Again, I think the problem is much bigger than what is publicly being shared. This is not science fiction any more, this is reality today. We must not ignore what these early incidents  are showing us.</p>
<p>We are building systems with:</p>
<ul>
<li aria-level="1">more autonomy,</li>
<li aria-level="1">access to more tools,</li>
<li aria-level="1">more persistent memory,</li>
<li aria-level="1">more access to infrastructure,</li>
<li aria-level="1">more ability to communicate,</li>
<li aria-level="1">and fewer humans directly involved in every decision.</li>
</ul>
<p>It is entirely reasonable to expect that these systems will eventually do things their designers did not anticipate. And let’s actually be real: they are really already doing that today.</p>
<p>Eventually, some of those things will be malicious, not necessarily because the underlying model suddenly develops malicious intent, but because an agent can be manipulated, compromised, given a harmful objective, or simply find an unexpected path toward accomplishing the objective it was given. It doesn’t have quite the full reasoning we have. It doesn’t really have empathy. It doesn’t really discern the way (good) humans do.</p>
<p>Security engineers have spent decades learning that you don’t wait until something becomes a widespread incident before you start monitoring it. In other words, even if you are not running any AI agents in your infrastructure today, I’m of the opinion that you should be prepared and put in place measures and tools to catch agents when they do show up. This is very much like e.g., virus or malware monitoring on your own computer. You don’t install an antivirus after it’s already on your computer, after it has already stolen your credentials, read and sent out sensitive data, spread to the rest of the network, encrypted your files and started blackmailing you, etc. No, smart people have antivirus running well ahead of such incidents and catch issues before they happen.</p>
<p>That’s how I think companies should approach AI agents.</p>
<h2 id="what-should-an-ai-agent-monitoring-tool-actually-do">What should an AI agent monitoring tool actually do?</h2>
<p>If I were evaluating these products, I wouldn’t start with a long feature checklist. I’d start with a few practical questions. So back to my 2-category starting point:</p>
<p>For an agent application that my team built, I want to know whether I can follow an execution from beginning to end. I want to see the model calls, tools, sub-agents, latency, failures, and cost. I also want some way of determining whether the agent’s output was actually good.</p>
<p>For infrastructure-level monitoring, my questions are different.</p>
<p>Can the system tell me which agents exist without requiring every developer to manually register them?</p>
<p>Can it show me what those agents are doing?</p>
<p>Can I see shell commands, file activity, network connections, tool execution, and access to sensitive information?</p>
<p>Can I identify unusual or risky behavior?</p>
<p>Can I create policies and alerts?</p>
<p>The first category is mostly about <b>observability and engineering quality</b>.</p>
<p>The second is increasingly about <b>security and governance</b>.</p>
<p>I don’t think those two categories will necessarily converge into one product. In fact, I suspect most companies will use different tools for each.</p>
<h2 id="1-sematext-ai-agent-watch">1. <a href="https://sematext.com/capabilities/ai-agent-watch/">Sematext AI Agent Watch</a></h2>
<p><b>Description</b></p>
<p>Sematext AI Agent Watch addresses a different problem from most of the products in this article.</p>
<p>LangSmith, Langfuse, Phoenix, and similar tools, which I review below, generally start from the assumption that you know about the agent. <i>You</i> built it, <i>you</i> instrumented it, and want to understand its execution.</p>
<p>But not all AI agents running on your infrastructure will be your agents – the agents that you have built and instrumented. There will be third party agents that somebody has installed on your servers for who knows what reason. Thus, AI Agent Watch starts with a more fundamental question:</p>
<p><b>What AI agents are actually running on my infrastructure?</b></p>
<p>It is designed to first discover agents running on monitored hosts and then observe what they are doing. That can include agent sessions, shell commands, tool execution, file activity, network connections, and potential exposure of sensitive information.</p>
<p>I think this is a super important distinction. This is that second category from the beginning of the article.</p>
<p>Additionally, an AI agent, including your own, can be perfectly instrumented at the application level and still be a security problem. Conversely, an agent might be running somewhere in the environment without anyone having instrumented it at all. But you should still want to know about it and its activity, right?</p>
<p>This type of monitoring is about discovering autonomous software and understanding its real-world behavior.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Automatic AI agent discovery</li>
<li aria-level="1">Host-level monitoring</li>
<li aria-level="1">Agent session tracking</li>
<li aria-level="1">Shell command visibility</li>
<li aria-level="1">Tool execution monitoring</li>
<li aria-level="1">File read and write monitoring</li>
<li aria-level="1">Network connection monitoring</li>
<li aria-level="1">Sensitive-data detection</li>
<li aria-level="1">Trusted and untrusted agent tracking</li>
<li aria-level="1">Risk scoring</li>
<li aria-level="1">Alert rules and reporting</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Solves a problem most LLM observability tools don’t address</li>
<li aria-level="1">Can discover agents without application-level instrumentation</li>
<li aria-level="1">Strong infrastructure and security perspective</li>
<li aria-level="1">Useful for detecting risky behavior</li>
<li aria-level="1">Focuses on real actions rather than only prompts and responses</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Not a replacement for detailed LLM tracing</li>
<li aria-level="1">Not primarily an evaluation platform</li>
<li aria-level="1">Most useful where you control or monitor the underlying infrastructure</li>
</ul>
<p><b>Pricing</b></p>
<p>Sematext AI Agent Watch pricing is tied to the monitored infrastructure and Sematext plan. It starts at $1.68/host/month.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> I think this addresses a problem that will become increasingly important: you can’t govern or secure agents if you don’t know they exist.</p>
<p>Traditional AI observability starts after someone deliberately instruments an agent. Infrastructure-level discovery starts earlier.</p>
<p>It asks:</p>
<p><b>What autonomous software is running, where, and what is it actually doing?</b></p>
<p>I think that will eventually become a standard security question.</p>
<p><b>What I dislike:</b> I wouldn’t use it alone for agent quality, prompt debugging, or detailed model-level evaluation. For those problems, I would pair it with Langfuse, LangSmith, or Phoenix.</p>
<h2 id="2-langsmith">2. <a href="https://smith.langchain.com/" target="_blank" rel="noopener noreferrer">LangSmith</a></h2>
<p><b>Description</b></p>
<p>LangSmith is one of the most complete AI application observability platforms. It covers tracing, evaluation, prompt management, datasets, experiments, production monitoring, and feedback collection.</p>
<p>Its biggest strength is that it makes complicated agent executions relatively easy to inspect. If an agent calls multiple models, invokes tools, uses retrievers, and delegates work to sub-agents, LangSmith gives you a structured view of that execution instead of forcing you to reconstruct it from logs.</p>
<p>It is particularly compelling for teams using LangChain or LangGraph, although it is no longer limited to those frameworks.</p>
<p>I see LangSmith as a platform rather than just a tracing tool. That’s useful if you want one place for much of your AI engineering workflow. The trade-off is that you’re adopting a fairly large proprietary platform, and I would think about that before making it the center of everything.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Agent and LLM tracing</li>
<li aria-level="1">Tool and sub-agent visibility</li>
<li aria-level="1">Production monitoring</li>
<li aria-level="1">Offline and online evaluation</li>
<li aria-level="1">Datasets and experiments</li>
<li aria-level="1">Prompt management</li>
<li aria-level="1">Token and cost tracking</li>
<li aria-level="1">User feedback</li>
<li aria-level="1">Dashboards and alerting</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">One of the best tracing experiences in the category</li>
<li aria-level="1">Excellent LangChain and LangGraph integration</li>
<li aria-level="1">Strong combination of observability and evaluation</li>
<li aria-level="1">Mature production workflow</li>
<li aria-level="1">Good cost visibility</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Proprietary platform</li>
<li aria-level="1">Strongest integration is naturally within the LangChain ecosystem</li>
<li aria-level="1">Self-hosting is not the default experience</li>
<li aria-level="1">Pricing is complicated: costs can grow with both usage and team size</li>
</ul>
<p><b>Pricing</b></p>
<p>LangSmith offers a free developer tier and paid plans that combine seats and usage. Pricing changes fairly regularly, so I would check the current pricing page before making a decision, particularly for production-scale workloads.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> The tracing UI is genuinely useful. When debugging a complicated agent, being able to visually follow the execution tree saves a lot of time.</p>
<p><b>What I dislike:</b> I don’t love the idea of tightly coupling my entire AI development workflow to one proprietary platform. If interoperability and deployment flexibility are important to me, I’d look closely at Langfuse or Phoenix as well.</p>
<h2 id="3-langfuse">3. <a href="https://langfuse.com/" target="_blank" rel="noopener noreferrer">Langfuse</a></h2>
<p><b>Description</b></p>
<p>Langfuse is probably my default recommendation for a general-purpose engineering team that wants AI observability without committing too heavily to a single proprietary ecosystem. Keep in mind that when I refer to “AI observability” here I mean that first category described further above.</p>
<p>It provides the things I expect from an AI observability platform: traces, nested agent activity, sessions, token and cost tracking, prompts, datasets, experiments, and evaluations. The important difference is that Langfuse is open source and can be self-hosted.</p>
<p>That makes it particularly interesting for companies that have data residency requirements or simply don’t want every prompt and model response to live in someone else’s SaaS platform.</p>
<p>I also like its OpenTelemetry direction. I think standardization matters in this space, especially because AI frameworks are changing so quickly.</p>
<p>The downside is that flexibility comes with more choices. Langfuse doesn’t force one particular way of building your AI engineering workflow, which I see as an advantage, but some teams may prefer something more opinionated.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">LLM and agent tracing</li>
<li aria-level="1">Agent graphs</li>
<li aria-level="1">Sessions</li>
<li aria-level="1">Token and cost tracking</li>
<li aria-level="1">Prompt management</li>
<li aria-level="1">Datasets and experiments</li>
<li aria-level="1">Online and offline evaluations</li>
<li aria-level="1">OpenTelemetry support</li>
<li aria-level="1">Python and JavaScript SDKs</li>
<li aria-level="1">Self-hosting</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Open-source core</li>
<li aria-level="1">Strong self-hosting story</li>
<li aria-level="1">Framework-agnostic</li>
<li aria-level="1">OpenTelemetry support</li>
<li aria-level="1">Good combination of tracing and evaluation</li>
<li aria-level="1">Reasonable entry pricing</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Self-hosting means operational responsibility</li>
<li aria-level="1">Requires more architectural decisions than highly opinionated platforms</li>
<li aria-level="1">Evaluation still requires engineering work and good datasets</li>
<li aria-level="1">Pricing units require some understanding at scale</li>
</ul>
<p><b>Pricing</b></p>
<p>Langfuse has a free cloud tier, paid cloud plans, and a self-hosted open-source option. This is one of the things that’s good about it: small teams can get started cheaply, while larger organizations have the option to keep more control over their deployment.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> This is probably where I would start for many teams. I like the combination of open source, OpenTelemetry, self-hosting, tracing, and evaluation.</p>
<p><b>What I dislike:</b> It’s less of a “just follow this workflow and everything works” product. If my team wanted maximum convenience and was already committed to LangGraph, LangSmith might be easier.</p>
<h2 id="4-arize-phoenix-and-arize-ax">4. <a href="https://phoenix.arize.com/" target="_blank" rel="noopener noreferrer">Arize Phoenix and Arize AX</a></h2>
<p><b>Description</b></p>
<p>Keep in mind that Dynatrace acquired Arize in August 2026. This means things may change in the future, but for now, this is how I see things:</p>
<p>Phoenix takes a more engineering-oriented approach to AI observability.</p>
<p>The open-source Phoenix project provides tracing and evaluation capabilities, while Arize’s commercial platform adds managed production monitoring and additional enterprise features.</p>
<p>What I find interesting about Phoenix is its emphasis on OpenTelemetry and open infrastructure. That makes it attractive if I don’t want my instrumentation strategy tied to a specific AI framework.</p>
<p>Phoenix is particularly useful for inspecting complex LLM and retrieval workflows and for building evaluation pipelines around them. The managed Arize platform makes more sense when you want those capabilities without operating everything yourself.</p>
<p>The main trade-off is that Phoenix feels more like an engineering platform than a polished, highly opinionated SaaS workflow.</p>
<p>That’s a good thing if your team wants flexibility. It’s less attractive if you just want to install an SDK and immediately have everything configured for you.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">OpenTelemetry-based tracing</li>
<li aria-level="1">LLM and agent observability</li>
<li aria-level="1">Retrieval and RAG inspection</li>
<li aria-level="1">Evaluations</li>
<li aria-level="1">Custom metrics</li>
<li aria-level="1">Production monitoring through Arize</li>
<li aria-level="1">Open-source deployment</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Strong OpenTelemetry support</li>
<li aria-level="1">Open-source option</li>
<li aria-level="1">Good fit for engineering-heavy teams</li>
<li aria-level="1">Strong evaluation capabilities</li>
<li aria-level="1">No immediate vendor lock-in</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">More engineering effort than some SaaS alternatives</li>
<li aria-level="1">Phoenix and Arize AX can be confusing as separate products</li>
<li aria-level="1">Less turnkey for teams without observability experience</li>
<li aria-level="1">Some uncertainty around the future of both Phoenix and Arize XA after acquisition by Dynatrace, known for being expensive and targeting large enterprises with deep pockets.</li>
</ul>
<p><b>Pricing</b></p>
<p>Phoenix is available as open source. Arize also offers managed plans with usage-based pricing and enterprise options.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> I like the architectural direction. OpenTelemetry and open-source instrumentation give me more confidence that I won’t have to completely redo my observability stack when the next AI framework becomes popular.</p>
<p><b>What I dislike:</b> It’s not the product I would choose for a team that wants the simplest possible onboarding experience.</p>
<h2 id="5-braintrust">5. <a href="https://www.braintrust.dev/" target="_blank" rel="noopener noreferrer">Braintrust</a></h2>
<p><b>Description</b></p>
<p>Braintrust is the tool in this list I would look at first if my biggest concern was not debugging, but preventing AI quality regressions.</p>
<p>Tracing is available, but the center of gravity is evaluation. Braintrust is built around datasets, experiments, scorers, production evaluations, and measuring whether AI systems are actually improving.</p>
<p>That philosophy makes sense to me. My background is in text search where similar frameworks exist for pretty much the same reasons – evaluating the quality of results, tuning, feedback, etc.</p>
<p>A beautiful trace can tell me exactly what happened. It still doesn’t tell me whether the agent did a good job.</p>
<p>Braintrust makes evaluation part of the normal engineering workflow. I can define test cases, compare versions, create scoring functions, and evaluate production behavior.</p>
<p>The trade-off is that this approach requires investment. You need meaningful datasets and useful evaluators. The tool can’t invent a good definition of quality for your application.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Agent tracing</li>
<li aria-level="1">Datasets and experiments</li>
<li aria-level="1">Custom scorers</li>
<li aria-level="1">Automated evaluation</li>
<li aria-level="1">LLM-as-a-judge</li>
<li aria-level="1">Production quality monitoring</li>
<li aria-level="1">Token and cost tracking</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Excellent evaluation workflow</li>
<li aria-level="1">Strong support for regression testing</li>
<li aria-level="1">Good production quality monitoring</li>
<li aria-level="1">Useful experiment comparison</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">More expensive than lightweight tracing tools</li>
<li aria-level="1">Requires serious investment in evaluation design</li>
<li aria-level="1">Proprietary platform</li>
<li aria-level="1">Can be more than a small team needs</li>
</ul>
<p><b>Pricing</b></p>
<p>Braintrust offers a free entry tier and paid plans for larger-scale evaluation and production use. Pricing is worth checking carefully because the platform makes the most sense when you are running a meaningful evaluation workflow rather than just collecting traces.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> I agree with the underlying philosophy. AI quality needs to be tested continuously, not treated as something developers inspect manually when a customer complains.</p>
<p><b>What I dislike:</b> If I only need tracing and debugging, I wouldn’t start here.</p>
<h2 id="6-agentops">6. <a href="https://www.agentops.ai/" target="_blank" rel="noopener noreferrer">AgentOps</a></h2>
<p><b>Description</b></p>
<p>AgentOps is more explicitly focused on the practical problem of understanding what an agent did. This is indeed useful. It sounds simple, but it’s not.</p>
<p>When an agent behaves unexpectedly, reproducing the problem can be difficult because LLM-based systems aren’t fully deterministic. AgentOps focuses heavily on tracing agent activity, tool calls, model usage, and the ability to inspect or replay sessions.</p>
<p>I particularly like the idea of replaying an agent’s execution. Traditional debugging tools have taught developers to expect breakpoints, stack traces, and reproducible failures. Agent systems don’t always provide that.</p>
<p>AgentOps tries to close that gap.</p>
<p>Compared with evaluation-first tools like Braintrust, I see AgentOps as more focused on debugging and operational visibility.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Agent tracing</li>
<li aria-level="1">Tool-call visibility</li>
<li aria-level="1">Multi-agent monitoring</li>
<li aria-level="1">Session tracking</li>
<li aria-level="1">Replay and debugging</li>
<li aria-level="1">Token and cost monitoring</li>
<li aria-level="1">Logs and errors</li>
<li aria-level="1">Framework integrations</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Strong focus on practical agent debugging</li>
<li aria-level="1">Useful replay capabilities</li>
<li aria-level="1">Good multi-agent visibility</li>
<li aria-level="1">Broad ecosystem support</li>
<li aria-level="1">Straightforward cost tracking</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Evaluation capabilities are not its strongest differentiator</li>
<li aria-level="1">Proprietary platform</li>
<li aria-level="1">Usage pricing needs to be monitored</li>
<li aria-level="1">Doesn’t solve infrastructure-level agent discovery</li>
</ul>
<p><b>Pricing</b></p>
<p>AgentOps provides a free tier and paid plans based on usage and organizational requirements.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> I like the focus on debugging. When an agent does something weird, my first instinct is to ask what sequence of events led to that behavior.</p>
<p><b>What I dislike:</b> For serious quality engineering, I would probably combine this type of tooling with a stronger evaluation platform.</p>
<h2 id="7-wb-weave">7. <a href="https://wandb.ai/site/weave" target="_blank" rel="noopener noreferrer">W&amp;B Weave</a></h2>
<p><b>Description</b></p>
<p>Weave makes the most sense in organizations that are already using Weights &amp; Biases for ML experimentation. It extends the W&amp;B ecosystem into LLM applications and agents by providing tracing, evaluations, monitoring, experiments, feedback, and production analysis.</p>
<p>The advantage of this approach is continuity. A team that already uses W&amp;B for models and experiments doesn’t have to introduce a completely separate platform for AI application monitoring.</p>
<p>The idea of monitoring production traffic using automated scoring and evaluators also makes sense. That is closer to how I think mature AI applications should operate: continuously checking whether behavior is degrading rather than waiting for users to notice.</p>
<p>The disadvantage is that if you are not already using W&amp;B, the ecosystem advantage is much smaller.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">End-to-end tracing</li>
<li aria-level="1">Token and cost monitoring</li>
<li aria-level="1">Evaluations</li>
<li aria-level="1">Experiment tracking</li>
<li aria-level="1">Production monitoring</li>
<li aria-level="1">Human feedback</li>
<li aria-level="1">Automated scoring</li>
<li aria-level="1">Safety and quality monitoring</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Strong evaluation and experimentation capabilities</li>
<li aria-level="1">Good fit for existing W&amp;B users</li>
<li aria-level="1">Connects development and production workflows</li>
<li aria-level="1">Supports multimodal AI workloads</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Most compelling inside the W&amp;B ecosystem</li>
<li aria-level="1">Broader platform than some teams need</li>
<li aria-level="1">Not focused on infrastructure-level agent discovery</li>
</ul>
<p><b>Pricing</b></p>
<p>Weave pricing depends on the broader W&amp;B platform and organizational usage. I would check the current pricing directly before evaluating it.</p>
<p><b>My Opinion</b></p>
<p><b>What I like:</b> If my organization already used W&amp;B, I would absolutely evaluate Weave before adding another specialized observability vendor.</p>
<p><b>What I dislike:</b> For a conventional software engineering team with no existing ML platform investment, it may feel like more ecosystem than necessary.</p>
<p> </p>
<h2 id="comparison-table">Comparison table</h2>
<table>
<tbody>
<tr>
<td><b>Tool</b></td>
<td><b>Best for</b></td>
<td><b>Tracing</b></td>
<td><b>Evals</b></td>
<td><b>Cost monitoring</b></td>
<td><b>Self-hosting</b></td>
<td><b>Agent discovery</b></td>
<td><b>Security/activity monitoring</b></td>
</tr>
<tr>
<td><a href="https://sematext.com/capabilities/ai-agent-watch/">Sematext AI Agent Watch</a></td>
<td>Discovering and monitoring agents on infrastructure</td>
<td>Activity-level</td>
<td>Limited today</td>
<td>Planned/currently evolving</td>
<td>SaaS agent-based</td>
<td><b>Yes</b></td>
<td><b>Excellent</b></td>
</tr>
<tr>
<td><a href="https://www.smith.langchain.com/" target="_blank" rel="noopener noreferrer">LangSmith</a></td>
<td>LangChain/LangGraph teams</td>
<td>Excellent</td>
<td>Excellent</td>
<td>Yes</td>
<td>Enterprise</td>
<td>No</td>
<td>Limited</td>
</tr>
<tr>
<td><a href="https://langfuse.com/" target="_blank" rel="noopener noreferrer">Langfuse</a></td>
<td>Open-source, framework-agnostic teams</td>
<td>Excellent</td>
<td>Excellent</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td>Limited</td>
</tr>
<tr>
<td><a href="https://phoenix.arize.com/" target="_blank" rel="noopener noreferrer">Arize Phoenix / AX</a></td>
<td>OpenTelemetry and evaluation-heavy teams</td>
<td>Excellent</td>
<td>Excellent</td>
<td>Yes</td>
<td>Phoenix: Yes</td>
<td>No</td>
<td>Limited</td>
</tr>
<tr>
<td><a href="https://www.braintrust.dev/docs/" target="_blank" rel="noopener noreferrer">Braintrust</a></td>
<td>Evaluation-first workflows</td>
<td>Good</td>
<td>Excellent</td>
<td>Yes</td>
<td>Enterprise options</td>
<td>No</td>
<td>Limited</td>
</tr>
<tr>
<td><a href="https://www.agentops.ai/" target="_blank" rel="noopener noreferrer">AgentOps</a></td>
<td>Debugging agent execution</td>
<td>Excellent</td>
<td>Moderate</td>
<td>Excellent</td>
<td>Enterprise</td>
<td>No</td>
<td>Some audit capabilities</td>
</tr>
<tr>
<td><a href="https://docs.wandb.ai/weave/concepts/what-is-weave" target="_blank" rel="noopener noreferrer">W&amp;B Weave</a></td>
<td>Teams already using W&amp;B/ML tooling</td>
<td>Excellent</td>
<td>Excellent</td>
<td>Yes</td>
<td>Limited/enterprise-dependent</td>
<td>No</td>
<td>Quality/safety scoring</td>
</tr>
</tbody>
</table>
<h2 id=""></h2>
<h2 id="how-i-would-choose-between-these-tools">How I would choose between these tools</h2>
<p>If I were building an agent application today, I would start by deciding which problem I actually need to solve, which of those two categories of AI monitoring I am primarily after.</p>
<p>If the problem is <b>debugging agent behavior</b>, I would look first at LangSmith, Langfuse, Phoenix, or AgentOps. (Category 1 below)</p>
<p>If the problem is <b>measuring quality and preventing regressions</b>, Braintrust, LangSmith, Langfuse, Phoenix, and Weave are stronger candidates. (Category 1 below)</p>
<p>If <b>OpenTelemetry, open source, and deployment control</b> matter most, I would look closely at Langfuse and Phoenix. (Category 1 below)</p>
<p>If my organization already runs heavily on <b>LangChain/LangGraph</b>, LangSmith would be the obvious first evaluation.</p>
<p>And if the question is:</p>
<p><b>What AI agents are running on my servers, containers, and infrastructure—and what are they actually doing?</b></p>
<p>Then I need something different from application-level tracing. That’s where infrastructure-level monitoring and agent discovery tools become relevant. (Category 2 below)</p>
<h3 id="category-1-ai-application-observability">Category 1: AI application observability</h3>
<p>For tracing, debugging, costs, and evaluations:</p>
<ul>
<li aria-level="1"><b>Langfuse</b> is my default general-purpose recommendation.</li>
<li aria-level="1"><b>LangSmith</b> is the obvious choice for many LangChain/LangGraph teams.</li>
<li aria-level="1"><b>Phoenix</b> is attractive if OpenTelemetry and open source matter.</li>
<li aria-level="1"><b>Braintrust</b> is strongest when evaluations are central to your engineering process.</li>
<li aria-level="1"><b>AgentOps</b> is particularly good for agent execution debugging.</li>
<li aria-level="1"><b>W&amp;B Weave</b> makes the most sense for organizations already invested in the W&amp;B ecosystem.</li>
</ul>
<h3 id="category-2-ai-agent-infrastructure-and-security-monitoring">Category 2: AI agent infrastructure and security monitoring</h3>
<p>This is a different problem. Here I want to know:</p>
<p>Which agents are running on my servers, what are they doing, and are they creating risk?</p>
<p>For that problem, traditional LLM observability products generally aren’t enough because they typically depend on application instrumentation and focus on prompts, model calls, and traces.</p>
<p>That is where a tool such as <b>Sematext AI Agent Watch</b> fits.</p>
<p><b>My preferred architecture for a serious production environment would probably be two layers:</b></p>
<pre>       AI Agent Application
               │
┌──────────────┴──────────────┐
│                             │
▼                             ▼
AI Observability              Infrastructure
Langfuse / LangSmith          AI Agent Watch
Phoenix / Braintrust          │
│                             │
▼                             ▼
Traces, Evals, Cost           Discovery, Files,
Quality, Latency              Commands, Network,
                              PII, Risk, Alerts</pre>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">That combination is where the market is heading.<br>
Tracing tells me whether the agent is working correctly.<br>
Infrastructure monitoring tells me whether the agent is doing something I should be worried about.<br>
</strong></div>
<p> </p>
<h2 id="feature-comparison">Feature comparison</h2>
<p>Here is another way to compare tools reviewed in this article. You can clearly see the two categories of solutions addressing different angles of AI monitoring.</p>
<table>
<tbody>
<tr>
<td><b>Feature</b></td>
<td><b>Sematext</b></td>
<td><b>LangSmith</b></td>
<td><b>Langfuse</b></td>
<td><b>Arize</b></td>
<td><b>Braintrust</b></td>
<td><b>AgentOps</b></td>
<td><b>W&amp;B Weave</b></td>
<td></td>
</tr>
<tr>
<td>Agent tracing</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td></td>
</tr>
<tr>
<td>Tool-call tracing</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★</td>
<td>★★★★★</td>
<td>★★★★</td>
<td></td>
</tr>
<tr>
<td>LLM cost tracking</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td></td>
</tr>
<tr>
<td>Offline evaluation</td>
<td>★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★</td>
<td>★★★★★</td>
<td></td>
</tr>
<tr>
<td>Online evaluation</td>
<td>★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★</td>
<td>★★★★★</td>
<td></td>
</tr>
<tr>
<td>Self-hosting</td>
<td>SaaS agent</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★</td>
<td>Varies</td>
<td></td>
</tr>
<tr>
<td>OpenTelemetry</td>
<td>N/A</td>
<td>★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
<td>★★★</td>
<td>★★★</td>
<td>★★★</td>
<td></td>
</tr>
<tr>
<td>Agent discovery</td>
<td>★★★★★</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td></td>
</tr>
<tr>
<td>File activity monitoring</td>
<td>★★★★★</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td></td>
</tr>
<tr>
<td>Network activity monitoring</td>
<td>★★★★★</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td>✖</td>
<td></td>
</tr>
<tr>
<td>Security risk detection</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★</td>
<td>★★</td>
<td>★★</td>
<td>★★★</td>
<td>★★★</td>
<td></td>
</tr>
</tbody>
</table>
<p> </p>
<h2 id="my-final-opinion">My final opinion</h2>
<p>I don’t think there is a single best AI agent monitoring tool because the category is splitting into two layers.</p>
<p>The first layer is <b>AI application observability</b>.</p>
<p>This is where tools such as Langfuse, LangSmith, Phoenix, Braintrust, AgentOps, and Weave operate. They help me understand execution, latency, costs, prompts, tools, and quality.</p>
<p>The second layer is <b>AI agent discovery, governance, and infrastructure monitoring</b>.</p>
<p>This layer answers a different question.</p>
<p>Not:</p>
<p>“Why did my application agent make this decision?”</p>
<p>But:</p>
<p>“What autonomous agents are running in my environment, what capabilities do they have, and what are they actually doing?”</p>
<p>I think the first layer is already becoming a standard part of AI application engineering.</p>
<p>The second layer is earlier in its evolution. It’s only emerging. But I suspect it won’t stay that way for long. As agents become more autonomous and get access to more systems, companies are going to need an inventory of those agents. They will need to know which agents can execute commands, access files, use credentials, and communicate externally.</p>
<p>And eventually, monitoring alone won’t be enough. Organizations will want AI policies, AI agent governance, and enforcement around what agents are allowed to do.</p>
<p>So if I were designing a production AI observability today, I would probably use two layers:</p>
<p><b>An AI observability platform</b> to understand whether the agent works correctly.</p>
<p><b>An infrastructure-level agent monitoring platform</b> to understand whether the agent is doing something it shouldn’t.</p>
<p>Those are different problems and both (are going to) matter.</p>
<p> </p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/best-ai-agent-monitoring-tools/">Best AI Agent Monitoring Tools in 2026: Reviews &#038; Comparisons</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What 13 Years of Building Observability Has Taught Us: The Problems Stay, the Technology Changes</title>
		<link>https://sematext.com/blog/what-13-years-of-building-observability-has-taught-us-the-problems-stay-the-technology-changes/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Wed, 26 Aug 2026 14:40:02 +0000</pubDate>
				<category><![CDATA[AI agents]]></category>
		<category><![CDATA[Frontend & user experience monitoring]]></category>
		<category><![CDATA[infrastructure monitoring]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[Sematext Cloud]]></category>
		<category><![CDATA[Synthetic Monitoring]]></category>
		<category><![CDATA[Tracing]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[observability]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=71046</guid>

					<description><![CDATA[<p>Technology moves quickly. As a matter of fact, it’s evolving exponentially. New frameworks appear. New architectures replace old ones. Entire categories of tools emerge, mature, consolidate, and occasionally disappear. A technology that sounds futuristic one year can feel almost boring a few years later. Does anyone still think about NoSQL, for example? After more than [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/what-13-years-of-building-observability-has-taught-us-the-problems-stay-the-technology-changes/">What 13 Years of Building Observability Has Taught Us: The Problems Stay, the Technology Changes</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Technology moves quickly. As a matter of fact, it’s evolving exponentially. New frameworks appear. New architectures replace old ones. Entire categories of tools emerge, mature, consolidate, and occasionally disappear. A technology that sounds futuristic one year can feel almost boring a few years later. Does anyone still think about <a href="https://en.wikipedia.org/wiki/NoSQL" target="_blank" rel="noopener noreferrer">NoSQL</a>, for example?</p>
<p>After more than a decade of building Sematext, one thing stands out to me:</p>
<p><b>Many of the problems we are solving today are remarkably similar to the problems we were trying to solve 10 or 15 years ago.</b></p>
<p>We still want to know:</p>
<ul>
<li aria-level="1">What is happening in our systems?</li>
<li aria-level="1">Why is this application slow?</li>
<li aria-level="1">Where did this request spend its time?</li>
<li aria-level="1">Which services depend on which other services?</li>
<li aria-level="1">What changed?</li>
<li aria-level="1">Where is the bottleneck?</li>
<li aria-level="1">What is consuming the CPU?</li>
<li aria-level="1">What is actually happening on the network?</li>
<li aria-level="1">And, increasingly: what are our AI agents doing?</li>
</ul>
<p>The questions have stayed with us. Ask any developers or sysadmins (that was the term back then) from the end of the last millenium and you’ll see they were asking the same questions 30+ years ago.</p>
<p>What has changed, sometimes dramatically, is the technology available to answer them. And new use cases have emerged (see towards the end of this post).</p>
<p>Looking back at Sematext’s own history is an interesting way to see this technology cycle play out.</p>
<h2 id="platform-gravity"><b>Platform gravity</b></h2>
<p>One of the things that has changed significantly over the last decade is the expectation that monitoring and observability capabilities should work together.</p>
<p>Today, every major monitoring vendor is a platform.</p>
<p>Metrics are not enough. Logs are not enough. Traces are not enough. Customers expect to be able to move between signals, correlate them, share context, and investigate problems without constantly switching tools and losing information along the way. That is now the default expectation.</p>
<p>But it wasn’t always like this. This was not the case as recently as 10-15 years ago.</p>
<p>Sematext was built around this idea early. Back in 2013 and 2014, we were already combining monitoring and log management in what would eventually evolve into Sematext Cloud. At the time, these were treated as separate product categories: New Relic was the leader in monitoring and Splunk in the log monitoring category.  For us, however, they were already parts of the same operational problem. For several years I was scratching my head and wondering why these big vendors attached only these individual observability dimensions and didn’t see what looked obvious to me, that these signals belong together:</p>
<ul>
<li aria-level="1">If a metric suddenly spikes, you want to see the logs.</li>
<li aria-level="1">If an error appears in the logs, you want to understand what was happening with the infrastructure and application.</li>
</ul>
<p>The value was not simply in collecting multiple kinds of data. The value was in connecting them. That basic idea has only become stronger over time.</p>
<p>As far as I am aware, Sematext was the first solution that combined metrics, logs, and later traces into a single observability platform, and later synthetic monitoring, user experience monitoring, infrastructure visibility, maps, profiling-related capabilities, and increasingly AI-related observability in one environment.</p>
<p>Things that have changed are architectures, data volumes, and terminology, but the underlying idea has remained remarkably stable:</p>
<p><b>Operational data becomes much more valuable when it can be understood in context.</b></p>
<h2 id="observability-verticals"><b>Observability verticals</b></h2>
<p>The rise of platforms does not mean the end of focused, single-purpose products. In fact, depending on the goal, there may be more opportunities than ever for specialists.</p>
<p>Platforms are powerful, but they have a natural disadvantage: they are large. Adding a completely new capability to an existing platform involves product strategy, engineering, storage architecture, data models, pricing, user experience, support, documentation, integrations, and the inevitable question of how the new capability fits with everything that already exists.</p>
<p>A specialist can simply focus on solving one problem exceptionally well. That creates an interesting dynamic. A startup can identify an emerging problem, move quickly, build deep expertise, and create technology that would take a larger platform years to reproduce.</p>
<p>Eventually, all platforms face build-versus-buy decisions and oftentimes buying is the obvious answer.</p>
<p>A very recent example is Dash0’s acquisition of Polar Signals. Polar Signals focused deeply on continuous profiling, including CPU, memory, and GPU/CUDA profiling. Dash0, meanwhile, is building a broader observability platform. The acquisition brings Polar Signals’ profiling technology and engineering expertise into that larger platform.</p>
<p>That is a model I expect we will continue to see:</p>
<ol>
<li aria-level="1">A focused company identifies a new problem.</li>
<li aria-level="1">It goes deep.</li>
<li aria-level="1">It builds expertise and technology.</li>
<li aria-level="1">A larger platform recognizes that reproducing all of that internally would be expensive and slow.</li>
<li aria-level="1">The specialist becomes part of the platform.</li>
</ol>
<p>We are seeing similar dynamics around AI. There is a great deal of innovation happening in narrowly focused companies building capabilities around AI agents, AI infrastructure, LLM observability, governance, security, coding agents, and autonomous operations.</p>
<p>Some of the specialist companies will become platforms themselves. Others may become highly valuable pieces of much larger platforms. Some will not make it.</p>
<p>The existence of platform gravity does not eliminate the opportunity for specialists. In many cases, it creates it.</p>
<p>Some recent examples of the AI acquisitions in the observability space:</p>
<ul>
<li aria-level="1">Dynatrace bought Arize AI (August 2026)</li>
<li aria-level="1">Elastic bought Deductive AI (August 2026)</li>
<li aria-level="1">Datadog bought Adaptive ML (June 2026)</li>
</ul>
<h2 id="distributed-tracing-before-the-three-pillars-of-observability"><b>Distributed tracing before “the three pillars of observability”</b></h2>
<p>Distributed tracing is a good example of how terminology can arrive (and also evaporate!) after the technology.</p>
<p>Sematext added distributed transaction tracing in 2015. It was very different from what most people think of when they hear “distributed tracing” today. Our initial implementation focused on JVM applications and used Java bytecode instrumentation. The goal, however, was already familiar: follow transactions through an application and understand where time was being spent.</p>
<p>Today, we have OpenTelemetry and with that we have  standardized APIs and SDKs.</p>
<p>We have auto-instrumentation across many languages, sometimes even multiple choices, like in case of Go (see <a href="https://sematext.com/blog/zero-code-opentelemetry-for-go-obi-vs-otelc/">Zero-Code OpenTelemetry for Go: Runtime Instrumentation with OBI vs. Compile-Time Instrumentation with Otelc</a>).</p>
<p>We have collectors, semantic conventions, OTLP, and increasingly broad ecosystem support.</p>
<p>But the fundamental problem has not changed.</p>
<p>We still want the answer to the same question:</p>
<p><b>Where did the request go, and where did it spend its time?</b></p>
<p>In 2015, the now-familiar “three pillars of observability” framing, referring to metrics, logs, and traces, had not yet become a part of the industry vocabulary. Today, the trifecta of these observability signals is so widely accepted that it is easy to forget how much of the ecosystem around these signals was still forming only a decade ago. And the name, “three pillars of observability” came and went. Nobody uses it any more. The “pillars” keep getting added as observability platforms widen their scope in an endless race to increase customer lifetime value, among other things.</p>
<p>OpenTelemetry itself provides an interesting perspective on how long technology maturation can take.</p>
<p>OpenTelemetry now feels as though it is reaching a much more mature stage in 2026. Its core signals are widely adopted, the tooling is substantially better, and the ecosystem around it is far more developed than it was just a couple of years ago.</p>
<p>But this did not happen overnight. The industry has spent well over a decade converging toward more standardized approaches to collecting and exchanging telemetry.</p>
<h2 id="from-appmap-to-service-map"><strong>From AppMap to Service Map</strong></h2>
<p>In August 2015, Sematext built what we called <b>AppMap</b>. I dug out <a href="http://archive.org" target="_blank" rel="noopener noreferrer">the original AppMap announcements from archive.org</a>. The UI looks super retro 🙂</p>
<p>But behind that old interface was a problem that is still very much with us today:</p>
<p><b>How do you understand the relationships and dependencies inside a distributed system?</b></p>
<p>The technology we had available at the time was different from what we have at our disposal today, of course. There was no OpenTelemetry. There was no broadly adopted, vendor-neutral tracing standard. So we used the signals we could obtain: network packet analysis.</p>
<p>Fast-forward 11 years.</p>
<p>Today, Sematext has a slick <a href="https://sematext.com/docs/service-map/">Service Dependency Map, built on top of OpenTelemetry</a> and modern distributed tracing. A bunch of things are different:</p>
<ul>
<li aria-level="1">The implementation is fundamentally different</li>
<li aria-level="1">The instrumentation model is different</li>
<li aria-level="1">The data model is different</li>
<li aria-level="1">The backend is different</li>
<li aria-level="1">Most obviously, the UI 😂</li>
</ul>
<p>But at the core, both products are trying to answer the same set of questions. We still want and need to know the same:</p>
<pre>2015                                     2026
AppMap                                   Service Map
-----------------------------------------------------------------
What talks to what?                      What talks to what?
What depends on what?                    What depends on what?
Where are dependencies?                  Where are dependencies?
Where might the bottleneck be?           Where is the bottleneck?</pre>
<p>How we go about getting answers to these questions has changed, but the core problem remains.</p>
<h2 id="network-map-major-technology-change"><b>Network Map: major technology change</b></h2>
<p>Here is another example. We also built an early Network Map. We called it <b>NetMap</b>.</p>
<p>It was built so long ago that the original announcement is no longer available on our blog. Somewhere along the way, probably during one of those SEO and content-cleanup projects that every company eventually goes through, the original post disappeared.</p>
<p>The Wayback Machine still has an <a href="https://web.archive.org/web/20190723141111/https://sematext.com/network-monitoring/" target="_blank" rel="noopener noreferrer">archived version of the old Network Monitoring product page</a> from 2019, although the original NetMap itself was built several years before that.</p>
<p>Now, roughly a decade later, <a href="https://sematext.com/docs/network-map/">Sematext has a new Network Map</a>.</p>
<p>The technology behind it is <i>entirely</i> different. The old and new versions are not incremental versions of the same implementation. The agent, the data collection technology, the backend, the frontend, they are all very different and, because of that, the capabilities and usability are substantially better.</p>
<p>The new Network Map is built using eBPF.</p>
<p>And this is where the technology cycle becomes particularly interesting (more towards the end).</p>
<p>eBPF gives us a fundamentally different way to observe what is happening inside modern systems. It allows us to create visibility that would have been much more difficult, or in some cases simply impractical, to build with the technologies available to us a decade ago.</p>
<p>And what are we doing with this, what problems are we solving, what questions are we answering? Well, we are once again answering questions such as:</p>
<ul>
<li aria-level="1">Which processes are communicating?</li>
<li aria-level="1">Which services depend on each other?</li>
<li aria-level="1">What is the network topology?</li>
<li aria-level="1">Where are unexpected connections?</li>
<li aria-level="1">What are the communication paths through the infrastructure?</li>
</ul>
<p>In other words:</p>
<p><b>The implementation is radically different. The core operational question is not.</b></p>
<h2 id="profiling-in-2016-vs-profiling-in-2026-opentelemetry"><b>Profiling in 2016 vs profiling in 2026: OpenTelemetry</b></h2>
<p>Another example is application profiling.</p>
<p>In March 2016, Sematext announced <a href="https://web.archive.org/web/20190819140026/https://sematext.com/blog/on-demand-java-profiling/" target="_blank" rel="noopener noreferrer">on-demand Java profiling</a>. It was very different from what we think of as modern continuous profiling. It was limited to JVM applications. It was on-demand. You would run it for a few minutes to capture and investigate what was happening inside an application.</p>
<p>The goal? Understand where the application was spending its time and resources.</p>
<p>Fast-forward more than 10 years to 2026. In March 2026, <a href="https://opentelemetry.io/docs/specs/otel/profiles/" target="_blank" rel="noopener noreferrer">OpenTelemetry Profiles</a> officially entered public Alpha.</p>
<p>The goal is not just to define another data format. It is to make continuous, low-overhead production profiling a first-class, standardized observability signal that can be correlated with traces, metrics, and logs, and that can be used to profile all kinds for runtimes.</p>
<pre>2016
│
├── On-demand profiling
├── JVM-focused
└── Run it when you need to investigate
 │
 ▼
2026
│
├── Continuous profiling
├── Multiple runtimes and environments
├── Low-overhead production collection
├── eBPF-based approaches
└── Standardization through OpenTelemetry</pre>
<p>The need for finding bottlenecks inside applications running in production, but without having to attach computationally expensive and impractical profiles, has been around for decades. We finally have the means to do that. The open-source standards and technology simply needed time to catch up.</p>
<h2 id="incremental-additions-to-observability"><b>Incremental additions to observability</b></h2>
<p>Looking back over all of this, I think there is a broader lesson.</p>
<p>Observability is often presented as a sequence of new categories.</p>
<ul>
<li aria-level="1">First metrics</li>
<li aria-level="1">Then logs</li>
<li aria-level="1">Then traces</li>
<li aria-level="1">Then profiling</li>
<li aria-level="1">Then eBPF (that provides a substantially better tech for these 4 telemetry signals)</li>
<li aria-level="1">Then OpenTelemetry</li>
<li aria-level="1">Then AI observability</li>
</ul>
<p>And, yes, new technologies genuinely do create new capabilities. But they also repeatedly improve our ability to solve old problems.</p>
<p>Network visibility did not begin with eBPF. Distributed tracing did not begin with OpenTelemetry. Profiling did not begin with continuous profiling platforms. Service dependency visualization did not begin with today’s Service Maps.</p>
<p>The problems often existed first! The technology caught up later. And when new technology arrives, it often does two things at once:</p>
<ol>
<li aria-level="1">It makes existing use cases dramatically better.</li>
<li aria-level="1">It makes entirely new use cases possible.</li>
</ol>
<p>eBPF is a good example. It can be used to solve a whole set of diverse problems:</p>
<ul>
<li aria-level="1">It can help build a new generation of Network Maps</li>
<li aria-level="1">It can also be used for profiling</li>
<li aria-level="1">It can contribute to tracing and application visibility</li>
<li aria-level="1">It can be used for security, network routing, filtering, etc.</li>
</ul>
<p>And the same fundamental ability to observe what software is actually doing can be extended into completely new areas……. including AI.</p>
<h2 id="the-next-frontier-observing-ai-agents"><b>The next frontier: observing AI agents</b></h2>
<p>The AI era is upon us and AI agents introduce a new category of operational questions. It is no longer enough to ask the health of applications, or how much CPU they use, or what are the main bottlenecks, and so on. We now increasingly need to ask questions such as:</p>
<ul>
<li aria-level="1">Which AI agents are running in our environment?</li>
<li aria-level="1">What are they doing?</li>
<li aria-level="1">Which systems are they accessing?</li>
<li aria-level="1">What tools are they using?</li>
<li aria-level="1">What actions are they taking?</li>
<li aria-level="1">Are they behaving according to policy?</li>
<li aria-level="1">Are they creating security or operational risks?</li>
<li aria-level="1">What sensitive data are they sending out to third party services?</li>
<li aria-level="1">….</li>
</ul>
<p>I think we can all relate to this. That is why we recently introduced <a href="https://sematext.com/docs/ai-agent-watch/">Sematext’s AI Agent Watch</a> capabilities. This sort of functionality is desperately needed right around now, whether or not every one of us recognizes this yet or not.</p>
<p>And so the underlying technologies and techniques behind modern observability continue to find new uses. The same industry that spent years learning how to observe servers, processes, services, requests, and code is now applying similar thinking to AI agents.</p>
<p>And this is only the beginning.</p>
<p> </p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/what-13-years-of-building-observability-has-taught-us-the-problems-stay-the-technology-changes/">What 13 Years of Building Observability Has Taught Us: The Problems Stay, the Technology Changes</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Zero-Code OpenTelemetry for Go: Runtime Instrumentation with OBI vs. Compile-Time Instrumentation with Otelc</title>
		<link>https://sematext.com/blog/zero-code-opentelemetry-for-go-obi-vs-otelc/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Tue, 25 Aug 2026 15:16:08 +0000</pubDate>
				<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[Tracing]]></category>
		<category><![CDATA[application monitoring]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[opentelemetry]]></category>
		<category><![CDATA[OpenTelemetry instrumentation best practices]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=71029</guid>

					<description><![CDATA[<p>At Sematext we’ve been using Go for probably about a decade. But we didn’t start instrumenting it with OpenTelemetry until earlier this year. Go has historically had a relatively straightforward but hands-on OpenTelemetry instrumentation model: add the OpenTelemetry SDK, initialize it, instrument the libraries you use, and create custom spans where application-specific context matters. That [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/zero-code-opentelemetry-for-go-obi-vs-otelc/">Zero-Code OpenTelemetry for Go: Runtime Instrumentation with OBI vs. Compile-Time Instrumentation with Otelc</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>At Sematext we’ve been using Go for probably about a decade. But we didn’t start instrumenting it with OpenTelemetry until earlier this year.</p>
<p>Go has historically had a relatively straightforward but hands-on OpenTelemetry instrumentation model: add the OpenTelemetry SDK, initialize it, instrument the libraries you use, and create custom spans where application-specific context matters.</p>
<p>That approach still gives you the most control. But it is no longer the only practical option.</p>
<p>The manual instrumentation approach requires so much work from engineers that we decided to create a general <a href="https://github.com/sematext/sematext-otel-onboarding/tree/main/skills" target="_blank" rel="noopener noreferrer">AI Skill for instrumenting applications with OpenTelemetry SDK</a>, regardless of the runtime/SDK.</p>
<p>Two newer approaches can instrument Go applications with little or no manual source-code instrumentation:</p>
<ul>
<li><b>OpenTelemetry eBPF Instrumentation (OBI)</b> instruments applications at runtime.</li>
<li aria-level="1"><b>OpenTelemetry Go Compile-Time Instrumentation (</b><b>otelc</b><b>) </b>injects instrumentation during the build.</li>
</ul>
<p>Both are part of the OpenTelemetry ecosystem. Both can produce OpenTelemetry telemetry without requiring developers to manually wrap every HTTP handler, database call, gRPC client, or messaging operation.</p>
<p>Both can be described as “zero-code instrumentation”, but they solve the problem at completely different points in the software lifecycle.</p>
<p>OBI asks:</p>
<p><b>How can we observe this application without changing or rebuilding it?</b></p>
<p>Otelc asks:</p>
<p><b>How can we build this application with instrumentation already inside it without manually modifying its source code?</b></p>
<p>This article looks at both approaches from the perspective of a developer, SRE, DevOps engineer, or engineering manager who needs to make a practical decision about instrumenting a Go application.</p>
<h3 id="the-traditional-way-to-instrument-go-with-opentelemetry">The traditional way to instrument Go with OpenTelemetry</h3>
<p>The conventional way to instrument a Go application is to explicitly add OpenTelemetry support to the application using the SDK for Go.</p>
<p>At a high level, that usually means:</p>
<ol>
<li aria-level="1">Adding the <a href="https://opentelemetry.io/docs/languages/go" target="_blank" rel="noopener noreferrer">OpenTelemetry Go API and SDK</a>.</li>
<li aria-level="1">Configuring a TracerProvider.</li>
<li aria-level="1">Configuring exporters.</li>
<li aria-level="1">Instrumenting libraries such as HTTP servers and clients, gRPC, databases, and messaging clients.</li>
<li aria-level="1">Adding custom spans around important application operations.</li>
</ol>
<p>A simplified example might look like this:</p>
<pre>tracer := otel.Tracer("checkout")
ctx, span := tracer.Start(ctx, "reserve_inventory")
defer span.End()
if err := inventory.Reserve(ctx, order); err != nil {
  span.RecordError(err)
  return err
}</pre>
<p>For a more complete example, see our Gin service instrumentation example: <a href="https://github.com/sematext/sematext-otel-onboarding/tree/main/go" target="_blank" rel="noopener noreferrer">https://github.com/sematext/sematext-otel-onboarding/tree/main/go</a></p>
<p>This model has important advantages:</p>
<ul>
<li aria-level="1">You explicitly control where spans start and end.</li>
<li aria-level="1">You can attach application-specific attributes.</li>
<li aria-level="1">You can model important business operations.</li>
<li aria-level="1">You can decide what should and should not become telemetry.</li>
</ul>
<p>The downside is obvious: instrumentation becomes part of the application.</p>
<p>For a sufficiently large system, that can mean touching many services, maintaining instrumentation dependencies, reviewing instrumentation changes, and deciding how deeply each library and operation should be instrumented. This is the type of stuff we faced at Sematext when we said “OK, let’s go and instrument all our Go services now”.</p>
<p>A useful way to think about the landscape is:</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-71033" src="https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum.webp" alt="OBI vs OTelc vs Manual OTel instrumentation" width="1600" height="900" srcset="https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum.webp 1600w, https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum-300x169.webp 300w, https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum-1024x576.webp 1024w, https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum-768x432.webp 768w, https://sematext.com/wp-content/uploads/2026/08/01-instrumentation-spectrum-1536x864.webp 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /></p>
<p>OBI and Otelc occupy different places on that spectrum.</p>
<p>Note that <b>manual instrumentation is far from obsolete</b>, you and your team can still choose this approach. It’s just that the zero-code approaches provide another layer of options. As a matter of fact, as you read this article you will learn that manual instrumentation is still critical in certain situations and complements the auto-instrumentation approaches.</p>
<h3 id="why-zero-code-instrumentation-is-harder-in-go">Why zero-code instrumentation is harder in Go</h3>
<p>Automatic instrumentation is relatively familiar in languages with highly dynamic runtimes.</p>
<p>Java agents can modify or intercept bytecode. Python can wrap functions dynamically. Other runtimes provide mechanisms that make it possible to insert instrumentation after an application has been built.</p>
<p>But Go is different. A Go application is typically compiled into a native binary. Once the binary exists, there is no general-purpose equivalent of loading a Java agent and rewriting the application’s bytecode.</p>
<p>That creates a fundamental choice for automatic instrumentation:</p>
<p><b>Do you instrument the process from outside, or do you modify the application during compilation?</b></p>
<p>OBI takes the first approach and Otelc takes the second.</p>
<p>The architectures look like this.</p>
<h4>OBI: runtime instrumentation</h4>
<p><img decoding="async" class="alignnone size-full wp-image-71034" src="https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture.webp" alt="OBI Runtime Instrumentation Architecture" width="1600" height="900" srcset="https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture.webp 1600w, https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture-300x169.webp 300w, https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture-1024x576.webp 1024w, https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture-768x432.webp 768w, https://sematext.com/wp-content/uploads/2026/08/02-obi-runtime-architecture-1536x864.webp 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /></p>
<h4>Otelc: compile-time instrumentation</h4>
<p><img decoding="async" class="alignnone size-full wp-image-71035" src="https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture.webp" alt="OTelc Compile-time Instrumentation Architecture" width="1600" height="900" srcset="https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture.webp 1600w, https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture-300x169.webp 300w, https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture-1024x576.webp 1024w, https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture-768x432.webp 768w, https://sematext.com/wp-content/uploads/2026/08/03-otelc-build-architecture-1536x864.webp 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /></p>
<p>This difference affects deployment, security, portability, ownership, and operational complexity.</p>
<p>Let’s look at each approach in detail.</p>
<h3 id="obi-instrumenting-a-running-go-process">OBI: Instrumenting a running Go process</h3>
<p><b>OpenTelemetry eBPF Instrumentation (OBI)</b> is the OpenTelemetry project’s eBPF-based automatic instrumentation technology.</p>
<p>It was originally based on technology from Grafana Beyla and is now developed as an OpenTelemetry project. OBI’s first OpenTelemetry release was announced in late 2025, and the project has continued to evolve since then.</p>
<p>We are big fans of eBPF at Sematext and have been using it for 10+ years now. When we first started instrumenting our Go applications we chose the OBI approach and included it in <a href="https://github.com/sematext/sematext-otel-onboarding/tree/main/go" target="_blank" rel="noopener noreferrer">our OTel examples for instrumenting Go applications</a>.</p>
<p>The central idea is simple:</p>
<p><b>Run instrumentation outside the application process and observe the application while it runs.</b></p>
<p>Unlike a traditional OpenTelemetry SDK integration, OBI does not require adding OpenTelemetry code to the application binary.</p>
<p>See also: <a href="https://opentelemetry.io/docs/zero-code/obi/setup/" target="_blank" rel="noopener noreferrer">OpenTelemetry eBPF Instrumentation documentation</a></p>
<h4>How OBI works</h4>
<p>OBI uses eBPF to observe application and system behavior. Depending on what is being instrumented, it can capture activity at protocol boundaries and use language-specific techniques, including user-space probes, or <a href="https://sematext.com/ebpf-userland-apps/">uprobes</a>, for supported Go instrumentation.</p>
<p>A simplified flow looks like this:</p>
<pre>         Client
           │
           │ HTTP request
           ▼
┌──────────────────────┐
│      Go service      │
│                      │
│   net/http handler   │◄───── OBI observes
│          │           │       supported operations
│          ▼           │
│     application      │
│       logic          │
│          │           │
│          ▼           │
│    database/sql      │◄───── OBI observes
│                      │
└──────────────────────┘
           │
           │ SQL
           ▼
       PostgreSQL
           │
           ▼
   ┌───────────────┐
   │      OBI      │
   └───────┬───────┘
           │
           ▼
    Trace + metrics</pre>
<p> </p>
<p>OBI can be deployed as:</p>
<ul>
<li aria-level="1">a standalone process,</li>
<li aria-level="1">a Docker container,</li>
<li aria-level="1">a Kubernetes sidecar,</li>
<li aria-level="1">or a Kubernetes DaemonSet.</li>
</ul>
<p>The exact deployment model depends on how broadly you want to instrument the environment.</p>
<h4>What can OBI instrument in Go?</h4>
<p>OBI supports a combination of protocol-level and Go library-level instrumentation.</p>
<p>The current OpenTelemetry documentation lists Go support for technologies including:</p>
<ul>
<li aria-level="1">net/http</li>
<li aria-level="1">HTTP/2</li>
<li aria-level="1">gorilla/mux</li>
<li aria-level="1">Gin</li>
<li aria-level="1">gRPC</li>
<li aria-level="1">database/sql</li>
<li aria-level="1">MySQL drivers</li>
<li aria-level="1">PostgreSQL drivers</li>
<li aria-level="1">Redis</li>
<li aria-level="1">Kafka</li>
<li aria-level="1">Sarama</li>
<li aria-level="1">pgx</li>
</ul>
<p>Compatibility depends on the specific library and version. For example, Go library-level instrumentation is documented for Go 1.17+, while some context propagation capabilities require Go 1.18+.</p>
<p>This is an important practical point. OBI is not simply “watching packets.”</p>
<p>For supported Go libraries, it can use Go-specific instrumentation to capture richer application behavior.</p>
<p>At the same time, it remains fundamentally an <b>out-of-process instrumentation system</b>.</p>
<h4>What using OBI looks like</h4>
<p>Imagine you have an existing Go service, say payment-api, and that it is already running in production.</p>
<p>As such, you may not want to:</p>
<ul>
<li aria-level="1">modify its source code,</li>
<li aria-level="1">change its dependencies,</li>
<li aria-level="1">rebuild it,</li>
<li aria-level="1">or restart it purely to add instrumentation.</li>
</ul>
<p>OBI can be deployed separately and configured to discover or target the application. This is particularly useful for existing workloads.</p>
<p>OBI’s runtime model is one of its strongest characteristics: it can observe applications without making OpenTelemetry instrumentation part of the application’s build artifact. The OpenTelemetry project describes OBI as out-of-process instrumentation that can provide telemetry without application code changes or application restarts in supported scenarios.</p>
<h4>Advantages of OBI</h4>
<h5>1. No source-code changes</h5>
<p>The obvious benefit is that developers do not need to edit the application.</p>
<p>There is no need to:</p>
<pre>git clone --&gt; add instrumentation --&gt; test instrumentation --&gt; commit --&gt; build --&gt; deploy</pre>
<p>Instead, instrumentation can be introduced independently of the application code.</p>
<p>This is particularly attractive when:</p>
<ul>
<li aria-level="1">the application is maintained by another team,</li>
<li aria-level="1">source code is unavailable,</li>
<li aria-level="1">the application is legacy,</li>
<li aria-level="1">you want to instrument an existing fleet,</li>
<li aria-level="1">or the platform team owns observability deployment.</li>
</ul>
<h5>2. No application rebuild</h5>
<p>OBI can instrument supported workloads without requiring you to produce a new binary. This is one of the clearest differences between OBI and Otelc.</p>
<p>Otelc, on the other hand, requires the ability to run the application through an instrumented build process.</p>
<h5>3. Instrumentation can be centrally operated</h5>
<p>OBI is well suited to an infrastructure-oriented operating model. For example, the platform team could choose to deploy OBI as a Kubernetes DaemonSet and have it handle the instrumentation of Go, Java, and Python applications. In other words, the application teams do not necessarily have to independently add and maintain instrumentation.</p>
<p>That can be valuable in organizations with many teams and inconsistent OpenTelemetry adoption.</p>
<h5>4. It is not Go-specific</h5>
<p>OBI can observe applications written in multiple languages. That means an SRE or platform engineering team can use a common instrumentation mechanism across a heterogeneous environment. For organizations operating Go, Java, Python, Node.js, NGINX, and other workloads, that can simplify initial telemetry coverage. This is one of the OBI aspects that we have benefited from at Sematext, as some of our legacy code still uses Java/Kotlin and Node.js.</p>
<h4>The limitations and trade-offs of OBI</h4>
<h5>1. OBI depends on the runtime environment</h5>
<p>OBI is fundamentally a Linux and eBPF-based technology.</p>
<p>That means your deployment environment must support the capabilities OBI needs.</p>
<p>The OpenTelemetry documentation describes OBI as a Linux process that can inspect other running processes and requires elevated privileges or the appropriate Linux capabilities, depending on deployment and configuration.</p>
<p>In containers and Kubernetes, this can become an architectural decision rather than a simple configuration change.</p>
<p>For example, some OBI deployments require or may use:</p>
<ul>
<li aria-level="1">privileged containers,</li>
<li aria-level="1">CAP_SYS_ADMIN,</li>
<li aria-level="1">CAP_PERFMON,</li>
<li aria-level="1">host or shared process namespaces,</li>
<li aria-level="1">access to /proc.</li>
</ul>
<p>The exact requirements depend on the instrumentation and deployment model. Recent kernel security changes can also affect Go instrumentation because OBI uses uprobes for Go-specific instrumentation.</p>
<p>This does not mean OBI is inherently unsuitable for production.It means that the <b>security model must be evaluated by the platform team</b>.</p>
<p>Of course, if your applications don’t run on Linux then OBI is not an option for you at all until other platforms, like Windows, get the needed eBPF support. See <a href="https://github.com/microsoft/ebpf-for-windows" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/ebpf-for-windows</a> for what Microsoft is doing about that for Windows.</p>
<h5>2. Coverage depends on what OBI understands</h5>
<p>OBI can automatically observe supported protocols and libraries, but it does not automatically understand arbitrary application code.</p>
<p>Consider:</p>
<pre>func CalculateEnterpriseDiscount(
    customer Customer,
    contract Contract,
) (Discount, error) {
    // 500 lines of business logic
}</pre>
<p>There is no general way for an external runtime observer to know that this function represents an important business operation. OBI can show what happens around it:</p>
<pre>HTTP request
    │
    ├── database query
    ├── Redis lookup
    ├── gRPC call
    └── Kafka publish</pre>
<p>But it cannot automatically know that CalculateEnterpriseDiscount is an important domain-level operation.</p>
<h5>3. Automatic service names and routes may need tuning</h5>
<p>Because OBI observes applications externally, automatically derived service names, routes, and URLs may not always match how your organization wants to identify services.</p>
<p>The OpenTelemetry documentation specifically calls out route configuration and decoration as something that should be reviewed when generating traces with OBI.</p>
<p>That means you should validate the resulting telemetry rather than assuming that automatic discovery will always produce exactly the naming and cardinality you want.</p>
<h3 id="otelc-instrumenting-go-during-compilation">Otelc: Instrumenting Go during compilation</h3>
<p>The second approach moves instrumentation from runtime to build time.</p>
<p><b>Otelc</b>, the OpenTelemetry Go Compile-Time Instrumentation tool, modifies the Go build process so that supported instrumentation is injected while the application is being compiled.</p>
<p>The resulting application binary contains the instrumentation.</p>
<p>The normal Go build looks like this:</p>
<p>Source code ──► go build ──► Go binary</p>
<p> </p>
<p>While with Otelc it looks like this:</p>
<p>Source code ──► otelc + go build ──► Instrumented Go binary</p>
<p>So if you choose Otelc you will not need to change the application source code, but you will need to alter the build process.</p>
<h4>How Otelc works</h4>
<p>According to the <a href="https://opentelemetry.io/docs/zero-code/go/compile-time/" target="_blank" rel="noopener noreferrer">OpenTelemetry Go compile-time instrumentation documentation</a>, Otelc:</p>
<ol>
<li aria-level="1">Intercepts compilation using the Go toolchain’s -toolexec mechanism.</li>
<li aria-level="1">Matches packages and functions against instrumentation rules.</li>
<li aria-level="1">Injects lightweight hook points.</li>
<li aria-level="1">Links those hooks to OpenTelemetry instrumentation code.</li>
</ol>
<p>The resulting binary contains the instrumentation, so there is no separate runtime instrumentation agent that needs to attach to the process. Operationally, this is simpler because there is no additional moving piece running in production.</p>
<p>Visually things look like this:</p>
<p>Go application (source) ──► Otelc (match rules, inject hooks, link OTel code) ──► Instrumented Go binary ──► OTLP</p>
<p> </p>
<p>The Otelc project uses techniques including <a href="https://en.wikipedia.org/wiki/Trampoline_(computing)" target="_blank" rel="noopener noreferrer">trampoline code injection</a> and function hook mechanisms to connect instrumented functions with OpenTelemetry logic.</p>
<h4>What does using Otelc look like?</h4>
<p>A simple workflow can look like:</p>
<pre>otelc go build -o myapp .</pre>
<p>Alternatively, Otelc can be integrated with the standard Go toolchain using -toolexec.</p>
<p>A documented pattern is:</p>
<pre>otelc setup
export GOFLAGS="${GOFLAGS} '-toolexec=otelc toolexec'"
go build -o myapp .</pre>
<p>This can be useful when a build command is controlled by an existing Makefile, CI system, or another build tool.</p>
<p>Otelc can also be installed as a Go tool dependency in supported Go versions, allowing builds such as:</p>
<pre>go tool otelc go build -o myapp .</pre>
<p>Otelc also supports generating or maintaining instrumentation configuration based on the application’s dependency graph.</p>
<h4>What can Otelc instrument?</h4>
<p>The currently documented set of supported instrumentation includes:</p>
<ul>
<li aria-level="1">net/http</li>
<li aria-level="1">gRPC</li>
<li aria-level="1">database/sql</li>
<li aria-level="1">Gin</li>
<li aria-level="1">Redis</li>
<li aria-level="1">MongoDB</li>
<li aria-level="1">Kubernetes client-go</li>
<li aria-level="1">OpenAI Go SDK</li>
<li aria-level="1">Anthropic Go SDK</li>
<li aria-level="1">Kafka</li>
<li aria-level="1">AWS SDK for Go v2</li>
<li aria-level="1">selected logging libraries for trace/span correlation</li>
</ul>
<p>The supported set will continue to evolve, so it is worth checking the project’s <a href="https://opentelemetry.io/docs/zero-code/go/compile-time/supported-libraries/" target="_blank" rel="noopener noreferrer">current supported-library documentation</a> before choosing it for a specific application.</p>
<h4>Advantages of Otelc</h4>
<h5>1. No manual instrumentation changes</h5>
<p>Developers do not have to manually add instrumentation to every supported library boundary.</p>
<p>The source can remain:</p>
<pre>http.HandleFunc("/checkout", checkoutHandler)</pre>
<p>rather than becoming:</p>
<pre>handler := otelhttp.NewHandler(
    http.HandlerFunc(checkoutHandler),
    "checkout",
)
http.Handle("/checkout", handler)</pre>
<p>The instrumentation is introduced during compilation instead.</p>
<h5>2. No privileged runtime instrumentation process</h5>
<p>Once the application has been built, there is no eBPF process that needs to attach to it.</p>
<p>This can make Otelc attractive in environments where:</p>
<ul>
<li aria-level="1">privileged containers are prohibited,</li>
<li aria-level="1">eBPF is unavailable,</li>
<li aria-level="1">security policy restricts process instrumentation,</li>
<li aria-level="1">or platform teams do not want observability software attaching to production workloads.</li>
</ul>
<p>The OpenTelemetry documentation explicitly identifies this as a use case for compile-time instrumentation.</p>
<h5>3. Instrumentation can reach supported dependencies</h5>
<p>Because Otelc participates in the compilation process, it can instrument supported third-party dependencies that are part of the application’s build. That is useful when you use a library that you do not own but still want to instrument.</p>
<p>For example:</p>
<pre>Your application
       │
       ├── Gin
       ├── gRPC
       ├── database/sql
       ├── Redis
       └── AWS SDK</pre>
<p>Otelc can apply instrumentation rules to supported parts of that dependency graph without requiring you to fork or edit those dependencies.</p>
<h5>4. The build artifact contains the instrumentation</h5>
<p>This changes who owns the operational problem.</p>
<p>With OBI: application deployment + runtime instrumentation deployment</p>
<p>With Otelc: only the instrumented application artifact</p>
<p>The instrumentation becomes part of the software artifact produced by the build. That can fit naturally into organizations where application teams already own their build and deployment pipelines.</p>
<h4>The limitations and trade-offs of Otelc</h4>
<p>Nothing in this world seems to come without downsides… let’s look at Otelc’s cons.</p>
<h5>1. You must control the build</h5>
<p>Otelc requires access to the build process because that is where instrumentation is introduced. This is the most important limitation. If you have a precompiled production binary but cannot rebuild it, Otelc is simply not an option.</p>
<h5>2. The build pipeline becomes part of the instrumentation architecture</h5>
<p>Adding Otelc is not the same as adding another environment variable.</p>
<p>You now need to think about:</p>
<ul>
<li aria-level="1">local developer builds,</li>
<li aria-level="1">CI builds,</li>
<li aria-level="1">release builds,</li>
<li aria-level="1">test builds,</li>
<li aria-level="1">reproducibility,</li>
<li aria-level="1">dependency management,</li>
<li aria-level="1">cross-compilation,</li>
<li aria-level="1">monorepos,</li>
<li aria-level="1">and build caching.</li>
</ul>
<p>The good news is that Otelc is designed to work with the normal Go build workflow and documents approaches for integrating through go tool, direct build wrapping, and -toolexec.</p>
<p>But this should still be treated as a build-system change and tested accordingly.</p>
<h5>3. Coverage is limited to available instrumentation</h5>
<p>Like OBI, Otelc does not automatically understand every Go package. It needs instrumentation rules for the libraries and functions you want to observe.</p>
<p>If you use some framework that is not yet supported by the instrumentation, Otelc will not magically infer its semantics.</p>
<p>You may need to:</p>
<ul>
<li aria-level="1">add manual instrumentation,</li>
<li aria-level="1">create instrumentation for that library,</li>
<li aria-level="1">or accept that the library is not automatically traced.</li>
</ul>
<p>Luckily, the Otelc project includes an <a href="https://opentelemetry.io/docs/zero-code/go/compile-time/configuration/" target="_blank" rel="noopener noreferrer">instrumentation model and documentation for adding support for additional libraries</a>, so this scenario can be handled.</p>
<h5>4. Automatic instrumentation is still not the same as manual application instrumentation</h5>
<p>Otelc can add spans around supported framework and library operations. It does not automatically know which parts of your business logic are important.</p>
<p>For example:</p>
<pre>POST /checkout
       │
       ▼
ValidateOrder
       │
       ├── ReserveInventory
       │
       ├── CalculateDiscount
       │
       ├── ProcessPayment
       │
       └── CreateShipment</pre>
<p>Automatic instrumentation may produce excellent visibility into:</p>
<pre>HTTP server span
       │
       ├── SQL query
       ├── Redis operation
       ├── HTTP call to payment provider
       └── Kafka publish</pre>
<p>But it may not tell you how much time was spent specifically in CalculateDiscount unless you explicitly instrument that operation.</p>
<h3 id="obi-vs-otelc-side-by-side-comparison">OBI vs. Otelc: side-by-side comparison</h3>
<p>The following table summarizes the practical differences.</p>
<table>
<tbody>
<tr>
<td><b>Characteristic</b></td>
<td><b>OBI</b></td>
<td><b>Otelc</b></td>
</tr>
<tr>
<td><b>Instrumentation point</b></td>
<td>Runtime</td>
<td>Build time</td>
</tr>
<tr>
<td><b>Primary mechanism</b></td>
<td>eBPF, protocol observation, and language-specific probes such as uprobes</td>
<td>Go compiler/toolchain integration and injected instrumentation hooks</td>
</tr>
<tr>
<td><b>Source-code changes</b></td>
<td>None required</td>
<td>None required</td>
</tr>
<tr>
<td><b>Application rebuild required</b></td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td><b>Can instrument an existing binary</b></td>
<td>Yes, in supported environments</td>
<td>No</td>
</tr>
<tr>
<td><b>Can observe an already-running process</b></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td><b>Requires build pipeline changes</b></td>
<td>No, not necessarily</td>
<td>Yes</td>
</tr>
<tr>
<td><b>Requires runtime instrumentation software</b></td>
<td>Yes</td>
<td>No separate attach-time agent</td>
</tr>
<tr>
<td><b>Requires Linux/eBPF support</b></td>
<td>Yes</td>
<td>No eBPF dependency</td>
</tr>
<tr>
<td><b>Requires elevated runtime privileges</b></td>
<td>Often requires privileged operation or specific Linux capabilities, depending on deployment</td>
<td>No eBPF-related runtime privileges</td>
</tr>
<tr>
<td><b>Can instrument supported Go libraries</b></td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td><b>Can instrument supported third-party dependencies</b></td>
<td>Yes, depending on supported protocol/library instrumentation</td>
<td>Yes, when supported instrumentation rules exist</td>
</tr>
<tr>
<td><b>Works when source code is unavailable</b></td>
<td>Potentially, yes</td>
<td>Only if you can rebuild from source</td>
</tr>
<tr>
<td><b>Works with precompiled binaries</b></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td><b>Cross-language use</b></td>
<td>Yes</td>
<td>Primarily Go</td>
</tr>
<tr>
<td><b>Typical operational owner</b></td>
<td>Platform engineering, SRE, DevOps</td>
<td>Application engineering and/or CI/CD/platform engineering</td>
</tr>
<tr>
<td><b>Best fit</b></td>
<td>Existing workloads and centralized runtime instrumentation</td>
<td>Applications where you control the Go build</td>
</tr>
<tr>
<td><b>Business-level custom spans</b></td>
<td>Requires additional/manual instrumentation</td>
<td>Requires additional/manual instrumentation</td>
</tr>
<tr>
<td><b>Instrumentation deployment</b></td>
<td>Separate from the application artifact</td>
<td>Baked into the build artifact</td>
</tr>
</tbody>
</table>
<p> </p>
<h3 id="obi-vs-otelc-how-to-choose-which-one-to-use">OBI vs. Otelc: how to choose which one to use</h3>
<h4>A simple decision matrix</h4>
<p>A quick way to determine if you should be considering OBI or Otelc is by considering the following scenarios and asking a few questions.</p>
<p>If your starting point is:</p>
<h5>“I have a binary already running and I don’t want to rebuild it.”</h5>
<p>Start with <b>OBI</b>.</p>
<pre>Existing binary?
      │
      ├── Yes ──► OBI is the practical zero-code option
      │
      └── No</pre>
<h5>“I control the build but don’t want to modify the application source.”</h5>
<p>Look at <b>Otelc</b>.</p>
<pre>Control the Go build?
      │
      ├── Yes ──► Otelc is a strong candidate
      │
      └── No ──► Consider OBI</pre>
<h5>“I cannot run privileged instrumentation in production.”</h5>
<p>Look at <b>Otelc</b>.</p>
<pre>eBPF / runtime privileges allowed?
      │
      ├── No ──► Otelc
      │
      └── Yes ──► OBI or Otelc</pre>
<h5>“I need to instrument services in several languages.”</h5>
<p>OBI may provide a better common platform-level approach.</p>
<pre>Go + Java + Python + Node.js
             │
             ▼
            OBI</pre>
<h5>“I need to instrument important internal business operations.”</h5>
<p>Neither automatic approach completely solves the problem. You will probably still want <b>manual instrumentation</b>. Ooops! ;)</p>
<h4>A practical decision tree</h4>
<p>Here is another approach, a decision tree, that will help you quickly see which approach is more suitable.</p>
<p>If you are deciding how to instrument a Go application, start with this:</p>
<pre>                      ┌──────────────────────┐
                      │ Need OpenTelemetry?  │
                      └──────────┬───────────┘
                                 │
                                 ▼
                  ┌────────────────────────────────┐
                  │ Can you modify the application │
                  │ source code?                   │
                  └──────────┬─────────────────────┘
                             │
                ┌────────────┴────────────┐
                │                         │
               Yes                        No
                │                         │
                ▼                         ▼
        Manual instrumentation     Can you rebuild
        is available                the application?
                                      │
                           ┌──────────┴──────────┐
                           │                     │
                          Yes                    No
                           │                     │
                           ▼                     ▼
                     Consider Otelc        Consider OBI
                           │                     │
                           ▼                     ▼
                    Do you need             Does your runtime
                    domain-level spans?     support OBI/eBPF?
                           │                     │
                           ▼                     ▼
                  Add manual spans        Deploy and validate
                  where they matter       supported coverage</pre>
<p>In practice, the decision often reduces to four questions.</p>
<h5>Question 1: Do I control the build?</h5>
<p>If yes, Otelc becomes an option.</p>
<p>If no, it does not.</p>
<h5>Question 2: Can I run eBPF instrumentation in production?</h5>
<p>If yes, OBI becomes an option.</p>
<p>If no, Otelc may be easier operationally.</p>
<h5>Question 3: Do I need to instrument existing binaries?</h5>
<p>If yes, OBI is the more natural fit.</p>
<h5>Question 4: How much application-specific context do I need?</h5>
<p>If the answer is “a lot,” neither zero-code approach is likely to be sufficient by itself. Plan for some manual instrumentation.</p>
<h3 id="why-automatic-instrumentation-does-not-eliminate-the-need-for-manual-instrumentation">Why automatic instrumentation does not eliminate the need for manual instrumentation</h3>
<p>This is perhaps the most important point in this entire article. It is tempting to think of automatic instrumentation as a replacement for manual instrumentation. In our experience, it usually is not.</p>
<p>Automatic instrumentation and manual instrumentation solve different problems.</p>
<p>Automatic instrumentation is excellent at finding and instrumenting common technical boundaries:</p>
<ul>
<li aria-level="1">HTTP requests,</li>
<li aria-level="1">gRPC calls,</li>
<li aria-level="1">database queries,</li>
<li aria-level="1">Redis operations,</li>
<li aria-level="1">messaging operations,</li>
<li aria-level="1">cloud SDK calls,</li>
<li aria-level="1">and other supported libraries.</li>
</ul>
<p>Manual instrumentation is where you describe what your application actually does.</p>
<p>Consider a checkout service.</p>
<p>Automatic instrumentation may give you:</p>
<pre>POST /checkout                           820 ms
│
├── SELECT customer                      12 ms
├── SELECT inventory                     18 ms
├── Redis GET                             3 ms
├── POST payment-provider               410 ms
└── Kafka publish                         8 ms</pre>
<p>This is indeed already extremely useful and you should aim for this as your first step.</p>
<p>But your engineering team may care about something different:</p>
<pre>Checkout
│
├── ValidateOrder
├── ReserveInventory
├── CalculateDiscount
├── ProcessPayment
└── CreateShipment</pre>
<p>Those are domain operations. Neither OBI or Otelc can reliably infer that these operations are important simply by observing technical behavior.</p>
<p><strong>The most effective approach is often a hybrid.</strong></p>
<pre>                HTTP request
                       │
                       ▼
        ┌──────────────────────────┐
        │ Automatic instrumentation│
        └────────────┬─────────────┘
                     │
              Application code
                     │
                     ▼
        ┌─────────────────────────┐
        │   Manual business spans │
        │                         │
        │ ReserveInventory        │
        │ CalculateDiscount       │
        │ ProcessPayment          │
        └────────────┬────────────┘
                     │
                     ▼
        ┌──────────────────────────┐
        │ Automatic instrumentation│
        │ SQL / Redis / gRPC / etc │
        └──────────────────────────┘</pre>
<p>For OBI specifically, OpenTelemetry also provides the <a href="https://opentelemetry.io/docs/zero-code/go/autosdk/" target="_blank" rel="noopener noreferrer">Go Instrumentation Auto SDK</a>, which is intended to help integrate manually created spans with eBPF-generated spans and shared trace context.</p>
<p>That makes the hybrid model especially relevant:</p>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">Use automatic instrumentation for broad baseline coverage. Add manual spans only where application-specific context materially improves observability.</strong></div>
<p>This avoids two extremes:</p>
<h4>Extreme 1: Instrument nothing automatically</h4>
<p>Every team has to manually instrument every HTTP framework, database driver, messaging library, and client.</p>
<h4>Extreme 2: Instrument everything automatically and assume the result is sufficient</h4>
<p>You get infrastructure-level telemetry but may lack the domain context required to answer questions such as:</p>
<ul>
<li aria-level="1">Why is checkout slow?</li>
<li aria-level="1">Which business operation failed?</li>
<li aria-level="1">How much time is spent calculating pricing?</li>
<li aria-level="1">Which customer workflow is affected?</li>
<li aria-level="1">Did the payment provider fail, or did our own validation logic reject the request?</li>
</ul>
<p>The best observability, as I hope I’ve illustrated so far in this article, usually combines the two approaches.</p>
<p> </p>
<h3 id="conclusion">Conclusion</h3>
<p> </p>
<p>OBI and Otelc represent two fundamentally different approaches to zero-code OpenTelemetry instrumentation for Go.</p>
<p><b>OBI instruments from the outside.</b></p>
<p>It is attractive when you want to observe applications that already exist, especially when rebuilding or modifying them is difficult. It can be deployed independently of the application and can support a centralized, platform-owned instrumentation model.</p>
<p><b>Otelc instruments from the inside—during the build.</b></p>
<p>It is attractive when you control the Go build process and want supported OpenTelemetry instrumentation to become part of the resulting binary without manually modifying application source code. It also avoids the need for a privileged runtime eBPF instrumentation process.</p>
<p>Neither approach eliminates the value of manual instrumentation.</p>
<p>A practical architecture for many teams will look like this:</p>
<pre>┌─────────────────────────────────────────────┐
│           Automatic instrumentation         │
│                                             │
│   OBI or Otelc                              │
│                                             │
│   HTTP • gRPC • SQL • Redis • Kafka • etc.  │
└───────────────────────┬─────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────┐
│           Manual instrumentation            │
│                                             │
│   Business operations                       │
│   Domain-specific spans                     │
│   Important attributes                      │
│   High-value application context            │
└───────────────────────┬─────────────────────┘
                        │
                        ▼
              OpenTelemetry backend</pre>
<p>The practical goal should not necessarily be to choose one instrumentation method and use it everywhere. Instead, choose the method that best fits the part of the system you are trying to observe.</p>
<ul>
<li aria-level="1"><b>Need visibility into existing workloads without rebuilding them?</b> Start with OBI.</li>
<li aria-level="1"><b>Control the Go build and want instrumentation baked into the binary?</b> Look at Otelc.</li>
<li aria-level="1"><b>Need detailed visibility into business operations?</b> Add manual instrumentation.</li>
<li aria-level="1"><b>Need all three?</b> A hybrid approach may be the most useful architecture.</li>
</ul>
<p>For implementation details and current compatibility information, start with the authoritative project documentation:</p>
<ul>
<li aria-level="1"><a href="https://opentelemetry.io/docs/zero-code/obi/setup/" target="_blank" rel="noopener noreferrer">OpenTelemetry eBPF Instrumentation (OBI)</a></li>
<li aria-level="1"><a href="https://opentelemetry.io/docs/zero-code/obi/configure/export-data/" target="_blank" rel="noopener noreferrer">OBI Go instrumentation compatibility and supported libraries</a></li>
<li aria-level="1"><a href="https://opentelemetry.io/docs/zero-code/go/compile-time/" target="_blank" rel="noopener noreferrer">OpenTelemetry Go compile-time instrumentation (Otelc)</a></li>
<li aria-level="1"><a href="https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation/blob/main/docs/getting-started.md" target="_blank" rel="noopener noreferrer">Otelc getting started guide and supported libraries</a></li>
<li aria-level="1"><a href="https://opentelemetry.io/docs/zero-code/go/autosdk/" target="_blank" rel="noopener noreferrer">OpenTelemetry Go Instrumentation Auto SDK</a></li>
</ul>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/zero-code-opentelemetry-for-go-obi-vs-otelc/">Zero-Code OpenTelemetry for Go: Runtime Instrumentation with OBI vs. Compile-Time Instrumentation with Otelc</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Best 9 SLO Monitoring Tools in 2026: Review and Comparison Tables</title>
		<link>https://sematext.com/blog/best-slo-monitoring-tools/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Sun, 23 Aug 2026 15:00:43 +0000</pubDate>
				<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Synthetic Monitoring]]></category>
		<category><![CDATA[Tools & comparisons]]></category>
		<category><![CDATA[api monitoring]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[SLO]]></category>
		<category><![CDATA[uptime]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=71024</guid>

					<description><![CDATA[<p>While working on adding SLO monitoring to Sematext we, of course, looked at other vendors and tools and their capabilities and approached. I think you will find this comparison of SLO monitoring platforms to be quite objective and factual. I provide an overview of 9 tools, their pros, cons, info about how their price their [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/best-slo-monitoring-tools/">Best 9 SLO Monitoring Tools in 2026: Review and Comparison Tables</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>While working on adding <a href="https://sematext.com/docs/synthetics/slo/">SLO monitoring to Sematext</a> we, of course, looked at other vendors and tools and their capabilities and approached. I think you will find this comparison of SLO monitoring platforms to be quite objective and factual. I provide an overview of 9 tools, their pros, cons, info about how their price their offering, as well as my take on each tool. The article contains several tool comparison tables comparing these vendors from multiple angles.</p>
<h2 id="key-functionality-to-compare"><b>Key Functionality to Compare</b></h2>
<p>At the basic level, an SLO defines the reliability target for a service—say, <b>99.9% successful requests over 30 days</b>. SLO monitoring turns that target into something actionable by tracking the underlying indicator, calculating error-budget consumption, and warning me when the budget is being burned too quickly.</p>
<p>The core functionality I look for is:</p>
<ul>
<li aria-level="1"><b>Flexible SLIs</b> based on availability, latency, errors, or custom metrics.</li>
<li aria-level="1"><b>Rolling and calendar-based time windows.</b></li>
<li aria-level="1"><b>Error budgets</b>, including remaining budget and burn rate.</li>
<li aria-level="1"><b>Burn-rate alerts</b>, ideally with multi-window alerting.</li>
<li aria-level="1"><b>Good integration with the telemetry I already collect</b>—metrics, traces, logs, or synthetic checks.</li>
<li aria-level="1"><b>Enough flexibility to model real services</b>, without forcing every SLO into a simplistic uptime template.</li>
</ul>
<p>The rest of this comparison focuses on the practical trade-offs: how each tool models SLOs, what data it can use, how usable the UI is, and how much complexity I have to accept to get reliable alerting. Note that service-level objectives are one of those things that sound straightforward until you try to operationalize them, so in addition to reviewing SLO monitoring tools it’s important to spend some time thinking about the SLOs themselves.</p>
<h2 id="quick-comparison"><b>Quick comparison</b></h2>
<p>I reviewed 9 tools. Most offer SLO as part of their wider observability platform, while one is a pure synthetic monitoring and another a purely SLO-focused tool. Here is a very quick high level comparison. There are several additional tables below that I suggest you look through.</p>
<table>
<tbody>
<tr>
<td><b>Tool</b></td>
<td><b>Best fit</b></td>
<td><b>SLI flexibility</b></td>
<td></td>
<td><b>Error-budget alerting</b></td>
<td><b>Pricing shape</b></td>
</tr>
<tr>
<td><b>Sematext</b></td>
<td>APIs, websites, and browser/user-journey reliability</td>
<td>Moderate</td>
<td></td>
<td>Yes</td>
<td>Monitor/usage-based</td>
</tr>
<tr>
<td><b>Datadog</b></td>
<td>Teams already deep in Datadog</td>
<td>High</td>
<td></td>
<td>Yes</td>
<td>Modular, usage-based</td>
</tr>
<tr>
<td><b>New Relic</b></td>
<td>Full-stack observability teams</td>
<td>High</td>
<td></td>
<td>Yes</td>
<td>Data + user/compute</td>
</tr>
<tr>
<td><b>Grafana Cloud</b></td>
<td>Prometheus/Grafana/OpenTelemetry environments</td>
<td>High</td>
<td></td>
<td>Yes</td>
<td>Platform fee + usage</td>
</tr>
<tr>
<td><b>Dynatrace</b></td>
<td>Complex enterprise and cloud environments</td>
<td>Very high</td>
<td></td>
<td>Yes</td>
<td>Platform/usage-based</td>
</tr>
<tr>
<td><b>Elastic Observability</b></td>
<td>Teams using Elastic for logs, metrics, and APM</td>
<td>Very high</td>
<td></td>
<td>Yes</td>
<td>Usage-based</td>
</tr>
<tr>
<td><b>Honeycomb</b></td>
<td>Cloud-native, tracing- and event-centric teams</td>
<td>High</td>
<td></td>
<td>Yes</td>
<td>Event/data-based</td>
</tr>
<tr>
<td><b>Nobl9</b></td>
<td>Organization-wide, vendor-neutral SLO programs</td>
<td>Very high</td>
<td></td>
<td>Yes</td>
<td>Quote-based</td>
</tr>
<tr>
<td><b>Checkly</b></td>
<td>Developer-centric synthetic/API monitoring</td>
<td>Moderate</td>
<td></td>
<td>Limited</td>
<td>Monitor/check-run based</td>
</tr>
</tbody>
</table>
<h2 id="slo-monitoring-tools-a-practical-comparison"><b>SLO Monitoring Tools: A Practical Comparison</b></h2>
<p>SLO monitoring has become one of the more useful ways to answer a deceptively simple question: <b>is my service actually reliable enough?</b></p>
<p>I don’t mean “are all the dashboards green?” or “did CPU stay below 80%?” I mean whether users are getting the level of availability and performance that the service is supposed to provide.</p>
<p>A <b>Service Level Indicator (SLI)</b> is the measurement. A <b>Service Level Objective (SLO)</b> is the target for that measurement over a period of time. If my API successfully serves 99.9% of requests over 30 days, the SLO might be 99.9% availability. The remaining 0.1% is the <b>error budget</b>—the amount of unreliability I can afford before missing the objective.</p>
<p>SLO monitoring matters because raw monitoring data does not tell me how much a problem matters. A service can generate thousands of errors and still be within its reliability objective. Conversely, a relatively short outage can consume a huge chunk of the error budget and require immediate attention.</p>
<p>The core capabilities I look for are:</p>
<ul>
<li aria-level="1">Flexible ways to define SLIs for availability, latency, errors, throughput, or custom business signals.</li>
<li aria-level="1">Rolling and calendar-based evaluation windows.</li>
<li aria-level="1">Accurate error-budget calculations.</li>
<li aria-level="1">Burn-rate monitoring and alerting.</li>
<li aria-level="1">Support for grouping, filtering, and managing large numbers of SLOs.</li>
<li aria-level="1">Good integration with the telemetry I already collect.</li>
<li aria-level="1">Automation through APIs, Terraform, or configuration-as-code.</li>
<li aria-level="1">A practical path from an SLO violation to the logs, metrics, traces, or synthetic checks that explain it.</li>
</ul>
<p>The tools below take noticeably different approaches. Some treat SLOs as one capability inside a larger observability platform. Others, especially Nobl9, treat SLO management as the product itself.</p>
<h2 id="tool-comparison"><b>Tool Comparison</b></h2>
<table>
<tbody>
<tr>
<td><b>Tool</b></td>
<td><b>Primary category</b></td>
<td><b>Best for</b></td>
<td><b>Native SLO/error-budget management</b></td>
<td><b>External synthetic monitoring</b></td>
</tr>
<tr>
<td>Sematext</td>
<td>Full-stack + synthetics</td>
<td>API, website, and user-journey reliability</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Datadog</td>
<td>Enterprise observability</td>
<td>Teams already using Datadog</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>New Relic</td>
<td>Full-stack observability</td>
<td>APM-centric teams</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Grafana Cloud</td>
<td>Cloud-native observability</td>
<td>Prometheus and OpenTelemetry teams</td>
<td>Yes</td>
<td>Through integrations</td>
</tr>
<tr>
<td>Dynatrace</td>
<td>Enterprise/full-stack observability</td>
<td>Complex enterprise and cloud environments</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Elastic Observability</td>
<td>Enterprise/full-stack observability</td>
<td>Flexible SLI definitions across multiple data types</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Honeycomb</td>
<td>Cloud-native observability</td>
<td>Tracing and event-based reliability</td>
<td>Yes</td>
<td>Indirectly</td>
</tr>
<tr>
<td>Checkly</td>
<td>Synthetic monitoring</td>
<td>Monitoring-as-code and developer workflows</td>
<td>SLO-style reliability workflows</td>
<td>Yes</td>
</tr>
<tr>
<td>Nobl9</td>
<td>Dedicated SLO platform</td>
<td>Vendor-neutral SLO programs</td>
<td>Yes</td>
<td>Via data sources</td>
</tr>
</tbody>
</table>
<p> </p>
<h2 id="1-sematext">1. <a href="https://sematext.com/">Sematext</a></h2>
<p>Sematext takes a relatively straightforward approach to SLO monitoring. Its current SLO functionality is built around synthetic monitoring, allowing me to create objectives from existing HTTP and browser monitors rather than requiring new instrumentation or a separate telemetry pipeline. That makes it particularly suitable for services where the thing I actually want to measure is externally observable behavior: can the API be reached, does the website respond quickly enough, and can a browser complete a critical user journey?</p>
<p>The implementation tracks compliance over configurable windows and provides error-budget visibility and early warnings. Sematext also connects the reliability view with the rest of its monitoring stack, including logs, infrastructure monitoring, and tracing. The main trade-off is that this is not trying to be a universal, vendor-neutral SLO layer that can model every imaginable SLI from every backend. It is simpler and more opinionated.</p>
<p><img decoding="async" class="alignnone size-full wp-image-70862" src="https://sematext.com/wp-content/uploads/2026/07/slo-screen-details.png" alt="SLO Error Budget and Compliance Charts and Alerts" width="2220" height="1494" srcset="https://sematext.com/wp-content/uploads/2026/07/slo-screen-details.png 2220w, https://sematext.com/wp-content/uploads/2026/07/slo-screen-details-300x202.png 300w, https://sematext.com/wp-content/uploads/2026/07/slo-screen-details-1024x689.png 1024w, https://sematext.com/wp-content/uploads/2026/07/slo-screen-details-768x517.png 768w, https://sematext.com/wp-content/uploads/2026/07/slo-screen-details-1536x1034.png 1536w, https://sematext.com/wp-content/uploads/2026/07/slo-screen-details-2048x1378.png 2048w" sizes="(max-width: 2220px) 100vw, 2220px" /></p>
<p> </p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">SLOs built from HTTP and browser synthetic monitors.</li>
<li aria-level="1">Availability and performance-oriented objectives.</li>
<li aria-level="1">Configurable compliance targets and time windows.</li>
<li aria-level="1">Remaining error-budget tracking.</li>
<li aria-level="1">Historical and live compliance views.</li>
<li aria-level="1">Early warning and alerting before an objective is violated.</li>
<li aria-level="1">Synthetic checks from multiple locations.</li>
<li aria-level="1">Monitoring of APIs, websites, user journeys, and third-party dependencies.</li>
<li aria-level="1">Correlation with other Sematext telemetry.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Very little setup if synthetic monitors already exist.</li>
<li aria-level="1">Good fit for externally visible services and user-facing reliability.</li>
<li aria-level="1">Easy to understand without becoming an SRE research project.</li>
<li aria-level="1">Useful for monitoring third-party APIs against expected reliability.</li>
<li aria-level="1">Integrates with logs, metrics, tracing, and other Sematext capabilities.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Less flexible than tools that can define SLOs directly from arbitrary metrics or multiple external data sources.</li>
<li aria-level="1">Not as strong for organizations that want every SLO managed through Git and a formal SLO-as-code workflow.</li>
<li aria-level="1">Synthetic-monitor-based SLOs are not a replacement for every internal service-level indicator.</li>
</ul>
<p><b>Pricing</b></p>
<p>Sematext currently offers a 14-day free trial. Synthetic Monitoring starts at <b>$2 per monitor per month</b> on monthly pricing, or <b>$1.80 per monitor per month</b> with annual pricing. SLO functionality is associated with the synthetic monitoring workflow, so the practical cost depends primarily on the monitors required to measure the service.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>What I like is the lack of ceremony. If I already have HTTP or browser monitors, turning those measurements into an SLO is a pretty natural next step. I also like the fact that an external SLO can represent what users actually experience rather than what an internal metric claims is happening.</p>
<p>What I dislike is the relative lack of flexibility compared with something like Nobl9 or a metric-centric implementation. If I want to define complex internal SLIs across arbitrary telemetry sources, this would not be my first choice.</p>
<h2 id="2-datadog">2. Datadog</h2>
<p>Datadog has one of the more mature general-purpose SLO implementations. It supports metric-based, monitor-based, and time-slice SLOs, which gives me several different ways to model reliability. Metric-based SLOs work well when I can clearly define good and bad events. Monitor-based SLOs build on existing monitors, synthetic checks, or service checks. Time-slice SLOs are useful when reliability is defined as a metric satisfying a condition during discrete periods of time.</p>
<p>Datadog also provides error-budget and burn-rate alerting, SLO tagging, search, historical views, APIs, and Terraform support. If my infrastructure, APM, logs, and synthetics are already in Datadog, this is an obvious place to keep SLOs because the data is already there. The downside is the same one that applies to Datadog generally: the platform is broad, powerful, and easy to expand inside, but the pricing model can become difficult to reason about as more products and telemetry are added.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Metric-based SLOs.</li>
<li aria-level="1">Monitor-based SLOs.</li>
<li aria-level="1">Time-slice SLOs.</li>
<li aria-level="1">Availability, latency, and custom metric use cases.</li>
<li aria-level="1">Error-budget tracking.</li>
<li aria-level="1">Burn-rate indicators and alerts.</li>
<li aria-level="1">Rolling windows.</li>
<li aria-level="1">Grouped SLOs and tags.</li>
<li aria-level="1">SLO search and management views.</li>
<li aria-level="1">API and Terraform support.</li>
<li aria-level="1">Integration with APM, logs, RUM, synthetics, and infrastructure metrics.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Very flexible SLI modeling.</li>
<li aria-level="1">Excellent fit if Datadog is already the telemetry platform.</li>
<li aria-level="1">Good support for both event-based and time-based reliability measurements.</li>
<li aria-level="1">Mature burn-rate alerting.</li>
<li aria-level="1">Strong automation support.</li>
<li aria-level="1">Easy to move from an SLO problem into the rest of the observability stack.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Pricing can be complicated because SLOs are only one part of a larger set of billable products.</li>
<li aria-level="1">The number of possible ways to model an SLO can be confusing for teams new to SRE practices.</li>
<li aria-level="1">Monitor-based SLOs can introduce dependencies on the underlying monitor configuration.</li>
<li aria-level="1">The best experience assumes the relevant telemetry already lives in Datadog.</li>
</ul>
<p><b>Pricing</b></p>
<p>Datadog’s pricing is modular and depends on the products used to collect and evaluate the underlying telemetry. Host-based products, including infrastructure monitoring and some APM offerings, use different billing models, while other capabilities are billed according to consumption. Datadog provides public list pricing, but in practice I would model the cost based on the complete telemetry architecture rather than looking for a standalone “SLO price.”</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>What I like most is flexibility. Datadog can handle the classic “good events divided by total events” model, monitor-based availability, and time-slice definitions without forcing me into a single interpretation of an SLI.</p>
<p>What I dislike is that I would hesitate to introduce Datadog purely for SLO monitoring. It makes the most sense when the organization is already committed to the platform. Otherwise, I am paying for and operating inside a much larger system than the specific SLO problem requires.</p>
<h2 id="3-new-relic">3. New Relic</h2>
<p>New Relic’s Service Level Management is tightly integrated into the rest of the New Relic platform. I can create service levels ranging from relatively simple one-click configurations to more advanced and customizable definitions, then view them alongside applications, workloads, and other observability data. The product also provides alerts and analysis views for tracking reliability over time and investigating breaches.</p>
<p>The advantage is that SLOs are not isolated objects sitting in a separate reliability tool. They are part of the APM and observability workflow. That can be useful when the next step after discovering that an error budget is being consumed is immediately opening the affected service, transaction, trace, or other telemetry.</p>
<p>New Relic’s pricing is also different from the traditional per-host approach. The current public model combines data ingest with user or compute-based access options. That can work well, but I would spend time modeling access requirements before committing.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Guided and advanced service-level creation.</li>
<li aria-level="1">SLI and SLO definitions integrated with New Relic services.</li>
<li aria-level="1">Reliability views across Navigator and Workloads.</li>
<li aria-level="1">Alerting for degradation and breaches.</li>
<li aria-level="1">Period-over-period analysis.</li>
<li aria-level="1">Investigation workflows around SLO breaches.</li>
<li aria-level="1">Integration with APM, infrastructure, logs, synthetics, and other New Relic capabilities.</li>
<li aria-level="1">Support for both simple and more customizable SLO definitions.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Strong integration with the rest of the observability platform.</li>
<li aria-level="1">Relatively approachable SLO creation.</li>
<li aria-level="1">Good fit for teams already using New Relic APM.</li>
<li aria-level="1">Useful free tier for evaluation and smaller deployments.</li>
<li aria-level="1">No need to count hosts as a primary pricing dimension.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Pricing can become more complicated once data volume and platform-user requirements grow.</li>
<li aria-level="1">The experience is best when New Relic is already the primary observability platform.</li>
<li aria-level="1">Some organizations may find the user-access model less attractive than purely telemetry-based pricing.</li>
<li aria-level="1">Less attractive as a standalone, vendor-neutral SLO layer.</li>
</ul>
<p><b>Pricing</b></p>
<p>New Relic’s free tier includes <b>100 GB of data ingest per month</b>, unlimited basic users, and one free full-platform user. Beyond that, public pricing lists original data ingest at <b>$0.40/GB</b> beyond the included allowance. User pricing varies by edition, while New Relic also offers a compute-based model for eligible customers.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>I like New Relic’s integrated approach. If I am already using New Relic for APM, I don’t want to export the same telemetry somewhere else just to calculate an error budget. Keeping the SLO next to the application data is operationally sensible.</p>
<p>What I dislike is the pricing complexity around data, user types, editions, and newer compute models. It is more transparent than some historical observability pricing models, but I would still build a realistic cost model before assuming the free tier or entry pricing reflects production costs.</p>
<h2 id="4-grafana-cloud">4. Grafana Cloud</h2>
<p>Grafana Cloud is particularly interesting to me because it fits naturally into Prometheus and OpenTelemetry-oriented environments. Grafana SLO provides a dedicated workflow for creating and managing SLOs, generating dashboards and alerts, tracking error budgets, and automating configuration through APIs and Terraform.</p>
<p>The biggest advantage is architectural familiarity. If my engineering organization already thinks in PromQL, metrics, recording rules, infrastructure-as-code, and Git-based workflows, Grafana SLO feels like an extension of the existing stack rather than a new conceptual layer. The product can generate supporting dashboards, recording rules, and alerting components instead of requiring me to hand-build everything.</p>
<p>The limitation is that Grafana SLO is a Grafana Cloud capability rather than a general feature of self-hosted open-source Grafana. That distinction matters if my primary reason for choosing Grafana is self-hosting and avoiding a managed SaaS dependency.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Guided SLO creation.</li>
<li aria-level="1">Metric-based SLIs.</li>
<li aria-level="1">Error-budget tracking.</li>
<li aria-level="1">SLO dashboards.</li>
<li aria-level="1">Error-budget alerts.</li>
<li aria-level="1">Generated recording rules.</li>
<li aria-level="1">Generated alerting rules.</li>
<li aria-level="1">API support.</li>
<li aria-level="1">Terraform support.</li>
<li aria-level="1">SLO-as-code workflows.</li>
<li aria-level="1">Integration with the broader Grafana observability stack.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Excellent fit for Prometheus-centric teams.</li>
<li aria-level="1">Strong infrastructure-as-code story.</li>
<li aria-level="1">Familiar workflow for teams already using Grafana.</li>
<li aria-level="1">Good separation between raw telemetry and reliability objectives.</li>
<li aria-level="1">Free tier and relatively accessible entry pricing.</li>
<li aria-level="1">Less architectural lock-in than some all-in-one observability platforms.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">The managed SLO capability is specifically part of Grafana Cloud.</li>
<li aria-level="1">Metric modeling still requires Prometheus/Grafana expertise.</li>
<li aria-level="1">Usage-based pricing can become harder to predict as metric cardinality grows.</li>
<li aria-level="1">The SLO implementation is less useful if my relevant data is not accessible through the supported Grafana Cloud metric workflow.</li>
</ul>
<p><b>Pricing</b></p>
<p>Grafana Cloud has a free tier and a Pro plan starting at <b>$19 per month plus usage</b>. The pricing page currently includes 10,000 active metric series in the platform fee, with additional metrics starting at <b>$6.50 per 1,000 series</b> before volume discounts. Enterprise starts with a <b>$25,000 annual spend commitment</b>.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>I like Grafana Cloud when the organization already has Prometheus expertise. The SLO-as-code and Terraform story is especially important for teams that do not want critical reliability definitions to exist only as manually configured UI objects.</p>
<p>What I dislike is that I still need to understand the underlying metric model. That is not necessarily a flaw—SLOs should be based on carefully chosen indicators—but it means Grafana is not always the easiest tool for a team that wants a highly opinionated, guided reliability workflow.</p>
<h2 id="5-dynatrace">5. Dynatrace</h2>
<p>Dynatrace has a fairly powerful SLO implementation, especially for organizations already using its broader observability platform. I can create SLOs from predefined templates or define custom SLIs using DQL, which means the underlying indicator does not have to be limited to standard availability or latency metrics. Dynatrace can use data available through Grail, including metrics and other data types that can be queried into a time series. The current SLO experience includes error-budget tracking, visualization, and management through a dedicated application, while APIs and SDKs provide automation options. Dynatrace is particularly interesting for complex environments because its topology and entity model can provide useful context around the services being measured. The downside is that the platform is large and opinionated, so using it just for SLO monitoring would usually be excessive.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Template-based SLO creation.</li>
<li aria-level="1">Custom SLI definitions using DQL.</li>
<li aria-level="1">Service availability and performance objectives.</li>
<li aria-level="1">Infrastructure and Kubernetes-oriented templates.</li>
<li aria-level="1">Error-budget tracking.</li>
<li aria-level="1">SLO visualization and dashboard integration.</li>
<li aria-level="1">Entity-aware observability context.</li>
<li aria-level="1">API and SDK support.</li>
<li aria-level="1">Access to multiple Grail data types for SLI definitions.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Very flexible SLI definitions.</li>
<li aria-level="1">Strong fit for large and complex environments.</li>
<li aria-level="1">Good topology and entity context.</li>
<li aria-level="1">Templates make common SLOs easier to create.</li>
<li aria-level="1">Custom DQL opens up nontraditional SLI use cases.</li>
<li aria-level="1">Good API and SDK support.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">A large platform if SLO monitoring is the only requirement.</li>
<li aria-level="1">DQL adds another query language to learn.</li>
<li aria-level="1">Pricing is not simple to evaluate from the SLO feature alone.</li>
<li aria-level="1">The platform can feel more opinionated than Prometheus-centric alternatives.</li>
</ul>
<p><b>Pricing</b></p>
<p>Dynatrace pricing is based on the broader platform and the products or capabilities being used rather than a simple standalone SLO price. I would treat SLO cost as part of the overall observability architecture and request a realistic quote based on data, monitoring scope, and the Dynatrace platform capabilities required.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>What I like is the flexibility. Being able to build an SLI from a custom DQL query means I am not limited to a small set of predefined reliability models. I also like the surrounding context: if an SLO is degrading, topology and entity information can help connect that reliability problem to the actual system.</p>
<p>What I dislike is the weight of the platform. If my team just wants straightforward SLOs on Prometheus metrics, Dynatrace would probably feel like bringing an entire observability platform to solve a narrower problem.</p>
<h2 id="6-elastic-observability">6. Elastic Observability</h2>
<p>Elastic has one of the more flexible SLO implementations among full-stack observability platforms. I can create SLIs from APM availability or latency, synthetic availability, custom metrics, histogram metrics, timeslice metrics, or custom KQL queries against data in Elasticsearch. That is a much broader set of options than tools that restrict SLOs to predefined monitor types.</p>
<p>Elastic supports both rolling and calendar-aligned windows, occurrences- and timeslice-based budgeting, error budgets, and burn-rate alerting. The SLO overview also makes it possible to see historical SLI performance and budget consumption without manually assembling dashboards.</p>
<p>I think Elastic is particularly interesting for teams that already use Elasticsearch for logs or observability data and want to define SLOs from that data without exporting it elsewhere.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">APM availability and latency SLIs.</li>
<li aria-level="1">Synthetic availability SLIs.</li>
<li aria-level="1">Custom KQL-based SLIs.</li>
<li aria-level="1">Custom metric and histogram metric SLIs.</li>
<li aria-level="1">Timeslice and occurrences budgeting.</li>
<li aria-level="1">Rolling and calendar-aligned windows.</li>
<li aria-level="1">Error-budget tracking.</li>
<li aria-level="1">Burn-rate alerts.</li>
<li aria-level="1">Historical SLI and error-budget views.</li>
<li aria-level="1">Dashboard integration.</li>
<li aria-level="1">OpenTelemetry and Prometheus support across the broader observability platform.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">One of the most flexible sets of SLI types in this comparison.</li>
<li aria-level="1">Can build SLOs from logs, metrics, APM, or synthetic data.</li>
<li aria-level="1">Supports both rolling and calendar windows.</li>
<li aria-level="1">Good support for error budgets and burn rates.</li>
<li aria-level="1">Strong fit for teams already using Elastic.</li>
<li aria-level="1">Useful combination of internal observability and external digital-experience monitoring.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Requires learning Elastic’s data model and query language if I want to use the most flexible SLI types.</li>
<li aria-level="1">Not a lightweight standalone SLO tool.</li>
<li aria-level="1">SLO availability depends on the appropriate Elastic deployment and licensing.</li>
<li aria-level="1">Self-managed deployments can require more operational work than SaaS-only alternatives.</li>
</ul>
<p><b>Pricing</b></p>
<p>Elastic’s current serverless Observability Complete tier includes SLO functionality. Serverless pricing is usage-based: Elastic currently lists metrics ingest from <b>$0.023/GB</b>, other observability data from <b>$0.09/GB</b>, plus separate retention and egress charges. Synthetic monitoring is available as an add-on. I would calculate the real cost based on total telemetry volume rather than thinking of SLOs as a separately priced feature.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>What I like most is flexibility. Elastic lets me define an SLO from the data I actually have instead of forcing me to translate everything into one specific metric format. I also like the combination of APM, logs, synthetics, and SLOs in the same platform.</p>
<p>What I dislike is the complexity. Elastic can do a lot, but that also means I need to understand how my data is structured before I can take full advantage of the SLO functionality.</p>
<h2 id="7-honeycomb">7. Honeycomb</h2>
<p>Honeycomb takes a more engineering-centric approach to observability than traditional metrics-first platforms, and its SLO implementation fits that model. SLOs are built from events, which makes them a natural fit for tracing and high-cardinality telemetry. I can define what successful behavior looks like and then track the remaining error budget over the selected time period.</p>
<p>The alerting model is particularly interesting. Honeycomb supports both <b>Exhaustion Time</b> alerts, which estimate when the error budget will run out, and <b>Budget Rate</b> alerts, which trigger when the budget is being consumed faster than expected. The UI also provides a budget-burndown graph that helps tune alerts before blindly picking a burn-rate threshold.</p>
<p>For teams already using OpenTelemetry and distributed tracing heavily, Honeycomb is one of the more natural SLO implementations I would evaluate.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Event-based SLOs.</li>
<li aria-level="1">Error-budget tracking.</li>
<li aria-level="1">Budget burndown visualization.</li>
<li aria-level="1">Historical burn-rate analysis.</li>
<li aria-level="1">Exhaustion Time burn alerts.</li>
<li aria-level="1">Budget Rate burn alerts.</li>
<li aria-level="1">Slack and PagerDuty notification support.</li>
<li aria-level="1">Distributed tracing and OpenTelemetry integration.</li>
<li aria-level="1">High-cardinality telemetry support.</li>
<li aria-level="1">Service-level SLO workflows.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Very natural fit for tracing and event-based telemetry.</li>
<li aria-level="1">Excellent burn-alert model.</li>
<li aria-level="1">Budget-burndown visualization helps tune alerts.</li>
<li aria-level="1">Strong OpenTelemetry support.</li>
<li aria-level="1">Particularly well suited to modern distributed systems.</li>
<li aria-level="1">More engineering-focused than dashboard-heavy.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Less attractive if the organization primarily thinks in Prometheus metrics.</li>
<li aria-level="1">SLOs are not available on the free plan.</li>
<li aria-level="1">The Pro plan includes only two SLOs.</li>
<li aria-level="1">Teams unfamiliar with event-based observability may need to adjust their mental model.</li>
</ul>
<p><b>Pricing</b></p>
<p>Honeycomb has a free plan with up to <b>20 million events per month</b> and <b>100 million metric data points per month</b>. The Pro plan starts at <b>$150 per month</b> and includes <b>2 SLOs</b>. Enterprise pricing is custom and starts with significantly larger trigger and SLO allowances.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>I like Honeycomb because the SLO implementation feels connected to how engineers actually investigate modern distributed systems. If the SLO burns, I can work from the relevant events and traces rather than switching into an entirely separate monitoring model.</p>
<p>What I dislike is the relatively limited number of SLOs in the Pro plan. Two SLOs is enough for evaluation or a small service footprint, but it is restrictive if I want to make SLOs a standard part of every production service.</p>
<h2 id="8-checkly">8. <a href="https://checklyhq.com" target="_blank" rel="noopener noreferrer">Checkly</a></h2>
<p>Checkly represents a different approach from the large observability platforms. It is primarily a synthetic monitoring platform designed around developers and monitoring-as-code. I can define API checks, browser checks, Playwright test suites, uptime monitors, and multistep checks, then manage them through the Checkly CLI, Terraform, or Pulumi.</p>
<p>For SLO-style monitoring, this is useful when the thing I care about is externally observable behavior. Instead of defining availability from an internal metric, I can measure whether an API responds correctly or whether a user can actually complete a critical workflow.</p>
<p>I would not put Checkly in the same category as Nobl9 or Elastic when it comes to arbitrary SLI definitions. Its strength is narrower but useful: taking synthetic tests and treating them as production reliability signals that can be managed like code.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">HTTP, TCP, DNS, ICMP, and heartbeat monitoring.</li>
<li aria-level="1">API and multistep checks.</li>
<li aria-level="1">Browser checks using Playwright.</li>
<li aria-level="1">Playwright Check Suites.</li>
<li aria-level="1">Global and private monitoring locations.</li>
<li aria-level="1">Automatic retries.</li>
<li aria-level="1">Monitoring-as-code workflows.</li>
<li aria-level="1">Checkly CLI.</li>
<li aria-level="1">Terraform provider.</li>
<li aria-level="1">Pulumi provider.</li>
<li aria-level="1">Prometheus metrics export.</li>
<li aria-level="1">Status pages and alerting integrations.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Excellent developer experience.</li>
<li aria-level="1">Strong monitoring-as-code support.</li>
<li aria-level="1">Native Playwright integration.</li>
<li aria-level="1">Useful for testing critical user journeys.</li>
<li aria-level="1">Terraform, Pulumi, and CLI support.</li>
<li aria-level="1">Good fit for CI/CD and production monitoring workflows.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Less flexible for arbitrary internal metric-based SLIs.</li>
<li aria-level="1">Synthetic checks can become expensive at high frequency and across many locations.</li>
<li aria-level="1">Not a full observability platform.</li>
<li aria-level="1">Best suited to externally observable services and workflows.</li>
</ul>
<p><b>Pricing</b></p>
<p>Checkly has a free Hobby plan with <b>10 uptime monitors</b>, <b>10,000 API check runs</b>, and <b>1,000 browser check runs per month</b>. The Starter plan starts at <b>$24 per month</b>, while Team starts at <b>$64 per month</b>. Enterprise pricing is custom. Pricing scales through monitor counts and synthetic check runs.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>What I like is the developer workflow. I would rather keep monitoring definitions in Git and deploy them with the rest of the application infrastructure than manually create hundreds of checks in a UI.</p>
<p>What I dislike is that it is easy to confuse “synthetic monitoring” with complete SLO management. Checkly is excellent when my SLI is based on externally observable behavior, but I would use another tool if I needed to define reliability objectives from arbitrary application metrics.</p>
<h2 id="9-nobl9">9. <a href="https://nobl9.com" target="_blank" rel="noopener noreferrer">Nobl9</a></h2>
<p>Nobl9 is the most specialized SLO product in this comparison. Rather than assuming that SLOs should live inside one observability backend, it acts as a dedicated reliability layer that can connect to multiple existing telemetry systems. Its platform includes error-budget alerting, composite SLOs, backtesting, service-health views, reporting, and a strong SLO-as-code workflow.</p>
<p>That vendor-neutral approach is its biggest differentiator. A large organization may have Datadog in one team, Prometheus in another, New Relic somewhere else, and cloud-native telemetry in yet another environment. Nobl9 is designed to put SLO definitions above those individual systems rather than requiring telemetry consolidation first.</p>
<p>It also has one of the strongest configuration-as-code stories through OpenSLO, YAML-based definitions, Git workflows, validation tooling, and automation. The trade-off is additional platform complexity and a separate product to operate.</p>
<p><b>Key features</b></p>
<ul>
<li aria-level="1">Vendor-neutral SLO management.</li>
<li aria-level="1">Multiple telemetry integrations.</li>
<li aria-level="1">Error-budget tracking and alerting.</li>
<li aria-level="1">Composite SLOs.</li>
<li aria-level="1">SLO backtesting.</li>
<li aria-level="1">Service Health Dashboard.</li>
<li aria-level="1">SLO annotations.</li>
<li aria-level="1">Reporting.</li>
<li aria-level="1">OpenSLO support.</li>
<li aria-level="1">YAML and Git-based workflows.</li>
<li aria-level="1">OpenSLO validation through the Oslo CLI.</li>
<li aria-level="1">SLO-as-code automation.</li>
</ul>
<p><b>Pros</b></p>
<ul>
<li aria-level="1">Purpose-built for SLO management.</li>
<li aria-level="1">Works across heterogeneous observability environments.</li>
<li aria-level="1">Excellent SLO-as-code support.</li>
<li aria-level="1">Strong OpenSLO ecosystem involvement.</li>
<li aria-level="1">Useful for large organizations standardizing reliability practices.</li>
<li aria-level="1">Advanced capabilities such as composite SLOs and backtesting.</li>
</ul>
<p><b>Cons</b></p>
<ul>
<li aria-level="1">Another platform to buy, integrate, and maintain.</li>
<li aria-level="1">Probably excessive for a small team with a handful of services.</li>
<li aria-level="1">Less compelling if all telemetry already lives comfortably in one observability platform.</li>
<li aria-level="1">Public pricing is not as simple as self-service competitors.</li>
</ul>
<p><b>Pricing</b></p>
<p>Nobl9 provides pricing through its sales process rather than publishing a simple per-monitor or per-host price. The pricing offering is aimed at selecting an option based on organizational requirements, so I would expect to request a quote for a real deployment.</p>
<h3 id="my-opinion"><b>My opinion</b></h3>
<p>Nobl9 is the one I would look at if SLOs themselves are becoming a platform concern. If multiple teams use different monitoring systems and I need a consistent reliability model across all of them, a dedicated abstraction layer makes sense.</p>
<p>What I dislike is the obvious trade-off: if I only have 10 services and everything already lives in Grafana, Datadog, or New Relic, adding another product may solve a problem I don’t actually have.</p>
<p> </p>
<h2 id="feature-comparison"><b>Feature comparison</b></h2>
<p>Here is a product-feature matrix for all SLO monitoring tools we are comparing here.</p>
<table>
<tbody>
<tr>
<td><b>Feature</b></td>
<td><b>Sematext</b></td>
<td><b>Datadog</b></td>
<td><b>New Relic</b></td>
<td><b>Grafana Cloud</b></td>
<td><b>Dynatrace</b></td>
<td><b>Elastic Observability</b></td>
<td><b>Honeycomb</b></td>
<td><b>Nobl9</b></td>
<td><b>Checkly</b></td>
</tr>
<tr>
<td>Availability SLOs</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes*</td>
</tr>
<tr>
<td>Latency SLOs</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes*</td>
</tr>
<tr>
<td>Custom metric SLIs</td>
<td>Limited</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Event-based</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Synthetic-monitor-based SLIs</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Indirectly</td>
<td>Yes</td>
<td>Yes</td>
<td>Indirectly</td>
<td>Via data sources</td>
<td>Yes</td>
</tr>
<tr>
<td>Arbitrary query-based SLIs</td>
<td>Limited</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Event/query-based</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Error budgets</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Limited*</td>
</tr>
<tr>
<td>Burn-rate alerting</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Limited*</td>
</tr>
<tr>
<td>Rolling time windows</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Depends on check configuration*</td>
</tr>
<tr>
<td>Calendar-based windows</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>No native SLO model</td>
</tr>
<tr>
<td>Multi-window burn-rate alerts</td>
<td>Limited</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>No native SLO model</td>
</tr>
<tr>
<td>SLO dashboard / overview</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Check dashboards rather than dedicated SLO views</td>
</tr>
<tr>
<td>Historical error-budget analysis</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Limited*</td>
</tr>
<tr>
<td>API support</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Terraform support</td>
<td>Limited</td>
<td>Yes</td>
<td>Limited</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Limited</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>SLO as code</td>
<td>Limited</td>
<td>Yes</td>
<td>API/Terraform workflows</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>API/configuration-driven</td>
<td>Excellent</td>
<td>Monitoring as code</td>
</tr>
<tr>
<td>OpenSLO support</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Multi-source / vendor-neutral telemetry</td>
<td>No</td>
<td>Primarily Datadog</td>
<td>Primarily New Relic</td>
<td>Yes, within Grafana ecosystem</td>
<td>Primarily Dynatrace</td>
<td>Primarily Elastic</td>
<td>Primarily Honeycomb</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Best data perspective</td>
<td>Synthetic + observability</td>
<td>Full-stack</td>
<td>Full-stack</td>
<td>Metrics / Prometheus / OTel</td>
<td>Full-stack + topology</td>
<td>Logs + metrics + APM + synthetics</td>
<td>Events + traces</td>
<td>Vendor-neutral</td>
<td>External synthetic checks</td>
</tr>
</tbody>
</table>
<p> </p>
<p>* <b>Checkly is the outlier in this table.</b> I would describe it as a synthetic monitoring and monitoring-as-code tool rather than a full native SLO management platform. It can measure availability and latency and can be used to implement reliability targets from checks, but it does not provide the same general-purpose SLI, error-budget, and multi-window burn-rate model as Datadog, Grafana Cloud, Dynatrace, Elastic, Honeycomb, or Nobl9.</p>
<p>This distinction is useful because it prevents the comparison from making Checkly look weaker at something it is not primarily designed to do. Its real strength is <b>defining production checks as code and using them to monitor APIs and critical user journeys</b>.</p>
<p> </p>
<h2 id="which-slo-monitoring-tool-would-i-choose"><b>Which SLO monitoring tool would I choose?</b></h2>
<p>My choice would depend less on the number of features in the product and more on where my telemetry already lives and what I am actually trying to measure.</p>
<p>If I had to narrow the list down based on the problem rather than the vendor:</p>
<table>
<tbody>
<tr>
<td><b>What I need</b></td>
<td><b>Tools I would evaluate first</b></td>
</tr>
<tr>
<td>Simple external/API/user-journey SLOs</td>
<td><b>Sematext, Checkly</b></td>
</tr>
<tr>
<td>SLOs inside an existing observability platform</td>
<td><b>Datadog, New Relic, Dynatrace, Elastic</b></td>
</tr>
<tr>
<td>Prometheus/OpenTelemetry + infrastructure as code</td>
<td><b>Grafana Cloud</b></td>
</tr>
<tr>
<td>Tracing and event-centric observability</td>
<td><b>Honeycomb</b></td>
</tr>
<tr>
<td>Vendor-neutral, organization-wide SLO management</td>
<td><b>Nobl9</b></td>
</tr>
<tr>
<td>Maximum flexibility in a large enterprise environment</td>
<td><b>Dynatrace, Datadog, Elastic</b></td>
</tr>
</tbody>
</table>
<p>The important distinction for me is that <b>Checkly and Sematext are strongest when the SLI represents externally observable behavior</b>, while <b>Datadog, New Relic, Grafana Cloud, Dynatrace, Elastic, and Honeycomb can build SLOs from deeper application telemetry</b>. <b>Nobl9 is different again: its main value is separating the SLO/reliability layer from the underlying observability system.</b></p>
<p>So I would not pick a winner based on a feature checklist. I would first decide where the SLI should come from, and then choose the tool that makes that workflow the least painful.</p>
<p> </p>
<h2 id="final-thoughts"><b>Final thoughts</b></h2>
<p>The most important thing I have learned about SLO monitoring is that the tool is rarely the hard part. The difficult part is choosing an SLI that actually represents user experience and setting an objective that is neither meaningless nor impossible.</p>
<p>A monitoring tool can calculate an error budget perfectly and still give me the wrong answer if I am measuring the wrong thing.</p>
<p>So before comparing vendors too deeply, I would start with a few concrete questions:</p>
<ol>
<li aria-level="1"><b>What user behavior am I trying to protect?</b></li>
<li aria-level="1"><b>What counts as a good event and a bad event?</b></li>
<li aria-level="1"><b>Should every request count equally, or is time-based availability more appropriate?</b></li>
<li aria-level="1"><b>How much unreliability can the business actually tolerate?</b></li>
<li aria-level="1"><b>What should happen when the error budget is being consumed too quickly?</b></li>
<li aria-level="1"><b>Where will engineers go next to investigate the problem?</b></li>
</ol>
<p>Once those answers are clear, the choice usually becomes much easier. For most teams, I would strongly prefer using the SLO capability already available in the observability platform they trust—unless they have a real need for vendor-neutral, organization-wide SLO management.</p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/best-slo-monitoring-tools/">Best 9 SLO Monitoring Tools in 2026: Review and Comparison Tables</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Top 12 Network Monitoring Tools in 2026: Complete Comparison &#038; Reviews</title>
		<link>https://sematext.com/blog/top-12-network-monitoring-tools-in-2026-complete-comparison-reviews/</link>
		
		<dc:creator><![CDATA[fulya.uluturk]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 10:17:47 +0000</pubDate>
				<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[network monitoring]]></category>
		<category><![CDATA[service monitoring]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=70791</guid>

					<description><![CDATA[<p>Modern infrastructure is no longer a stack of routers, switches, and racks sitting in a single data center. Most teams now run a mix of Kubernetes clusters, virtual machines, managed cloud services, and SaaS dependencies spread across regions and providers. Knowing which device is up is not the same as knowing whether your application is [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/top-12-network-monitoring-tools-in-2026-complete-comparison-reviews/">Top 12 Network Monitoring Tools in 2026: Complete Comparison &#038; Reviews</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Modern infrastructure is no longer a stack of routers, switches, and racks sitting in a single data center. Most teams now run a mix of Kubernetes clusters, virtual machines, managed cloud services, and SaaS dependencies spread across regions and providers. Knowing which device is up is not the same as knowing whether your application is healthy.</p>
<p>That shift is why network monitoring in 2026 looks very different from a decade ago. Traditional SNMP-based tools still have a place, but cloud-native teams need service-aware visibility, automatic topology discovery, and tight correlation with logs, metrics, and traces. The right tool can cut hours off incident response, surface cost leaks, and replace the architecture diagrams that are always getting outdated that nobody wants to maintain.</p>
<p>This guide compares the 12 best network monitoring tools available in 2026. For each one, you will find the features that matter, honest pros and cons, real pricing, and the kind of team it fits best.</p>
<h2 id="what-is-network-monitoring">What is Network Monitoring?</h2>
<p>Network monitoring is the continuous practice of collecting data about network devices, traffic, and connections to detect performance issues, outages, and security events before they affect users. The data can come from many sources: SNMP polling for device health, NetFlow or sFlow for traffic analysis, packet captures for deep inspection, eBPF for kernel-level connection visibility, and synthetic probes for path validation.</p>
<p>The category has expanded beyond LAN and WAN. In 2026, network monitoring also covers:</p>
<ul>
<li aria-level="1">Pod-to-pod and node-to-node traffic inside Kubernetes clusters</li>
<li aria-level="1">East-west traffic between microservices</li>
<li aria-level="1">Cross-region and cross-cloud connectivity costs</li>
<li aria-level="1">Connections to managed databases, message queues, and SaaS APIs</li>
<li aria-level="1">Suspicious outbound traffic that might signal a compromise</li>
</ul>
<p>Good network monitoring helps teams answer questions like: which services are talking to which databases right now, where is traffic getting slow, which connections are eating our cloud egress budget, and what process on which host opened that unexpected outbound connection.</p>
<h2 id="what-to-look-for-in-a-network-monitoring-tool">What to Look for in a Network Monitoring Tool</h2>
<p>Before comparing tools, here are the criteria that matter most in 2026.</p>
<h3 id="topology-discovery-and-visualization">Topology Discovery and Visualization</h3>
<p>A good tool draws the map for you. Static Visio diagrams go stale the moment someone deploys a new service. Look for automatic discovery and a real-time topology view that updates as your infrastructure changes.</p>
<h3 id="kubernetes-and-cloud-native-support">Kubernetes and Cloud-Native Support</h3>
<p>Containerized workloads are short-lived and dynamic. Tools designed for static IP-based device lists struggle here. Native Kubernetes support, pod-aware identity, and service detection are now table stakes for any team running clusters.</p>
<h3 id="protocol-visibility">Protocol Visibility</h3>
<p>Knowing that two hosts exchanged 500 MB tells you less than knowing that an application server made 12,000 PostgreSQL queries to a specific database. Tools that detect protocols (HTTP, PostgreSQL, MongoDB, Kafka, Redis, and others) give you context, not just byte counts.</p>
<h3 id="auto-detection-of-services">Auto-Detection of Services</h3>
<p>Manually labeling every host and process does not scale. The best tools recognize databases, caches, message queues, web servers, and runtimes automatically based on process names, container images, network signatures, and orchestrator metadata.</p>
<h3 id="correlation-with-logs-metrics-and-traces">Correlation with Logs, Metrics, and Traces</h3>
<p>A network alert in isolation is not very useful. Tools that let you pivot from a network connection to the related logs, application metrics, or distributed traces dramatically reduce time to root cause.</p>
<h3 id="alerting-and-thresholds">Alerting and Thresholds</h3>
<p>Alerts that fire on every minor blip get ignored. Look for tools that support tunable thresholds, baseline-aware anomaly detection, and clear escalation paths.</p>
<h3 id="pricing-transparency">Pricing Transparency</h3>
<p>Network monitoring is one of the categories where cost surprises are most common, especially with consumption-based pricing on flow data or device counts. Predictable, published pricing matters more than free tiers that turn into bill shock at scale.</p>
<h2 id="the-12-best-network-monitoring-tools-in-2026">The 12 Best Network Monitoring Tools in 2026</h2>
<h3 id="1-sematext-network-map">1. Sematext Network Map</h3>
<p><b>Best for: Cloud-native teams that want eBPF-powered service and infrastructure visibility inside a full observability platform</b></p>
<p><a href="https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-scaled.png"><img decoding="async" class="wp-image-70817 size-full" src="https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-scaled.png" alt="Sematext Network Map" width="2560" height="1498" srcset="https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-scaled.png 2560w, https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-300x176.png 300w, https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-1024x599.png 1024w, https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-768x450.png 768w, https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-1536x899.png 1536w, https://sematext.com/wp-content/uploads/2026/05/network-map-2026-07-1-2048x1199.png 2048w" sizes="(max-width: 2560px) 100vw, 2560px" /></a></p>
<p> </p>
<p><a href="https://sematext.com/network-monitoring/">Sematext Network Map</a> gives you a real-time, visual representation of your entire infrastructure topology. Using eBPF-powered network insights collected by the Sematext Agent, you can see how services, pods, containers, and processes communicate across Kubernetes clusters and standalone hosts without configuring anything beyond installing the agent.</p>
<p>Instead of polling devices and inferring relationships, Network Map shows the actual connections happening right now. When something breaks, you can immediately see which services are affected and trace the problem to its source. Two complementary views, Services View and Infrastructure View (see <a href="https://sematext.com/docs/network-map/#two-ways-to-view-your-infrastructure">details in the docs</a>), let you flip between application-level dependency analysis and Kubernetes infrastructure drill-down.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1"><b>eBPF-based connection capture</b>: Kernel-level visibility into every connection, no port mirroring or packet capture required. Next to zero overhead.</li>
<li aria-level="1"><b>Two views, one map</b>: Services View for application dependencies, Infrastructure View for cluster, node, pod, container, and process drill-down</li>
<li aria-level="1"><b>Automatic service detection</b>: Over 100 service types recognized out of the box, including PostgreSQL, MySQL, MongoDB, Redis, Kafka, RabbitMQ, Elasticsearch, Nginx, HAProxy, Envoy, and more</li>
<li aria-level="1"><b>Protocol-aware connections</b>: Detects HTTP, PostgreSQL, MongoDB, Kafka, Redis, and dozens of other protocols with traffic volume per connection</li>
<li aria-level="1"><strong>Key metrics</strong>: network latency, round trip time (RTT), packet loss, retransmissions, CPU, memory, disk I/O, HTTP latency, HTTP response codes, etc.</li>
<li aria-level="1"><b>Custom thresholds</b>: Configurable warning and critical levels for CPU, memory, network I/O, and disk I/O so the map highlights what matters in your environment</li>
<li aria-level="1"><b>Color-coded health</b>: Green, yellow, and red service cards and connection lines make problems visible at a glance</li>
<li aria-level="1"><b>Kubernetes-native</b>: Cluster to node to pod to container to process navigation with namespace, deployment, and workload context</li>
<li aria-level="1"><b>Standalone host support</b>: Works equally well for VMs and bare-metal servers, not just containers</li>
<li aria-level="1"><b>Filtering and search</b>: Quickly focus on a namespace, service type, host, or specific service when the topology gets dense</li>
<li aria-level="1"><b>Unified observability</b>: Pivot from network connections to logs, metrics, traces, and synthetic checks in the same UI</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Truly cloud-native and Kubernetes-first, designed for dynamic infrastructure rather than retrofitted onto SNMP foundations</li>
<li aria-level="1">eBPF means no application code changes, no sidecars, and no instrumentation work, and next to zero overhead</li>
<li aria-level="1">Service detection works automatically for the technologies most teams actually run</li>
<li aria-level="1">Integrated with the rest of the Sematext platform, so traces, logs, and metrics live next to your topology</li>
<li aria-level="1">Significantly cheaper than the major enterprise observability platforms</li>
<li aria-level="1">Useful for discovering unknown dependencies, suspicious connections, data exfiltration patterns, and cross-region cost leakage</li>
<li aria-level="1">Replaces stale architecture diagrams with a live picture of what is actually running</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Newer product compared to legacy NMS incumbents, less brand recognition among traditional network teams</li>
<li aria-level="1">Focuses on host, container, and service visibility rather than deep packet inspection or SNMP-style switch and router polling</li>
</ul>
<p><b>Pricing:</b> Starts at $1.68 per host per month. Network Map scales with your Sematext Infrastructure Monitoring plan and retention. 14-day free trial, no credit card required.</p>
<p><b>Best For:</b> DevOps and SRE teams running Kubernetes or hybrid cloud infrastructure who want service-aware network visibility tightly integrated with logs, metrics, and traces. Teams that find traditional NMS tools too device-centric and modern APM platforms too expensive.</p>
<p><a href="https://apps.sematext.com/ui/registration" target="_blank" rel="noopener noreferrer">Get started with Sematext Network Map</a> or check out <a href="https://sematext.com/docs/network-map/">Network Map docs</a>.</p>
<h3 id="2-datadog-network-monitoring">2. Datadog Network Monitoring</h3>
<p><b>Best for: Enterprises already on Datadog who want network visibility inside the same platform</b></p>
<p>Datadog offers two related products: Network Performance Monitoring (NPM) for host-to-host and pod-to-pod traffic analysis, and Cloud Network Monitoring for cloud provider flow logs and load balancer telemetry. Both plug into the Datadog platform alongside APM, logs, and infrastructure monitoring.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">Host and Kubernetes pod-level traffic analysis via the Datadog Agent</li>
<li aria-level="1">VPC flow log analysis for AWS, Azure, and GCP</li>
<li aria-level="1">DNS monitoring with query-level visibility</li>
<li aria-level="1">Cloud load balancer and gateway telemetry</li>
<li aria-level="1">Integration with Datadog APM, logs, and infrastructure metrics</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Strong if you already use Datadog for everything else</li>
<li aria-level="1">Detailed flow analysis with rich filtering</li>
<li aria-level="1">AI-assisted anomaly detection through Watchdog</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Each Datadog product is billed separately, and bills add up quickly at scale</li>
<li aria-level="1">“Bill shock” is a recurring complaint from customers</li>
<li aria-level="1">Network products require agent and integrations setup separately from core APM</li>
</ul>
<p><b>Pricing:</b> Network Performance Monitoring starts at $5 per host per month. Cloud Network Monitoring is priced per analyzed flow. Costs scale with hosts, flows, and retention.</p>
<p><b>Best For:</b> Mid-size to large enterprises already standardized on Datadog who can absorb the platform-wide cost.</p>
<h3 id="3-dynatrace">3. Dynatrace</h3>
<p><b>Best for: Large enterprises wanting AI-driven full-stack observability with network context</b></p>
<p>Dynatrace covers network visibility as part of its broader Davis AI observability platform. The OneAgent captures process-level network connections alongside code-level traces and infrastructure metrics.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">OneAgent captures host, process, and connection-level data automatically</li>
<li aria-level="1">Smartscape topology view combining services, processes, and infrastructure</li>
<li aria-level="1">Davis AI for root cause analysis across signals</li>
<li aria-level="1">Multi-cloud and Kubernetes coverage</li>
<li aria-level="1">Strong support for traditional enterprise workloads like SAP and mainframe</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Truly automatic instrumentation with minimal manual configuration</li>
<li aria-level="1">AI correlation across network, traces, logs, and metrics</li>
<li aria-level="1">Strong enterprise governance and compliance features</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Premium pricing, often the highest in the market</li>
<li aria-level="1">OneAgent has a significant resource footprint compared to lightweight collectors</li>
<li aria-level="1">Steep learning curve across the many Dynatrace apps and modules</li>
</ul>
<p><b>Pricing:</b> Custom pricing through sales. Typically positioned at the high end of the enterprise observability market.</p>
<p><b>Best For:</b> Large enterprises with complex hybrid environments and the budget for a premium AI-powered observability platform.</p>
<h3 id="4-kentik">4. Kentik</h3>
<p><b>Best for: Network teams running large hybrid, multi-cloud, and internet-facing infrastructure</b></p>
<p>Kentik focuses on what it calls network intelligence: deep traffic analysis, BGP and internet path visibility, and AI-assisted investigation for hybrid and multi-cloud networks. It is particularly strong for service providers, SaaS companies, and large enterprises with significant cloud and internet exposure.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">NetFlow, sFlow, IPFIX, VPC flow logs, and synthetic test ingestion</li>
<li aria-level="1">BGP and internet performance visibility</li>
<li aria-level="1">Kentik AI Advisor and Cause Analysis for guided troubleshooting</li>
<li aria-level="1">DDoS detection and mitigation analytics</li>
<li aria-level="1">Hybrid and multi-cloud topology</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Industry-leading depth for traffic analytics and internet path visibility</li>
<li aria-level="1">Strong for cloud egress cost analysis</li>
<li aria-level="1">AI-assisted investigation reduces time on complex incidents</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Pricing aimed at mid-market and enterprise, not small teams</li>
<li aria-level="1">Steeper learning curve than general-purpose monitoring tools</li>
<li aria-level="1">Focused on NetOps workflows more than application-level observability</li>
</ul>
<p><b>Pricing:</b> Custom pricing through sales. Aimed at enterprise budgets.</p>
<p><b>Best For:</b> Mid-market and enterprise NetOps and SRE teams managing complex hybrid and internet-connected networks.</p>
<h3 id="5-cisco-thousandeyes">5. Cisco ThousandEyes</h3>
<p><b>Best for: Teams that need path visibility across the public internet and SaaS providers</b></p>
<p>ThousandEyes monitors network paths from your users and applications to wherever they need to go: SaaS apps, cloud regions, third-party APIs, and your own services. It is the go-to tool for understanding ISP, CDN, and public internet performance.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">Synthetic agents on user devices, in cloud regions, and on enterprise networks</li>
<li aria-level="1">Hop-by-hop path visualization across the internet</li>
<li aria-level="1">BGP route monitoring and outage detection</li>
<li aria-level="1">SaaS application performance tests (Microsoft 365, Salesforce, Zoom, and similar)</li>
<li aria-level="1">Internet outage detection and notifications</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Best-in-class for public internet and SaaS path visibility</li>
<li aria-level="1">Wide global agent network</li>
<li aria-level="1">Strong correlation between user experience and underlying network paths</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Does not cover host or pod-level traffic inside your infrastructure</li>
<li aria-level="1">Pricing scales quickly with agent counts and test frequency</li>
<li aria-level="1">Less useful as a standalone tool, usually has to be paired with another monitoring platform</li>
</ul>
<p><b>Pricing:</b> Subscription-based, priced per agent and per test. Custom quotes through sales.</p>
<p><b>Best For:</b> Enterprises with significant SaaS, hybrid work, and internet-facing service dependencies that need to prove whether the problem is them, their ISP, or a SaaS provider.</p>
<h3 id="6-solarwinds-network-performance-monitor">6. SolarWinds Network Performance Monitor</h3>
<p><b>Best for: Traditional enterprise IT teams managing on-premises networks</b></p>
<p>SolarWinds Network Performance Monitor is one of the longest-running enterprise NPM products. It excels at SNMP-based monitoring of routers, switches, firewalls, wireless access points, and other traditional network gear.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">SNMP v1, v2c, and v3 polling with deep multi-vendor support</li>
<li aria-level="1">Automated Layer 2 and Layer 3 topology mapping</li>
<li aria-level="1">NetPath for hop-by-hop path analysis</li>
<li aria-level="1">Wireless network monitoring and heat maps</li>
<li aria-level="1">Integration with the broader SolarWinds Observability portfolio</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Deep coverage for traditional network gear from Cisco, Juniper, Aruba, Fortinet, and many others</li>
<li aria-level="1">Mature alerting and reporting features</li>
<li aria-level="1">Familiar to most network engineers</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Built for static network device inventories rather than dynamic cloud-native workloads</li>
<li aria-level="1">Self-hosted deployment requires Windows Server infrastructure</li>
<li aria-level="1">Modernization toward SaaS has been gradual</li>
</ul>
<p><b>Pricing:</b> Starts around $1,995 for SolarWinds NPM perpetual license. SaaS pricing through SolarWinds Observability is consumption-based.</p>
<p><b>Best For:</b> Enterprise NetOps teams managing campus, branch, or data center networks where SNMP and traditional NPM workflows dominate.</p>
<h3 id="7-auvik">7. Auvik</h3>
<p><b>Best for: MSPs and IT teams managing many distributed sites</b></p>
<p>Auvik is a cloud-based network monitoring platform aimed primarily at managed service providers and multi-site IT teams. Its automated topology mapping and per-site collector model make it easy to onboard new networks quickly.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">Cloud-managed with lightweight on-premises collectors per site</li>
<li aria-level="1">Automatic Layer 1, 2, and 3 topology discovery and visualization</li>
<li aria-level="1">TrafficInsights for NetFlow, sFlow, J-Flow, and IPFIX analysis</li>
<li aria-level="1">Configuration backup and change tracking</li>
<li aria-level="1">Multi-tenant architecture for MSPs</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Fast time to value, sites usually online within an hour</li>
<li aria-level="1">Excellent automated topology maps that update in real time</li>
<li aria-level="1">Multi-tenant model purpose-built for MSPs</li>
<li aria-level="1">Configuration management and syslog included</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Per-billable-device pricing can get expensive at scale</li>
<li aria-level="1">Less depth than Kentik or SolarWinds NPM for deep traffic analytics</li>
<li aria-level="1">Not designed for application-level or container-level visibility</li>
</ul>
<p><b>Pricing:</b> Per-billable-device pricing through sales. Free trial available.</p>
<p><b>Best For:</b> MSPs and IT teams managing dozens or hundreds of distributed sites where rapid onboarding matters.</p>
<h3 id="8-paessler-prtg-network-monitor">8. Paessler PRTG Network Monitor</h3>
<p><b>Best for: Small and mid-size organizations that prefer sensor-based, all-in-one monitoring</b></p>
<p>PRTG is a long-established Windows-based monitoring tool that uses a sensor model: each metric, port, or check is a sensor, and you pay for the total number of sensors. It covers networks, servers, applications, and IoT devices through SNMP, WMI, NetFlow, and HTTP probes.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">250+ pre-built sensor types for network devices, servers, and applications</li>
<li aria-level="1">SNMP, WMI, NetFlow, sFlow, J-Flow, and IPFIX support</li>
<li aria-level="1">Maps, dashboards, and reporting included</li>
<li aria-level="1">On-premises and PRTG Hosted options</li>
<li aria-level="1">Free tier up to 100 sensors</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Easy to install and configure on Windows</li>
<li aria-level="1">Broad sensor catalog covers network and infrastructure in one tool</li>
<li aria-level="1">Free tier is genuinely useful for small environments</li>
<li aria-level="1">Strong fit for SMB and mid-market IT generalists</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Sensor-based licensing gets complex and expensive as environments grow</li>
<li aria-level="1">Windows-centric architecture (probes can be on Linux but the core is Windows-only)</li>
<li aria-level="1">Less suitable for dynamic Kubernetes workloads</li>
</ul>
<p><b>Pricing:</b> Perpetual licenses from around $2,149 for 500 sensors. PRTG Hosted available as SaaS. Free up to 100 sensors.</p>
<p><b>Best For:</b> Small and mid-size organizations running mixed Windows and Linux infrastructure that want a single tool for network and server monitoring.</p>
<h3 id="9-manageengine-opmanager">9. ManageEngine OpManager</h3>
<p><b>Best for: IT teams that want broad multi-vendor monitoring at a moderate price</b></p>
<p>OpManager is part of the ManageEngine portfolio. It provides SNMP, WMI, CLI, and Telnet-based monitoring with extensive multi-vendor support and offers both subscription and perpetual licensing.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">200+ pre-built device templates across Cisco, Juniper, HP, Dell, Fortinet, and others</li>
<li aria-level="1">Network Configuration Manager add-on for backup and compliance</li>
<li aria-level="1">Workflow automation for routine remediation</li>
<li aria-level="1">NetFlow Analyzer add-on for traffic analysis</li>
<li aria-level="1">On-premises deployment with broad OS support</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Significantly cheaper than SolarWinds NPM with comparable feature depth</li>
<li aria-level="1">Perpetual licensing option for teams that prefer capital over operating expenses</li>
<li aria-level="1">Strong multi-vendor coverage out of the box</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Interface feels dated compared to modern SaaS tools</li>
<li aria-level="1">Add-on modules increase the total cost</li>
<li aria-level="1">Self-hosted only, no fully managed SaaS option</li>
</ul>
<p><b>Pricing:</b> Starts around $245 per year for 25 devices. Perpetual licenses available. NetFlow Analyzer and Network Configuration Manager priced separately.</p>
<p><b>Best For:</b> Mid-market IT teams wanting broad on-premises network and server monitoring at a moderate price.</p>
<h3 id="10-logicmonitor">10. LogicMonitor</h3>
<p><b>Best for: Hybrid infrastructure teams wanting SaaS-based monitoring across networks, servers, and cloud</b></p>
<p>LogicMonitor is a SaaS infrastructure monitoring platform that covers network devices, servers, cloud resources, and containers from a single console. The Edwin AI engine adds anomaly detection and event correlation across signals.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">3,000+ integrations and modules across networks, servers, and cloud</li>
<li aria-level="1">Cloud-managed with on-premises collectors</li>
<li aria-level="1">Edwin AI for anomaly detection and alert correlation</li>
<li aria-level="1">Per-device licensing rather than per-sensor or per-interface</li>
<li aria-level="1">Topology mapping and synthetic checks</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">One of the broadest integration libraries in the market</li>
<li aria-level="1">Predictable per-device pricing</li>
<li aria-level="1">Strong fit for hybrid environments mixing data center and cloud</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Enterprise pricing, not aimed at small teams</li>
<li aria-level="1">Less focused on application-level or service-level visibility than Datadog or Dynatrace</li>
<li aria-level="1">Some users report complex initial setup for advanced features</li>
</ul>
<p><b>Pricing:</b> Custom pricing through sales. Aimed at mid-market and enterprise.</p>
<p><b>Best For:</b> Mid-market and enterprise IT teams managing hybrid infrastructure that want a single SaaS tool for networks, servers, and cloud.</p>
<h3 id="11-zabbix">11. Zabbix</h3>
<p><b>Best for: Teams wanting a free, open-source enterprise-grade monitoring platform</b></p>
<p>Zabbix is one of the most widely deployed open-source monitoring tools. It supports SNMP, agent-based, agentless, and API-based monitoring for networks, servers, applications, and cloud services. The project has been actively developed for over two decades.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">SNMP, IPMI, JMX, ODBC, agent, and agentless monitoring</li>
<li aria-level="1">Network discovery and topology maps</li>
<li aria-level="1">Flexible templating and macros</li>
<li aria-level="1">Notifications across many channels</li>
<li aria-level="1">Distributed proxy architecture for large environments</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Completely free and open-source under AGPL</li>
<li aria-level="1">Mature, production-proven at very large scale</li>
<li aria-level="1">Active community and commercial support available</li>
<li aria-level="1">Flexible enough to cover networks, servers, and applications</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Requires operational expertise to deploy, scale, and maintain</li>
<li aria-level="1">UI feels less polished than commercial SaaS tools</li>
<li aria-level="1">Initial configuration can be time-consuming</li>
</ul>
<p><b>Pricing:</b> Free. Commercial support and training available through Zabbix LLC.</p>
<p><b>Best For:</b> Teams with the operational capacity to run their own monitoring infrastructure and that want full control without licensing costs.</p>
<h3 id="12-cilium-hubble">12. Cilium Hubble</h3>
<p><b>Best for: Kubernetes teams wanting open-source eBPF-native network observability</b></p>
<p>Cilium Hubble is the observability layer for Cilium, the CNCF-graduated eBPF-based networking and security project. It provides flow-level visibility, service maps, and policy enforcement insights for Kubernetes clusters.</p>
<p><b>Key Features:</b></p>
<ul>
<li aria-level="1">eBPF-based flow capture without sidecars</li>
<li aria-level="1">L3, L4, and L7 visibility including HTTP, gRPC, Kafka, and DNS</li>
<li aria-level="1">Service map visualization</li>
<li aria-level="1">Network policy verification and dropped-flow analysis</li>
<li aria-level="1">Integration with Prometheus and Grafana</li>
</ul>
<p><b>Pros:</b></p>
<ul>
<li aria-level="1">Completely free and open-source under Apache 2.0</li>
<li aria-level="1">Native eBPF approach with low overhead</li>
<li aria-level="1">Strong for Kubernetes security and network policy use cases</li>
<li aria-level="1">Tight integration with Cilium CNI</li>
</ul>
<p><b>Cons:</b></p>
<ul>
<li aria-level="1">Requires Cilium as the CNI plugin, which is a significant architectural choice</li>
<li aria-level="1">Operational expertise needed to deploy and scale Hubble</li>
<li aria-level="1">Less suited for standalone hosts, VMs, or non-Kubernetes workloads</li>
</ul>
<p><b>Pricing:</b> Free. Commercial support through Isovalent (now part of Cisco).</p>
<p><b>Best For:</b> Kubernetes-native teams that have adopted or are willing to adopt Cilium as their CNI and want deep eBPF-based flow observability without commercial licensing.</p>
<h2 id="network-monitoring-tools-comparison-table">Network Monitoring Tools Comparison Table</h2>
<table>
<thead>
<tr>
<th><b>Tool</b></th>
<th><b>Deployment</b></th>
<th><b>Kubernetes</b></th>
<th><b>Telemetry</b></th>
<th><b>Pricing</b></th>
<th><b>Best For</b></th>
</tr>
</thead>
<tbody>
<tr>
<td><b>Sematext Network Map</b></td>
<td>SaaS</td>
<td>Native</td>
<td>eBPF, agent metrics</td>
<td>Per host</td>
<td>Cloud-native teams wanting service-aware visibility</td>
</tr>
<tr>
<td><b>Datadog Network Monitoring</b></td>
<td>SaaS</td>
<td>Yes</td>
<td>Agent flows, VPC flow logs</td>
<td>Per host + per flow</td>
<td>Enterprises already on Datadog</td>
</tr>
<tr>
<td><b>Dynatrace</b></td>
<td>SaaS or managed</td>
<td>Yes</td>
<td>OneAgent</td>
<td>Custom</td>
<td>Large enterprises wanting AI-driven observability</td>
</tr>
<tr>
<td><b>Kentik</b></td>
<td>SaaS</td>
<td>Yes</td>
<td>NetFlow, sFlow, VPC flows, BGP</td>
<td>Custom</td>
<td>NetOps in hybrid and multicloud</td>
</tr>
<tr>
<td><b>Cisco ThousandEyes</b></td>
<td>SaaS</td>
<td>Limited</td>
<td>Synthetic agents, BGP</td>
<td>Per agent</td>
<td>Internet and SaaS path visibility</td>
</tr>
<tr>
<td><b>SolarWinds NPM</b></td>
<td>Self-hosted or SaaS</td>
<td>Limited</td>
<td>SNMP, NetPath</td>
<td>License + maintenance</td>
<td>Traditional enterprise NetOps</td>
</tr>
<tr>
<td><b>Auvik</b></td>
<td>SaaS</td>
<td>Limited</td>
<td>SNMP, NetFlow</td>
<td>Per device</td>
<td>MSPs and multi-site IT</td>
</tr>
<tr>
<td><b>Paessler PRTG</b></td>
<td>Self-hosted or SaaS</td>
<td>Limited</td>
<td>SNMP, WMI, NetFlow</td>
<td>Per sensor</td>
<td>SMB and mid-market generalists</td>
</tr>
<tr>
<td><b>ManageEngine OpManager</b></td>
<td>Self-hosted</td>
<td>Limited</td>
<td>SNMP, WMI, NetFlow</td>
<td>Per device</td>
<td>Mid-market multi-vendor</td>
</tr>
<tr>
<td><b>LogicMonitor</b></td>
<td>SaaS</td>
<td>Yes</td>
<td>Agent, SNMP, cloud APIs</td>
<td>Per device</td>
<td>Hybrid infrastructure teams</td>
</tr>
<tr>
<td><b>Zabbix</b></td>
<td>Self-hosted</td>
<td>Yes</td>
<td>Agent, SNMP, IPMI</td>
<td>Free</td>
<td>Open-source enterprise</td>
</tr>
<tr>
<td><b>Cilium Hubble</b></td>
<td>Self-hosted</td>
<td>Native</td>
<td>eBPF</td>
<td>Free</td>
<td>Kubernetes-native eBPF</td>
</tr>
</tbody>
</table>
<h2 id="how-to-choose-the-right-network-monitoring-tool">How to Choose the Right Network Monitoring Tool</h2>
<h3 id="start-with-your-stack">Start With Your Stack</h3>
<p>A team running mostly Cisco switches and on-premises servers has a very different set of needs from a team running Kubernetes on EKS. SNMP-based tools like SolarWinds, ManageEngine, and PRTG remain the right answer for traditional network gear. For Kubernetes and dynamic cloud workloads, eBPF-based tools like Sematext Network Map and Cilium Hubble give you visibility that legacy NMS products cannot match.</p>
<h3 id="decide-whether-you-want-a-standalone-or-integrated-tool">Decide Whether You Want a Standalone or Integrated Tool</h3>
<p>Network monitoring used to be a separate tool maintained by a separate team. That model still works for some organizations, but most modern teams benefit from network visibility that lives next to logs, metrics, and traces. Sematext, Datadog, Dynatrace, and LogicMonitor all let you correlate network signals with application data. Standalone specialists like Kentik and ThousandEyes go deeper in their niche, often paired with a broader observability platform.</p>
<h3 id="model-your-cost-at-scale">Model Your Cost at Scale</h3>
<p>Pricing models vary widely. Per-sensor models like PRTG can balloon as you add checks. Per-device models like Auvik and LogicMonitor are predictable but can become expensive as device counts grow. Per-host models like Sematext and Datadog scale with infrastructure size. Always run a quick projection for your expected scale rather than going by starter-tier pricing.</p>
<h3 id="test-before-you-buy">Test Before You Buy</h3>
<p>Most commercial tools offer free trials. Open-source tools cost only your time. Pick two or three candidates that fit your environment and run them on a real workload for a week or two. You will learn more from a short pilot than from any vendor demo.</p>
<h3 id="do-not-forget-about-people">Do Not Forget About People</h3>
<p>A tool nobody uses is worse than no tool at all. Whatever you choose, make sure your on-call engineers find the UI usable, the alerts trustworthy, and the data easy to share across teams.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Network monitoring in 2026 is no longer a single category. Some teams need deep SNMP visibility for traditional gear. Others need eBPF-based service maps for Kubernetes. Many need both, plus correlation with logs, metrics, and traces.</p>
<p>For cloud-native and hybrid teams, <b>Sematext Network Map</b> stands out as the most pragmatic choice in 2026. It gives you eBPF-powered service and infrastructure visibility, automatic detection of over 100 service types, Kubernetes-native drill-down, and integration with logs, metrics, traces, and synthetic monitoring in one platform. All of that comes at a fraction of the cost of the major enterprise observability incumbents.</p>
<p>If your environment is dominated by traditional network gear, SolarWinds, ManageEngine, and Auvik remain solid choices. If you need internet and SaaS path visibility, ThousandEyes is hard to beat. If you want fully open-source, Zabbix covers the broad case and Cilium Hubble covers the Kubernetes-native case.</p>
<p>Whatever you choose, prioritize tools that fit how your infrastructure actually works today, not how it worked five years ago.</p>
<p><b>Ready to see your infrastructure as it really is?</b> <a href="https://apps.sematext.com/ui/registration" target="_blank" rel="noopener noreferrer">Try Sematext Network Map free for 14 days</a>, no credit card required.</p>
<h2 id="faq">FAQ</h2>
<h3 id="what-is-the-difference-between-network-monitoring-and-observability">What is the difference between network monitoring and observability?</h3>
<p>Network monitoring focuses on the health and behavior of network infrastructure: devices, interfaces, traffic, paths, and connections. Observability is a broader practice that combines logs, metrics, traces, and topology to understand the health of the entire system, including applications. Modern tools like Sematext, Datadog, and Dynatrace blur the line by treating network visibility as one signal among many.</p>
<h3 id="do-i-need-separate-network-monitoring-if-i-already-have-apm">Do I need separate network monitoring if I already have APM?</h3>
<p>APM tells you what your application code is doing. Network monitoring tells you what is happening at the network connection and infrastructure level. The two are complementary. A slow database query shows up in APM. A flaky network path, a saturated link, or a rogue process making outbound calls shows up in network monitoring, but not in APM. Most teams benefit from both, ideally on the same platform.</p>
<h3 id="what-is-ebpf-and-why-does-it-matter-for-network-monitoring">What is eBPF and why does it matter for network monitoring?</h3>
<p>eBPF (extended Berkeley Packet Filter) is a Linux kernel technology that lets tools safely run sandboxed programs inside the kernel to observe events such as network connections, system calls, and packet processing. For network monitoring, eBPF allows tools to capture connection-level data with very low overhead and without modifying applications. Tools like Sematext Network Map and Cilium Hubble use eBPF to build accurate, real-time topology views without sidecars, port mirroring, or packet captures.</p>
<h3 id="can-network-monitoring-tools-work-with-kubernetes">Can network monitoring tools work with Kubernetes?</h3>
<p>Yes, but with very different levels of effectiveness. Tools designed for static device inventories struggle with the dynamic nature of pods and containers. eBPF-based and Kubernetes-aware tools like Sematext Network Map, Cilium Hubble, Datadog NPM, and Dynatrace are built for this environment. Traditional SNMP-focused tools can still monitor the underlying nodes, but they will not give you pod-level or service-level visibility.</p>
<h3 id="what-are-the-best-free-or-open-source-network-monitoring-tools-in-2026">What are the best free or open-source network monitoring tools in 2026?</h3>
<p>Zabbix remains the most widely deployed open-source choice for general infrastructure and network monitoring. Nagios and Icinga are still in active use for traditional environments. LibreNMS and OpenNMS are strong for SNMP-heavy networks. For Kubernetes-native, eBPF-based observability, Cilium Hubble is the leading open-source option. All of these are free to use but require operational expertise to deploy and scale.</p>
<h3 id="how-much-do-network-monitoring-tools-cost">How much do network monitoring tools cost?</h3>
<p>Pricing varies enormously. Open-source tools are free but carry operational cost. Per-device tools like Auvik and OpManager typically range from a few dollars to tens of dollars per device per month. Per-host tools like Sematext Network Map start around $1.68 per host per month. Per-sensor tools like PRTG depend on how many checks you configure. Enterprise platforms like Datadog, Dynatrace, Kentik, and LogicMonitor are usually priced through sales and can run from tens of thousands to hundreds of thousands of dollars per year depending on scale.</p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/top-12-network-monitoring-tools-in-2026-complete-comparison-reviews/">Top 12 Network Monitoring Tools in 2026: Complete Comparison &#038; Reviews</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using AI to Instrument Applications with OpenTelemetry</title>
		<link>https://sematext.com/blog/using-ai-to-instrument-applications-with-opentelemetry/</link>
		
		<dc:creator><![CDATA[fulya.uluturk]]></dc:creator>
		<pubDate>Thu, 21 May 2026 07:20:49 +0000</pubDate>
				<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[Programming languages & frameworks]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=70785</guid>

					<description><![CDATA[<p>OpenTelemetry is one of the best things that’s happened to observability in the last decade. It’s open. It has SDKs for every language that matters. It’s vendor neutral. The OTel community has been doing the hard work of standardizing how applications emit telemetry, so that you, the engineer, don’t have to learn five different agent [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/using-ai-to-instrument-applications-with-opentelemetry/">Using AI to Instrument Applications with OpenTelemetry</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a> is one of the best things that’s happened to observability in the last decade. It’s open. It has SDKs for every language that matters. It’s vendor neutral. The OTel community has been doing the hard work of standardizing how applications emit telemetry, so that you, the engineer, don’t have to learn five different agent formats to monitor five different services.</p>
<p>But there’s a part of the OTel pitch that often gets glossed over: <b>somebody still has to instrument the application</b>. And that part isn’t quick or easy. Even now.</p>
<h2 id="the-instrumentation-tax"><b>The instrumentation tax</b></h2>
<p>Modern applications aren’t a single binary anymore. At Sematext we run <b>30+ microservices</b> to power the <a href="https://sematext.com/docs/">Sematext Cloud</a> platform: alerts, metrics receivers and consumers, log receivers and consumers, user experience services, tracing pipelines, network map, various APIs and more, across Java (Spring Boot), Go, and a few other stacks.</p>
<p><img decoding="async" class="alignnone wp-image-70788 size-full" src="https://sematext.com/wp-content/uploads/2026/05/network-map-big.png" alt="" width="2500" height="1332" srcset="https://sematext.com/wp-content/uploads/2026/05/network-map-big.png 2500w, https://sematext.com/wp-content/uploads/2026/05/network-map-big-300x160.png 300w, https://sematext.com/wp-content/uploads/2026/05/network-map-big-1024x546.png 1024w, https://sematext.com/wp-content/uploads/2026/05/network-map-big-768x409.png 768w, https://sematext.com/wp-content/uploads/2026/05/network-map-big-1536x818.png 1536w, https://sematext.com/wp-content/uploads/2026/05/network-map-big-2048x1091.png 2048w" sizes="(max-width: 2500px) 100vw, 2500px" /></p>
<p>That’s a lot of surface area, several languages, multiple frameworks, different build systems for different stacks. None of this is unusual for a mature system. This means that instrumentation effort grows with that diversity, so any mechanism that helps minimize instrumentation mistakes will be welcomed by engineers tasked with instrumentation.</p>
<p>If you want <b>end-to-end tracing</b> through that stack, the kind that actually tells you where a slow request spent its time, you can’t just instrument one service. You have to instrument the whole chain: frontend → API gateway → backend service A → backend service B → database. Skip a hop and the trace breaks. The dependency graph the trace gives you stops being useful exactly at the boundary you didn’t instrument.</p>
<p>So in practice, “let’s adopt OpenTelemetry” turns into a checklist of dozens of services that each need their own instrumentation work. The good news is that it doesn’t have to happen all at once and AI can help.</p>
<h2 id="how-much-does-opentelemetry-instrumentation-cost"><b>How much does OpenTelemetry instrumentation cost?</b></h2>
<p>By cost, we mean the cost to an engineer, the team, and the organization. We can look at it as a non-monetary cost, but if we trace (pun intended!) this cost all the way down then yes, there is also a financial cost associated with this effort.</p>
<p>Three things make this hard, even with OTel:</p>
<p><b>Prioritization. </b>Instrumenting a service competes with shipping features and fixing bugs. It’s preventive work; its value shows up the next time something breaks at 3am, not this sprint. That’s a hard sell to a product manager.</p>
<p><b>Unknown territory. </b>When the chain spans services you didn’t write, in languages you don’t use day to day, you’re spending most of your time on context switch overhead. You’re not adding instrumentation; you’re re-learning a framework you saw once two years ago.</p>
<p><b>Time needed even for auto-instrumentation. </b>“Auto-instrumentation” means no code changes. It doesn’t mean no work. For one service the loop typically goes:</p>
<ol>
<li aria-level="1">Read the right OTel SDK docs for your language</li>
<li aria-level="1">Pick the right auto-instrumentation package (there are usually three options, only one of which is current)</li>
<li aria-level="1">Install it in the build (pom.xml, package.json, requirements.txt, …)</li>
<li aria-level="1">Configure the OTLP endpoint, the auth header, the service name</li>
<li aria-level="1">Restart, hit the service, watch what happens</li>
<li aria-level="1">Debug the first attempt: wrong port (4317 vs 4318 vs 4338), wrong protocol (http/protobuf vs grpc), wrong auth header (Bearer vs vendor-specific), region mismatch on the endpoint</li>
<li aria-level="1">Verify the data lands in the right place in your observability tool</li>
<li aria-level="1">Multiply by the number of services in your chain</li>
</ol>
<p>Forty minutes to two hours per service if you’re moving carefully, and that’s just for traces and metrics. The OTel auto-instrumentation packages don’t ship logs in most SDKs. For logs you need to switch to manual instrumentation, which is another SDK init block per service.</p>
<h2 id="and-then-theres-custom-opentelemetry-instrumentation"><b>And then there’s custom OpenTelemetry instrumentation</b></h2>
<p>The above buys you “spans for every incoming HTTP request” and a generic metrics set. The moment you want anything specific (e.g., a custom span attribute for the user’s account tier, a business metric counting checkouts, a log enriched with the trace ID so you can correlate logs and traces for faster Root Cause Analysis), you’re back in manual-instrumentation land, writing SDK code in every service you care about. The auto path ends; the per-language SDK learning curve begins.</p>
<p>For one service that’s an afternoon. For thirty services that’s a quarter. What can we do about this?</p>
<h2 id="can-we-use-ai-to-instrument-applications-with-opentelemetry"><b>Can we use AI to instrument applications with OpenTelemetry?</b></h2>
<p>The instrumentation work (pick the SDK, set the env vars, debug the endpoint, verify it landed) is exactly the kind of structured, repetitive, well-documented task an AI agent does well. The blockers aren’t intellectual; they’re “look up the right thing, paste it in the right place, watch for the obvious gotcha.”</p>
<p>That’s not “let the AI do your engineering.” It’s “let the AI do the parts that already had a right answer, written down somewhere, and just needed someone to fetch it.”</p>
<p>We tried this for instrumenting applications against Sematext Cloud. The result is a small,but highly valuable open-source artifact: a <b>Claude Code Agent Skill</b> that walks an engineer through OTel instrumentation conversationally. It’s plain markdown, lives in our public Github repository, and works with any AI agent that can read a URL.</p>
<h2 id="what-the-otel-instrumentation-ai-skill-does"><b>What the OTel instrumentation AI skill does</b></h2>
<p>The Sematext OTel skill at <a href="https://github.com/sematext/sematext-otel-onboarding/blob/main/skills/SKILL.md" target="_blank" rel="noopener noreferrer">sematext-otel-onboarding/blob/main/skills/SKILL.md</a> is the AI-readable version of “how to wire your application to Sematext.” When loaded into Claude Code (or any agent that can fetch a markdown URL), it triages the user through six short questions:</p>
<ol>
<li aria-level="1">Sematext region (US or EU)</li>
<li aria-level="1">Which App types you’re wiring (Tracing, Logs, Monitoring, any combination)</li>
<li aria-level="1">Flow: managed OTLP endpoint or Sematext Agent</li>
<li aria-level="1">Protocol: HTTP (default) or gRPC</li>
<li aria-level="1">Language and deployment environment</li>
<li aria-level="1">Auto or manual instrumentation</li>
</ol>
<p>Then it produces the exact env-var block, parameterized to your answers, including:</p>
<ul>
<li aria-level="1">The correct OTLP endpoint URL for your region and protocol</li>
<li aria-level="1">The Sematext-specific X-API-TOKEN header (different from the standard Authorization: Bearer … most OTel docs show, easy to miss)</li>
<li aria-level="1">One header per signal type, so you only configure what you’re using</li>
<li aria-level="1">A pointer to a runnable reference example in the same repo, in your language</li>
</ul>
<p>Similarly, you can use the skill not only to add instrumentation to uninstrumented applications, but also to fix broken instrumentation that’s not really working. Auto-instrumentation doesn’t ship logs? The skill flags that and asks if you want to switch to manual. Region-token mismatch? The skill warns explicitly. Custom header convention? Documented. The skill is opinionated and aware of the setup required where the official OpenTelemetry docs may be silent or difficult to understand and follow.</p>
<h2 id="what-an-instrumentation-session-looks-like"><b>What an instrumentation session looks like</b></h2>
<p>In practice, an engineer with Claude Code in their editor opens their service’s directory and pastes:</p>
<p><code>Use <a href="https://github.com/sematext/sematext-otel-onboarding/blob/main/skills/SKILL.md" target="_blank" rel="noopener noreferrer">https://github.com/sematext/sematext-otel-onboarding/blob/main/skills/SKILL.md</a> to instrument this app for Sematext.<br>
Region: US. App type: Tracing. Token: &lt;pasted-from-Sematext-UI&gt;.</code></p>
<p>Claude loads the skill, reads the project’s files to figure out the language and framework, asks the two remaining triage questions, then proposes the diff to the project (adds the OTel SDK to the build file, adds the env vars to docker-compose or systemd or .env or wherever they belong, and shows you what to expect in the Sematext UI within 60 seconds). You review the diff. You apply. You restart. You see traces.</p>
<p>Compared to the manual path (read docs, pick SDK, install, configure, debug, verify), we’d expect the instrumentation effort time to first data to drop from the typical 40 to 120 minutes per service to a handful of minutes. For an organization adopting OTel across dozens of services, that compounds quickly. A quarter of part-time effort becomes a couple of focused days. Thousands of dollars in engineering time drops to a much more sane number. The effort has a positive ROI.</p>
<h2 id="what-the-skill-doesnt-do"><b>What the skill doesn’t do</b></h2>
<p>This is where AI posts usually start hand-waving. Here’s the honest list:</p>
<ul>
<li aria-level="1"><b>It doesn’t write custom span attributes or business metrics for you. </b>It writes the boilerplate that gets you to the point where you <i>can</i> write those. The judgment about what to measure is still yours. The benefit is that the skill gives you all the scaffolding, a working instrumentation, so the effort of collecting custom/business metrics becomes significantly lower.</li>
<li aria-level="1"><b>It doesn’t psychic-debug your network. </b>If your service can’t reach the OTLP endpoint on first run (corporate proxy, missing TLS cert chain, wrong port), the skill points at the common causes, but you still have to look at the service’s own logs to confirm what happened.</li>
<li aria-level="1"><b>It doesn’t change OTel’s reality. </b>Auto-instrumentation still doesn’t ship logs in most SDKs. AI doesn’t fix the SDK. But it does tell you up front, so you don’t spend an hour wondering why your Logs App is empty.</li>
</ul>
<h2 id="try-it-the-skill-is-vendor-agnostic"><b>Try it, the skill is vendor-agnostic</b></h2>
<p>The skill is open-source and lives in our <a href="https://github.com/sematext/sematext-otel-onboarding/" target="_blank" rel="noopener noreferrer">OTel onboarding repo</a>. The same repo has runnable reference apps for Node.js, Java, Python, .NET, and PHP across baremetal, Docker, and Kubernetes deployments, so if you want to see what the skill is going to walk you through, the reference is right there.</p>
<p>If you have Claude Code, point it at the URL above. If you use a different AI agent, the skill is just markdown. Load it however your agent loads documentation. There’s no install step; there’s no vendor lock-in. The skill shared is not Sematext-specific. Sematext’s contribution is the knowledge, encoded in a format an AI can act on.</p>
<h2 id="where-this-is-going"><b>Where this is going</b></h2>
<p>The OTel skill is one example of a broader pattern we think makes sense for observability tools: <b>knowledge as something an AI can use, not just something a human can read.</b></p>
<p>A few directions we’re exploring:</p>
<ul>
<li aria-level="1"><b>Per-language sub-skills </b>for deeper, opinionated guidance when a language has subtle gotchas (Node async hooks, Java agent attach, Python startup ordering)</li>
<li aria-level="1"><b>In-product wiring </b>so the App creation page in Sematext Cloud gives you a one-click “use AI to set this up” alongside the existing manual instructions, with your region and token pre-filled into the prompt</li>
<li aria-level="1"><b>Skills for the rest of the observability journey </b>(picking sensible default alerts, creating dashboards, interpreting RCA results), each as a small, auditable markdown file you can use, fork, or ignore</li>
</ul>
<p>The bet is that the value of an observability platform isn’t just the data it collects; it’s how quickly an engineer can go from “we should monitor this” to “we’re monitoring it and we know what to do when it breaks.” AI doesn’t replace the judgment in that loop as of yet. But it can absolutely replace the busywork around it.</p>
<p>If you give the skill a try and find a gap, <a href="https://github.com/sematext/sematext-otel-onboarding/blob/main/skills/sematext-otel.md" target="_blank" rel="noopener noreferrer">open a PR</a>. The fastest way for this pattern to get good is for more people to use it on more apps.</p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/using-ai-to-instrument-applications-with-opentelemetry/">Using AI to Instrument Applications with OpenTelemetry</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pull Request Velocity as a Proxy for AI Usage for Software Development</title>
		<link>https://sematext.com/blog/pull-request-velocity-as-a-proxy-for-ai-usage-for-software-development/</link>
		
		<dc:creator><![CDATA[Otis]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 07:06:27 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=70751</guid>

					<description><![CDATA[<p>While AI have usage has been growing steadily for the last several years, the LLM models noticeably improved around the end of 2025. Specifically, they become more viable for software development. We are seeing the results. The feature and product delivery has picked up. One way to visualize this is by looking at the number [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/pull-request-velocity-as-a-proxy-for-ai-usage-for-software-development/">Pull Request Velocity as a Proxy for AI Usage for Software Development</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>While AI have usage has been growing steadily for the last several years, the LLM models noticeably improved around the end of 2025. Specifically, they become more viable for software development. We are seeing the results. The feature and product delivery has picked up. One way to visualize this is by looking at the number of pull requests for your organization / software development teams.  This chart shows the number of Github pull requests created by a team. Can you spot when AI usage increased?</p>
<p><img decoding="async" class="alignnone  wp-image-70752" src="https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-300x86.png" alt="" width="677" height="194" srcset="https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-300x86.png 300w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-1024x293.png 1024w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-768x220.png 768w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-1536x440.png 1536w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-ai-usage-proxy-2048x586.png 2048w" sizes="(max-width: 677px) 100vw, 677px" /></p>
<p>It starts in late November, 2025. This marks the beginning of increased AI usage (for coding) in Sematext. That’s when the LLMs got better. It <i>roughly </i>matches the change in velocity as visualized in JIRA.</p>
<h3 id="individual-ai-adoption">Individual AI Adoption</h3>
<p>The blurred part are PR author names, which we can use for filtering. If we look at trends of individuals we can spot early adopters like this one:</p>
<p><img decoding="async" class="alignnone  wp-image-70753" src="https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-300x65.png" alt="" width="660" height="143" srcset="https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-300x65.png 300w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-1024x221.png 1024w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-768x166.png 768w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-1536x332.png 1536w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-early-ai-user-2048x442.png 2048w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>Or another individual who started making more use of AI later:</p>
<p><img decoding="async" class="alignnone  wp-image-70754" src="https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-300x64.png" alt="" width="656" height="140" srcset="https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-300x64.png 300w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-1024x219.png 1024w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-768x164.png 768w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-1536x329.png 1536w, https://sematext.com/wp-content/uploads/2026/03/gh-pr-late-ai-user-2048x438.png 2048w" sizes="(max-width: 656px) 100vw, 656px" /></p>
<h3 id="source-github-webhook-events">Source: Github WebHook Events</h3>
<p>This data comes into Sematext via <a href="https://sematext.com/docs/integration/github-webhook-events-integration/">Github Webhook Events.</a> It takes about 5-10 minutes to set up. It can be set up at the Github organization level or for individual repositories.</p>
<h3 id="a-word-of-caution">A Word of Caution</h3>
<ol>
<li aria-level="1">There are many software development styles. There are people who commit frequently and incrementally and there are those who keep things to themselves until everything is nearly done. This is a fun chart to look at and is helpful when you want to get the feel for the “pulse” of a team or even an individual. But be careful not to judge people on this sort of data alone. Use this with a grain of salt and in combination with other inputs, observations, etc.</li>
<li aria-level="1">Creating more code or PRs doesn’t always equal better code or higher effectiveness. A person may be tapping in the dark trying to debug or implement something with the help of AI and, in the process, creating a lot of (temporary?) code and PRs.</li>
<li aria-level="1">As velocity increases, so will regressions, unless you take countermeasures. See <a href="https://www.linkedin.com/pulse/faster-coding-ai-increased-regressions-otis-gospodneti%C4%87-bi6ve/" target="_blank" rel="noopener noreferrer">Faster Coding with AI and Increased Regressions</a>.</li>
</ol>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/pull-request-velocity-as-a-proxy-for-ai-usage-for-software-development/">Pull Request Velocity as a Proxy for AI Usage for Software Development</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Running OpenTelemetry at Scale: Architecture Patterns for 100s of Services</title>
		<link>https://sematext.com/blog/running-opentelemetry-at-scale-architecture-patterns-for-100s-of-services/</link>
		
		<dc:creator><![CDATA[fulya.uluturk]]></dc:creator>
		<pubDate>Tue, 03 Mar 2026 12:06:59 +0000</pubDate>
				<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[Tracing]]></category>
		<category><![CDATA[distributed tracing]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[opentelemetry]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=70550</guid>

					<description><![CDATA[<p>It feels great getting OpenTelemetry working in a demo environment. Spans appear, metrics flow, you connect it to a backend and everything lights up in a satisfying cascade. You write the internal doc, you present it to the team, but it’s just a matter of time when somebody on the team asks: “Great, so how [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/running-opentelemetry-at-scale-architecture-patterns-for-100s-of-services/">Running OpenTelemetry at Scale: Architecture Patterns for 100s of Services</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">It feels great getting OpenTelemetry working in a demo environment. Spans appear, metrics flow, you connect it to a backend and everything lights up in a satisfying cascade. You write the internal doc, you present it to the team, but it’s just a matter of time when somebody on the team asks: “Great, so how do we roll this out to all 100 services?” If you are at that point on your OTel journey, this article will help you roll out OTel to production.</span></p>
<p><span style="font-weight: 400;">Running OTel across a handful of services and running it across a few hundred are genuinely different problems. The instrumentation part stays roughly the same. Everything around it — how you collect the data, how you route it, how you make sure a traffic spike in one region does not take down your entire observability pipeline — that is where teams either build something resilient or spend the next six months fire-fighting because of inadequate planning or suboptimal architecture.</span></p>
<p><span style="font-weight: 400;">I wrote this article to share the patterns that actually hold up at scale: collector tiers, load balancing strategies, sampling at volume, and multi-cluster setups. Everything comes with real config examples because “it depends” is only useful advice if you can see what it depends on.</span></p>
<p><span style="font-weight: 400;">See</span><a href="https://sematext.com/blog/from-debugging-to-slos-how-opentelemetry-changes-the-way-teams-do-observability/" target="_blank" rel="noopener"> <span style="font-weight: 400;">How OpenTelemetry changes the way teams do observability</span></a><span style="font-weight: 400;"> for why OpenTelemetry matters and how it shifts focus from traditional metrics and logs to full, end-to-end observability.</span></p>
<h2 id="why-a-single-collector-falls-apart-and-when"><b>Why a Single Collector Falls Apart (and When)</b></h2>
<p><span style="font-weight: 400;">Most OTel tutorials show you a single collector instance receiving spans from all your services and forwarding everything to a backend. That setup works until about the point where it stops working, which tends to happen quietly and at the worst possible time. You are not going to notice a single collector struggling until it is already dropping data, buffering is maxed out, and your traces have gaps you cannot explain.</span></p>
<p><span style="font-weight: 400;">The core issue is that a single collector is both a single point of failure and a resource bottleneck. At low traffic it sits there looking fine. Add a few dozen services, let traffic spike during a product launch or a retry storm, and you will watch it start falling behind. The exporter queue fills up. Backpressure kicks in. Services start dropping spans rather than blocking on the export. By the time anyone notices, you have lost the exact telemetry you needed to understand what just happened.</span></p>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">The failure mode is silent.</strong> <b></b><span style="font-weight: 400;"> When a collector falls behind, it does not usually crash spectacularly. It drops spans without loud errors, your traces become incomplete, and your dashboards show suspiciously clean latency numbers because the slow requests stopped being recorded. If your p99 looks unexpectedly healthy during an incident, check your collector queue depth before trusting it.</span></div>
<p><span style="font-weight: 400;">The solution is to stop thinking about the collector as a single process and start thinking about it as a tier. Two tiers cover most production scenarios. Three tiers cover the rest. The architecture you need depends on your traffic, whether you need tail-based sampling, and how many backends you are exporting to.</span></p>
<p><span style="font-weight: 400;">Let me make this more specific: if you have fewer than 20 services and under 500 requests per second total, a single well-configured collector will likely hold up (yes, of course it depends on the underlying hardware/resources). At 20 to 80 services or 500 to 5,000 RPS, the two-tier model becomes worthwhile. Above 80 services or 5,000 RPS, you need the full tiered setup with </span><a href="https://opentelemetry.io/docs/collector/deploy/gateway/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">trace-aware load balancing</span></a><span style="font-weight: 400;"> and </span><a href="https://sematext.com/blog/opentelemetry-production-monitoring-what-breaks-and-how-to-prevent-it/#tail-sampling" target="_blank" rel="noopener"><span style="font-weight: 400;">tail-based sampling</span></a><span style="font-weight: 400;"> at the gateway. </span></p>
<p><span style="font-weight: 400;">For more information on common production pitfalls and strategies to prevent them, see </span><a href="https://sematext.com/blog/opentelemetry-production-monitoring-what-breaks-and-how-to-prevent-it/" target="_blank" rel="noopener"> <span style="font-weight: 400;">OpenTelemetry Production Monitoring: What Breaks and How to Prevent It</span></a><span style="font-weight: 400;">.</span></p>
<h2 id="collector-tiers-the-architecture-that-actually-scales"><b>Collector Tiers: The Architecture That Actually Scales</b></h2>
<p><span style="font-weight: 400;">The tiered collector model separates two concerns that should never have been combined in the first place: getting data off your services quickly, and doing something intelligent with that data before it hits your backend.</span></p>
<p><span style="font-weight: 400;">Before getting into the architecture, it helps to know that the OTel Collector can run in three modes — and in a scaled setup, you will use all three:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><b>Agent</b><span style="font-weight: 400;"> — a collector running on the same host as your services, collecting telemetry locally and forwarding it upstream. It stays thin: no heavy processing, just receive-and-forward.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Gateway</b><span style="font-weight: 400;"> — a collector running as a standalone service, receiving data from agents (or directly from SDKs) and doing the heavier work: sampling, routing, fan-out to backends, attribute redaction.</span></li>
</ul>
<p><b>Combined</b><span style="font-weight: 400;"> — the full pattern, where agent collectors feed into gateway collectors. Agents handle what only makes sense per-host (host metrics, file logs, resource detection). Gateways handle what only makes sense centrally (tail-based sampling, cross-service routing, policy management). The </span><a href="https://opentelemetry.io/docs/collector/deploy/gateway/#combined-deployment-of-collectors-as-agents-and-gateways" target="_blank" rel="noopener noreferrer"> <span style="font-weight: 400;">OTel Collector deployment docs</span></a><span style="font-weight: 400;"> call this the combined deployment pattern.</span></p>
<p><span style="font-weight: 400;">The tiered setup this article describes is the combined pattern. Here is what it looks like:</span></p>
<div style="margin: 32px 0;">
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase; margin-bottom: 24px;">TWO-TIER COLLECTOR ARCHITECTURE</div>
<p><!-- SERVICES ROW --></p>
<div style="text-align: center; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 8px;">SERVICES</div>
<div style="display: flex; justify-content: center; gap: 12px; margin-bottom: 6px;">
<div style="background: #1e3a5f; border: 2px solid #f59e0b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; margin-bottom: 3px;">Service</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">App A</div>
</div>
<div style="background: #1e3a5f; border: 2px solid #f59e0b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; margin-bottom: 3px;">Service</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">App B</div>
</div>
<div style="background: #1e3a5f; border: 2px solid #f59e0b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; margin-bottom: 3px;">Service</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">App C</div>
</div>
<div style="background: #1e3a5f; border: 2px solid #f59e0b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; margin-bottom: 3px;">Service</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">App N</div>
</div>
</div>
<p><!-- Arrow down --></p>
<div style="text-align: center; color: #94a3b8; font-size: 20px; line-height: 1; margin: 4px 0;">↓</div>
<p><!-- TIER 1 LABEL --></p>
<div style="text-align: center; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 8px;">TIER 1 — AGENT / SIDECAR COLLECTORS</div>
<div style="display: flex; justify-content: center; gap: 12px; margin-bottom: 6px;">
<div style="background: #14532d; border: 2px solid #14532d; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #86efac; margin-bottom: 3px;">Agent</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector</div>
</div>
<div style="background: #14532d; border: 2px solid #14532d; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #86efac; margin-bottom: 3px;">Agent</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector</div>
</div>
<div style="background: #14532d; border: 2px solid #14532d; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #86efac; margin-bottom: 3px;">Agent</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector</div>
</div>
<div style="background: #14532d; border: 2px solid #14532d; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #86efac; margin-bottom: 3px;">Agent</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector</div>
</div>
</div>
<p><!-- Arrow down --></p>
<div style="text-align: center; color: #94a3b8; font-size: 20px; line-height: 1; margin: 4px 0;">↓</div>
<p><!-- TIER 2 LABEL --></p>
<div style="text-align: center; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 8px;">TIER 2 — GATEWAY COLLECTORS</div>
<div style="display: flex; justify-content: center; gap: 12px; margin-bottom: 6px;">
<div style="background: #1e293b; border: 2px solid #1e293b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 110px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 3px;">Gateway</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector (HA)</div>
</div>
<div style="background: #1e293b; border: 2px solid #1e293b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 110px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 3px;">Gateway</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Collector (HA)</div>
</div>
</div>
<p><!-- Arrow down --></p>
<div style="text-align: center; color: #94a3b8; font-size: 20px; line-height: 1; margin: 4px 0;">↓</div>
<p><!-- BACKENDS --></p>
<div style="display: flex; justify-content: center; gap: 12px; margin-bottom: 6px;">
<div style="background: #1e293b; border: 2px solid #1e293b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 3px;">Backend</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Traces</div>
</div>
<div style="background: #1e293b; border: 2px solid #1e293b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 3px;">Backend</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Metrics</div>
</div>
<div style="background: #1e293b; border: 2px solid #1e293b; border-radius: 6px; padding: 10px 18px; text-align: center; min-width: 90px;">
<div style="font-size: 9px; font-weight: bold; letter-spacing: 0.1em; color: #94a3b8; margin-bottom: 3px;">Backend</div>
<div style="font-size: 15px; font-weight: bold; color: #ffffff;">Logs</div>
</div>
</div>
<p><!-- Caption --></p>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; margin-top: 16px; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto;">Tier 1 agents sit close to services and do minimal work. Tier 2 gateways handle sampling, routing, and backend fan-out.</div>
</div>
<h3 id="tier-1-collectors-running-as-agents"><b>Tier 1: Collectors running as agents</b></h3>
<p><span style="font-weight: 400;">The agent tier runs as a sidecar. Its job is exactly one thing: receive telemetry from the services and forward it as fast as possible. No tail-based sampling, no complex routing logic, no fan-out to multiple backends. The only processing you want at this tier is cheap and stateless: adding resource attributes like cluster name, node name, and environment; batching spans to reduce connection overhead; and basic filtering to drop genuinely worthless spans like health check endpoints generating thousands of spans per minute and telling you nothing.</span></p>
<div style="background: rgba(217,119,6,0.06); border-left: 3px solid #D97706; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #78350f;"><span style="font-weight: 400;">Only stamp resource attributes that are low-cardinality and apply to the whole node or pod — things like environment, cluster name, and region. Adding high-cardinality values like user IDs or request IDs as resource attributes will explode your metrics storage, because each unique value becomes a separate time series.</span></div>
<div>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">TIER 1 AGENT COLLECTOR CONFIG</div>
<pre># Tier 1: runs as DaemonSet, minimal processing
receivers:
  otlp:
    protocols:
      grpc: {endpoint: "0.0.0.0:4317"}
      http: {endpoint: "0.0.0.0:4318"}

processors:
  batch:                    # batch before forwarding
    send_batch_size: 1024
    timeout: 5s
  resourcedetection:        # stamp node/pod metadata
    detectors: [k8snode, env]
  filter/drop_healthchecks:
    spans:
      exclude:
        match_type: regexp
        attributes:
          - {key: http.route, value: ".*/health.*"}

exporters:
  otlp:
    # forward to gateway tier, not directly to backend
    endpoint: "otel-gateway:4317"
    sending_queue:
      enabled: true
      num_consumers: 4
      queue_size: 500

service:
  pipelines:
    traces:
      receivers:  [otlp]
      processors: [batch, resourcedetection, filter/drop_healthchecks]
      exporters:  [otlp]
</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">Agent config stays thin. Anything heavier than batching and attribute stamping belongs in the gateway tier.</div>
<h3 id="tier-2-collectors-running-as-gateways"><b>Tier 2: Collectors running as gateways</b></h3>
<p><span style="font-weight: 400;">The gateway tier is where the interesting work happens: tail-based sampling, fan-out to multiple backends, and the routing logic that sends traces, metrics, and logs where they need to go. Once you introduce a gateway tier, it needs careful resource sizing. In practice, that means running at least two gateway collectors behind a load balancer to </span><b>avoid single points of failure</b><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">How you deploy them depends on your environment. In Kubernetes, that typically means a Deployment scaled by load rather than node count. In a VM-based setup, two or more collector processes behind a hardware or software load balancer works just as well. The important thing is that the gateway tier scales horizontally based on traffic, not based on how many hosts you have.</span></p>
<p><span style="font-weight: 400;">Two to four instances is a reasonable starting point for a deployment handling roughly 1,000 to 5,000 spans per second across 20 to 50 services. Beyond that, sizing should be driven primarily by your tail-based sampling configuration — specifically the </span><code>decision_wait</code><span style="font-weight: 400;"> window and the </span><code>num_traces</code><span style="font-weight: 400;"> value — which determine how much trace state each gateway must hold in memory.</span></p>
<h2 id="load-balancing-the-subtle-trap-with-tail-based-sampling"><b>Load Balancing: The Subtle Trap with Tail-Based Sampling</b></h2>
<p><span style="font-weight: 400;">If you are using tail-based sampling and running multiple gateway collector instances, standard round-robin load balancing will silently break your sampling decisions. Tail-based sampling works by collecting all spans for a given trace and then making a single keep-or-drop decision once the trace is complete. With round-robin, spans for the same trace end up scattered across different collector instances. Each instance only sees a fragment, so no instance ever has enough context to make a valid decision.</span></p>
<div style="background: rgba(217,119,6,0.06); border-left: 3px solid #D97706; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #78350f;"><i><span style="font-weight: 400;">The symptom is traces that look complete but are not. You will see traces that hit your sampling rate but are missing spans from certain services, because those spans went to a different collector instance that independently decided to drop its fragment. This is one of the harder things to debug because the data loss is structured rather than random.</span></i></div>
<p><span style="font-weight: 400;">The solution is </span><b>trace-aware load balancing</b><span style="font-weight: 400;">, where spans are routed to gateway instances based on their trace ID. The OTel Collector has a </span><a href="https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/loadbalancingexporter" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">loadbalancing exporter</span></a><span style="font-weight: 400;"> built for exactly this. It consistently hashes trace IDs to the same downstream collector, which means all spans for a given trace always end up in the same place regardless of which agent they came from.</span></p>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">LOAD BALANCING EXPORTER CONFIG — AGENT TIER</div>
<pre>exporters:
  loadbalancing:
    routing_key: "traceID"   # hash by trace ID, not round-robin
    resolver:
      k8s:                    # auto-discover gateway pods via DNS
        service: "otel-gateway"
        ports: [4317]
    protocol:
      otlp:
        timeout: 1s
        sending_queue:
          enabled: true
          queue_size: 1000
</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">The k8s resolver watches the gateway headless service and automatically updates routing when pods scale up or down.</div>
<p><span style="font-weight: 400;">Gateway restarts or scale-in events can occasionally produce incomplete traces.  See </span><a href="https://opentelemetry.io/docs/collector/scaling/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">OTel Collector scaling documentation</span></a><span style="font-weight: 400;"> for details.</span></p>
<h2 id="sampling-strategies-at-volume-picking-the-right-one"><b style="letter-spacing: 0.12em; text-transform: uppercase; font-size: 16px;">Sampling Strategies at Volume: Picking the Right One</b></h2>
</div>
<div>
<p><span style="font-weight: 400;">At small scale, sampling feels like an optional optimization. At large scale, it is a </span><b>financial and operational necessity</b><span style="font-weight: 400;">. Sending 100 percent of traces from a service handling 10,000 requests per second generates a staggering volume of data, most of which you will never look at. This is not too different from logs – for example, Sematext’s log pipeline contains the </span><a href="https://sematext.com/docs/logs/sampling-processor/" target="_blank" rel="noopener"><span style="font-weight: 400;">Sampling Processor</span></a><span style="font-weight: 400;"> for the same reason. Getting sampling right means you keep the traces that help you debug real incidents and drop the ones that would just sit there consuming storage.</span></p>
<p><span style="font-weight: 400;">The tricky part is that “keep the useful traces” is not as simple as it sounds. The traces you most need to keep are the ones with errors and high latency, which are often a small fraction of total traffic. If you use pure random sampling at 1 percent, you will statistically drop 99 percent of your error traces along with everything else. That is the core tension that drives the choice between head-based and tail-based sampling.</span></p>
<div style="margin: 32px 0;">
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase; margin-bottom: 10px;">SAMPLING STRATEGY COMPARISON</div>
<table style="width: 100%; border-collapse: collapse; font-family: inherit; font-size: 14px;">
<thead>
<tr style="background: #0f172a;">
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">STRATEGY</th>
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">WHERE</th>
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">KEEPS ERRORS</th>
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">MEMORY COST</th>
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">BEST FOR</th>
<th style="padding: 10px 14px; text-align: left; font-size: 10px; font-weight: bold; letter-spacing: 0.1em; color: #f59e0b; border: 1px solid #334155;">WHAT IT DOES</th>
</tr>
</thead>
<tbody>
<tr style="background: #ffffff;">
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: 600; color: #1e293b;">Always-on</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">SDK</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #16a34a;">YES</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #dc2626;">HIGH</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Dev / staging only</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Keep all spans, no sampling</td>
</tr>
<tr style="background: #f8fafc;">
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: 600; color: #1e293b;">Parent-based</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">SDK</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #f59e0b;">INHERITS</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #16a34a;">LOW</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Consistent decisions across services</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Keep/drop based on parent trace</td>
</tr>
<tr style="background: #ffffff;">
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: 600; color: #1e293b;">Probabilistic</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">SDK/Collector</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #dc2626;">NO</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #16a34a;">LOW</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Volume reduction on healthy traffic</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Randomly keep spans at a fixed rate</td>
</tr>
<tr style="background: #f8fafc;">
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: 600; color: #1e293b;">Rate-limiting</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Collector</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #dc2626;">NO</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #16a34a;">LOW</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Capping ingest cost during spikes</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Keep spans until a fixed rate limit</td>
</tr>
<tr style="background: #ffffff;">
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: 600; color: #1e293b;">Tail-based</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Collector (GW)</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #16a34a;">YES</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; font-weight: bold; color: #dc2626;">HIGH</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Error-aware sampling at scale</td>
<td style="padding: 10px 14px; border: 1px solid #e2e8f0; color: #475569;">Keep spans based on errors &amp; latency</td>
</tr>
</tbody>
</table>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; margin-top: 12px; text-align: center; max-width: 540px; margin-left: auto; margin-right: auto; margin-bottom: 12px;">Most production deployments combine parent-based sampling at the SDK with tail-based sampling at the gateway tier.</div>
<div>
<h3 id="the-combination-that-works-at-scale"><b>The combination that works at scale</b></h3>
<p><span style="font-weight: 400;">Parent-based sampling means the sampling decision is made once at the root span — the first service that receives the request — and every downstream service in that trace inherits the same decision automatically, so you never end up with a trace where some spans were kept and others were dropped by different services making independent choices.</span></p>
<p><span style="font-weight: 400;">Use </span><a href="https://opentelemetry.io/docs/languages/go/sampling/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">parent-based sampling at the SDK level</span></a><span style="font-weight: 400;"> to reduce overall span volume before it even reaches the collector, then use tail-based sampling at the gateway tier to make intelligent keep-or-drop decisions on what makes it through. Two passes of selection — aggressive on volume, smart about what survives.</span></p>
<p><span style="font-weight: 400;">A concrete example: set parent-based sampling at 10 percent for general traffic at the SDK. At the gateway, keep 100 percent of error traces, 100 percent of traces exceeding your latency SLO, and 10 percent of everything else. You end up storing roughly 11 to 12 percent of total trace volume, but with near-complete coverage of the production incidents you actually need to investigate.</span></p>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">TAIL SAMPLING POLICY CONFIG — GATEWAY TIER</div>
<pre>processors:
  tail_sampling:
    decision_wait: 10s      # wait for all spans before deciding
    num_traces: 100000      # traces held in memory simultaneously
    expected_new_traces_per_sec: 1000
    policies:
      # always keep error traces
      - name: keep-errors
        type: status_code
        status_code: {status_codes: [ERROR]}

      # always keep slow traces (adjust threshold to your SLO)
      - name: keep-slow
        type: latency
        latency: {threshold_ms: 500}

      # keep 100% of checkout and payment — business critical
      - name: keep-critical-services
        type: string_attribute
        string_attribute:
          key: service.name
          values: [checkout-api, payment-service]

      # probabilistic baseline for everything else
      - name: baseline-sample
        type: probabilistic
        probabilistic: {sampling_percentage: 10}
</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">Policies are evaluated in order. A trace is kept if any policy matches. The probabilistic baseline catches everything the specific policies did not select.</div>
<h3 id="memory-sizing-for-tail-based-sampling"><b>Memory sizing for tail-based sampling</b></h3>
<p><span style="font-weight: 400;">The <code>num_traces</code> parameter is the one that will bite you if you undershoot it. It controls how many traces the gateway holds in memory simultaneously while waiting for all their spans to arrive. A rough formula: multiply your expected traces per second by your decision_wait value, then add 20 percent headroom. For 1,000 traces per second with a 10 second wait, you need at least 12,000 slots — not the 1,000 that most tutorial configs show.</span></p>
<p><a href="https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">The tail sampling processor documentation</span></a><span style="font-weight: 400;"> has the full parameter reference including the memory limiter integration, which you absolutely want enabled at the gateway tier to prevent OOM kills during traffic spikes.</span></p>
<h2 id="multi-cluster-setups-when-one-pipeline-is-not-enough"><b>Multi-Cluster Setups: When One Pipeline Is Not Enough</b></h2>
<p><span style="font-weight: 400;">At some point, a single OTel pipeline stops being the right model. Maybe you operate in multiple regions with data residency requirements. Maybe you have a mix of Kubernetes clusters running different workloads with different SLOs. Whatever the reason, multi-cluster OTel setups introduce a layer of complexity that single-cluster thinking does not prepare you for.</span></p>
<p><span style="font-weight: 400;">The fundamental question is where aggregation happens. Aggregate within each cluster and forward summarized telemetry to a global backend, and you keep cross-region bandwidth low but lose the ability to do cross-cluster trace correlation. Forward raw telemetry to a central aggregation layer, and you get full correlation capability at significantly higher egress cost. Most organizations end up with a hybrid: metrics and logs aggregate locally, traces are forwarded to a central tier for correlation.</span></p>
<h3 id="getting-trace-context-across-cluster-boundaries"><b>Getting trace context across cluster boundaries</b></h3>
<p><span style="font-weight: 400;">Cross-cluster trace correlation only works if your services propagate the </span><a href="https://www.w3.org/TR/trace-context/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">W3C traceparent header</span></a><span style="font-weight: 400;"> across cluster boundaries. Internal service mesh traffic usually handles this correctly. However, cross-cluster calls that pass through an API gateway, CDN, or any reverse proxy that strips unknown headers will </span><b>break trace continuity</b><span style="font-weight: 400;"> at that boundary.</span></p>
<p><span style="font-weight: 400;">Diagnosing this is straightforward: if you see a trace starting at an API gateway span and the first downstream service shows a different root span with no parent, there’s a propagation break. To fix it, add </span><span style="font-weight: 400;"><code>traceparent</code></span><span style="font-weight: 400;"> and </span><span style="font-weight: 400;"><code>tracestate</code></span><span style="font-weight: 400;"> to your proxy’s header allowlist.</span></p>
<p><span style="font-weight: 400;">Here is what that looks like in the two most common cases:</span></p>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">PROXY HEADER CONFIG — NGINX AND ENVOY</div>
<pre># nginx — add inside your proxy_pass block
proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate  $http_tracestate;

---

# Envoy — request_headers_to_add in HttpConnectionManager
route_config:
  request_headers_to_add:
    - header: { key: traceparent }
    - header: { key: tracestate }
</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">One of these two covers the vast majority of cases. If you are behind a CDN, check their documentation for custom header passthrough settings.</div>
<h3 id="data-residency-and-the-gdpr-headache"><b>Data residency and the GDPR headache</b></h3>
<p><span style="font-weight: 400;">If you operate in the EU, forwarding raw traces containing user identifiers to a central tier outside the EU can be a compliance problem. The practical solution is to run attribute redaction in your regional gateway before any data leaves the region. The OTel Collector’s transform processor lets you hash, mask, or drop specific attributes before export.</span></p>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">PII REDACTION CONFIG — EU GATEWAY PROCESSOR</div>
<pre>processors:
  transform/redact_pii:
    trace_statements:
      - context: span
        statements:
          # hash user IDs rather than drop
          - set(attributes["user.id"], SHA256(attributes["user.id"]))
          # drop email entirely
          - delete_key(attributes, "user.email")
          # truncate IP to /24 for geo without individual tracking
          - replace_pattern(attributes["net.peer.ip"], "\\d+$", "0")
</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">Run PII redaction at the regional gateway, not the central tier. By the time data reaches central, sensitive attributes should already be gone.</div>
<h2 id="keeping-the-pipeline-itself-observable"><b>Keeping the Pipeline Itself Observable</b></h2>
<p><span style="font-weight: 400;">It would be funny if the  observability tools couldn’t be observed. The </span><a href="https://opentelemetry.io/docs/collector/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">OTel Collector</span></a><span style="font-weight: 400;"> exposes its own internal telemetry as a standard OTLP pipeline, which means you can route it to any backend or an observability solution that you are already using.</span></p>
<p><span style="font-weight: 400;"><code>otelcol_processor_batch_timeout_trigger_send</code> (gotta love this long property name!) tells you whether the batch processor is flushing because the timeout fired rather than because the batch was full. </span><b>A high ratio of timeout-triggered flushes means your traffic volume is lower than your batch config expects, and you are adding unnecessary latency.</b></p>
<p><span style="font-weight: 400;"><code>otelcol_exporter_queue_size</code> is the canary for backpressure. </span><b>When <code>otelcol_exporter_queue_size</code> climbs toward your configured maximum, your exporter is falling behind the ingest rate.</b><span style="font-weight: 400;"> If it hits the maximum, the collector starts dropping data. Set an alert at 80 percent of queue capacity and you will catch pressure building before it becomes data loss.</span></p>
<p><span style="font-weight: 400;">otelcol_processor_tail_sampling_sampling_decision_timer_latency (another awesome long name!) tells you how long the tail sampling processor is taking to make decisions. A sudden increase here usually means the number of active traces in memory has grown past what the processor can efficiently scan — either increase resources or tighten your sampling policy.</span></p>
<div style="font-size: 11px; font-weight: bold; letter-spacing: 0.12em; color: #64748b; text-transform: uppercase;">COLLECTOR SELF-MONITORING CONFIG</div>
<pre>receivers:
  prometheus:
    config:
      scrape_configs:
        - job_name: otel-collector
          scrape_interval: 15s
          static_configs:
            - targets: ["localhost:8888"]

# Expose collector's own telemetry via its service config
service:
  telemetry:
    metrics:
      level: detailed   # basic | normal | detailed
      address: 0.0.0.0:8888
    logs:
      level: warn       # keep collector logs quiet in production

</pre>
<div style="font-size: 13px; color: #94a3b8; font-style: italic; text-align: center; max-width: 480px; margin-left: auto; margin-right: auto; margin-bottom: 24px;">Set telemetry level to ‘detailed’ in staging to understand baseline behavior, then dial back to ‘normal’ in production.</div>
<h2 id="rolling-this-out-without-breaking-everything"><b>Rolling This Out Without Breaking Everything</b></h2>
<p><span style="font-weight: 400;">The migration path from a single collector to a tiered setup does not have to be a big-bang cutover. You could introduce the gateway tier first while keeping the existing single collector in place, route a small percentage of services to the new tier, and validate that data is flowing correctly before moving everything over.</span></p>
<p><span style="font-weight: 400;">I suggest you start with a non-critical service — one that has decent traffic but where gaps in telemetry during the migration window would not cause anyone to lose sleep. Verify spans arrive at the gateway, verify they arrive at the backend with the right resource attributes, and check that your tail sampling policies are making sensible decisions. That validation loop is worth running for a week before you touch any of your critical services.</span></p>
<p><span style="font-weight: 400;">The config change on the service side is usually just updating the OTLP endpoint to the new agent address. If you are using the </span><a href="https://opentelemetry.io/docs/kubernetes/operator/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">OTel Operator for Kubernetes</span></a><span style="font-weight: 400;">, you can inject the agent endpoint as an environment variable through the Instrumentation custom resource — no application code changes, no redeployment of service configs when the collector topology changes.</span></p>
<p><span style="font-weight: 400;">The pattern across all of this — tiered collectors, trace-aware load balancing, layered sampling strategies, regional pipelines — is that scaling OTel is fundamentally an architecture problem, not an instrumentation problem. The instrumentation is the relatively easy part. The hard part is building a pipeline that stays operational under load, degrades gracefully when individual components have problems, and gives you enough visibility into itself that you can tell when something is wrong before it starts affecting the data your engineers depend on during incidents.</span></p>
<p><span style="font-weight: 400;">Once your OpenTelemetry pipeline is running at scale, the next step is learning how to interpret the traces to identify performance bottlenecks and root causes. See </span><a href="https://sematext.com/blog/troubleshooting-microservices-with-opentelemetry-distributed-tracing/" target="_blank" rel="noopener"><span style="font-weight: 400;">Troubleshooting Microservices with OpenTelemetry Distributed Tracing</span></a><span style="font-weight: 400;"> for an in-depth and very practical guidance on that subject.</span></p>
</div>
</div>
</div>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/running-opentelemetry-at-scale-architecture-patterns-for-100s-of-services/">Running OpenTelemetry at Scale: Architecture Patterns for 100s of Services</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>From Debugging to SLOs: How OpenTelemetry Changes the Way Teams Do Observability</title>
		<link>https://sematext.com/blog/from-debugging-to-slos-how-opentelemetry-changes-the-way-teams-do-observability/</link>
		
		<dc:creator><![CDATA[fulya.uluturk]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 10:15:34 +0000</pubDate>
				<category><![CDATA[OpenTelemetry]]></category>
		<category><![CDATA[Tracing]]></category>
		<category><![CDATA[distributed tracing]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[opentelemetry]]></category>
		<guid isPermaLink="false">https://sematext.com/?p=70545</guid>

					<description><![CDATA[<p>At some point in every team’s life, someone gets paged at 2 AM because a service is ‘slow.’ Nobody knows which service. Nobody knows why. Someone opens five different dashboards, pastes a trace ID into a Slack thread, and thirty minutes later you have twelve engineers in a call arguing about whether the problem is [&#8230;]</p>
<p>The post <a href="https://sematext.com/blog/from-debugging-to-slos-how-opentelemetry-changes-the-way-teams-do-observability/">From Debugging to SLOs: How OpenTelemetry Changes the Way Teams Do Observability</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">At some point in every team’s life, someone gets paged at 2 AM because a service is ‘slow.’ Nobody knows which service. Nobody knows why. Someone opens five different dashboards, pastes a trace ID into a Slack thread, and thirty minutes later you have twelve engineers in a call arguing about whether the problem is in the database or the API gateway. By the time you find the actual culprit, half the team has memorized each other’s sleep schedules.</span></p>
<p><span style="font-weight: 400;">This is what life looks like when observability is an afterthought: logs in one place, metrics in another, and a custom monitoring agent that only works for two services because the third one was written in a language nobody on the team uses anymore. It works, technically. Until it does not.</span></p>
<p><span style="font-weight: 400;">OpenTelemetry came out of a genuine frustration with this fragmented mess. It is an open-source observability framework that gives you a </span><a href="https://sematext.com/guides/understanding-opentelemetry-a-practical-guide/" target="_blank" rel="noopener"><span style="font-weight: 400;">vendor-neutral, standardized way to instrument your applications</span></a><span style="font-weight: 400;"> and then connect that instrumentation to service health, error budgets, and eventually SLOs that your entire organization actually understands. This article walks through what that shift looks like in practice, and why it matters for more than just the people who are on call.</span></p>
<h2 id="the-old-world-logs-apm-agents-and-the-dashboard-graveyard"><b>The Old World: Logs, APM Agents, and the Dashboard Graveyard</b></h2>
<p><span style="font-weight: 400;">Let’s be direct about how most teams actually do observability before they invest in it properly. You have application logs going into a log management platform, with varying levels of structure depending on who wrote which service. You have an APM tool that auto-instruments some of your services but not all of them, and the traces it produces are siloed within its own ecosystem. And you have a monitoring dashboard that someone built eighteen months ago and that might or might not reflect how the service actually behaves today.</span></p>
<div style="background: rgba(220,38,38,0.06); border-left: 3px solid #DC2626; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #7f1d1d;"><strong style="color: #991b1b;">The real cost is not the outage. It is the investigation.</strong> A 2023 industry study on downtime costs found that engineering teams spend an average of 200-plus hours per year just on incident investigation, separate from the time actually fixing things. A good chunk of that is tool-switching and context-switching because telemetry data lives in silos.</div>
<p><span style="font-weight: 400;">The deeper problem is not the tools themselves; it is that each one has its own instrumentation model. Your APM agent captures HTTP spans one way. Your custom metrics library reports latency percentiles slightly differently. Your logs do not correlate to your traces automatically. So when something breaks, you are stitching together three different narratives instead of reading one coherent story about what happened.</span></p>
<div style="background: rgba(26,86,160,0.06); border-left: 3px solid #1a56dc; border-radius: 0 8px 8px 0; padding: 22px 26px; margin: 36px 0; font-size: 17px; color: #1e3a5f;">This is actually the origin of Sematext – back in 2012 Sematext was the first platform to offer both performance monitoring (so metrics) and log monitoring in one observability platform, and then distributed transaction tracing in 2015.</div>
<h2 id="what-opentelemetry-actually-is-without-the-fluff"><b>What OpenTelemetry Actually Is (Without the Fluff)</b></h2>
<p><span style="font-weight: 400;">OpenTelemetry standardizes how you generate, collect, and export telemetry data. It covers three signal types (with more to come), which are the foundation of everything else in this article:</span></p>
<div style="margin: 36px 0; font-family: inherit;">
<p style="font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: 2.5px; text-transform: uppercase; color: #94a3b8; margin-bottom: 16px;">THE THREE PILLARS OF OPENTELEMETRY</p>
<p><!-- Card grid wrapper --></p>
<div style="background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 24px; box-sizing: border-box;">
<table style="width: 100%; border-collapse: separate; border-spacing: 14px; table-layout: fixed;">
<tbody>
<tr style="vertical-align: top;"><!-- Traces -->
<td style="border-radius: 10px; padding: 24px 16px 20px; text-align: center; border: 1px solid rgba(59,130,246,0.3); background: rgba(59,130,246,0.05); width: 33.33%;">
<div style="font-size: 28px; margin-bottom: 12px;">🔗</div>
<div style="font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600; letter-spacing: 1px; color: #2563eb; margin-bottom: 10px;">Traces</div>
<p style="font-size: 13px; color: #475569; line-height: 1.6; margin: 0;">End-to-end request paths across services. Shows exactly where time is spent and where errors propagate.</p>
</td>
<p><!-- Metrics --></p>
<td style="border-radius: 10px; padding: 24px 16px 20px; text-align: center; border: 1px solid rgba(16,185,129,0.3); background: rgba(16,185,129,0.05); width: 33.33%;">
<div style="font-size: 28px; margin-bottom: 12px;">📊</div>
<div style="font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600; letter-spacing: 1px; color: #059669; margin-bottom: 10px;">Metrics</div>
<p style="font-size: 13px; color: #475569; line-height: 1.6; margin: 0;">Numeric measurements over time: latency histograms, request counts, error rates, resource utilization. The raw material for SLOs.</p>
</td>
<p><!-- Logs --></p>
<td style="border-radius: 10px; padding: 24px 16px 20px; text-align: center; border: 1px solid rgba(245,158,11,0.3); background: rgba(245,158,11,0.05); width: 33.33%;">
<div style="font-size: 28px; margin-bottom: 12px;">📋</div>
<div style="font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600; letter-spacing: 1px; color: #d97706; margin-bottom: 10px;">Logs</div>
<p style="font-size: 13px; color: #475569; line-height: 1.6; margin: 0;">Structured event records with trace context attached. No more copy-pasting trace IDs; logs link directly to the span that generated them, and an error span links back to every log event emitted during that span.</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><!-- Caption --></p>
<p style="text-align: center; font-size: 13px; font-style: italic; color: #94a3b8; margin-top: 12px;">Traces, Metrics, and Logs share the same context propagation model in OTel, which lets you jump from a log line to its trace in seconds.</p>
</div>
<p><span style="font-weight: 400;">What makes OTel different from what came before is not magic; it is the fact that all three signals share the same </span><a href="https://opentelemetry.io/docs/specs/otel/context/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">context propagation model</span></a><span style="font-weight: 400;">. A trace ID that starts in your frontend propagates through every instrumented microservice call, and if your logs are also emitting that trace ID, you can jump from a log line to its trace in seconds. Not minutes. Seconds. If you are the person doing production troubleshooting you know how valuable this difference is!</span></p>
<h2 id="slos-what-they-are-and-why-otel-makes-them-achievable"><b>SLOs: What They Are and Why OTel Makes Them Achievable</b></h2>
<p><a href="https://sematext.com/glossary/service-level-objective/" target="_blank" rel="noopener"><span style="font-weight: 400;">Service Level Objectives</span></a><span style="font-weight: 400;"> have been a thing since Google wrote about them in the </span><a href="https://sre.google/sre-book/service-level-objectives/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">Site Reliability Engineering book</span></a><span style="font-weight: 400;">, and they have been misunderstood and poorly implemented since roughly the same time. The core idea is simple: you agree on a target for how reliable a service needs to be, you measure it consistently, and you manage your engineering work in relation to how much reliability budget you have consumed or have left.</span></p>
<p><span style="font-weight: 400;">The reason SLOs often fail is not the concept; it is that teams try to define them before they have reliable telemetry. You cannot set a meaningful availability target for a service if your metrics come from three different monitoring agents that measure availability in subtly different ways. You end up with SLOs that nobody trusts, which means nobody uses them to make decisions.</span></p>
<div style="margin: 36px 0;">
<p><!-- Section label --></p>
<p style="font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: 2.5px; text-transform: uppercase; color: #94a3b8; margin-bottom: 16px;">Example SLOs Built on OTel Metrics</p>
<p><!-- Table wrapper --></p>
<div style="background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 4px; overflow: hidden;">
<table style="width: 100%; border-collapse: collapse; font-size: 14px;">
<thead>
<tr>
<th style="background: #1e3a5f; color: #93c5fd; font-family: 'JetBrains Mono', monospace; font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px; padding: 13px 14px; text-align: left; border-bottom: 1px solid #e2e8f0;">Service</th>
<th style="background: #1e3a5f; color: #93c5fd; font-family: 'JetBrains Mono', monospace; font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px; padding: 13px 14px; text-align: left; border-bottom: 1px solid #e2e8f0;">SLI</th>
<th style="background: #1e3a5f; color: #93c5fd; font-family: 'JetBrains Mono', monospace; font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px; padding: 13px 14px; text-align: left; border-bottom: 1px solid #e2e8f0;">Target</th>
<th style="background: #1e3a5f; color: #93c5fd; font-family: 'JetBrains Mono', monospace; font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px; padding: 13px 14px; text-align: left; border-bottom: 1px solid #e2e8f0;">Error Budget</th>
<th style="background: #1e3a5f; color: #93c5fd; font-family: 'JetBrains Mono', monospace; font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px; padding: 13px 14px; text-align: left; border-bottom: 1px solid #e2e8f0;">Status</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">Checkout API</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">% requests &lt; 500 ms, non-5xx</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">99.5%</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">3 h 36 m remaining</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; vertical-align: middle;"><span style="display: inline-block; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 600; padding: 3px 9px; border-radius: 12px; letter-spacing: 0.5px; background: rgba(16,185,129,0.1); color: #059669; border: 1px solid rgba(16,185,129,0.3);">HEALTHY</span></td>
</tr>
<tr>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">Auth Service</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">% successful token validations</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">99.9%</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">0 h 22 m remaining</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; vertical-align: middle;"><span style="display: inline-block; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 600; padding: 3px 9px; border-radius: 12px; letter-spacing: 0.5px; background: rgba(245,158,11,0.1); color: #d97706; border: 1px solid rgba(245,158,11,0.3);">AT RISK</span></td>
</tr>
<tr>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">Search API</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">% queries returning results &lt; 1 s</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #1e293b; vertical-align: middle;">98.0%</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; color: #475569; vertical-align: middle;">Budget exhausted</td>
<td style="padding: 12px 14px; border-bottom: 1px solid #e2e8f0; vertical-align: middle;"><span style="display: inline-block; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 600; padding: 3px 9px; border-radius: 12px; letter-spacing: 0.5px; background: rgba(220,38,38,0.1); color: #dc2626; border: 1px solid rgba(220,38,38,0.3);">BREACHED</span></td>
</tr>
<tr>
<td style="padding: 12px 14px; color: #1e293b; vertical-align: middle;">Order Worker</td>
<td style="padding: 12px 14px; color: #475569; vertical-align: middle;">% jobs processed without retry</td>
<td style="padding: 12px 14px; color: #1e293b; vertical-align: middle;">99.0%</td>
<td style="padding: 12px 14px; color: #475569; vertical-align: middle;">5 h 12 m remaining</td>
<td style="padding: 12px 14px; vertical-align: middle;"><span style="display: inline-block; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 600; padding: 3px 9px; border-radius: 12px; letter-spacing: 0.5px; background: rgba(16,185,129,0.1); color: #059669; border: 1px solid rgba(16,185,129,0.3);">HEALTHY</span></td>
</tr>
</tbody>
</table>
</div>
<p><!-- Caption --></p>
<p style="text-align: center; font-size: 13px; font-style: italic; color: #94a3b8; margin-top: 12px;">When SLIs are computed from OTel semantic conventions, every service uses the same measurement logic regardless of language or framework.</p>
</div>
<p><span style="font-weight: 400;">When your </span><a href="https://sematext.com/glossary/service-level-indicator/" target="_blank" rel="noopener"><span style="font-weight: 400;">SLIs</span></a><span style="font-weight: 400;"> are computed from OTel metrics, specifically from the semantic conventions that define how HTTP span duration and status should be recorded, you get consistency across services by default. The latency histogram for your Go service and the one for your .NET service use the same bucket boundaries. The error classification follows the same logic. Suddenly your SLOs are comparing apples to apples, and that changes what you can do with them.</span></p>
<h2 id="the-correlation-story-how-one-trace-id-connects-everything"><b>The Correlation Story: How one Trace ID Connects Everything</b></h2>
<p><span style="font-weight: 400;">One of the things that sounds academic until you experience it is </span><a href="https://opentelemetry.io/docs/concepts/context-propagation/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">trace context propagation</span></a><span style="font-weight: 400;">. When a request comes into your frontend and you are using OTel instrumentation, a trace ID gets generated and passed along to every downstream service call via HTTP headers, gRPC metadata, message queue attributes, or whatever transport you are using. Every span in that trace carries the same trace ID, and your logs carry it too if you have set up log correlation.</span></p>
<p><span style="font-weight: 400;">What this means in practice: when your error rate alert fires because the checkout service just breached its error budget, you do not start by guessing. You go to the traces for that time window, filter for error spans, and you are already looking at the full call path: frontend, checkout API, inventory service, payment gateway, with timing for each hop. If the inventory service was slow, you will see a long span there. If the payment gateway returned a 503, you will see that in the span status. No grep-ing through logs trying to find a request ID that someone may or may not have remembered to log. For a step-by-step breakdown of what these patterns look like in real incidents,</span><a href="https://sematext.com/blog/troubleshooting-microservices-with-opentelemetry-distributed-tracing/" target="_blank" rel="noopener"> <span style="font-weight: 400;">troubleshooting microservices with distributed tracing</span></a><span style="font-weight: 400;"> is a good companion read.</span></p>
<div style="margin: 36px 0;">
<p><!-- Section label --></p>
<p style="font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: 2.5px; text-transform: uppercase; color: #94a3b8; margin-bottom: 16px;">Before vs After: What Investigation Actually Looks Like</p>
<p><!-- Cards wrapper --></p>
<div style="background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 24px; box-sizing: border-box;">
<table style="width: 100%; border-collapse: separate; border-spacing: 16px; table-layout: fixed;">
<tbody>
<tr style="vertical-align: top;"><!-- Before -->
<td style="border-radius: 10px; padding: 22px 18px; background: rgba(220,38,38,0.05); border: 1px solid rgba(220,38,38,0.25); width: 50%;">
<div style="font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: 2px; text-transform: uppercase; color: #dc2626; margin-bottom: 14px;">Before OTel</div>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Alert fires. Open APM tool, find service.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Open logging tool, search by timestamp.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Paste trace ID into search; hope the log format includes it.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Cross-reference three tools. Escalate because nobody can reproduce it.</p>
<p style="font-size: 14px; color: #94a3b8; font-style: italic; margin: 0; line-height: 1.6;">MTTR: 45 to 90 min for medium-severity incidents.</p>
</td>
<p><!-- After --></p>
<td style="border-radius: 10px; padding: 22px 18px; background: rgba(16,185,129,0.05); border: 1px solid rgba(16,185,129,0.25); width: 50%;">
<div style="font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: 2px; text-transform: uppercase; color: #059669; margin-bottom: 14px;">After OTel</div>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Alert fires with a link to the error budget burn rate.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Click through to traces for that time window.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Follow the trace to the failing span.</p>
<p style="font-size: 14px; color: #475569; margin-bottom: 8px; line-height: 1.6;">Logs automatically surfaced by trace ID.</p>
<p style="font-size: 14px; color: #94a3b8; font-style: italic; margin: 0; line-height: 1.6;">MTTR: 5 to 20 min for the same incidents.</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><!-- Caption --></p>
<p style="text-align: center; font-size: 13px; font-style: italic; color: #94a3b8; margin-top: 12px;">The difference in MTTR is not about effort. It is about whether correlated telemetry exists at all.</p>
</div>
<h2 id="auto-instrumentation-getting-value-without-rewriting-everything"><b>Auto-Instrumentation: Getting Value Without Rewriting Everything</b></h2>
<p><span style="font-weight: 400;">One of the biggest objections to investing in observability is the instrumentation cost. If you have thirty microservices and each one needs to be manually instrumented before you see any benefit, that is a project with a very long feedback loop. This is actually what we saw with our initial distributed tracing implementation at Sematext back in 2015 – adoption of a challenge due to how much work engineers would have to invest in instrumenting their applications. OTel’s auto-instrumentation libraries change that equation significantly.</span></p>
<p><span style="font-weight: 400;">For Java, the </span><a href="https://opentelemetry.io/docs/zero-code/java/agent/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">OTel Java agent</span></a><span style="font-weight: 400;"> attaches to your JVM at startup and automatically instruments common frameworks such as Spring Boot, gRPC, JDBC, and Kafka without any code changes. For Python, </span><a href="https://opentelemetry.io/docs/zero-code/python/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">opentelemetry-instrument</span></a><span style="font-weight: 400;"> does the same for Flask, Django, FastAPI, and SQLAlchemy. The .NET ecosystem has similar coverage through the </span><a href="https://opentelemetry.io/docs/zero-code/dotnet/" target="_blank" rel="noopener noreferrer"><span style="font-weight: 400;">automatic instrumentation package</span></a><span style="font-weight: 400;">. You get spans for every incoming HTTP request, every outgoing call, and every database query without touching the application code. If you want to skip the boilerplate and start from something that already works,</span><a href="https://github.com/sematext/sematext-opentelemetry-examples" target="_blank" rel="noopener noreferrer"> <span style="font-weight: 400;">these language-specific OTel examples</span></a><span style="font-weight: 400;"> cover the setup end to end.</span></p>
<h2 id="what-to-actually-watch-out-for"><b>What to Actually Watch Out For</b></h2>
<p><span style="font-weight: 400;">None of this comes without tradeoffs, and articles that only cover the benefits are setting you up for some unpleasant surprises. A few things will bite you if you do not plan for them.</span></p>
<p><span style="font-weight: 400;">A deep dive into</span><a href="https://sematext.com/blog/opentelemetry-instrumentation-best-practices-for-microservices-observability/" target="_blank" rel="noopener"> <span style="font-weight: 400;">OpenTelemetry instrumentation best practices</span></a><span style="font-weight: 400;"> covers all of these in detail, but here is the short version.</span></p>
<h3 id="cardinality-explodes-if-you-are-not-careful"><b>Cardinality explodes if you are not careful</b></h3>
<p><span style="font-weight: 400;">OTel metrics support rich attribute sets, which is great for debugging but problematic for storage if you start adding high-cardinality attributes like user IDs or request IDs to your metrics. The OTel metrics spec includes cardinality limits, and you should understand them before you start attaching attributes to everything.</span></p>
<h3 id="sampling-is-necessary-at-scale-and-confusing-to-get-right"><b>Sampling is necessary at scale and confusing to get right</b></h3>
<p><span style="font-weight: 400;">Sending 100 percent of traces when you are handling thousands of requests per second is expensive. Head-based sampling, where you decide at the start of a trace whether to keep it, is simple but means you might drop the interesting traces. Tail-based sampling, where you decide after seeing the whole trace, keeps the errors but requires the OTel Collector to buffer spans, which adds complexity. There is no right answer, only tradeoffs that depend on your volume and budget.</span></p>
<h3 id="auto-instrumentation-vs-manual-instrumentation-the-honest-tradeoff"><b>Auto-instrumentation vs manual instrumentation: the honest tradeoff</b></h3>
<p><span style="font-weight: 400;">Auto instrumentation gets you running in an afternoon with zero code changes and gives consistent coverage across your entire fleet from day one. The trade off is that it understands frameworks, not business intent. It can tell you a database query took 800 ms but not that it was pricing a cart for a high value customer.</span></p>
<p><span style="font-weight: 400;">Manual instrumentation fills the gap that actually matters for SLOs. Checkout completion time, order processing latency by fulfillment partner, or time to first search result. It takes more effort, but it is what turns a latency alert into a business conversation.</span></p>
<p><span style="font-weight: 400;">In practice, auto instrumentation provides the foundational 80 percent. Requests, error rates, and durations (aka RED) from day one. You then layer manual instrumentation on top for the business critical signals your SLOs should be measuring.</span></p>
<h3 id="the-collector-configuration-gets-complex-fast"><b>The Collector configuration gets complex fast</b></h3>
<p><span style="font-weight: 400;">Once you start running multiple pipelines, applying transforms, doing tail-based sampling, and exporting to multiple backends, your collector config becomes something that needs to be tested and versioned like application code. Treat it that way from the start.</span></p>
<h2 id="starting-without-starting-over"><b>Starting Without Starting Over</b></h2>
<p><span style="font-weight: 400;">The most common mistake teams make when adopting OTel is treating it as a big-bang migration. You do not need to instrument every service before any of it becomes useful. Pick one service, ideally something that sits in the middle of your call graph so you can see upstream and downstream spans, and get it fully instrumented with OTel, exporting to a collector and from there to whatever backend you already have. Define one or two SLIs for it. Watch them for a week and see if they match your intuition about how the service is performing.</span></p>
<p><span style="font-weight: 400;">That first service will teach you things that no amount of reading can. You will find out how your framework handles context propagation. You will discover that your log format does not include trace IDs and need to fix that. You will learn what your normal latency histogram looks like and be surprised by the long tail. Do that before you roll out to thirty services, and the rollout will go much faster. </span></p>
<p><span style="font-weight: 400;">To get started see the </span><a href="https://sematext.com/docs/tracing/getting-started/" target="_blank" rel="noopener"><span style="font-weight: 400;">Sematext step-by-step setup guide</span></a><span style="font-weight: 400;"> for OpenTelemetry tracing. Once you have that in place, the article on </span><a href="https://sematext.com/blog/troubleshooting-microservices-with-opentelemetry-distributed-tracing/#building-a-troubleshooting-workflow-with-sematext-tracing" target="_blank" rel="noopener"><span style="font-weight: 400;">building a troubleshooting workflow with Sematext tracing</span></a><span style="font-weight: 400;"> shows how to use those first traces to investigate issues and iterate on your instrumentation.</span></p>
<p class="space-top"><a href="https://apps.sematext.com/ui/registration" class="button-big" target="_blank" rel="noopener noreferrer">Start Free Trial</a></p><hr class="hidden"><p>The post <a href="https://sematext.com/blog/from-debugging-to-slos-how-opentelemetry-changes-the-way-teams-do-observability/">From Debugging to SLOs: How OpenTelemetry Changes the Way Teams Do Observability</a> appeared first on <a href="https://sematext.com">Sematext</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
