{"id":1658,"date":"2024-11-20T07:37:31","date_gmt":"2024-11-20T07:37:31","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=1658"},"modified":"2024-11-20T20:01:43","modified_gmt":"2024-11-20T20:01:43","slug":"otel-context-propagation-cpp","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=1658","title":{"rendered":"OTel Context Propagation for MQ Applications: part 2 &#8211; C\/C++"},"content":{"rendered":"\n<p>The <a href=\"https:\/\/marketaylor.synology.me\/?p=1626\" target=\"_blank\" rel=\"noreferrer noopener\">first article<\/a> in this series introduced OpenTelemetry (OTel) tracing with IBM MQ. It showed how the trace context  can flow when the application is using the MQ Node.JS or Go interfaces. This article carries on the story for OTel context propagation, this time talking about C++ and C applications.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Instrumenting C and C++ applications<\/h2>\n\n\n\n<p>Just as with the other language interfaces, your application should already have OTel instrumentation. With C and C++ applications, that is not as straightforward as some other environments. <\/p>\n\n\n\n<p>For a start, the OTel project does not provide pre-built libraries, though there are some places you might be able to download them from, depending on your operating system version. As another aspect, there are no automatic or standard library integrations. So you will probably have to build the OTel libraries for yourself, and then add the necessary instrumentation to the application directly.<\/p>\n\n\n\n<p>OTel also do not provide any native C support; everything is done via C++. So instrumenting C applications will likely require some wrapper layer to convert C to the object-oriented APIs. That&#8217;s how this API Exit is written &#8211; using a mixture of languages to convert MQ&#8217;s C interfaces to the C++ operations driving the OTel API. (The fact that this made it easier to use constructs such as Maps was certainly a benefit but it wasn&#8217;t the primary purpose.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The MQ language binding and exit<\/h2>\n\n\n\n<p>While the Node.js and Go propagation layer sits above the C MQI, manipulating message properties and the MQRFH2 structures, the C variant runs underneath the C MQI. It is implemented as an <a href=\"https:\/\/marketaylor.synology.me\/?p=700\" target=\"_blank\" rel=\"noreferrer noopener\">API Exit<\/a>. But it is logically doing an identical thing to those other bindings. Your application does not need to do anything different, beyond its own OTel work. Calls to the MQI are transparently picked up and processed.<\/p>\n\n\n\n<p>Outbound messages have properties added that can be picked up by a receiving application; inbound messages with context have that context linked into any existing OTel trace\/spans. This exit does not emit any new traces or spans of its own.<\/p>\n\n\n\n<p>This layer may be running inside a Go or Node.js program, but there is no &#8220;double accounting&#8221;. The wrappers&#8217; OTel work takes precedence if the apps are instrumented.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/ibm-messaging\/mq-exits\/tree\/master\/apix\/otel\" target=\"_blank\" rel=\"noreferrer noopener\">The exit<\/a> has been written and tested on Linux platforms only. It MIGHT work on AIX with small tweaks to the Makefile (though getting the OTel SDK libraries might be more challenging); it would require more changes to build and run on Windows. It can work in conjunction with, but does not require, the Instana MQ Tracing exit.<\/p>\n\n\n\n<p>An incidental benefit of this exit is that it demonstrates many of the features of a larger API Exit. In particular, how you can work with <a href=\"https:\/\/marketaylor.synology.me\/?p=700#properties\" target=\"_blank\" rel=\"noreferrer noopener\">message properties<\/a>.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">RemoveRFH2 Option?<\/h5>\n\n\n\n<p>One difference from the other MQ OTel binding layers is that there is no <code>RemoveRFH2<\/code> option on the MQPMO and MQGMO structures. So your application might receive &#8220;unexpected&#8221; properties or RFH2 header blocks. Part of the reason for not implementing that feature in this exit is because the MQI cannot be extended in any way: the API Exit is inside the MQI calls, not wrapping it. The application would need to use an alternative mechanism. Perhaps an environment variable, but I don&#8217;t like using those for this kind of feature. If it turns out to be necessary, then it could be added in future.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Building the exit<\/h2>\n\n\n\n<p>First, you need to get a copy of the MQ API exit. Use <code>git clone<\/code> to pull down a copy from <a href=\"https:\/\/github.com\/ibm-messaging\/mq-exits\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. The OTel exit is in the <code>apix\/otel<\/code> subdirectory. Before building the exit itself, you also need the OTel cpp libraries.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">OpenTelemetry library dependency<\/h4>\n\n\n\n<p>The exits depend on having the opentelemetry cpp libraries already available. Either archive or shared libraries can be used depending on your preference. But using shared libraries is more likely to need additional configuration such as <code>LD_LIBRARY_PATH<\/code> to be set so that they can be found and loaded at runtime.<\/p>\n\n\n\n<p>While you might be able to find existing pre-built libraries, it&#8217;s more likely that you will have to build them yourself. See <a href=\"https:\/\/opentelemetry.io\/docs\/languages\/cpp\/getting-started\/\" target=\"_blank\" rel=\"noreferrer noopener\">Getting Started material here<\/a> for information on creating these libraries. For this exit, you do not need any of the exporters to be built, which means that many of the dependencies (eg grpc) are not necessary.<\/p>\n\n\n\n<p>However you do need to build the OTel libraries with the ABI version 2 option. This is done by setting <code>-DWITH_ABI_VERSION_2=ON -DWITH_ABI_VERSION_1=OFF<\/code> in the <em>cmake<\/em> configuration. You also need <code>-DCMAKE_POSITION_INDEPENDENT_CODE=ON<\/code>.<\/p>\n\n\n\n<p>This is where I might like to have a rant about how inappropriate C++ is for library packages \u2026 But I&#8217;ll mostly resist that temptation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The API Exit<\/h4>\n\n\n\n<p>Once you are in the correct subdirectory of the MQ Exits repository, execute the Makefile with <code>make<\/code>! The output from that step contains two things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An API exit written in C that loads the main tracing exit. Various MQI calls are then proxied to the tracing exit.<\/li>\n\n\n\n<li>A tracing exit written in C++ using the OTel C++ tracing libraries. Note that this is really mostly C code, as it needs to work with the C MQI. It only gets into C++ mode when essential.<\/li>\n<\/ul>\n\n\n\n<p>The Makefile might require editing to point at directories where your OTel libraries and include files live. You might also need to modify the <code>OTELLIBS<\/code>variable to match your choice of archive or shared OTel libraries.<\/p>\n\n\n\n<p>When you build the exit, the output includes a 32-bit version that does no real work so that 32-bit applications using the queue manager (if you configure it at that point) do not actually fail to run.<\/p>\n\n\n\n<p>More likely, you would run the exit in an MQ C client, with the <em>mqclient.ini<\/em> file pointing at the exit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation and Configuration<\/h2>\n\n\n\n<p>The <code>doit<\/code> script copies the binaries to a suitable place in the <code>\/var\/mqm<\/code> tree.<\/p>\n\n\n\n<p>If you want to use the exit in an MQ client, then the <em>mqclient.ini<\/em> file can point at the exit. And your application may in turn need to use the <code>MQCLNTCF<\/code> environment variable to point at the <em>mqclient.ini<\/em> file.If you want to use the exit for local bindings applications, use the queue manager&#8217;s <em>qm.ini<\/em> file.<\/p>\n\n\n\n<p>In both <em>ini<\/em> files, the syntax for defining the exit is the same:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ApiExitLocal:\n  Sequence=10\n  Function=EntryPoint\n  Module=mqiotel\n  Name=MQOTelExit<\/code><\/pre>\n\n\n\n<p>If you configure this at the queue manager level and also have the Instana exit installed on the queue manager, then the sequence number associated with this exit should be lower than that associated with the Instana exit. That ensures that the queue manager calls the exits at the right time.<\/p>\n\n\n\n<p>The exit is only effective in application processes, whether using local bindings or client connections. It does not have any effect inside queue manager processes. This includes the <code>amqrmppa<\/code> processes that handle the SVRCONN<br>connections.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Logging\/debug<\/h2>\n\n\n\n<p>Set the <code>APIX_LOGFILE<\/code> environment variable to see various bits of debug reported during the application&#8217;s execution. That variable can point at either a filename, or be set to <em>stdout<\/em> or <em>stderr<\/em> to print to the console. Problems getting the exit loaded may be easily diagnosed with this log.<\/p>\n\n\n\n<p>As the exit does not do any work in queue manager processes, printing to the console can be appropriate for applications.<\/p>\n\n\n\n<p>The exit also populates a field used by the MQ service trace to show it has been loaded successfully or not.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrumented applications<\/h2>\n\n\n\n<p>Instrumenting your C\/C++ applications to use OTel tracing is beyond the scope of this document. The Getting Started page referenced earlier has useful information.<\/p>\n\n\n\n<p>One requirement is that the application must also be using the ABI V2 OTel libraries. Mixing both V1 and V2 libraries in the same application process seems to cause confusion. And of course, this exit is only useful for instrumented applications.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing<\/h2>\n\n\n\n<p>Just as in the previous article, I used the equivalent roll-dice application from the Getting Started exercise. And replaced the rolling with MQPUT and MQGET calls. But this time in C++. <\/p>\n\n\n\n<p>As we would expect, the traces are similar. This time showing the CppPut application and flow through the queue manager network:<\/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_cpp_put.png\" target=\"_blank\" rel=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put.png noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"2126\" height=\"1008\" src=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put.png\" alt=\"\" class=\"wp-image-1663\" srcset=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put.png 2126w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-300x142.png 300w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-1024x486.png 1024w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-768x364.png 768w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-1536x728.png 1536w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-2048x971.png 2048w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/11\/jaeger_cpp_put-1200x569.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">A C++ instrumented application<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The OTel support for C and C++ applications seems less complete than for other application languages and frameworks. Developers need to do more work to instrument each application that they might need in a Node.js application. And the C++ libraries have their own issues around building and distributing.<\/p>\n\n\n\n<p>But perhaps this component will give a boost for these applications to encourage OTel instrumentation, knowing that they can be observed in their MQ integrations. <\/p>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on November 20th, 2024 at 08:01 pm<\/p>","protected":false},"excerpt":{"rendered":"<p>The first article in this series introduced OpenTelemetry (OTel) tracing with IBM MQ. It showed how the trace context can flow when the application is using the MQ Node.JS or Go interfaces. This article carries on the story for OTel context propagation, this time talking about C++ and C applications. This post was last updated &hellip; <a href=\"https:\/\/marketaylor.synology.me\/?p=1658\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;OTel Context Propagation for MQ Applications: part 2 &#8211; C\/C++&#8221;<\/span><\/a><\/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,20,131,135],"class_list":["post-1658","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mq","tag-ibmmq","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 2 - C\/C++ - 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 C and C++ 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=1658\" \/>\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 2 - C\/C++ - 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 C and C++ applications.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=1658\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-20T07:37:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-20T20:01:43+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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"OTel Context Propagation for MQ Applications: part 2 &#8211; C\\\/C++\",\"datePublished\":\"2024-11-20T07:37:31+00:00\",\"dateModified\":\"2024-11-20T20:01:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658\"},\"wordCount\":1425,\"commentCount\":1,\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"keywords\":[\"ibmmq\",\"mqseries\",\"opentelemetry\",\"otel\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658\",\"name\":\"OTel Context Propagation for MQ Applications: part 2 - C\\\/C++ - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/opentelemetrylogo-1.png\",\"datePublished\":\"2024-11-20T07:37:31+00:00\",\"dateModified\":\"2024-11-20T20:01:43+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 C and C++ applications.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1658#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=1658#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 2 &#8211; C\\\/C++\"}]},{\"@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 2 - C\/C++ - Mark Taylor&#039;s Blog","description":"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for C and C++ 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=1658","og_locale":"en_GB","og_type":"article","og_title":"OTel Context Propagation for MQ Applications: part 2 - C\/C++ - Mark Taylor&#039;s Blog","og_description":"OpenTelemetry tracing must flow through all parts of an application. This post shows OTel context propagation for C and C++ applications.","og_url":"https:\/\/marketaylor.synology.me\/?p=1658","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2024-11-20T07:37:31+00:00","article_modified_time":"2024-11-20T20:01:43+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":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=1658#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"OTel Context Propagation for MQ Applications: part 2 &#8211; C\/C++","datePublished":"2024-11-20T07:37:31+00:00","dateModified":"2024-11-20T20:01:43+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658"},"wordCount":1425,"commentCount":1,"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","keywords":["ibmmq","mqseries","opentelemetry","otel"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=1658#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=1658","url":"https:\/\/marketaylor.synology.me\/?p=1658","name":"OTel Context Propagation for MQ Applications: part 2 - C\/C++ - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658#primaryimage"},"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/2024\/02\/opentelemetrylogo-1.png","datePublished":"2024-11-20T07:37:31+00:00","dateModified":"2024-11-20T20:01:43+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 C and C++ applications.","breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=1658#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=1658"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/marketaylor.synology.me\/?p=1658#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=1658#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 2 &#8211; C\/C++"}]},{"@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\/1658","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=1658"}],"version-history":[{"count":13,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1658\/revisions"}],"predecessor-version":[{"id":1686,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1658\/revisions\/1686"}],"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=1658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}