<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Opentelemetry on tsvinc</title>
		<link>https://tsvinc.dev/tags/opentelemetry/</link>
		<description>Recent content in Opentelemetry on tsvinc</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 26 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://tsvinc.dev/tags/opentelemetry/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Measuring OpenTelemetry Overhead Without Fooling Yourself</title>
				<link>https://tsvinc.dev/posts/measuring-telemetry-overhead-fairly/</link>
				<pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/measuring-telemetry-overhead-fairly/</guid>
				<description>&lt;p&gt;Saturday 24 October, 17:05 UTC: the first cell of my telemetry overhead matrix starts. At 18:55 UTC (21:55 on the local clock that &lt;code&gt;driver.log&lt;/code&gt; keeps) I stopped it, seven cells into thirty. Five of the seven had passed the gate, and two of those five had been OOM-killed 39 and 48 times.&lt;/p&gt;&#xA;&lt;p&gt;The question was one number per setup: what OpenTelemetry costs a Spring Boot 4.1.2 service in memory and in CPU per order. The service is the order pipeline from &lt;a href=&#34;https://tsvinc.dev/posts/otel-agent-vs-starter-parity/&#34;&gt;part 1&lt;/a&gt;, in two flavours: &lt;code&gt;plain&lt;/code&gt; uses the bare RabbitMQ, Mongo and JDBC clients, &lt;code&gt;spring&lt;/code&gt; uses Spring Data and Spring AMQP. The setups are &lt;code&gt;none&lt;/code&gt;, a Prometheus reference, Boot&#39;s own OpenTelemetry starter (&lt;code&gt;mo-*&lt;/code&gt;), the OpenTelemetry project&#39;s starter (&lt;code&gt;on-*&lt;/code&gt;) and the JVM-only OTel Java agent; &lt;code&gt;-m&lt;/code&gt; is metrics only, &lt;code&gt;-mt&lt;/code&gt; metrics and traces. The second attempt finished all 60 cells. Most of this post is what had to be true of a cell before its number counted.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Counts Match, Dashboards Don&#39;t: OTel Agent vs Starter</title>
				<link>https://tsvinc.dev/posts/otel-agent-vs-starter-parity/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/otel-agent-vs-starter-parity/</guid>
				<description>&lt;p&gt;Twenty-four test cells, 284 row checks, 24 cross-checks, zero failures. I ran one Spring Boot order pipeline under the OpenTelemetry Java agent, OpenTelemetry&#39;s Spring Boot starter and Boot&#39;s own OpenTelemetry starter, on the JVM and, for the two starters, as a GraalVM native image. Every count with an exact expectation, 284 rows of them, equalled what the load generator had sent.&lt;/p&gt;&#xA;&lt;p&gt;The question I&#39;d been asked was whether a service on the agent today can go native and keep its Grafana dashboards and alerts. The agent doesn&#39;t run in a native image, so native means a starter, and a parity report that green reads like permission to swap. A panel reads something else: a metric name, a unit, label keys, label values and histogram buckets. Scored on those, OpenTelemetry&#39;s starter in native keeps 4 of the 26 things a panel in my two test apps can read, and all four are the &lt;code&gt;job&lt;/code&gt; and &lt;code&gt;instance&lt;/code&gt; labels. Boot&#39;s starter in native keeps 2, both of them &lt;code&gt;job&lt;/code&gt;. A perfect score on the wrong exam.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java 25 Changes Your Telemetry in Strings, Not Code</title>
				<link>https://tsvinc.dev/posts/java25-opentelemetry-upgrade/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/java25-opentelemetry-upgrade/</guid>
				<description>&lt;p&gt;A JDK upgrade gets tested like a runtime change. Does it compile, does it start, did the GC pauses get worse. Telemetry rides along as if it were part of the runtime. In practice it&#39;s a contract written in strings, like &lt;code&gt;jvm.gc.name=&amp;quot;ZGC Pauses&amp;quot;&lt;/code&gt; and &lt;code&gt;jvm.memory.pool.name=&amp;quot;ZHeap&amp;quot;&lt;/code&gt;, and no test suite asserts on a name the JVM makes up at start-up. When those strings change, nothing errors. A panel goes flat, an alert stops firing, and both look exactly like a healthy service.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Spring Boot 4 Keeps a Tracer With Tracing Off</title>
				<link>https://tsvinc.dev/posts/boot4-tracing-enabled-ignored/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/boot4-tracing-enabled-ignored/</guid>
				<description>&lt;p&gt;Spring Boot 4.0&#39;s release notes cover it in one bullet, under Miscellaneous: &amp;quot;The property management.tracing.enabled has been renamed to management.tracing.export.enabled.&amp;quot; The old key doesn&#39;t forward to the new one. It doesn&#39;t fail startup, and in the run I have it doesn&#39;t log a word. Set it to &lt;code&gt;false&lt;/code&gt; and it binds to nothing.&lt;/p&gt;&#xA;&lt;p&gt;I found it while chasing a red test on Boot 4.1.2, and the dead key wasn&#39;t what turned the test red. The test was wrong: with the new key, the Tracer bean stays too.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Config I Measured Was Not the Config That Ran</title>
				<link>https://tsvinc.dev/posts/native-dropped-telemetry-config/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/native-dropped-telemetry-config/</guid>
				<description>&lt;p&gt;&lt;code&gt;optional:&lt;/code&gt; is the most forgiving word in a Spring Boot config file. Put it in front of an import and Boot loads the file if it&#39;s there and carries on if it isn&#39;t. A missing file can never keep the app from starting. My benchmark app imported its telemetry settings that way. In the native image the import kept that promise to the letter. The file wasn&#39;t there, Boot carried on without it, and not one byte of telemetry reached the collector.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
