<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jovan Stojiljkovic</title>
    <description>The latest articles on DEV Community by Jovan Stojiljkovic (@jstojiljkovic).</description>
    <link>https://dev.to/jstojiljkovic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3940764%2F1279e9d5-10c1-4e4b-8ce8-d7cce7af44cb.jpg</url>
      <title>DEV Community: Jovan Stojiljkovic</title>
      <link>https://dev.to/jstojiljkovic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jstojiljkovic"/>
    <language>en</language>
    <item>
      <title>OpenTelemetry for Symfony: v2.0 is out</title>
      <dc:creator>Jovan Stojiljkovic</dc:creator>
      <pubDate>Tue, 19 May 2026 17:03:52 +0000</pubDate>
      <link>https://dev.to/jstojiljkovic/opentelemetry-for-symfony-v20-is-out-1pm1</link>
      <guid>https://dev.to/jstojiljkovic/opentelemetry-for-symfony-v20-is-out-1pm1</guid>
      <description>&lt;p&gt;We shipped v2.0 of &lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle" rel="noopener noreferrer"&gt;&lt;code&gt;traceway/opentelemetry-symfony&lt;/code&gt;&lt;/a&gt; today.&lt;/p&gt;

&lt;p&gt;Two months ago, &lt;a href="https://medium.com/@jstojiljkovic941/why-we-built-our-own-opentelemetry-bundle-for-symfony-9d1a273c75aa" rel="noopener noreferrer"&gt;v1.0 launched&lt;/a&gt; with HTTP, Messenger, and HttpClient tracing. It is a pure-PHP&lt;br&gt;
  OpenTelemetry bundle for Symfony, with no C extension required. That post covered the &lt;em&gt;why&lt;/em&gt;. This one covers what nine stable releases added since:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v1.5&lt;/strong&gt;: DBAL 3 and 4 tracing in the same package. &lt;code&gt;NamespacedPoolInterface&lt;/code&gt; support for cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.6&lt;/strong&gt;: OTel native log export. Monolog handler with per-channel instrumentation scope, microsecond timestamp precision, exception attributes, re-entrance guard against export-path recursion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.7&lt;/strong&gt;: metrics foundation. &lt;code&gt;MeterRegistry&lt;/code&gt; service plus Messenger consume-side metrics (&lt;code&gt;messaging.process.duration&lt;/code&gt;, &lt;code&gt;messaging.client.consumed.messages&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.8&lt;/strong&gt;: full metrics rollout. Doctrine &lt;code&gt;db.client.operation.duration&lt;/code&gt;, HTTP client &lt;code&gt;http.client.request.duration&lt;/code&gt; (Stable semconv), Messenger dispatch metrics. Log records got OTel &lt;code&gt;code.*&lt;/code&gt; semconv
attributes from Monolog's &lt;code&gt;IntrospectionProcessor&lt;/code&gt;. The &lt;code&gt;Tracing&lt;/code&gt; helper joined the bundle-wide &lt;code&gt;ResetInterface&lt;/code&gt; pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.9&lt;/strong&gt;: Mailer instrumentation (PRODUCER and CLIENT span split with ECS-aligned &lt;code&gt;email.*&lt;/code&gt; attributes), Scheduler instrumentation (CONSUMER span per scheduled-task run, Messenger middleware auto-dedups
envelopes carrying &lt;code&gt;ScheduledStamp&lt;/code&gt;), HTTP server and Mailer transport metrics. PHPUnit 13 support across the test matrix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2.0&lt;/strong&gt;: nested signal-grouped config plus BC layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every release shipped stable, no betas. PHPStan level 10 with no baseline throughout.&lt;/p&gt;

