[{"data":1,"prerenderedAt":803},["ShallowReactive",2],{"i-feather:search":3,"i-feather:x":8,"i-feather:moon":10,"i-feather:sun":12,"i-fa-brands:youtube":14,"i-fa-brands:twitch":18,"i-fa-brands:github":20,"i-fa-brands:linkedin":23,"i-fa-brands:stack-overflow":26,"i-simple-icons:bluesky":29,"i-fa-brands:mastodon":31,"i-fa-regular:envelope":33,"i-fa-solid:rss":35,"post-\u002Fexporting-open-telemetry-data-to-jaeger\u002F":37,"post-navigation":401,"i-fa-solid:share-alt":783,"i-fa-brands:facebook":785,"i-fa-brands:twitter":787,"i-fa-brands:reddit":789,"i-fa-brands:patreon":791,"i-simple-icons:buymeacoffee":793,"i-fa-brands:paypal":795,"i-fa-regular:question-circle":797,"i-feather:arrow-left":799,"i-feather:arrow-right":801},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003Cpath d=\"m21 21l-4.35-4.35\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"5\"\u002F>\u003Cpath d=\"M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":15,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":17},576,512,"\u003Cpath fill=\"currentColor\" d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"currentColor\" d=\"M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0L24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75l-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z\"\u002F>",{"left":4,"top":4,"width":21,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":22},496,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":25},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":28},384,"\u003Cpath fill=\"currentColor\" d=\"M290.7 311L95 269.7L86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8l153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24l119.3 160.3l32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":30},"\u003Cpath fill=\"currentColor\" d=\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":32},"\u003Cpath fill=\"currentColor\" d=\"M433 179.11c0-97.2-63.71-125.7-63.71-125.7c-62.52-28.7-228.56-28.4-290.48 0c0 0-63.72 28.5-63.72 125.7c0 115.7-6.6 259.4 105.63 289.1c40.51 10.7 75.32 13 103.33 11.4c50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7c56.12-6.7 105-41.3 111.23-72.9c9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175c25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5l11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1c23.71 27.3 18.4 53 18.4 175z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":34},"\u003Cpath fill=\"currentColor\" d=\"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48m0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49c-16.841 13.247-50.201 45.072-73.413 44.701c-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646c21.857 17.205 60.134 55.186 103.062 54.955c42.717.231 80.509-37.199 103.053-54.947c49.528-38.783 82.032-64.401 104.947-82.653V400z\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":36},"\u003Cpath fill=\"currentColor\" d=\"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041s64.04 28.673 64.04 64.041m175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018c111.832 7.284 201.473 96.702 208.772 208.772c.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79m144.249.288C439.596 229.677 251.465 40.445 16.503 32.01C7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999c191.179 7.839 344.627 161.316 352.465 352.465c.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504\"\u002F>",{"id":38,"title":39,"author":40,"body":41,"comments":296,"date":375,"dateModified":376,"description":377,"extension":378,"headings":379,"heroImage":384,"meta":385,"path":65,"permalink":65,"published":386,"stem":387,"tags":388,"timeToRead":400},"posts\u002Fposts\u002F2021\u002Fexporting-open-telemetry-data-to-jaeger\u002Findex.md","Exporting Open Telemetry Data to Jaeger","Muhammad Rehan Saeed",{"type":42,"value":43,"toc":293},"minimark",[44,73,81,84,115,123,131,137,140,161,182,196,207,212,226,231,245,252,262,265,272,286,289],[45,46,47,55,61,67],"ol",{},[48,49,50],"li",{},[51,52,54],"a",{"href":53},"\u002Fdeep-dive-into-open-telemetry-for-net\u002F","Open Telemetry - Deep Dive into Open Telemetry for .NET",[48,56,57],{},[51,58,60],{"href":59},"\u002Fopen-telemetry-for-asp-net-core\u002F","Open Telemetry - Configuring Open Telemetry for ASP.NET Core",[48,62,63],{},[51,64,66],{"href":65},"\u002Fexporting-open-telemetry-data-to-jaeger\u002F","Open Telemetry - Exporting Open Telemetry Data to Jaeger",[48,68,69],{},[51,70,72],{"href":71},"\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F","Open Telemetry - Optimally Configuring Open Telemetry Tracing for ASP.NET Core",[74,75,76,77,80],"p",{},"As I talked about in my ",[51,78,79],{"href":53},"first post",", the end goal is to get nice visualisations from our Open Telemetry data, so we can spot patterns and learn something from the behaviours of our applications.",[74,82,83],{},"In this post, I'll show how we can export the Open Telemetry traces, logs and metrics that we've collected to Jaeger and view them in the Jaeger dashboard.",[85,86,89,95],"h1",{"id":87,"data-section-heading":88},"open-telemetry-protocol-otlp","",[90,91,94],"span",{"className":92},[93],"heading__text","Open Telemetry Protocol (OTLP)",[96,97,100],"anchor-link",{"href":98,"label":99},"#open-telemetry-protocol-otlp","Link to this section",[101,102,109],"svg",{"xmlns":103,"xmlns:xlink":104,"viewBox":105,"version":106,"width":107,"height":107,"aria-hidden":108},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,"true",[110,111],"path",{"fill":112,"fill-rule":113,"d":114},"currentColor","evenodd","M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z",[74,116,117,118,122],{},"There are actually two methods of exporting our telemetry to Jaeger. The first uses Jaeger's proprietary protocol and is not something I plan to cover in this post. The second uses the Open Telemetry Protocol (OTLP), which is an open standard that we can use to export Open Telemetry data to ",[119,120,121],"strong",{},"any"," application that supports it.",[74,124,125,126,130],{},"Jaeger is a pretty complex application that splits it's responsibilities into several separate binaries. It splits the collection of telemetry into a binary called a 'collector'. If we want Jaeger to collect telemetry using the Open Telemetry Protocol, we need to use the Jaeger Open Telemetry collector. I'm not going to cover how we can setup Jaeger in a full production setup. Instead I'll be using the ",[127,128,129],"code",{},"jaegertracing\u002Fopentelemetry-all-in-one"," Docker image which makes running Jaeger with the Open Telemetry collector as easy as running this command:",[132,133],"pre",{"className":134,"language":135,"meta":88,"style":88,"html":136},"language-powershell shiki shiki-themes light-plus monokai","powershell","\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">docker run \u003C\u002Fspan>\u003Cspan class=\"snCLD\">--\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">name jaeger \u003C\u002Fspan>\u003Cspan class=\"snCLD\">-\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">p \u003C\u002Fspan>\u003Cspan class=\"s0PsH\">13133\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">:\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">13133\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">p \u003C\u002Fspan>\u003Cspan class=\"s0PsH\">16686\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">:\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">16686\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">p \u003C\u002Fspan>\u003Cspan class=\"s0PsH\">4317\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">:\u003C\u002Fspan>\u003Cspan class=\"s0PsH\">55680\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">d \u003C\u002Fspan>\u003Cspan class=\"snCLD\">--\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">restart\u003C\u002Fspan>\u003Cspan class=\"snCLD\">=\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">unless\u003C\u002Fspan>\u003Cspan class=\"snCLD\">-\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">stopped jaegertracing\u003C\u002Fspan>\u003Cspan class=\"snCLD\">\u002F\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">opentelemetry\u003C\u002Fspan>\u003Cspan class=\"snCLD\">-\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">all\u003C\u002Fspan>\u003Cspan class=\"snCLD\">-\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">in\u003C\u002Fspan>\u003Cspan class=\"snCLD\">-\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">one\n\u003C\u002Fspan>\u003C\u002Fspan>",[74,138,139],{},"I've also opened up a few ports to the Docker container:",[141,142,143,149,155],"ul",{},[48,144,145,148],{},[119,146,147],{},"4317"," - Open Telemetry Protocol (OTLP) receiver where we expect to receive Open Telemetry data.",[48,150,151,154],{},[119,152,153],{},"16686"," - Dashboard where users can see visualisations.",[48,156,157,160],{},[119,158,159],{},"13133"," - Jaeger health check.",[162,163,167,172],"div",{"className":164},[165,166],"custom-block","warning",[74,168,171],{"className":169},[170],"custom-block-title","Warning",[74,173,174,175,178,179,181],{},"The default port used by the Open Telemetry Protocol has recently been changed from ",[127,176,177],{},"55680"," to ",[127,180,147],{},". This change has not yet been made in Jaeger which uses the older port number.",[85,183,185,189],{"id":184,"data-section-heading":88},"exporting-from-net",[90,186,188],{"className":187},[93],"Exporting from .NET",[96,190,192],{"href":191,"label":99},"#exporting-from-net",[101,193,194],{"xmlns":103,"xmlns:xlink":104,"viewBox":105,"version":106,"width":107,"height":107,"aria-hidden":108},[110,195],{"fill":112,"fill-rule":113,"d":114},[74,197,198,199,202,203,206],{},"In the ",[51,200,201],{"href":59},"last post"," I showed how we can collect Open Telemetry data in an ASP.NET Core application. I'm going to build on that example to export to Jaeger. To start with, we'll need to add an additional NuGet package called ",[127,204,205],{},"OpenTelemetry.Exporter.OpenTelemetryProtocol",":",[132,208],{"className":209,"language":210,"meta":88,"style":88,"html":211},"language-xml shiki shiki-themes light-plus monokai","xml","\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">PackageReference\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Include\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"OpenTelemetry.Exporter.Console\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Version\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"1.0.1\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">PackageReference\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Include\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"OpenTelemetry.Exporter.OpenTelemetryProtocol\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Version\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"1.0.1\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">PackageReference\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Include\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"OpenTelemetry.Extensions.Hosting\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Version\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"1.0.0-rc2\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">PackageReference\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Include\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"OpenTelemetry.Instrumentation.AspNetCore\"\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> Version\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"1.0.0-rc2\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\"> \u002F&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[74,213,214,215,218,219,222,223,225],{},"Then we can use the ",[127,216,217],{},"AddOtlpExporter"," method to configure where to export to. In this case, I'm exporting to ",[127,220,221],{},"http:\u002F\u002Flocalhost:4317"," where port ",[127,224,147],{}," is the default port used by the Open Telemetry Protocol. Ideally, we'd retrieve this value from configuration but I'm keeping things simple in this example.",[132,227],{"className":228,"language":229,"meta":88,"style":88,"html":230},"language-cs shiki shiki-themes light-plus monokai","cs","\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">services\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddOpenTelemetryTracing\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">    builder\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        builder\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">SetResourceBuilder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ResourceBuilder\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">CreateDefault\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddService\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">webHostEnvironment\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ApplicationName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">))\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddAspNetCoreInstrumentation\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddOtlpExporter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">options\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> options\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Endpoint\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Uri\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"http:\u002F\u002Flocalhost:4317\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">        if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">webHostEnvironment\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsDevelopment\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">())\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            builder\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddConsoleExporter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">options\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> options\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Targets\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> ConsoleExporterOutputTargets\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Debug\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    });\n\u003C\u002Fspan>\u003C\u002Fspan>",[85,232,234,238],{"id":233,"data-section-heading":88},"the-dashboard",[90,235,237],{"className":236},[93],"The Dashboard",[96,239,241],{"href":240,"label":99},"#the-dashboard",[101,242,243],{"xmlns":103,"xmlns:xlink":104,"viewBox":105,"version":106,"width":107,"height":107,"aria-hidden":108},[110,244],{"fill":112,"fill-rule":113,"d":114},[74,246,247,248,251],{},"We can now fire up the Jaeger dashboard in our browser which we can access at ",[127,249,250],{},"http:\u002F\u002Flocalhost:16686",". If we execute some request\u002Fresponse cycles in our application where we have added Open Telemetry support, we can see the telemetry for each request\u002Fresponse:",[74,253,254],{},[255,256],"img",{"alt":257,"src":258,"width":259,"height":260,"loading":261},"The Jaeger dashboard showing request\u002Fresponse cycles","\u002Fcontent-images\u002Fposts\u002F2021\u002Fexporting-open-telemetry-data-to-jaeger\u002Fimages\u002FJaeger-Dashboard-1903x1086.png",1903,1086,"lazy",[74,263,264],{},"If we drill down into a particular request\u002Fresponse trace, we can view the spans (in this simple example, there is only one) and all attributes associated with the span. This is the same data we saw in the debug output from my previous post:",[74,266,267],{},[255,268],{"alt":257,"src":269,"width":270,"height":271,"loading":261},"\u002Fcontent-images\u002Fposts\u002F2021\u002Fexporting-open-telemetry-data-to-jaeger\u002Fimages\u002FJaeger-Dashboard-Span-1903x800.png",1920,800,[85,273,275,279],{"id":274,"data-section-heading":88},"up-next",[90,276,278],{"className":277},[93],"Up Next",[96,280,282],{"href":281,"label":99},"#up-next",[101,283,284],{"xmlns":103,"xmlns:xlink":104,"viewBox":105,"version":106,"width":107,"height":107,"aria-hidden":108},[110,285],{"fill":112,"fill-rule":113,"d":114},[74,287,288],{},"In this post, I've shown how you can quickly fire up Jaeger and how you can get an ASP.NET Core app to export Open Telemetry data to it. In my next final post I'll discuss optimally configuring Open Telemetry for an ASP.NET application.",[290,291,292],"style",{},"html pre.shiki code .sjLUg, html code.shiki .sjLUg{--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .snCLD, html code.shiki .snCLD{--shiki-default:#000000;--shiki-dark:#F92672}html pre.shiki code .s0PsH, html code.shiki .s0PsH{--shiki-default:#098658;--shiki-dark:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sNflI, html code.shiki .sNflI{--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .sjbfc, html code.shiki .sjbfc{--shiki-default:#800000;--shiki-dark:#F92672}html pre.shiki code .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}html pre.shiki code .squEy, html code.shiki .squEy{--shiki-default:#0000FF;--shiki-dark:#E6DB74}html pre.shiki code .sFrd5, html code.shiki .sFrd5{--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sWm5y, html code.shiki .sWm5y{--shiki-default:#795E26;--shiki-dark:#A6E22E}html pre.shiki code .sJvqV, html code.shiki .sJvqV{--shiki-default:#0000FF;--shiki-dark:#F92672}html pre.shiki code .sw29p, html code.shiki .sw29p{--shiki-default:#267F99;--shiki-default-text-decoration:inherit;--shiki-dark:#A6E22E;--shiki-dark-text-decoration:underline}html pre.shiki code .swiDo, html code.shiki .swiDo{--shiki-default:#A31515;--shiki-dark:#E6DB74}html pre.shiki code .smL5M, html code.shiki .smL5M{--shiki-default:#AF00DB;--shiki-dark:#F92672}",{"title":88,"searchDepth":294,"depth":294,"links":295},2,[],{"issue":297,"comments":301},{"number":298,"title":299,"html_url":300},262,"[Comment] Exporting Open Telemetry Data to Jaeger","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262",[302,315,323,335,346,358,367],{"id":303,"html_url":304,"body_html":305,"created_at":306,"updated_at":307,"author_association":308,"user":309,"reactions":313},788640208,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-788640208","\u003Cp>I ran the docker for jaeger with following command as given in the post\u003Cbr \u002F>\ndocker run --name jaeger -p 13133:13133 -p 16686:16686 -p 4317:55680 -d --restart=unless-stopped jaegertracing\u002Fopentelemetry-all-in-one\u003C\u002Fp>\n\u003Cp>and configure the otlp exporter to \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:4317\u002F\">http:\u002F\u002Flocalhost:4317\u003C\u002Fa> in my api.\u003Cbr \u002F>\nI could see the telemetry in the console of my api.\u003Cbr \u002F>\nBut I could not see the same of my api in \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:16686\u002F\">http:\u002F\u002Flocalhost:16686\u002F\u003C\u002Fa>. the only service I could see is 'jaeger-query' in \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:16686\u002F\">http:\u002F\u002Flocalhost:16686\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>what could be missing?\u003C\u002Fp>","2021-03-02T06:05:32Z","2021-03-02T06:09:51Z","NONE",{"login":310,"avatar_url":311,"html_url":312},"martinmani","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F28119985?v=4","https:\u002F\u002Fgithub.com\u002Fmartinmani",{"url":314,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F788640208\u002Freactions",{"id":316,"html_url":317,"body_html":318,"created_at":319,"updated_at":319,"author_association":308,"user":320,"reactions":321},788656139,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-788656139","\u003Cp>I changed to the following and found working :)\u003Cbr \u002F>\ndocker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775\u002Fudp  -p 6831:6831\u002Fudp  -p 6832:6832\u002Fudp  -p 5778:5778 -p 16686:16686  -p 14268:14268 -p 14250:14250 -p 9411:9411  jaegertracing\u002Fall-in-one:1.22\u003C\u002Fp>\n\u003Cp>And in the api use AddJaegerExporter() instead of AddOtlpExporter(options =&gt; options.Endpoint = new Uri(\"\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Flocalhost:4317\u002F\">http:\u002F\u002Flocalhost:4317\u003C\u002Fa>\"))\u003C\u002Fp>","2021-03-02T06:37:50Z",{"login":310,"avatar_url":311,"html_url":312},{"url":322,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F788656139\u002Freactions",{"id":324,"html_url":325,"body_html":326,"created_at":327,"updated_at":327,"author_association":308,"user":328,"reactions":332},825424677,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-825424677","\u003Cp>I am using Serilog for logging - I enrich all the logs with TraceID and SpanID of Http Request. I am using Prometheus.NET to collect metrics.\u003Cbr \u002F>\nHow do I leverage OpenTelemetry.NET in this setup?\u003C\u002Fp>\n\u003Cp>Can I use OpenTelemetry to collect metrics as well?\u003Cbr \u002F>\nCan existing logs from application through Serilog can also be used Telemetry?\u003Cbr \u002F>\nI also have one more problem-\u003Cbr \u002F>\nI receive messages from Third Party MF system to my kafka queue. Each message has its own unique id. There is .Net core kafka message processor which reads message from Queue and call a multiple Web Apis.\u003Cbr \u002F>\nHow do I assign unique Id of message to System.Diagnostics.Activity.TraceID in Kafak .Net processor, so any HttpClient call made from this exe to any API get that copied over via request headers.\u003C\u002Fp>\n\u003Cp>Alternatively please also let me know if I am approaching the problem in wrong way and there is already a standard solution for this kind of problem.\u003C\u002Fp>\n\u003Cp>I really appreciate your time and help in above queries\u003C\u002Fp>","2021-04-23T06:33:13Z",{"login":329,"avatar_url":330,"html_url":331},"ElectricVampire","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F34921378?v=4","https:\u002F\u002Fgithub.com\u002FElectricVampire",{"url":333,"total_count":334,"+1":334,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F825424677\u002Freactions",1,{"id":336,"html_url":337,"body_html":338,"created_at":339,"updated_at":339,"author_association":308,"user":340,"reactions":344},825525054,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-825525054","\u003Cp>The series of articles is very interesting and to the point. Great work! However it is mostly focused on the area of OpenTelemetry dedicated to distributed tracing. In the examples above there is no explanation as to how application logs can be also sent and correlated with the tracing capabilities of Jaeger. In fact, when using this configuration along with a \u003Ccode>ILogger\u003C\u002Fcode> and trying to log information, the Console logger configuration does not log the messages.\u003C\u002Fp>\n\u003Cp>How would you achieve correlation between Logs and Traces based in this configuration and using Jaeger?\u003C\u002Fp>","2021-04-23T09:20:13Z",{"login":341,"avatar_url":342,"html_url":343},"neoaisac","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7813966?v=4","https:\u002F\u002Fgithub.com\u002Fneoaisac",{"url":345,"total_count":334,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":334,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F825525054\u002Freactions",{"id":347,"html_url":348,"body_html":349,"created_at":350,"updated_at":350,"author_association":351,"user":352,"reactions":356},825573393,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-825573393","\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FElectricVampire\">@ElectricVampire\u003C\u002Fa> Open Telemetry metrics are still a work in progress. You can push logs via Open Telemetry so they show up in tools like Jaeger but this is not currently working out of the box. \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-dotnet\u002Fissues\u002F1739\">open-telemetry\u002Fopentelemetry-dotnet#1739\u003C\u002Fa> talks about adding logging support and how Serilog fits into the picture (hint: we might not need Serilog anymore!). If you have ID's that you want to relate to a trace, you can \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002Fdeep-dive-into-open-telemetry-for-net\u002F#attributes\">add them easily as attributes\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002Fneoaisac\">@neoaisac\u003C\u002Fa> I'm glad you found the resource useful! \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-dotnet\u002Fissues\u002F1739\">open-telemetry\u002Fopentelemetry-dotnet#1739\u003C\u002Fa> talks about adding logging support and how Serilog fits into the picture (hint: we might not need Serilog anymore!).\u003C\u002Fp>","2021-04-23T10:48:04Z","OWNER",{"login":353,"avatar_url":354,"html_url":355},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":357,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F825573393\u002Freactions",{"id":359,"html_url":360,"body_html":361,"created_at":362,"updated_at":363,"author_association":308,"user":364,"reactions":365},826499672,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-826499672","\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FRehanSaeed\">@RehanSaeed\u003C\u002Fa> : Thanks for reply,\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>If you have ID's that you want to relate to a trace, you can add them easily as attributes.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>But in that case it won't be used by .net FW. For example if I receive a message from queue -&gt; I read unique ID from message -&gt; I create an activity and assign attribute -&gt; then make a Http web API call within the scope of Activity\u003Cbr \u002F>\nAccording to the code which I understood from HttpClient it will read and copy the Activity.TraceId in header and not from custom attribute.\u003Cbr \u002F>\nSo is there any way by which .NetFw(specially HttpClient) can be configured to use my unique message Id rather than system generated TraceID)\u003Cbr \u002F>\nThanks again for your time on query.\u003C\u002Fp>","2021-04-26T04:55:53Z","2021-04-26T04:56:09Z",{"login":329,"avatar_url":330,"html_url":331},{"url":366,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F826499672\u002Freactions",{"id":368,"html_url":369,"body_html":370,"created_at":371,"updated_at":371,"author_association":351,"user":372,"reactions":373},826674302,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F262#issuecomment-826674302","\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FElectricVampire\">@ElectricVampire\u003C\u002Fa> You can use \u003Ccode>HttpContext.TraceIdentifier = foo\u003C\u002Fcode> for that.\u003C\u002Fp>","2021-04-26T09:31:11Z",{"login":353,"avatar_url":354,"html_url":355},{"url":374,"total_count":334,"+1":334,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F826674302\u002Freactions","2021-02-11T00:00:00+00:00",null,"How to optimally export Open Telemetry metrics, logs, and traces for .NET to Jaeger.","md",[380,381,382,383],{"depth":334,"value":94},{"depth":334,"value":188},{"depth":334,"value":237},{"depth":334,"value":278},"\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",{},true,"posts\u002F2021\u002Fexporting-open-telemetry-data-to-jaeger\u002Findex",[389,390,391,392,393,394,395,396,397,398,399],"Open Telemetry",".NET",".NET Core","ASP.NET Core","Metrics","Logging","Tracing","Distributed Tracing","Span","Activity","Jaeger",3,[402,406,410,414,419,422,425,429,433,437,440,444,449,452,455,459,463,467,470,474,478,482,485,490,495,499,502,505,508,513,517,520,525,529,533,537,540,544,548,552,556,560,564,568,571,575,579,583,587,590,594,598,601,604,608,612,617,621,625,629,633,637,641,644,647,650,654,658,661,665,668,671,674,677,681,685,688,691,695,699,702,705,708,712,716,720,724,727,730,733,735,736,740,743,747,751,754,758,761,763,767,771,775,779],{"title":403,"permalink":404,"heroImage":405,"timeToRead":334},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":407,"permalink":408,"heroImage":409,"timeToRead":294},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":411,"permalink":412,"heroImage":413,"timeToRead":400},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",{"title":415,"permalink":416,"heroImage":417,"timeToRead":418},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Freactive-extensions-part1-replacing-events\u002F","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",4,{"title":420,"permalink":421,"heroImage":417,"timeToRead":400},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":423,"permalink":424,"heroImage":417,"timeToRead":294},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":426,"permalink":427,"heroImage":428,"timeToRead":400},"WPF Metro Part 1 - Modern UI for WPF","\u002Fwpf-metro-part1-modern-ui-for-wpf\u002F","\u002Fimages\u002Fhero\u002FModern-UI-for-WPF-1366x768.png",{"title":430,"permalink":431,"heroImage":432,"timeToRead":400},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":434,"permalink":435,"heroImage":436,"timeToRead":400},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":438,"permalink":439,"heroImage":417,"timeToRead":400},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":441,"permalink":442,"heroImage":443,"timeToRead":294},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":445,"permalink":446,"heroImage":447,"timeToRead":448},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":450,"permalink":451,"heroImage":417,"timeToRead":418},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":453,"permalink":454,"heroImage":409,"timeToRead":448},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":456,"permalink":457,"heroImage":417,"timeToRead":458},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":460,"permalink":461,"heroImage":462,"timeToRead":334},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":464,"permalink":465,"heroImage":466,"timeToRead":458},"Model-View-ViewModel (MVVM) - Part 1 - Overview","\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{"title":468,"permalink":469,"heroImage":466,"timeToRead":418},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable","\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F",{"title":471,"permalink":472,"heroImage":466,"timeToRead":473},"Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F",11,{"title":475,"permalink":476,"heroImage":477,"timeToRead":400},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":479,"permalink":480,"heroImage":466,"timeToRead":481},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F",12,{"title":483,"permalink":484,"heroImage":447,"timeToRead":418},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":486,"permalink":487,"heroImage":488,"timeToRead":489},"ASP.NET Core Boilerplate","\u002Fasp-net-mvc-boilerplate\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":491,"permalink":492,"heroImage":493,"timeToRead":494},"Internet Favicon Madness (Updated)","\u002Finternet-favicon-madness\u002F","\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":496,"permalink":497,"heroImage":498,"timeToRead":489},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":500,"permalink":501,"heroImage":498,"timeToRead":400},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":503,"permalink":504,"heroImage":488,"timeToRead":473},"Securing the ASP.NET MVC Web.config","\u002Fsecuring-the-aspnet-mvc-web-config\u002F",{"title":506,"permalink":507,"heroImage":417,"timeToRead":294},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":509,"permalink":510,"heroImage":511,"timeToRead":512},"NWebSec ASP.NET MVC Security Through HTTP Headers","\u002Fnwebsec-asp-net-mvc-security-through-http-headers\u002F","\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",6,{"title":514,"permalink":515,"heroImage":516,"timeToRead":107},"Content Security Policy (CSP) for ASP.NET MVC","\u002Fcontent-security-policy-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":518,"permalink":519,"heroImage":409,"timeToRead":458},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":521,"permalink":522,"heroImage":523,"timeToRead":524},"Building RSS\u002FAtom Feeds for ASP.NET MVC","\u002Fbuilding-rssatom-feeds-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":526,"permalink":527,"heroImage":528,"timeToRead":473},"Canonical URL's for ASP.NET MVC","\u002Fcanonical-urls-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{"title":530,"permalink":531,"heroImage":532,"timeToRead":418},"Dynamically Generating Robots.txt Using ASP.NET MVC","\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{"title":534,"permalink":535,"heroImage":536,"timeToRead":418},"Minifying HTML for ASP.NET MVC","\u002Fminifying-html-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FThe-Internet-Is-A-Series-Of-Tubes-1366x768.jpg",{"title":538,"permalink":539,"heroImage":488,"timeToRead":294},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":541,"permalink":542,"heroImage":543,"timeToRead":489},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":545,"permalink":546,"heroImage":547,"timeToRead":294},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":549,"permalink":550,"heroImage":551,"timeToRead":334},".NET Big-O Algorithm Complexity Cheat Sheet","\u002Fnet-big-o-algorithm-complexity-cheat-sheet\u002F","\u002Fimages\u002Fhero\u002FNET-Big-O-Algorithm-Complexity-Cheat-Sheet-1366x768.jpg",{"title":553,"permalink":554,"heroImage":555,"timeToRead":400},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":557,"permalink":558,"heroImage":559,"timeToRead":334},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":561,"permalink":562,"heroImage":563,"timeToRead":294},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":565,"permalink":566,"heroImage":567,"timeToRead":400},"Subresource Integrity TagHelper Using ASP.NET Core - Part 1","\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FMake-Security-Easy-1366x768.png",{"title":569,"permalink":570,"heroImage":567,"timeToRead":418},"Subresource Integrity TagHelper Using ASP.NET Core - Part 2","\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F",{"title":572,"permalink":573,"heroImage":574,"timeToRead":458},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":576,"permalink":577,"heroImage":578,"timeToRead":512},"Azure Active Directory Versus Identity Server","\u002Fazure-active-directory-versus-identity-server\u002F","\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{"title":580,"permalink":581,"heroImage":582,"timeToRead":294},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":584,"permalink":585,"heroImage":586,"timeToRead":473},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":588,"permalink":589,"heroImage":409,"timeToRead":294},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":591,"permalink":592,"heroImage":593,"timeToRead":418},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":595,"permalink":596,"heroImage":597,"timeToRead":489},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":599,"permalink":600,"heroImage":417,"timeToRead":334},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":602,"permalink":603,"heroImage":409,"timeToRead":418},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":605,"permalink":606,"heroImage":607,"timeToRead":448},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":609,"permalink":610,"heroImage":611,"timeToRead":489},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":613,"permalink":614,"heroImage":615,"timeToRead":616},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":618,"permalink":619,"heroImage":620,"timeToRead":418},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":622,"permalink":623,"heroImage":624,"timeToRead":294},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":626,"permalink":627,"heroImage":628,"timeToRead":512},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":630,"permalink":631,"heroImage":632,"timeToRead":294},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":634,"permalink":635,"heroImage":636,"timeToRead":458},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":638,"permalink":639,"heroImage":640,"timeToRead":334},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":642,"permalink":643,"heroImage":640,"timeToRead":400},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":645,"permalink":646,"heroImage":640,"timeToRead":418},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":648,"permalink":649,"heroImage":640,"timeToRead":458},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":651,"permalink":652,"heroImage":653,"timeToRead":418},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":655,"permalink":656,"heroImage":657,"timeToRead":458},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":659,"permalink":660,"heroImage":409,"timeToRead":294},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":662,"permalink":663,"heroImage":664,"timeToRead":294},".NET Boxed","\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":666,"permalink":667,"heroImage":409,"timeToRead":294},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":669,"permalink":670,"heroImage":409,"timeToRead":400},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":672,"permalink":673,"heroImage":409,"timeToRead":334},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":675,"permalink":676,"heroImage":409,"timeToRead":616},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":678,"permalink":679,"heroImage":680,"timeToRead":489},"PluralSight vs LinkedIn Learning vs FrontendMasters vs Egghead.io vs YouTube","\u002Fpluralsight-vs-linkedin-learning-vs-frontendmasters-vs-egghead-io-vs-youtube\u002F","\u002Fimages\u002Fhero\u002FOnline-Learning-1366x768.png",{"title":682,"permalink":683,"heroImage":684,"timeToRead":616},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":686,"permalink":687,"heroImage":664,"timeToRead":616},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":689,"permalink":690,"heroImage":640,"timeToRead":334},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":692,"permalink":693,"heroImage":694,"timeToRead":418},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":696,"permalink":697,"heroImage":698,"timeToRead":489},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":700,"permalink":701,"heroImage":409,"timeToRead":400},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":703,"permalink":704,"heroImage":664,"timeToRead":458},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":706,"permalink":707,"heroImage":409,"timeToRead":418},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":709,"permalink":710,"heroImage":711,"timeToRead":489},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":713,"permalink":714,"heroImage":715,"timeToRead":294},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":717,"permalink":718,"heroImage":719,"timeToRead":458},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":721,"permalink":722,"heroImage":723,"timeToRead":458},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":725,"permalink":726,"heroImage":462,"timeToRead":512},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":728,"permalink":729,"heroImage":409,"timeToRead":400},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":731,"permalink":53,"heroImage":384,"timeToRead":732},"Deep Dive into Open Telemetry for .NET",10,{"title":734,"permalink":59,"heroImage":384,"timeToRead":400},"Open Telemetry for ASP.NET Core",{"title":39,"permalink":65,"heroImage":384,"timeToRead":400},{"title":737,"permalink":738,"heroImage":739,"timeToRead":400},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":741,"permalink":742,"heroImage":739,"timeToRead":512},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":744,"permalink":745,"heroImage":746,"timeToRead":418},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":748,"permalink":749,"heroImage":750,"timeToRead":294},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":752,"permalink":753,"heroImage":498,"timeToRead":334},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":755,"permalink":756,"heroImage":757,"timeToRead":400},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":759,"permalink":760,"heroImage":409,"timeToRead":400},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":762,"permalink":71,"heroImage":384,"timeToRead":418},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core",{"title":764,"permalink":765,"heroImage":766,"timeToRead":294},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":768,"permalink":769,"heroImage":770,"timeToRead":294},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":772,"permalink":773,"heroImage":774,"timeToRead":418},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"title":776,"permalink":777,"heroImage":778,"timeToRead":334},"AI Gone Rogue","\u002Fai-gone-rogue\u002F","\u002Fimages\u002Fhero\u002FHAL-9000-Prop-1600x900.png",{"title":780,"permalink":781,"heroImage":782,"timeToRead":458},"AI Learnings from Upgrading My Blog","\u002Fai-learnings-from-upgrading-my-blog\u002F","\u002Fimages\u002Fhero\u002FAI-Agents-Upgrading-a-Blog-With-Human-Code-Review-1600x900.png",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":784},"\u003Cpath fill=\"currentColor\" d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.55 96.55 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.3 96.3 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96s-42.981-96-96-96\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":786},"\u003Cpath fill=\"currentColor\" d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48c27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":788},"\u003Cpath fill=\"currentColor\" d=\"M459.37 151.716c.325 4.548.325 9.097.325 13.645c0 138.72-105.583 298.558-298.558 298.558c-59.452 0-114.68-17.219-161.137-47.106c8.447.974 16.568 1.299 25.34 1.299c49.055 0 94.213-16.568 130.274-44.832c-46.132-.975-84.792-31.188-98.112-72.772c6.498.974 12.995 1.624 19.818 1.624c9.421 0 18.843-1.3 27.614-3.573c-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319c-28.264-18.843-46.781-51.005-46.781-87.391c0-19.492 5.197-37.36 14.294-52.954c51.655 63.675 129.3 105.258 216.365 109.807c-1.624-7.797-2.599-15.918-2.599-24.04c0-57.828 46.782-104.934 104.934-104.934c30.213 0 57.502 12.67 76.67 33.137c23.715-4.548 46.456-13.32 66.599-25.34c-7.798 24.366-24.366 44.833-46.132 57.827c21.117-2.273 41.584-8.122 60.426-16.243c-14.292 20.791-32.161 39.308-52.628 54.253\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":790},"\u003Cpath fill=\"currentColor\" d=\"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6c0-13.8 11.1-24.9 24.9-24.9c13.6 0 24.6 11.1 24.6 24.9c0 13.6-11.1 24.6-24.6 24.6M504 256c0 137-111 248-248 248S8 393 8 256S119 8 256 8s248 111 248 248m-132.3-41.2c-9.4 0-17.7 3.9-23.8 10c-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3l55.4 12.5c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8c-6.1-6.4-14.7-10.2-24.1-10.2c-34.9 0-46.3 46.9-14.4 62.8c-1.1 5-1.7 10.2-1.7 15.5c0 52.6 59.2 95.2 132 95.2c73.1 0 132.3-42.6 132.3-95.2c0-5.3-.6-10.8-1.9-15.8c31.3-16 19.8-62.5-14.9-62.5M302.8 331c-18.2 18.2-76.1 17.9-93.6 0c-2.2-2.2-6.1-2.2-8.3 0c-2.5 2.5-2.5 6.4 0 8.6c22.8 22.8 87.3 22.8 110.2 0c2.5-2.2 2.5-6.1 0-8.6c-2.2-2.2-6.1-2.2-8.3 0m7.7-75c-13.6 0-24.6 11.1-24.6 24.9c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.1 24.9-24.6c0-13.8-11-24.9-24.9-24.9\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":792},"\u003Cpath fill=\"currentColor\" d=\"M512 194.8c0 101.3-82.4 183.8-183.8 183.8c-101.7 0-184.4-82.4-184.4-183.8c0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8M0 501.5h90v-491H0z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":794},"\u003Cpath fill=\"currentColor\" d=\"m20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379c-.197-.069-.42-.098-.57-.241c-.152-.143-.196-.366-.231-.572c-.065-.378-.125-.756-.192-1.133c-.057-.325-.102-.69-.25-.987c-.195-.4-.597-.634-.996-.788a6 6 0 0 0-.626-.194c-1-.263-2.05-.36-3.077-.416a26 26 0 0 0-3.7.062c-.915.083-1.88.184-2.75.5c-.318.116-.646.256-.888.501c-.297.302-.393.77-.177 1.146c.154.267.415.456.692.58c.36.162.737.284 1.123.366c1.075.238 2.189.331 3.287.37q1.829.074 3.65-.118q.449-.05.896-.119c.352-.054.578-.513.474-.834c-.124-.383-.457-.531-.834-.473c-.466.074-.96.108-1.382.146q-1.767.12-3.536.006a22 22 0 0 1-1.157-.107c-.086-.01-.18-.025-.258-.036q-.364-.055-.724-.13c-.111-.027-.111-.185 0-.212h.005q.416-.09.838-.147h.002c.131-.009.263-.032.394-.048a25 25 0 0 1 3.426-.12q1.011.029 2.017.144l.228.031q.4.06.798.145c.392.085.895.113 1.07.542c.055.137.08.288.111.431l.319 1.484a.237.237 0 0 1-.199.284h-.003l-.112.015a37 37 0 0 1-4.743.295a37 37 0 0 1-4.699-.304c-.14-.017-.293-.042-.417-.06c-.326-.048-.649-.108-.973-.161c-.393-.065-.768-.032-1.123.161c-.29.16-.527.404-.675.701c-.154.316-.199.66-.267 1c-.069.34-.176.707-.135 1.056c.087.753.613 1.365 1.37 1.502a39.7 39.7 0 0 0 11.343.376a.483.483 0 0 1 .535.53l-.071.697l-1.018 9.907c-.041.41-.047.832-.125 1.237c-.122.637-.553 1.028-1.182 1.171q-.868.197-1.756.205c-.656.004-1.31-.025-1.966-.022c-.699.004-1.556-.06-2.095-.58c-.475-.458-.54-1.174-.605-1.793l-.731-7.013l-.322-3.094c-.037-.351-.286-.695-.678-.678c-.336.015-.718.3-.678.679l.228 2.185l.949 9.112c.147 1.344 1.174 2.068 2.446 2.272c.742.12 1.503.144 2.257.156c.966.016 1.942.053 2.892-.122c1.408-.258 2.465-1.198 2.616-2.657l1.024-9.995l.215-2.087a.48.48 0 0 1 .39-.426c.402-.078.787-.212 1.074-.518c.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233c-2.416.359-4.866.54-7.308.46c-1.748-.06-3.477-.254-5.207-.498c-.17-.024-.353-.055-.47-.18c-.22-.236-.111-.71-.054-.995c.052-.26.152-.609.463-.646c.484-.057 1.046.148 1.526.22q.865.132 1.737.212c2.48.226 5.002.19 7.472-.14q.675-.09 1.345-.21c.399-.072.84-.206 1.08.206c.166.281.188.657.162.974a.54.54 0 0 1-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a6 6 0 0 1-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38c0 0 1.243.065 1.658.065c.447 0 1.786-.065 1.786-.065c.783 0 1.434-.6 1.499-1.38l.94-9.95a4 4 0 0 0-1.322-.238c-.826 0-1.491.284-2.26.613\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":796},"\u003Cpath fill=\"currentColor\" d=\"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134c-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9c152.3 0 165.1-3.7 204 11.4c60.1 23.3 65.6 79.5 44 140.3c-21.5 62.6-72.5 89.5-140.1 90.3c-43.4.7-69.5-7-75.3 24.2M357.1 152c-1.8-1.3-2.5-1.8-3 1.3c-2 11.4-5.1 22.5-8.8 33.6c-39.9 113.8-150.5 103.9-204.5 103.9c-6.1 0-10.1 3.3-10.9 9.4c-22.6 140.4-27.1 169.7-27.1 169.7c-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9c.7-5.4-1.1 6.1 14.4-91.3c4.6-22 14.3-19.7 29.3-19.7c71 0 126.4-28.8 142.9-112.3c6.5-34.8 4.6-71.4-23.8-92.6\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":798},"\u003Cpath fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8m0 448c-110.532 0-200-89.431-200-200c0-110.495 89.472-200 200-200c110.491 0 200 89.471 200 200c0 110.53-89.431 200-200 200m107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516c17.561-9.845 28.324-16.541 28.324-29.579c0-17.246-21.999-28.693-39.784-28.693c-23.189 0-33.894 10.977-48.942 29.969c-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8M298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42s18.841-42 42-42s42 18.841 42 42\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":800},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 12H5m7 7l-7-7l7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":802},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1794232716089]