{"id":1674,"date":"2024-11-20T18:52:18","date_gmt":"2024-11-20T18:52:18","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=1674"},"modified":"2024-11-21T07:15:11","modified_gmt":"2024-11-21T07:15:11","slug":"otel-context-propagation-java","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=1674","title":{"rendered":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS"},"content":{"rendered":"\n<p>Previous articles in this series have shown OpenTelemetry (OTel) Context propagation for Node.js, Go and C\/C++ MQ applications. You should read the <a href=\"https:\/\/marketaylor.synology.me\/?p=1626\" target=\"_blank\" rel=\"noreferrer noopener\">first article<\/a> for an introduction and explanation of the scenarios and problems that need solutions. <\/p>\n\n\n\n<p>This (final?) entry discusses JMS applications.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Background<\/h2>\n\n\n\n<p>I was encouraged to write this 3rd post, to pull it out from what started as comments underneath the first of this OTel series. I said then that we needed no special work to support JMS applications with OTel tracing, but I did still end up writing an application to demonstrate that statement was true. And it did show some differences in trace contents that are worth highlighting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Automatic Tracing<\/h2>\n\n\n\n<p>The OTel SDK developers provide automatic tracing capability for several languages and several standard (or commonly-used) packages. One such combination is the Java language and the JMS API. <\/p>\n\n\n\n<p>No additional work is required in your application code to take advantage of this. The only change is how you start the application. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n\n<p>As with the other languages discussed in this series, I started with the dice-rolling application described <a href=\"https:\/\/opentelemetry.io\/docs\/languages\/java\/getting-started\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. <\/p>\n\n\n\n<p>And then I replaced the work with MQ operations. In this case, it was to make JMS calls to send or receive messages through an MQ network. Although the application would work with the generic JMS classes (eg <code>Session<\/code>), I deliberately chose to make the program variables belong to the MQ-specific equivalent subclasses (eg <code>MQSession<\/code>). That was to confirm that the instrumentation module supports MQ&#8217;s implementation of the JMS API.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Application Startup<\/h4>\n\n\n\n<p>There was no code change for instrumenting this application. Just configuration and startup options:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">agent=.\/opentelemetry-javaagent.jar\nputProps=\"-Dotel.resource.attributes=service.name=javaPut\"\n\nagentProps=\"\"\nagentProps=\"$agentProps -Dotel.javaagent.logging=none\"\nagentProps=\"$agentProps -Dotel.exporter.otlp.protocol=grpc\"\nagentProps=\"$agentProps -Dotel.exporter.otlp.endpoint=http:\/\/localhost:4319\"\nagentProps=\"$agentProps -Dotel.metrics.exporter=none\"\nagentProps=\"$agentProps -Dotel.logs.exporter=none\"\nagentProps=\"$agentProps -Dotel.trace.exporter=otlp\"\nagentProps=\"$agentProps -Dotel.trace.exporter.otlp.protocol=grpc\"\n\njava -Xshare:off -javaagent:$agent \\\n       $putProps $agentProps \\\n       -jar .\/build\/libs\/putget.jar LOOP1.OUT OTEL1<\/pre>\n\n\n\n<p>The <code>opentelemetry-javaagent.jar<\/code> module came from the <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-java-instrumentation\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">OTel repositories<\/a>. From the <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-java-instrumentation\/tree\/main\/instrumentation\" target=\"_blank\" rel=\"noreferrer noopener\">source code tree<\/a>, you can see which packages it knows about. One of those integration points is JMS. Using the <code>javaagent<\/code>option to the <code>java<\/code> command causes this module to be loaded before running any of the real application code. It then inserts calls around any of the APIs it recognises, to emit the OTel traces and spans.<\/p>\n\n\n\n<p>The configuration options tell the OTel instrumentation module what kind of information it should emit, and how. I&#8217;ve requested just the tracing data, to use the OTLP\/gRPC protocol.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Results<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1024x485.png\" target=\"_blank\" rel=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1024x485.png noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"485\" src=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1024x485.png\" alt=\"\" class=\"wp-image-1676\" srcset=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1024x485.png 1024w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-300x142.png 300w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-768x364.png 768w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1536x727.png 1536w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-2048x970.png 2048w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put-1200x568.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">JMS Application sending a message through MQ<\/figcaption><\/figure>\n\n\n\n<p>The interesting span in this trace is the one labelled as <code>javaPut queue:\/\/LOOP1.OUT publish<\/code>. The JMS instrumentation has recognised the call to the JMS producer <code>send()<\/code> method and reported it. Expanding the tags associated with that span shows more details:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1024x513.png\" target=\"_blank\" rel=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1024x513.png noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" src=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1024x513.png\" alt=\"\" class=\"wp-image-1677\" srcset=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1024x513.png 1024w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-300x150.png 300w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-768x385.png 768w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1536x769.png 1536w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-2048x1026.png 2048w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_java_put_details-1200x601.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">Tags associated with a JMS send() operation<\/figcaption><\/figure>\n\n\n\n<p>The name of the queue appears, as does the MessageID. And the subsequent spans demonstrate that it sets suitable message properties, so that the MQ tracing exit can propagate the context.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Differences<\/h3>\n\n\n\n<p>This looks similar to the traces I showed in the previous articles. But there is one clear difference: the trace from the Getting application does not have an explicit link to the Putter&#8217;s. The two traces are disjoint. You could try to correlate them by using the <code>process.pid<\/code> values and timestamps in the two traces (as the Putter&#8217;s trace still concludes when the Getter consumes the message). But that may not be completely reliable.<\/p>\n\n\n\n<p>Another less-visible difference is that we can see how long it takes for the API call to flow across the MQ Client channel &#8211; one span is emitted as the <em>send()<\/em> happens (although it&#8217;s labelled as &#8220;publish&#8221; &#8211; an indication of how the specification was originally created), and the next span appears as the message is put to the target queue. The other language bindings I discussed in the previous articles do not emit spans of their own so you don&#8217;t see the network stage.<\/p>\n\n\n\n<p> There seems to have been debate, ambiguity, and evolution in both the overall OTel specifications for messaging, and specifically in the JMS implementation of the instrumentation. But hopefully all the implementations will eventually agree.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>I hadn&#8217;t been planning on writing much about the JMS instrumentation, but it&#8217;s probably been worth it for completeness. And I hope this explains how the pieces fit together.<\/p>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on November 21st, 2024 at 07:15 am<\/p>","protected":false},"excerpt":{"rendered":"<p>Previous articles in this series have shown OpenTelemetry (OTel) Context propagation for Node.js, Go and C\/C++ MQ applications. You should read the first article for an introduction and explanation of the scenarios and problems that need solutions. This (final?) entry discusses JMS applications. This post was last updated on November 21st, 2024 at 07:15 am<\/p>\n","protected":false},"author":1,"featured_media":1546,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[35,137,48,20,131,135],"class_list":["post-1674","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mq","tag-ibmmq","tag-jaeger","tag-jms","tag-mqseries","tag-opentelemetry","tag-otel"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog<\/title>\n<meta name=\"description\" content=\"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marketaylor.synology.me\/?p=1674\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=1674\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-20T18:52:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-21T07:15:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"367\" \/>\n\t<meta property=\"og:image:height\" content=\"137\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@marketaylor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS\",\"datePublished\":\"2024-11-20T18:52:18+00:00\",\"dateModified\":\"2024-11-21T07:15:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674\"},\"wordCount\":684,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"keywords\":[\"ibmmq\",\"jaeger\",\"jms\",\"mqseries\",\"opentelemetry\",\"otel\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674\",\"name\":\"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"datePublished\":\"2024-11-20T18:52:18+00:00\",\"dateModified\":\"2024-11-21T07:15:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"description\":\"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#primaryimage\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"contentUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"width\":367,\"height\":137,\"caption\":\"OTel logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1674#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/marketaylor.synology.me\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/\",\"name\":\"Mark Taylor&#039;s Blog\",\"description\":\"Messaging, Music and Moving Around\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/marketaylor.synology.me\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\",\"name\":\"Mark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"caption\":\"Mark\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/marketaylor\"],\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog","description":"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marketaylor.synology.me\/?p=1674","og_locale":"en_GB","og_type":"article","og_title":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog","og_description":"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.","og_url":"https:\/\/marketaylor.synology.me\/?p=1674","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2024-11-20T18:52:18+00:00","article_modified_time":"2024-11-21T07:15:11+00:00","og_image":[{"width":367,"height":137,"url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","type":"image\/png"}],"author":"Mark","twitter_card":"summary_large_image","twitter_creator":"@marketaylor","twitter_misc":{"Written by":"Mark","Estimated reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=1674#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS","datePublished":"2024-11-20T18:52:18+00:00","dateModified":"2024-11-21T07:15:11+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674"},"wordCount":684,"commentCount":0,"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","keywords":["ibmmq","jaeger","jms","mqseries","opentelemetry","otel"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=1674#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=1674","url":"https:\/\/marketaylor.synology.me\/?p=1674","name":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674#primaryimage"},"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","datePublished":"2024-11-20T18:52:18+00:00","dateModified":"2024-11-21T07:15:11+00:00","author":{"@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"description":"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for Java applications.","breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=1674#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=1674"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/marketaylor.synology.me\/?p=1674#primaryimage","url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","contentUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","width":367,"height":137,"caption":"OTel logo"},{"@type":"BreadcrumbList","@id":"https:\/\/marketaylor.synology.me\/?p=1674#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marketaylor.synology.me\/"},{"@type":"ListItem","position":2,"name":"OTel Context Propagation for MQ Applications: part 3 \u2013 JMS"}]},{"@type":"WebSite","@id":"https:\/\/marketaylor.synology.me\/#website","url":"https:\/\/marketaylor.synology.me\/","name":"Mark Taylor&#039;s Blog","description":"Messaging, Music and Moving Around","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marketaylor.synology.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c","name":"Mark","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","caption":"Mark"},"sameAs":["https:\/\/x.com\/marketaylor"],"url":"https:\/\/marketaylor.synology.me\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1674"}],"version-history":[{"count":8,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1674\/revisions"}],"predecessor-version":[{"id":1688,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1674\/revisions\/1688"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/media\/1546"}],"wp:attachment":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}