&lt;p&gt;v2.0 restructures the config from flat keys to a nested, signal-grouped shape aligned with the OpenTelemetry spec and the &lt;code&gt;OTEL_*&lt;/code&gt; env-var convention:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# v1.x: still works, emits a Symfony deprecation&lt;/span&gt;
  &lt;span class="na"&gt;open_telemetry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;traces_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;messenger_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;log_export_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="c1"&gt;# v2.0: nested under traces / metrics / logs&lt;/span&gt;
  &lt;span class="na"&gt;open_telemetry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;traces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;messenger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;export&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every v1.x flat key keeps working; each one emits a Symfony deprecation pointing at the new nested location, scheduled for removal in v3.0. Setting both flat and nested in the same block throws an&lt;br&gt;
  &lt;code&gt;InvalidConfigurationException&lt;/code&gt; rather than silently picking one. Upgrading requires zero edits, and you get a deprecation pass to migrate on your own schedule. Full mapping in&lt;br&gt;
  &lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle/blob/master/UPGRADE-2.0.md" rel="noopener noreferrer"&gt;UPGRADE-2.0.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One default also flipped: &lt;code&gt;logs.export.unprefixed_attributes&lt;/code&gt; is now &lt;code&gt;true&lt;/code&gt; by default. Monolog &lt;code&gt;context&lt;/code&gt; and &lt;code&gt;extra&lt;/code&gt; fields are emitted as flat OTel attributes instead of under &lt;code&gt;monolog.context.*&lt;/code&gt; /&lt;br&gt;
  &lt;code&gt;monolog.extra.*&lt;/code&gt; prefixes, matching how every other ecosystem does it (Java logback, Python &lt;code&gt;LoggingHandler&lt;/code&gt;, .NET &lt;code&gt;OpenTelemetryLogger&lt;/code&gt;, JS Winston). The knob has existed since v1.8.0 so users had a&lt;br&gt;
  release cycle to opt in. Set it back to &lt;code&gt;false&lt;/code&gt; explicitly if your dashboards depend on the prefixed shape.&lt;/p&gt;

&lt;p&gt;Getting started is two steps:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  composer require traceway/opentelemetry-symfony
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  OTEL_PHP_AUTOLOAD_ENABLED=true
  OTEL_SERVICE_NAME=my-symfony-app
  OTEL_TRACES_EXPORTER=otlp
  OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
  OTEL_EXPORTER_OTLP_PROTOCOL=http/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With Symfony Flex the bundle auto-registers. Every HTTP request, console command, outgoing call, Messenger job, DB query, cache operation, and Twig render is now traced. Point it at any OTel-compatible&lt;br&gt;
  backend: &lt;a href="https://tracewayapp.com" rel="noopener noreferrer"&gt;Traceway&lt;/a&gt;, Jaeger, Tempo, Datadog, Honeycomb, and the rest.&lt;/p&gt;

&lt;p&gt;v2.1 will land Monolog handler ergonomics: a &lt;code&gt;channels&lt;/code&gt; filter and configurable exception keys, driven by community feedback in &lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle/issues/23" rel="noopener noreferrer"&gt;issue&lt;br&gt;
  #23&lt;/a&gt;. Issues and PRs welcome.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tracewayapp" rel="noopener noreferrer"&gt;
        tracewayapp
      &lt;/a&gt; / &lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle" rel="noopener noreferrer"&gt;
        opentelemetry-symfony-bundle
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Pure-PHP OpenTelemetry instrumentation for Symfony - automatic HTTP, HttpClient, and Messenger tracing. No C extension required
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://tracewayapp.com" rel="nofollow noopener noreferrer"&gt;
    
      
      
      &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftracewayapp%2Ftraceway%2Fmain%2FTraceway%2520Logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftracewayapp%2Ftraceway%2Fmain%2FTraceway%2520Logo.png" alt="Traceway Logo" width="200"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;OpenTelemetry Symfony Bundle&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/tracewayapp/opentelemetry-symfony-bundle/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/tracewayapp/opentelemetry-symfony-bundle" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/578e9ab0ca4d7c6d0b5a25073184b143400f1f8c16acc42f275412cf36aa5c1f/68747470733a2f2f636f6465636f762e696f2f67682f74726163657761796170702f6f70656e74656c656d657472792d73796d666f6e792d62756e646c652f67726170682f62616467652e737667" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://packagist.org/packages/traceway/opentelemetry-symfony" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aebf2e633114969dc5b25a55556150c1f2ec1a81e483648e5eedde16e336c12d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f74726163657761792f6f70656e74656c656d657472792d73796d666f6e792e737667" alt="Packagist Version"&gt;&lt;/a&gt;
&lt;a href="https://packagist.org/packages/traceway/opentelemetry-symfony" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/440fb495cfbe28a94beae249d1036421f87f938080648c1cf2b63b16cd08172c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f74726163657761792f6f70656e74656c656d657472792d73796d666f6e792e737667" alt="Packagist Downloads"&gt;&lt;/a&gt;
&lt;a href="https://php.net" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04744bae0a61d2ffe29c26f07a9612eae20445fc6feaeb77b3af1f0e9be6447c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344382e312d3838393242462e737667" alt="PHP Version"&gt;&lt;/a&gt;
&lt;a href="https://symfony.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/df69560fe6c25fd0268689a4bbba1950f74df1ee59a1b5d6f744f96d63043647/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73796d666f6e792d253345253344362e342d3030303030302e737667" alt="Symfony Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/tracewayapp/opentelemetry-symfony-bundle/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/9tPn2SB3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/397741123d69503a0a224452a3629154669e9a870686f0c21c68527c7d8faa07/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e2d3538363546323f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pure-PHP OpenTelemetry instrumentation for Symfony — automatic tracing for HTTP, Console, HttpClient, Messenger, Mailer, Scheduler, Doctrine DBAL, Cache, and Twig, plus Monolog log-trace correlation, OpenTelemetry log export, and opt-in metrics for Messenger, DBAL, HTTP server/client, and Mailer. No C extension required.&lt;/p&gt;
&lt;p&gt;Works with any OpenTelemetry-compatible backend: &lt;a href="https://tracewayapp.com" rel="nofollow noopener noreferrer"&gt;Traceway&lt;/a&gt;, &lt;a href="https://www.jaegertracing.io/" rel="nofollow noopener noreferrer"&gt;Jaeger&lt;/a&gt;, &lt;a href="https://zipkin.io/" rel="nofollow noopener noreferrer"&gt;Zipkin&lt;/a&gt;, &lt;a href="https://www.datadoghq.com/" rel="nofollow noopener noreferrer"&gt;Datadog&lt;/a&gt;, &lt;a href="https://grafana.com/oss/tempo/" rel="nofollow noopener noreferrer"&gt;Grafana Tempo&lt;/a&gt;, &lt;a href="https://www.honeycomb.io/" rel="nofollow noopener noreferrer"&gt;Honeycomb&lt;/a&gt;, and more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pure PHP&lt;/strong&gt; — no C extension required; installs on every managed Symfony host&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-ready&lt;/strong&gt; — stable since v1.0, PHPStan level 10 with no baseline, supports Symfony 6.4 LTS through 8.x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct under load&lt;/strong&gt; — Messenger trace context propagates across async queue boundaries, Doctrine DBAL 3 and 4 both CI-tested, re-entrance guards prevent export-path recursion in HttpClient and the log handler&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;composer require traceway/opentelemetry-symfony&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-v"&gt;OTEL_PHP_AUTOLOAD_ENABLED&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;true&lt;/span&gt;
&lt;span class="pl-v"&gt;OTEL_SERVICE_NAME&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;my-symfony-app&lt;/span&gt;
&lt;span class="pl-v"&gt;OTEL_TRACES_EXPORTER&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;otlp&lt;/span&gt;
&lt;span class="pl-v"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;http://localhost:4318&lt;/span&gt;
&lt;span class="pl-v"&gt;OTEL_EXPORTER_OTLP_PROTOCOL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;http/json&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Optional: OTEL_RESOURCE_ATTRIBUTES=service.version=1.0&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Use &lt;code&gt;http/json&lt;/code&gt; unless…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tracewayapp/opentelemetry-symfony-bundle" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>symfony</category>
      <category>opentelemetry</category>
      <category>php</category>
      <category>observability</category>
    </item>
  </channel>
</rss>
