<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Stas Sultanov</title>
    <description>The latest articles on Forem by Stas Sultanov (@stas-sultanov).</description>
    <link>https://forem.com/stas-sultanov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg</url>
      <title>Forem: Stas Sultanov</title>
      <link>https://forem.com/stas-sultanov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/stas-sultanov"/>
    <language>en</language>
    <item>
      <title>Serving RSA and ECDSA from One ASP.NET Core Kestrel Endpoint</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Mon, 30 Mar 2026 07:57:39 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/serving-rsa-and-ecdsa-from-one-aspnet-core-kestrel-endpoint-2bk5</link>
      <guid>https://forem.com/stas-sultanov/serving-rsa-and-ecdsa-from-one-aspnet-core-kestrel-endpoint-2bk5</guid>
      <description>&lt;p&gt;Most web servers are built for clients whose security behavior is handled by mainstream general-purpose operating systems.&lt;br&gt;
In that world, TLS handling by the web server is usually straightforward: one server name, one endpoint, one certificate chain, and broad interoperability across the signature schemes those stacks support.&lt;/p&gt;

&lt;p&gt;The situation is different when clients fall outside that mainstream.&lt;br&gt;
In IoT, device fleets, industrial gateways, legacy SDKs, or application-to-application integrations, clients often have hard restrictions on which server authentication algorithms, certificate public key types, and certificate signature schemes they can use.&lt;/p&gt;

&lt;p&gt;One important subset of those cases concerns the signature algorithms supported by the client.&lt;br&gt;
Cryptographic algorithms evolved over time, and different generations of clients ended up with support for different sets of algorithms.&lt;br&gt;
As a result, one client may support only RSA, another may support only ECDSA, and a third may support both.&lt;/p&gt;

&lt;p&gt;When implementing a web server that must serve all those clients, this creates a specific requirement for the server.&lt;br&gt;
During the TLS handshake, it must inspect the client's capabilities and present a certificate with a signature algorithm that the client supports.&lt;/p&gt;

&lt;p&gt;This article is about how to handle that requirement directly in ASP.NET Core Kestrel, without moving certificate management into a reverse proxy, external gateway, or other edge tier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: ASP.NET Core implementation, and most of the information available on this topic, focus on SNI-based certificate selection, where different server names map to different certificates, which is not the case here.&lt;br&gt;
Because of that, most people and LLM-based AI assistants conclude that this scenario is impossible to implement in ASP.NET Core Kestrel.&lt;/p&gt;

&lt;p&gt;Note: The reader should have a deep understanding of TLS, especially the negotiation phase of the handshake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Visualization
&lt;/h3&gt;

&lt;p&gt;The visualization below illustrates the exact case addressed in this article.&lt;br&gt;
The backend exposes one endpoint and clients have different capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mermaid.live/edit#pako:eNqVVVFvqjAY_StNzd7QgECBZlmuMnjaXuaedrlZKlQl1paUks1r_O-3IEwRl9w9YPjOd3pOv9NGDjAVGYUYrpj4SDdEKvD0kvC7O8A1XiY8UcuqzDktyyexztPfCZy39f1SPjRYAv80PJJuKc_e9VOInKuaeoJA1EItM2U55epd7Qv6TjQtbGpQ12BWy74sZkBwtr_BX17x5x2f1D7h42J2Y1F6tSisFzXkSxvFymfCyZpKTX99WtSk3QloGDqUtRRV0aRSVsu1JMUGtGOfp23VLvVOdS_IGqrJtaqkjKhc8HIQDrgfjx_AdbKDTP6Pln5Pu8bAeDwG_f2fq1amP40eo1R71l6ZK7lfB1BuSEExWMlxmsv0eIuFMY4u9nQ21I1XNryLGp4VBcvTJrxBdrp9OvNBXN920qsOKctHugLt1SmVFFs6_sgztcHWxC0-jRbKiB5PSrLHXHDaonjkeK6LAmOVM4ZH0TTyY9NIBRMSj8zY8qaznose8ecWZuwhFLUWYRjPY6uzsGwncvoWF3H93GruuLbZTRNHsR16nZXn264Z96y6k_y5j207lut2Pn48i8Nhas1d664yaLhKEl4WROqj-tIKnJk9943-Hm7tAAGnMzmdWm3Ccr5dNEYZXZGKdcPgEXI8x58bw9mgAdcyzyBeEVZSA-6o3JG6hoeEA5BAtaE7mkCsXzMitwk0Tjgje1GprrGWmpPwo5YrCH8TYgf1fJUW1H9A682XfFVkRNHHXC8gZ4qOhMpQVFxBHDQKEB_gJ8RTbzpBVoAC07ZN10IuMuAeYsueuKYZOFNH__peYFtHA_5tTM1J4PhTFCDTRTZyA-QbkGa5EvL59N1oPh_Hf1B4NGo" rel="noopener noreferrer"&gt;Open in mermaid.live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVcFuozAU_BXLUW8QQQAHrKrahMKpvTQ9dVlVDjgJimMjY9Rmo_z7GgJNCKm0PSDx5o1n_MYWHGAqMgoxXDHxkW6IVODpJeF3d4BrvEx4opZVmXNalk9inae_Ezhv6_ulfGiwBP5peCTdUp6966cQOVc19QSBqIVaZspyytW72hf0nWha2NSgrsGsln1ZzIDgbH-Dv7zizzs-qX3Cx8XsxqL0alFYL2rIlzaKlc-EkzWVmv76tKhJuxPQMHQoaymqokmlrJZrSYoNaMc-T9uqXeqd6l6QNVSTa1VJGVG54OUgHHBvmg_gOtlBJv9HS7-nXWPANE3Q3_-5amX60-gxSrVn7ZW5kvt1AOWGFBSDlTTTXKbHWyyMcXSxp7Ohbryy4V3U8KwoWJ424Q2y0-3TmQ_i-raTXnVIWT7SFWivTqmk2FLzI8_UBttjr_g0WigjejwpyR5zwWmL4pE79TwUGKucMTyKJpEfW0YqmJB4ZMX2dDLruegRf25hxVOEotYiDON5bHcWtuNGbt_iIq6fW81dz7G6aeIodsJpZzX1Hc-Ke1bdSf7cx3Fc2_M6Hz-exeEwteaudVcZNFwlCS8LIvVRfWkF7syZ-0Z_D7d2gIDbmZxOrTZhOd8uGqOMrkjFumHwCLlT158bw9mgAdcyzyBeEVZSA-6o3JG6hoeEA5BAtaE7mkCsXzMitwk0Tjgje1GprrGWmpPwo5YrCH8TYgf1fJUW1B-g9eZLvioyouhjrheQM0VHQmUoKq4g9hoFiA_wE2JkjZEdTG3f99DEDlwHGXAPselMxm4QWBPXdnT0E985GvBvY2qNA9efoABZHnKQFyDfgDTLlZDPp_9G8_s4_gNQxzRq%3Ftype%3Dpng" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVcFuozAU_BXLUW8QQQAHrKrahMKpvTQ9dVlVDjgJimMjY9Rmo_z7GgJNCKm0PSDx5o1n_MYWHGAqMgoxXDHxkW6IVODpJeF3d4BrvEx4opZVmXNalk9inae_Ezhv6_ulfGiwBP5peCTdUp6966cQOVc19QSBqIVaZspyytW72hf0nWha2NSgrsGsln1ZzIDgbH-Dv7zizzs-qX3Cx8XsxqL0alFYL2rIlzaKlc-EkzWVmv76tKhJuxPQMHQoaymqokmlrJZrSYoNaMc-T9uqXeqd6l6QNVSTa1VJGVG54OUgHHBvmg_gOtlBJv9HS7-nXWPANE3Q3_-5amX60-gxSrVn7ZW5kvt1AOWGFBSDlTTTXKbHWyyMcXSxp7Ohbryy4V3U8KwoWJ424Q2y0-3TmQ_i-raTXnVIWT7SFWivTqmk2FLzI8_UBttjr_g0WigjejwpyR5zwWmL4pE79TwUGKucMTyKJpEfW0YqmJB4ZMX2dDLruegRf25hxVOEotYiDON5bHcWtuNGbt_iIq6fW81dz7G6aeIodsJpZzX1Hc-Ke1bdSf7cx3Fc2_M6Hz-exeEwteaudVcZNFwlCS8LIvVRfWkF7syZ-0Z_D7d2gIDbmZxOrTZhOd8uGqOMrkjFumHwCLlT158bw9mgAdcyzyBeEVZSA-6o3JG6hoeEA5BAtaE7mkCsXzMitwk0Tjgje1GprrGWmpPwo5YrCH8TYgf1fJUW1B-g9eZLvioyouhjrheQM0VHQmUoKq4g9hoFiA_wE2JkjZEdTG3f99DEDlwHGXAPselMxm4QWBPXdnT0E985GvBvY2qNA9efoABZHnKQFyDfgDTLlZDPp_9G8_s4_gNQxzRq%3Ftype%3Dpng" alt="intro visualization" width="661" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Common Approach
&lt;/h2&gt;

&lt;p&gt;This case is not unique and occurs frequently in some areas.&lt;br&gt;
It is often addressed by offloading TLS certificate management to a dedicated edge service placed in front of the web server.&lt;br&gt;
More specifically, that edge service is often a reverse proxy such as NGINX or HAProxy, a managed edge gateway such as Azure Application Gateway, or a Kubernetes Gateway implementation.&lt;/p&gt;

&lt;p&gt;While this approach certainly works, it also brings drawbacks, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one more network hop,&lt;/li&gt;
&lt;li&gt;one more system to provision,&lt;/li&gt;
&lt;li&gt;one more failure domain,&lt;/li&gt;
&lt;li&gt;one more place where TLS configuration can drift,&lt;/li&gt;
&lt;li&gt;one more operational surface that costs money and must be managed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In mutual TLS scenarios, this is even less attractive.&lt;br&gt;
Once certificate negotiation and identity extraction move to an edge service, authentication logic gets split across services.&lt;br&gt;
The edge service now owns part of the security model, while the application owns another part.&lt;br&gt;
This is especially problematic in regulated or protocol-driven environments that require strict end-to-end client authentication and certificate binding at the application layer.&lt;br&gt;
In zero-trust environments, it may also be unacceptable to leave traffic unencrypted between the edge service and the web server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visualization
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mermaid.live/edit#pako:eNqVVctuozAU_RXLUXdQ8X5YVTWEgGbRbiZdzTCqHHAICrGRcdRmovz7GAJNIInULCLic889h_uQ2cOUZQQiuCzZR7rCXICXXwl9eABU4nVCE7HY1gUldf3C8iL9k8Bpd35a8OcWS-DflofTNaHZu_xVrKCioR4hEHVQx0zLglDxLnYVeceSFrZn0JxB0Mj-mgeA0XJ3hb8Y8ac9Hzc-4WweXElKR0lhk9SSz21EWb9iinPCJf3tZd6QNkegZcim5Jxtq7Yr9XaRc1ytQFf2qdpO7YxCspzIeCQfX8FzuyPSpA7zcFWVRYpFwehPVjcNDU4IaKAzucGYBortQ748J2WbWV_MADyp6jMYD_Ci9d-jpbdpYwyoqgqGfTidOplhWbKMWuzKbjNHcj_2oF7hiiCw5Gpa8PRwjYUQis7e6WQoA2_l5cpL-KztF72T4eNqXbTrZiQdRXBdz8gSdBtaC87WRP0oMrFC-qNdfSodlGFZHud4hyijpEPRxHJt2_GVZVGWaBIZkRdrSspKxtFEi3XXCAYussT7LbTYdZyoswjDeBrrvYVuWpE1tDjf0rutppZtan01cRSbodtbuZ5pa_HAqp_k_T6maem23ft4cRCHl11rd61fZdByBce0rjCXo_rS8q3AnHrK8B2uvYEDrN7kOLWTSXNJ3HaY-a6rOd9wsIDZO_iGpWnRyWF0ndw2M2zHjKb3memRGXhtz8qCruetYUaWeFv2s0ETx3Itb6zbjAoqMOdFBtESlzVR4IbwDW7OcJ9QABIoVmQj704k_2aYrxOoHPES79hW9IGcS05CD1KuwvQ3Yxso69tKQXlt56sv-W2VYUFmhUzAJ4qcMOEh21IBkWu2EhDt4SdEjvbo6L6re57tGLpvmY4CdxCppvFo-b5mWLopV8nwzIMC_7Wu2qNveYbjO5pspWP7jswgWSEYfz1-btuv7uE_Jh6lrw" rel="noopener noreferrer"&gt;Open in mermaid.live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVctuozAU_RXLUXdQ8X5YVTWEgGbRbiZdzTCqHHAICrGRcdRmovz7GAJNIInULCLic889h_uQ2cOUZQQiuCzZR7rCXICXXwl9eABU4nVCE7HY1gUldf3C8iL9k8Bpd35a8OcWS-DflofTNaHZu_xVrKCioR4hEHVQx0zLglDxLnYVeceSFrZn0JxB0Mj-mgeA0XJ3hb8Y8ac9Hzc-4WweXElKR0lhk9SSz21EWb9iinPCJf3tZd6QNkegZcim5Jxtq7Yr9XaRc1ytQFf2qdpO7YxCspzIeCQfX8FzuyPSpA7zcFWVRYpFwehPVjcNDU4IaKAzucGYBortQ748J2WbWV_MADyp6jMYD_Ci9d-jpbdpYwyoqgqGfTidOplhWbKMWuzKbjNHcj_2oF7hiiCw5Gpa8PRwjYUQis7e6WQoA2_l5cpL-KztF72T4eNqXbTrZiQdRXBdz8gSdBtaC87WRP0oMrFC-qNdfSodlGFZHud4hyijpEPRxHJt2_GVZVGWaBIZkRdrSspKxtFEi3XXCAYussT7LbTYdZyoswjDeBrrvYVuWpE1tDjf0rutppZtan01cRSbodtbuZ5pa_HAqp_k_T6maem23ft4cRCHl11rd61fZdByBce0rjCXo_rS8q3AnHrK8B2uvYEDrN7kOLWTSXNJ3HaY-a6rOd9wsIDZO_iGpWnRyWF0ndw2M2zHjKb3memRGXhtz8qCruetYUaWeFv2s0ETx3Itb6zbjAoqMOdFBtESlzVR4IbwDW7OcJ9QABIoVmQj704k_2aYrxOoHPES79hW9IGcS05CD1KuwvQ3Yxso69tKQXlt56sv-W2VYUFmhUzAJ4qcMOEh21IBkd8qQLSHnxA52qOj-67uebZj6L5lOgrcQaSaxqPl-5ph6abcJMMzDwr815pqj77lGY7vaLKTju07MoNkhWD89fi1bT-6h_-GiKV-%3Ftype%3Dpng" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVctuozAU_RXLUXdQ8X5YVTWEgGbRbiZdzTCqHHAICrGRcdRmovz7GAJNIInULCLic889h_uQ2cOUZQQiuCzZR7rCXICXXwl9eABU4nVCE7HY1gUldf3C8iL9k8Bpd35a8OcWS-DflofTNaHZu_xVrKCioR4hEHVQx0zLglDxLnYVeceSFrZn0JxB0Mj-mgeA0XJ3hb8Y8ac9Hzc-4WweXElKR0lhk9SSz21EWb9iinPCJf3tZd6QNkegZcim5Jxtq7Yr9XaRc1ytQFf2qdpO7YxCspzIeCQfX8FzuyPSpA7zcFWVRYpFwehPVjcNDU4IaKAzucGYBortQ748J2WbWV_MADyp6jMYD_Ci9d-jpbdpYwyoqgqGfTidOplhWbKMWuzKbjNHcj_2oF7hiiCw5Gpa8PRwjYUQis7e6WQoA2_l5cpL-KztF72T4eNqXbTrZiQdRXBdz8gSdBtaC87WRP0oMrFC-qNdfSodlGFZHud4hyijpEPRxHJt2_GVZVGWaBIZkRdrSspKxtFEi3XXCAYussT7LbTYdZyoswjDeBrrvYVuWpE1tDjf0rutppZtan01cRSbodtbuZ5pa_HAqp_k_T6maem23ft4cRCHl11rd61fZdByBce0rjCXo_rS8q3AnHrK8B2uvYEDrN7kOLWTSXNJ3HaY-a6rOd9wsIDZO_iGpWnRyWF0ndw2M2zHjKb3memRGXhtz8qCruetYUaWeFv2s0ETx3Itb6zbjAoqMOdFBtESlzVR4IbwDW7OcJ9QABIoVmQj704k_2aYrxOoHPES79hW9IGcS05CD1KuwvQ3Yxso69tKQXlt56sv-W2VYUFmhUzAJ4qcMOEh21IBkd8qQLSHnxA52qOj-67uebZj6L5lOgrcQaSaxqPl-5ph6abcJMMzDwr815pqj77lGY7vaLKTju07MoNkhWD89fi1bT-6h_-GiKV-%3Ftype%3Dpng" alt="common approach visualziation" width="761" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Optimal Approach
&lt;/h2&gt;

&lt;p&gt;For the specific case discussed in this article, the optimal design is to keep certificate selection inside the application host.&lt;/p&gt;

&lt;p&gt;That produces a much cleaner model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no extra hop and no extra failure point.&lt;/li&gt;
&lt;li&gt;TLS management stays with the host that actually owns the endpoint.&lt;/li&gt;
&lt;li&gt;Certificate selection is implemented exactly where the handshake happens.&lt;/li&gt;
&lt;li&gt;In mutual TLS (mTLS) scenarios, client certificate negotiation and application-side identity handling are in one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Visualization
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mermaid.live/edit#pako:eNqVVdtuozAQ_RXLUd-g4n6xqmoJBe1D-7Lp0y6rygEnQSE2so3abJR_X0MgF5JK7UOUzPGZOZ4zQ9jBnBUEIrio2Hu-wlyC518ZvbsDVOEio5mcN6KkRIhntizzPxmc9vHDnD92WAb_djycrwkt3tSnZiWVLfUAgaSHemZelYTKN7mtyRtWtLiLQRuDqC37axYBRqvtDf58xJ8OfNzqxE-z6EZSPkqK26SOfC4jK_GCKV4Sruivz7OWtDkAHUOZsuSsqTtXRDNfclyvQN_2qdu-2hkF13VV5liWjP5kojUmOiGghY4557cYkIsBHMBWhvZf6lqcVF0tceUueND1RzAezZWpX6Pln9PGGNB1HVy2cor6MpdtqTaE3Fb9zo3K_dgBscI1QWDB9bzk-f4WCyGUnN3pJKgOXqvrZVbw2SCuvFPHh6W5suvTk3x0goV4IgvQ756QnK2J_l4WcoXMe7f-0HqowKo9zvEWUUZJj6KJ47uuF2qLsqrQJLGSIDW0nFWMo4mRmr4VXaioFr8vYaS-5yW9RByn09QcJEzbSZxLifO9_bbU1HFtY-gmTVI79gcpP7BdI72QGib5fR3bdkzXHXSCNErja9e6XRtWGXRcyTEVNeZqVMdaoRPZ00C7vMOtG3jAGUQOUzuJjB7_z8Us17OT6RfEHGAfh5TYUdB1VJV0PesEC7LATTU4hyae4zvBuG5rJNTgkpcFRAtcCaLBDeEb3MZwl1EAMihXZEMyiNTPAvN1BrUDXuEta-RwsOSKk9G9Kldj-puxDVT9Naqg-rtcro7lm7rAkjyVKgFvjqiyoCA8Zg2VEPl-VwOiHfyAyDPuPTP0zSBwPcsMHdvT4BYi3bbunTA0LMe01aStwN5r8F8na9yHTmB5oWcoLz039FQGKUrJ-MvhPde97vb_AQikdVM" rel="noopener noreferrer"&gt;Open in mermaid.live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVU1vozAQ_SuWo94g4jtgVdUSCtpDe2l62mVVOeAkKMRGtlGbjfLfawjkg6RSe4iSeX4zz_NmCDuYsZxABBcle89WmEvw9JLSuztAFS5Smsp5LQpKhHhiyyL7m8JpF9_P-UOLpfBfy8PZmtD8TX0qVlDZUA8QiDuoY2ZlQah8k9uKvGFFi9oYNDEIm7IvsxAwWm5v8OcD_rTn40YnepyFN5KyQVLUJLXkcxlZimdM8ZJwRX99mjWkzQFoGcqUJWd11boi6vmS42oFurZP3XbVzii4qsoiw7Jg9DcTjTHhCQENdMw5v0WPXAzgADYytPtS1-KkbGuJK3fBva4_gOForkz9Hi37mjbEgK7r4LKVU9SVuWxLtSHktux2blDu1w6IFa4IAguuZwXP9rdYCKH47E4nQXXwWl4vs4LPBnHlnTo-LM2VXV-eZIMTLMQjWYBu94TkbE309yKXK2SO3epD66Acq_Y4x1tEGSUdikbOxHW9QFsUZYlGsRX7iaFlrGQcjYzEnFjhhYpq8ecSRjLxvLiTiKJkmpi9hGk7sXMpcb63P5aaOq5t9N0kcWJHk15q4tuukVxI9ZP8uY5tO6br9jp-EibRtWvtrvWrDFqu5JiKCnM1qmOtwAntqa9d3uHWDTzg9CKHqZ1EBo__12KW69nx9BtiDrCPQ4rt0G87Kgu6nrWCOVnguuydQyPPmTj-sG5jJNTgkhc5RAtcCqLBDeEb3MRwl1IAUihXZENSiNTPHPN1CrUDXuItq2V_sOSKk9K9Kldh-oexDVT91aqg-rtcro7l6yrHkjwWKgGfKMp_wiNWUwlR0FaAaAc_IPKMsWcGE9P3Xc8yA8f2NLiFSLetsRMEhuWYtpqz5dt7Df5vRY1x4PiWF3iGctJzA09lkLyQjD8f3nLty27_CR_HdNM%3Ftype%3Dpng" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVVU1vozAQ_SuWo94g4jtgVdUSCtpDe2l62mVVOeAkKMRGtlGbjfLfawjkg6RSe4iSeX4zz_NmCDuYsZxABBcle89WmEvw9JLSuztAFS5Smsp5LQpKhHhiyyL7m8JpF9_P-UOLpfBfy8PZmtD8TX0qVlDZUA8QiDuoY2ZlQah8k9uKvGFFi9oYNDEIm7IvsxAwWm5v8OcD_rTn40YnepyFN5KyQVLUJLXkcxlZimdM8ZJwRX99mjWkzQFoGcqUJWd11boi6vmS42oFurZP3XbVzii4qsoiw7Jg9DcTjTHhCQENdMw5v0WPXAzgADYytPtS1-KkbGuJK3fBva4_gOForkz9Hi37mjbEgK7r4LKVU9SVuWxLtSHktux2blDu1w6IFa4IAguuZwXP9rdYCKH47E4nQXXwWl4vs4LPBnHlnTo-LM2VXV-eZIMTLMQjWYBu94TkbE309yKXK2SO3epD66Acq_Y4x1tEGSUdikbOxHW9QFsUZYlGsRX7iaFlrGQcjYzEnFjhhYpq8ecSRjLxvLiTiKJkmpi9hGk7sXMpcb63P5aaOq5t9N0kcWJHk15q4tuukVxI9ZP8uY5tO6br9jp-EibRtWvtrvWrDFqu5JiKCnM1qmOtwAntqa9d3uHWDTzg9CKHqZ1EBo__12KW69nx9BtiDrCPQ4rt0G87Kgu6nrWCOVnguuydQyPPmTj-sG5jJNTgkhc5RAtcCqLBDeEb3MRwl1IAUihXZENSiNTPHPN1CrUDXuItq2V_sOSKk9K9Kldh-oexDVT91aqg-rtcro7l6yrHkjwWKgGfKMp_wiNWUwlR0FaAaAc_IPKMsWcGE9P3Xc8yA8f2NLiFSLetsRMEhuWYtpqz5dt7Df5vRY1x4PiWF3iGctJzA09lkLyQjD8f3nLty27_CR_HdNM%3Ftype%3Dpng" alt="optimal approach visualization" width="711" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Certificate Selection Works During TLS
&lt;/h2&gt;

&lt;p&gt;Before moving forward, it is important to clarify how server-side certificate selection works.&lt;/p&gt;

&lt;p&gt;This process must occur during the initial phase of the TLS handshake: after the client sends &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4.1.2" rel="noopener noreferrer"&gt;ClientHello&lt;/a&gt; and before the server responds with &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4.1.3" rel="noopener noreferrer"&gt;ServerHello&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The server-side flow is as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receive the incoming TLS record.&lt;/li&gt;
&lt;li&gt;Parse the record as &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-5.1" rel="noopener noreferrer"&gt;TLSPlaintext&lt;/a&gt; and verify that it contains a &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4" rel="noopener noreferrer"&gt;Handshake&lt;/a&gt; message with a &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4.1.2" rel="noopener noreferrer"&gt;ClientHello&lt;/a&gt; body.&lt;/li&gt;
&lt;li&gt;Extract the client capabilities relevant to certificate selection from ClientHello.&lt;/li&gt;
&lt;li&gt;Select the appropriate certificate based on those capabilities and your server’s selection policy.&lt;/li&gt;
&lt;li&gt;Respond with &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4.1.3" rel="noopener noreferrer"&gt;ServerHello&lt;/a&gt; and continue handshake, including Certificate message.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to get client capabilities
&lt;/h3&gt;

&lt;p&gt;To determine which certificates are compatible, the &lt;a href="https://www.rfc-editor.org/rfc/rfc8446#section-4.1.2" rel="noopener noreferrer"&gt;ClientHello&lt;/a&gt; message must be inspected.&lt;/p&gt;

&lt;p&gt;The exact location of the information needed for certificate selection depends on the TLS version:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Primary Source&lt;/th&gt;
&lt;th&gt;Secondary Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;signature_algorithms&lt;/code&gt; extension&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cipher_suites&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;signature_algorithms_cert&lt;/code&gt; extension&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;signature_algorithms&lt;/code&gt; extension&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How the Server Chooses a Certificate
&lt;/h3&gt;

&lt;p&gt;The actual certificate to present is chosen by considering both the client’s capabilities and the web server’s certificate selection policy.&lt;/p&gt;

&lt;p&gt;The specific selection policy is determined by the server implementation and may depend on organizational requirements or security policies.&lt;/p&gt;

&lt;p&gt;Typical strategies include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer the certificate with the strongest algorithm supported by both server and client.&lt;/li&gt;
&lt;li&gt;Present a default certificate if it matches the client’s capabilities.&lt;/li&gt;
&lt;li&gt;If no compatible certificate is available, abort the handshake.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the core mechanism for dynamic certificate selection based on client capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement using ASP.NET Core Kestrel
&lt;/h2&gt;

&lt;p&gt;Since ASP.NET Core 2.1, Kestrel provides the ability to configure TLS handshake behavior via &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.server.kestrel.https.httpsconnectionadapteroptions" rel="noopener noreferrer"&gt;&lt;code&gt;HttpsConnectionAdapterOptions&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;HttpsConnectionAdapterOptions&lt;/code&gt; provides a &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.server.kestrel.https.httpsconnectionadapteroptions.servercertificateselector" rel="noopener noreferrer"&gt;&lt;code&gt;ServerCertificateSelector&lt;/code&gt;&lt;/a&gt; property that allows configuration of a callback that is called during the TLS negotiation phase.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Historically, this API was designed for SNI-based certificate selection, where the server name influences which certificate is returned.&lt;br&gt;
However, nothing prevents using a different certificate-selection logic, such as client capabilities provided in &lt;code&gt;ClientHello&lt;/code&gt; and implementation-specific policies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The method assigned to &lt;code&gt;ServerCertificateSelector&lt;/code&gt; accepts an argument of type &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.connections.connectioncontext" rel="noopener noreferrer"&gt;&lt;code&gt;ConnectionContext&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.connections.connectioncontext" rel="noopener noreferrer"&gt;&lt;code&gt;ConnectionContext&lt;/code&gt;&lt;/a&gt; implements the &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.connections.features.imemorypoolfeature" rel="noopener noreferrer"&gt;&lt;code&gt;IMemoryPoolFeature&lt;/code&gt;&lt;/a&gt; interface, which exposes a &lt;a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.connections.features.imemorypoolfeature.memorypool" rel="noopener noreferrer"&gt;&lt;code&gt;MemoryPool&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;MemoryPool&lt;/code&gt; property can be used to access the raw TLS records as bytes sent by the client during the handshake. The relevant TLS record is a &lt;code&gt;TLSPlaintext&lt;/code&gt; struct that carries a &lt;code&gt;Handshake&lt;/code&gt; message with a &lt;code&gt;ClientHello&lt;/code&gt; body. This enables custom parsing of handshake data if needed.&lt;/p&gt;

&lt;p&gt;Starting with ASP.NET Core 10.0, &lt;code&gt;HttpsConnectionAdapterOptions&lt;/code&gt; also provides the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.https.httpsconnectionadapteroptions.tlsclienthellobytescallback" rel="noopener noreferrer"&gt;&lt;code&gt;TlsClientHelloBytesCallback&lt;/code&gt;&lt;/a&gt; property.&lt;br&gt;
This callback enables inspection of the incoming &lt;code&gt;ClientHello&lt;/code&gt; before the certificate selection callback is invoked.&lt;/p&gt;

&lt;p&gt;These APIs provide all the necessary hooks to implement dynamic certificate selection in Kestrel based on client capabilities, not just SNI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference Implementation
&lt;/h2&gt;

&lt;p&gt;Everything required to implement the optimal approach described in this article has already been implemented by me in the following GitHub repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/stas-sultanov/tls-server-certificate-selection" rel="noopener noreferrer"&gt;tls-server-certificate-selection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a toy demo.&lt;br&gt;
The repository contains production-grade code for parsing &lt;code&gt;ClientHello&lt;/code&gt; and extracting the data required for certificate selection.&lt;/p&gt;

&lt;p&gt;It also contains tests that can be used to study the behavior in detail, including integration tests that show how to wire the mechanism into ASP.NET Core Kestrel.&lt;/p&gt;

&lt;p&gt;More specifically, the repository provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;low-level parsing of &lt;code&gt;ClientHello&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;extraction of the TLS data relevant to certificate selection,&lt;/li&gt;
&lt;li&gt;a reusable implementation that can be inspected independently from the article,&lt;/li&gt;
&lt;li&gt;Kestrel-based integration tests that demonstrate end-to-end certificate selection behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository shows the implementation in full, with tests that make the behavior easy to verify and explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you have one logical endpoint and heterogeneous non-browser clients, deploying an extra TLS tier should not be your default response.&lt;/p&gt;

&lt;p&gt;When the requirement is simply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same host,&lt;/li&gt;
&lt;li&gt;same application,&lt;/li&gt;
&lt;li&gt;different certificate algorithms per client capability,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kestrel can solve it where the problem actually lives: inside the server during TLS negotiation.&lt;/p&gt;




&lt;p&gt;If you found this article useful, feel free to buy the author &lt;a href="https://ko-fi.com/stas_sultanov" rel="noopener noreferrer"&gt;a cup of coffee&lt;/a&gt; ☕.&lt;/p&gt;




</description>
      <category>aspnet</category>
      <category>dotnet</category>
      <category>tls</category>
      <category>security</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Tue, 09 Dec 2025 20:31:49 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/-c2d</link>
      <guid>https://forem.com/stas-sultanov/-c2d</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/stas-sultanov" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" alt="stas-sultanov"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/stas-sultanov/why-every-saas-company-needs-a-solutions-architect-31a1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Why Every SaaS Company Needs a Solutions Architect&lt;/h2&gt;
      &lt;h3&gt;Stas Sultanov ・ Oct 28&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#saas&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>architecture</category>
      <category>career</category>
      <category>saas</category>
    </item>
    <item>
      <title>Why Every SaaS Company Needs a Solutions Architect</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Tue, 28 Oct 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/why-every-saas-company-needs-a-solutions-architect-31a1</link>
      <guid>https://forem.com/stas-sultanov/why-every-saas-company-needs-a-solutions-architect-31a1</guid>
      <description>&lt;p&gt;A SaaS company’s business model depends entirely on the IT solution it builds and operates. If the solution is well-made, it supports the business and enables growth. If it’s made poorly, the business starts to struggle.&lt;/p&gt;

&lt;p&gt;That struggle shows up in familiar ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;outages, overloads, and peak‑time failures that erode customer trust&lt;/li&gt;
&lt;li&gt;runaway infrastructure bills that eat margin&lt;/li&gt;
&lt;li&gt;slow evolution that delays getting new functionality to market&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t bad luck. It’s a structural issue that won’t fix itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What causes the problem?
&lt;/h2&gt;

&lt;p&gt;The root cause is a stream of suboptimal, often simply bad, decisions made through the lifecycle of the IT solution.&lt;/p&gt;

&lt;p&gt;Under business pressure or through lack of experience, teams pick the quickest path. It buys a short‑term win and hides a long‑term cost. People act tactically; no one holds the strategic line.&lt;/p&gt;

&lt;p&gt;In the moment, choices look reasonable: unblock a deal, hit a date, calm an incident. Each one quietly adds long‑term risk that surfaces later. The consequences arrive as outages, rising run costs, and slower change — long after the original decision is forgotten.&lt;/p&gt;

&lt;p&gt;From the outside, the fix seems obvious: “Just start making optimal decisions”.&lt;br&gt;
In reality, it isn’t that simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why is making optimal decisions hard?
&lt;/h2&gt;

&lt;p&gt;In a nutshell, every meaningful decision within the lifecycle of a SaaS product is a trade‑off across four forces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business&lt;/strong&gt;&lt;br&gt;
What must be achieved to win the deal, protect margin, satisfy contractual promises, and keep revenue flowing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;&lt;br&gt;
What must be respected by the product — processes, rules, compliance obligations, regulatory constraints, and industry expectations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;br&gt;
What can be built, tested, and maintained by the current teams and tech stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;br&gt;
What can support the solution and host the software at scale — with the required capacity, resilience, security, performance, and predictable run cost.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These four forces naturally form two sides of a single scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Demand = Business + Domain&lt;/strong&gt;&lt;br&gt;
Demand is what the business wants and what must be respected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capability = Software + Infrastructure&lt;/strong&gt;&lt;br&gt;
Capability is what the engineers can actually build and run.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every decision within a SaaS product’s lifecycle must keep Demand and Capability in balance. That’s inherently hard — and in most SaaS companies, no one is explicitly accountable for that balance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why does no one own the balance?
&lt;/h2&gt;

&lt;p&gt;Even though every decision must balance Demand and Capability, inside most SaaS companies there is no shared understanding of the four forces that define that balance — Business, Domain, Software, and Infrastructure. Because these forces aren’t explicitly named or understood, the need to balance them is invisible. As a result, nobody is assigned to own it.&lt;/p&gt;

&lt;p&gt;Instead, each group defends its own priority:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leadership pushes new ideas and commercial commitments.&lt;/li&gt;
&lt;li&gt;Sales optimizes for contract wins.&lt;/li&gt;
&lt;li&gt;Product management optimizes for functionality and deadlines.&lt;/li&gt;
&lt;li&gt;Engineering optimizes for shipping code.&lt;/li&gt;
&lt;li&gt;Operations optimizes for stability and keeping production up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, each of these priorities is rational. Together, they pull the solution apart.&lt;/p&gt;

&lt;p&gt;This is the structural gap.&lt;/p&gt;

&lt;p&gt;The job of holding Business, Domain, Software, and Infrastructure in balance must belong to a dedicated role.&lt;/p&gt;

&lt;p&gt;That role is the &lt;strong&gt;Solutions Architect&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What does a Solutions Architect actually do?
&lt;/h2&gt;

&lt;p&gt;A real Solutions Architect (SA) is the business safeguard against self‑inflicted damage.&lt;/p&gt;

&lt;p&gt;The SA’s responsibility is to translate business intent into something that the company can actually build, run, and afford — and then defend that shape against erosion.&lt;/p&gt;

&lt;p&gt;In practical terms, an effective SA does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirms that what is being promised to a customer can in fact be delivered without destroying future roadmap or operational stability.&lt;/li&gt;
&lt;li&gt;States clearly when a shortcut creates a future liability (technical, contractual, compliance, or cost).&lt;/li&gt;
&lt;li&gt;Describes the viable path: “Yes, this is possible — here is how it must be done so it won’t explode six months from now”.&lt;/li&gt;
&lt;li&gt;Forces explicit trade‑offs and documented decisions instead of silent debt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SA keeps Demand and Capability in balance.&lt;/p&gt;

&lt;p&gt;The SA provides margin protection, reputational protection, and delivery‑risk control.&lt;/p&gt;




&lt;h2&gt;
  
  
  How does the SA do this in practice?
&lt;/h2&gt;

&lt;p&gt;To keep a SaaS product running, a solution architect must continually translate business intent into real, tangible value that integrates with what already exists and reliably operates in production—without unexpected costs, disruptions, or deviations from the roadmap.&lt;/p&gt;

&lt;p&gt;The SA does this through an ongoing process that looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture Business intent&lt;/strong&gt;: understand revenue impact, contractual promises, deadlines, constraints, and success criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor it in the Domain&lt;/strong&gt;: map real workflows, compliance, obligations, and rules that cannot be broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check it against Software capabilities&lt;/strong&gt;: confirm that it can be built with the current stack, safely, on time, and make visible the debt or risk created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate it against Infrastructure realtiy&lt;/strong&gt;: ensure that it can run at scale, securely, cost‑effectively, and with the uptime and cost profile the company is willing to own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negotiate and document the solution shape&lt;/strong&gt;: define how the solution must look so it is truly buildable and operable, with explicit trade‑offs instead of silent debt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stay through implementation&lt;/strong&gt;: ensure what gets delivered still matches that agreed shape and has not been quietly degraded into something unstable, unmaintainable, or unprofitable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process cannot be reliably split across multiple roles. When it is fragmented, every group protects its own priority, and nobody owns the balance.&lt;/p&gt;

&lt;p&gt;Only when a single role owns this process end to end does the balance hold and the product remain viable.&lt;/p&gt;

&lt;p&gt;That single accountable role is the &lt;strong&gt;Solutions Architect&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who can play this role?
&lt;/h2&gt;

&lt;p&gt;A real Solutions Architect is rare.&lt;br&gt;
This is not a theoretical strategist.&lt;br&gt;
This is a person who has already lived the consequences of bad decisions across multiple environments and can recognize them before they repeat.&lt;/p&gt;

&lt;p&gt;A strong SA typically has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business&lt;/strong&gt;&lt;br&gt;
Direct exposure to commercial pressure. Ideally has acted as a co‑founder, carried responsibility for a product or engagement P&amp;amp;L, or directly supported revenue‑critical deals. Understands money, contract pressure, and margin, not just technology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;&lt;br&gt;
Several years inside the actual business domain (energy, finance, logistics, healthcare, etc.). Understands compliance traps and which “minor requirements” are in fact legally or operationally non‑negotiable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;br&gt;
Over a decade or even two of building, debugging, and operating production systems in the same languages and frameworks that the IT solution uses. Not “familiar with”, but battle-tested. Has carried on-call responsibility for that stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;br&gt;
A decade of running workloads on the actual platform in use (specific cloud environment, network model, security posture). Understands scaling limits, cost levers, and real failure modes under load.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;&lt;br&gt;
The SA must care that the solution actually fits the business and survives in production — and must be rewarded like someone protecting revenue, margin, and reputation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a role that can be filled by “a smart engineer with potential in six months”.&lt;/p&gt;

&lt;p&gt;This profile is rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  How can a company get a Solutions Architect?
&lt;/h2&gt;

&lt;p&gt;The realistic way is to bring in a senior Solutions Architect from the market as a dedicated contractor for 12–36 months, depending on the IT solution.&lt;/p&gt;

&lt;p&gt;The company must bring in someone who has already seen these failure patterns in multiple environments, already paid the price for getting them wrong, and is motivated to protect the business.&lt;/p&gt;

&lt;p&gt;Note that SAs, by nature, don’t stay long at a single company. The judgment this role requires comes from switching products and environments — seeing different business models, domains, stacks, and failure modes. That breadth is hard to accumulate inside one product, so senior SAs tend to rotate to build and maintain the experience the role demands.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why isn’t there an alternative?
&lt;/h2&gt;

&lt;p&gt;When companies understand what the Solutions Architect actually does, they assume that they can easily cover the capability with a workaround.&lt;/p&gt;

&lt;p&gt;What happens in practice is always some variation of the same assumption which is failure by nature:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Give it to the CTO
&lt;/h3&gt;

&lt;p&gt;Assumption: the Chief Technology Officer is “the technical one,” so can also do the SA job.&lt;/p&gt;

&lt;p&gt;The CTO role is crucial, but it’s an executive function: organization design, budget, hiring, vendor strategy, certifications, board work, and customer engagement. The expertise required for CTO is fundamentally different from that of an SA.&lt;/p&gt;

&lt;p&gt;Even if a CTO personally meets the SA bar, they almost never have the time or focus to do deep SA work week in, week out.&lt;br&gt;
Using a CTO as a substitute for an SA usually means neither job is done properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cover with multiple people
&lt;/h3&gt;

&lt;p&gt;Assumption: “Senior people together can cover it”.&lt;/p&gt;

&lt;p&gt;Companies put Engineers, Operations, Product Management, and Compliance in one room, aim for consensus, and expect the group to collectively “own” decisions.&lt;/p&gt;

&lt;p&gt;On paper, this seems to cover Business, Domain, Software, and Infrastructure. In reality, it fails because no single person is accountable for the integrated balance. Each participant protects their own priority, consensus dilutes responsibility, and there is still no owner of the balance in real time.&lt;/p&gt;

&lt;p&gt;Shared responsibility becomes no one’s responsibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Level up an internal employee
&lt;/h3&gt;

&lt;p&gt;Assumption: mentor a strong internal engineer or delivery lead into an SA over time.&lt;/p&gt;

&lt;p&gt;This rarely succeeds. Correct judgment in this role comes from years of exposure to different pressures and failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple customers,&lt;/li&gt;
&lt;li&gt;multiple business models,&lt;/li&gt;
&lt;li&gt;multiple domains with different regulatory traps,&lt;/li&gt;
&lt;li&gt;multiple technology stacks and scaling problems,&lt;/li&gt;
&lt;li&gt;multiple production outages and cost crises.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A single SaaS company usually cannot generate that breadth fast enough. It isn’t about intelligence; it’s accumulated scar tissue under different conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Borrow from a vendor
&lt;/h3&gt;

&lt;p&gt;Assumption: use an architect provided by an implementation partner or service provider.&lt;/p&gt;

&lt;p&gt;A vendor architect’s primary loyalty is to their employer’s commercial safety and delivery success — not to SaaS company.&lt;/p&gt;

&lt;p&gt;Even if the SA genuinely wants to help, they will always be forced to propose solutions that work for their employer first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Any SaaS company that operates a live product needs a Solutions Architect.&lt;/p&gt;

&lt;p&gt;Without an SA, no one is accountable for keeping Business and Domain expectations aligned with what Software and Infrastructure can actually deliver and run. That’s when costs spike, promises break, and reputation is damaged.&lt;/p&gt;

&lt;p&gt;With an SA, that balance is actively protected. The product stays deliverable, operable, and economically viable.&lt;/p&gt;

&lt;p&gt;A senior SA is not overhead. It is a required function for any serious SaaS business.&lt;/p&gt;




&lt;p&gt;If you found this article useful, feel free to buy the author &lt;a href="https://ko-fi.com/stas_sultanov" rel="noopener noreferrer"&gt;a cup of coffee&lt;/a&gt; ☕.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>career</category>
      <category>saas</category>
    </item>
    <item>
      <title>To var or Not</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Tue, 27 May 2025 12:54:30 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/to-var-or-not-26jl</link>
      <guid>https://forem.com/stas-sultanov/to-var-or-not-26jl</guid>
      <description>&lt;p&gt;&lt;strong&gt;var&lt;/strong&gt; is a C# keyword introduced in version 3.0 (year 2007) to simplify variable declarations by eliminating redundant type specifications.&lt;/p&gt;

&lt;p&gt;Despite its straightforward purpose and clear benefits, many developers still passionately debate its use.&lt;/p&gt;

&lt;p&gt;Some argue that &lt;strong&gt;var&lt;/strong&gt; should never be used. Others say it's acceptable, but only when the type is immediately clear. Discussions flare around readability, maintainability, and clarity — as if we're still programming on punch cards.&lt;/p&gt;

&lt;p&gt;Every time I come across these arguments, I can't help but wonder:&lt;br&gt;
&lt;em&gt;Seriously, what year are these people living in?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Critics of &lt;strong&gt;var&lt;/strong&gt; frequently overlook one crucial reality:&lt;br&gt;
For decades, we've been working with code via powerful IDEs.&lt;/p&gt;

&lt;p&gt;Modern IDEs like Visual Studio, Rider, or VS Code provide instant clarity about every aspect of your code, including variables declared using &lt;strong&gt;var&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The IDE always knows the variable's type — just hover your pointer.&lt;/p&gt;

&lt;p&gt;The idea that &lt;strong&gt;var&lt;/strong&gt; hides the type is simply outdated.&lt;br&gt;
Such concerns might have had merit decades ago, during the era of monochrome displays and basic text editors, but today they're irrelevant.&lt;/p&gt;

&lt;p&gt;Some gifted individuals still claim it’s hard to understand the type behind &lt;strong&gt;var&lt;/strong&gt; — usually while reviewing pull requests or browsing code on GitHub’s web interface.&lt;/p&gt;

&lt;p&gt;My take? If you’re doing serious code review or exploration, you should be using a proper tool — like VS Code with GitHub extensions.&lt;/p&gt;

&lt;p&gt;So, the real problem isn’t &lt;strong&gt;var&lt;/strong&gt;. It’s using the wrong tools for the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;var&lt;/strong&gt; wherever it is possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;Back in the 1980s, C++ developers started prefixing class members with &lt;strong&gt;m_&lt;/strong&gt; to distinguish them from method parameters and variables.&lt;br&gt;
It made sense at the time — there were no IDEs, no semantic highlighting, no code navigation. It was a practical workaround for working in primitive environments.&lt;/p&gt;

&lt;p&gt;By the late 1990s, IDEs like Visual Studio made that convention obsolete. Syntax highlighting and intelligent tooling eliminated the need for such manual tricks.&lt;br&gt;
Yet some developers still cling to &lt;strong&gt;m_&lt;/strong&gt;.&lt;br&gt;
Not because it helps — but because it’s what they’re used to.&lt;/p&gt;

&lt;p&gt;That’s not engineering discipline. That’s fossilized thinking.&lt;/p&gt;

&lt;p&gt;The resistance to &lt;strong&gt;var&lt;/strong&gt; today is cut from the same cloth. It's not about clarity. It's about being stuck in habits that modern tools have already outgrown.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>For years, Microservice Architecture has been marketed as the ultimate solution for scalability, flexibility, and efficiency within IT Solutions. But does it really live up to its promises ❓</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Wed, 14 May 2025 06:07:20 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/for-years-microservice-architecture-has-been-marketed-as-the-ultimate-solution-for-scalability-19jn</link>
      <guid>https://forem.com/stas-sultanov/for-years-microservice-architecture-has-been-marketed-as-the-ultimate-solution-for-scalability-19jn</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/stas-sultanov/microservice-architecture-the-wrong-turn-ei8" class="crayons-story__hidden-navigation-link"&gt;Microservice Architecture — The Wrong Turn&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/stas-sultanov" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" alt="stas-sultanov profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/stas-sultanov" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Stas Sultanov
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Stas Sultanov
                
              
              &lt;div id="story-author-preview-content-2462603" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/stas-sultanov" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Stas Sultanov&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/stas-sultanov/microservice-architecture-the-wrong-turn-ei8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/stas-sultanov/microservice-architecture-the-wrong-turn-ei8" id="article-link-2462603"&gt;
          Microservice Architecture — The Wrong Turn
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microservices"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microservices&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/stas-sultanov/microservice-architecture-the-wrong-turn-ei8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/stas-sultanov/microservice-architecture-the-wrong-turn-ei8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>microservices</category>
      <category>architecture</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Azure Application Insights — The Most Underused Service</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Tue, 13 May 2025 06:45:10 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/application-insights-the-most-underused-azure-service-heres-why-5hdi</link>
      <guid>https://forem.com/stas-sultanov/application-insights-the-most-underused-azure-service-heres-why-5hdi</guid>
      <description>&lt;p&gt;Application Insights is one of the most critical Azure services for managing and reducing operational risks in IT solutions.&lt;/p&gt;

&lt;p&gt;Yet, despite being available for over a decade, it remains misunderstood, poorly utilized, and underappreciated by most organizations.&lt;/p&gt;

&lt;p&gt;In practice, teams frequently treat it merely as a log repository, while business leaders question its costs and perceive little return on investment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Goal:&lt;/strong&gt; Clarify the real purpose of Application Insights, highlight why organizations often fail to leverage its full potential, and outlines how to effectively use it to protect your business from operational disruptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Application Insights Really Is
&lt;/h2&gt;

&lt;p&gt;At its core, Application Insights is an observability service, but not simply a tool for monitoring performance or capturing errors. It is a strategic asset for reducing operational risks in IT systems.&lt;/p&gt;

&lt;p&gt;Its most valuable—and often neglected—capability is predictive analytics, which identifies, correlates, and anticipates issues before they become serious incidents.&lt;/p&gt;

&lt;p&gt;From a business standpoint, predictive analytics is essential. It empowers companies to proactively manage risks, minimize impact, and maintain continuous business operations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In my experience, this capability has repeatedly proven invaluable, preventing downtime and preserving customer trust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In addition to predictive insights, Application Insights provides comprehensive visibility into system behavior, answering crucial questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How stable is our IT solution?&lt;/li&gt;
&lt;li&gt;How do users interact with our system?&lt;/li&gt;
&lt;li&gt;Are there undetected issues impacting customer experience?&lt;/li&gt;
&lt;li&gt;Where is degraded performance affecting our revenue?&lt;/li&gt;
&lt;li&gt;Which integrations or dependencies are negatively impacting system performance?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When implemented effectively, Application Insights goes beyond basic telemetry—it becomes an essential business safeguard.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Reasons Behind Misuse
&lt;/h2&gt;

&lt;p&gt;In most companies, Application Insights runs quietly in the background. It collects telemetry that no one reviews and is typically configured by people who don’t understand its purpose.&lt;/p&gt;

&lt;p&gt;Here are the key reasons why organizations fail to realize its full potential:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pigeon Architects
&lt;/h3&gt;

&lt;p&gt;Many so-called Cloud Architects focus more on theory than implementation. Their main contribution is placing the Application Insights icon on a diagram — without understanding its role or verifying its integration. &lt;br&gt;
They often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fail to define a clear observability strategy&lt;/li&gt;
&lt;li&gt;Don’t understand the full capabilities of Application Insights&lt;/li&gt;
&lt;li&gt;Lack hands-on experience&lt;/li&gt;
&lt;li&gt;Can’t connect telemetry with business outcomes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We call them “Pigeon Architects” because they fly in, drop diagrams, and disappear — leaving behind pretty but useless architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unaware Developers
&lt;/h3&gt;

&lt;p&gt;Modern development practices often favor abstraction layers, but rarely acknowledge their downsides.&lt;/p&gt;

&lt;p&gt;These abstractions can hide essential capabilities of the tools they encapsulate. This is exactly what happens with Application Insights.&lt;/p&gt;

&lt;p&gt;For example, .NET developers typically rely on ILogger, which reduces Application Insights to a basic log collector — distorting the data model, correlation, and context.&lt;/p&gt;

&lt;p&gt;Without a clear observability strategy, developers typically push everything into Application Insights. This leads to bloated telemetry, increased Azure costs, and reduced return on investment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft’s “Install and Forget” Mentality
&lt;/h3&gt;

&lt;p&gt;To make adoption easier, Microsoft promotes the idea that Application Insights requires just a simple install and a line of configuration. While this increases adoption, it also creates a dangerous illusion: that the service works out-of-the-box without any need for understanding.&lt;/p&gt;

&lt;p&gt;As a result, developers integrate the tool without knowing how it works — and businesses never benefit from its full capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do
&lt;/h2&gt;

&lt;p&gt;Observability must be regarded as a business imperative, not just a technical afterthought.&lt;/p&gt;

&lt;p&gt;Organizations should engage experts who understand both business needs and the practical implementation of telemetry tools.&lt;/p&gt;

&lt;p&gt;Key actions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hire hands-on architects: Experts who understand telemetry intricacies, can align it with business objectives, and directly assist in implementation.&lt;/li&gt;
&lt;li&gt;Assign clear architectural accountability: Architects should own not only the design, but also validate and ensure successful practical implementation.&lt;/li&gt;
&lt;li&gt;Integrate telemetry with business goals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The true value lies not just in having Application Insights but understanding precisely how and why to use it effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Application Insights is more than a monitoring feature—it's a strategic business safeguard.&lt;/p&gt;

&lt;p&gt;When used intentionally, it becomes your early-warning system, identifying potential disruptions before they impact your business.&lt;/p&gt;

&lt;p&gt;Ignoring Application Insights means firefighting reactively. Embracing it ensures you proactively prevent operational crises.&lt;/p&gt;

&lt;p&gt;Understand it. Integrate it. Use it purposefully.&lt;/p&gt;

&lt;p&gt;Only then can you turn a perceived cost into genuine operational risk reduction and measurable business value.&lt;/p&gt;




&lt;p&gt;If you found this article useful, feel free to buy the author &lt;a href="https://ko-fi.com/stas_sultanov" rel="noopener noreferrer"&gt;a cup of coffee&lt;/a&gt; ☕.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Thinking about working with a Microsoft Cloud Solution Provider? Before you commit, take a moment to understand the real risks that rarely get discussed.</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Mon, 12 May 2025 14:10:17 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/thinking-about-working-with-a-microsoft-cloud-solution-provider-before-you-commit-take-a-moment-26m0</link>
      <guid>https://forem.com/stas-sultanov/thinking-about-working-with-a-microsoft-cloud-solution-provider-before-you-commit-take-a-moment-26m0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/stas-sultanov/5-risks-of-using-terraform-for-azure-1jlp" class="crayons-story__hidden-navigation-link"&gt;5 Risks of Using Terraform for Azure&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/stas-sultanov" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" alt="stas-sultanov profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/stas-sultanov" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Stas Sultanov
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Stas Sultanov
                
              
              &lt;div id="story-author-preview-content-2464959" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/stas-sultanov" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Stas Sultanov&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/stas-sultanov/5-risks-of-using-terraform-for-azure-1jlp" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 7 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/stas-sultanov/5-risks-of-using-terraform-for-azure-1jlp" id="article-link-2464959"&gt;
          5 Risks of Using Terraform for Azure
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/azure"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;azure&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microsoft"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microsoft&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/terraform"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;terraform&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/stas-sultanov/5-risks-of-using-terraform-for-azure-1jlp#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Wake up, IT...</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Mon, 12 May 2025 10:16:27 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/wake-up-it-jf8</link>
      <guid>https://forem.com/stas-sultanov/wake-up-it-jf8</guid>
      <description>&lt;p&gt;Today, the major part of the IT industry that focuses on delivering solutions for businesses has become a grotesque machine, meticulously engineered to bleed businesses dry while delivering little to no real value.&lt;/p&gt;

&lt;p&gt;Developers, managers, architects — entire organizations — have abandoned any pretense of delivering meaningful outcomes. Their only concern is how to extract as much money as possible from businesses. Delivering value is irrelevant; all they care about is that the cash must flow.&lt;/p&gt;

&lt;p&gt;To sustain this deception, they imitate work: overengineering trivialities, conducting endless refinements, staging meaningless ceremonies, and rolling out hollow “improvements” that devour time, budgets, and attention — often producing negative value.&lt;/p&gt;

&lt;p&gt;Buzzwords, architecture patterns, frameworks, certifications, and cargo cult methodologies dominate the landscape, creating a smokescreen of frantic, purposeless activity.&lt;/p&gt;

&lt;p&gt;Beneath it all hides a brutal reality:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most IT initiatives aimed at supporting businesses do not produce real business outcomes.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;The stagnation we see in IT today is no accident.&lt;/p&gt;

&lt;p&gt;It is the inevitable consequence of systemic rot.&lt;/p&gt;

&lt;p&gt;Businesses are pushing back, reflecting on the billions wasted on meaningless delivery. Layoffs, budget cuts, and the mad rush to replace developers and managers with AI are not anomalies — they are a response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Businesses are done subsidizing an industry that burns money without delivering anything of substance.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;IT solutions exist for one reason only — to make money, save money, or protect money.&lt;/p&gt;

&lt;p&gt;This is the simple truth that only a minority understands.&lt;/p&gt;

&lt;p&gt;Businesses do not fund IT departments because they admire technology. They invest because IT, when done properly, becomes a weapon — increasing profits, slashing operational costs, accelerating decisions, and annihilating competition.&lt;/p&gt;

&lt;p&gt;IT is not a playground. Not a lifestyle brand. Not a safe space for tech enthusiasts.&lt;/p&gt;

&lt;p&gt;IT is a business weapon.&lt;/p&gt;

&lt;p&gt;A tool for dominance. A tool for survival.&lt;/p&gt;

&lt;p&gt;Within the IT solution lifecycle, every decision made and every line of code written must be ruthlessly judged by three filters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it increase revenue?&lt;/li&gt;
&lt;li&gt;Does it cut costs?&lt;/li&gt;
&lt;li&gt;Does it reduce risk?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is no — it must not exist.&lt;/p&gt;




&lt;p&gt;If you are a developer, a manager, or a so-called “tech leader”, you must understand one thing: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your role is to help the business succeed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers obsessed with shiny frameworks and coding aesthetics are dead weight unless they deliver measurable business outcomes.&lt;/p&gt;

&lt;p&gt;A good developer is not the one who masters trendy frameworks or polishes code to academic perfection. A good developer is the one who brings measurable value to the business in the most efficient way — measured in time and cost.&lt;/p&gt;

&lt;p&gt;Managers are no different. Drowning in Agile ceremonies, Jira tickets, and SAFe certifications will not save you. If you cannot tie your role directly to profit, cost reduction, or risk mitigation, you are ballast. Disposable ballast.&lt;/p&gt;

&lt;p&gt;Modern project management has become a self-sustaining scam — a theater of the absurd, where delivery metrics are worshiped while real-world outcomes rot and die unnoticed.&lt;/p&gt;

&lt;p&gt;Real professionals tie their existence to three brutal outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increasing revenue.&lt;/li&gt;
&lt;li&gt;Reducing costs.&lt;/li&gt;
&lt;li&gt;Mitigating risks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Everything else is waste.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything else must be eliminated.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;The IT industry is collapsing under the weight of its own lies.&lt;/p&gt;

&lt;p&gt;Developers who don't understand business will be replaced — by those who do, or even by machines.&lt;/p&gt;

&lt;p&gt;Project managers who can't prove real value will vanish.&lt;/p&gt;

&lt;p&gt;Companies that fund IT for the sake of “innovation”, without clear traceability to business results, will die.&lt;/p&gt;

&lt;p&gt;This is not a hypothetical.&lt;/p&gt;

&lt;p&gt;It is already happening.&lt;/p&gt;

&lt;p&gt;The future belongs to those who reconnect IT to its only legitimate purpose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business first.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wake up, IT!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>agile</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>Everyone’s worried about AI taking our jobs. I’m worried about AI taking control of our minds. In just 3 steps, AI becomes the Telescreen of the 21st century — far more advanced than anything Orwell imagined. Here’s how it happens.</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Mon, 12 May 2025 09:53:15 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/everyones-worried-about-ai-taking-our-jobs-im-worried-about-ai-taking-control-of-our-minds-4ml7</link>
      <guid>https://forem.com/stas-sultanov/everyones-worried-about-ai-taking-our-jobs-im-worried-about-ai-taking-control-of-our-minds-4ml7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/stas-sultanov/ai-a-telescreen-we-deserve-1c99" class="crayons-story__hidden-navigation-link"&gt;AI — A Telescreen We Deserve&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/stas-sultanov" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" alt="stas-sultanov profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/stas-sultanov" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Stas Sultanov
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Stas Sultanov
                
              
              &lt;div id="story-author-preview-content-2461613" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/stas-sultanov" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3127095%2Fa8143dc0-0e97-405f-a60f-59ff55164961.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Stas Sultanov&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/stas-sultanov/ai-a-telescreen-we-deserve-1c99" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 5 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/stas-sultanov/ai-a-telescreen-we-deserve-1c99" id="article-link-2461613"&gt;
          AI — A Telescreen We Deserve
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devdiscuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devdiscuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/stas-sultanov/ai-a-telescreen-we-deserve-1c99#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>devdiscuss</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Microsoft CSP — 5 Risks You May Face</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Sat, 10 May 2025 08:32:40 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/five-risks-you-face-with-microsoft-csp-f73</link>
      <guid>https://forem.com/stas-sultanov/five-risks-you-face-with-microsoft-csp-f73</guid>
      <description>&lt;p&gt;If you’re reading this article, chances are you’ve already heard about Microsoft Cloud Solution Provider, aka CSP. If not, here’s a quick primer: a CSP is a Microsoft-certified partner company authorized to resell Microsoft services like Azure and M365, along with related professional services.&lt;/p&gt;

&lt;p&gt;While the benefits of working with a CSP are well-promoted, less attention is given to the potential downsides. This article sheds light on the risks involved in going the CSP route and provides actionable advice on how to mitigate them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: I have extensive experience on both sides of the CSP relationship. I’ve been directly involved in helping companies achieve Microsoft CSP status, and I’ve also worked extensively with various CSPs as a customer. The insights shared in this article are based on real-world experience and may not apply universally to every CSP.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Risk #1 – You Might Be Provided with a Suboptimal Solution
&lt;/h2&gt;

&lt;p&gt;Microsoft financially incentivizes partners to resell its products and services, including Azure and M365. This can sometimes result in CSPs designing solutions that prioritize revenue over your actual needs.&lt;/p&gt;

&lt;p&gt;For example, with M365, you might be sold licenses that significantly exceed your requirements. With Azure, the solution might be over-engineered, with unnecessary services or excessive capacity—just to increase margins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Involve internal or third-party experts to review your M365 licensing and Azure architecture. An unbiased second opinion can save you a lot of money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk #2 – You Might Receive Low-Quality Service
&lt;/h2&gt;

&lt;p&gt;Qualified cloud engineers are expensive and in short supply. While Microsoft doesn’t strictly require CSPs to assign certified or experienced professionals to every client, some CSPs may start you off with senior staff and then quietly replace them with less qualified personnel.&lt;/p&gt;

&lt;p&gt;They may claim senior engineers are still “involved” (e.g., reviewing work a few hours a week), but in practice, this rarely works effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Insist on having qualified experts assigned throughout the engagement. Ask for proof of experience and ensure continuity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk #3 – You May Lose Visibility into Your Cloud Spending
&lt;/h2&gt;

&lt;p&gt;With Pay-As-You-Go subscriptions or Microsoft Customer Agreements, Azure spending data is typically available within a day. But this is not the case for subscriptions managed through a CSP.&lt;/p&gt;

&lt;p&gt;This lack of visibility means you can’t track spending in near real-time, making cost optimization difficult and reactive. You may only discover a spike in usage when the monthly invoice arrives. Some CSPs offer their own portals for cost tracking, but not all do.&lt;/p&gt;

&lt;p&gt;Microsoft has promised to improve this, but at the time of writing, limitations still exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Choose a CSP that provides near real-time spending visibility and allows you to manage M365 purchases directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk #4 – Slower Issue Resolution
&lt;/h2&gt;

&lt;p&gt;When you have a problem with Azure, you’d normally open a support request directly through the portal. However, if your Azure subscription is CSP-managed, you’ll need to go through your CSP instead.&lt;/p&gt;

&lt;p&gt;This introduces an extra layer of communication. Often, the CSP simply relays your issue to Microsoft, acting as a middleman—and delaying resolution in the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Consider purchasing a direct Azure support plan to retain access to Microsoft support channels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk #5 – Your Services May Be Tied to the Wrong Region
&lt;/h2&gt;

&lt;p&gt;CSPs are restricted in where they can resell services like Microsoft 365. While it usually makes sense to work with a CSP based in your country, some businesses choose providers from other countries to reduce costs.&lt;/p&gt;

&lt;p&gt;This can lead to significant issues. For instance, if your company is in the UK but your CSP is in Turkey, the CSP may create your Entra tenant with Turkey set as the country. This affects currency settings and regional availability.&lt;/p&gt;

&lt;p&gt;At first, this might not matter much—since you're paying the CSP directly—but it becomes a serious issue if you decide to switch to purchasing directly from Microsoft. Changing the Entra tenant country later is extremely difficult. Microsoft support will often recommend deleting the tenant and creating a new one—obviously not a viable option for an operating business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Be very careful when selecting the country during Entra tenant creation. Ensure it matches your business location and long-term plans.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Personally, I do not recommend purchasing Microsoft services through a CSP unless there is a compelling reason to do so. If you're considering a CSP for access to skilled professionals, consider hiring those professionals directly or engaging them on a contract basis instead. This gives you greater control over quality, cost, and long-term risks.&lt;/p&gt;

&lt;p&gt;Ultimately, buying directly from Microsoft remains the safest, most transparent option.&lt;/p&gt;

&lt;p&gt;Take a moment to review your current cloud strategy—does a CSP really offer the value you expect?&lt;/p&gt;




&lt;p&gt;If you found this article useful, feel free to buy the author &lt;a href="https://ko-fi.com/stas_sultanov" rel="noopener noreferrer"&gt;a cup of coffee&lt;/a&gt; ☕.&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>management</category>
      <category>cloud</category>
      <category>azure</category>
    </item>
    <item>
      <title>Microsoft Power Platform — Plugins Telemetry</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Fri, 09 May 2025 07:47:51 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/tracking-telemetry-in-power-platform-plugins-2i95</link>
      <guid>https://forem.com/stas-sultanov/tracking-telemetry-in-power-platform-plugins-2i95</guid>
      <description>&lt;p&gt;Plugins play a key role within many IT solutions built on top of &lt;strong&gt;Microsoft Power Platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Plugin can encapsulate business logic, enforce rules, and enable integration with APIs, external services, and cloud components — making it a critical part of an IT solution.&lt;/p&gt;

&lt;p&gt;Just like any other component with an IT solution, plugins need telemetry tracking. Telemetry helps engineering teams diagnose issues, understand execution flow, and maintain visibility across the entire system.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Microsoft&lt;/strong&gt; ecosystem, &lt;strong&gt;Azure Monitor&lt;/strong&gt; — particularly its &lt;strong&gt;Application Insights&lt;/strong&gt; feature — is commonly used to collect and analyze telemetry data. However, integrating &lt;strong&gt;Power Platform&lt;/strong&gt; plugin with &lt;strong&gt;Application Insights&lt;/strong&gt; is not straightforward.&lt;/p&gt;

&lt;p&gt;This article explains how to implement telemetry tracking for &lt;strong&gt;Power Platform&lt;/strong&gt; plugins with &lt;strong&gt;Application Insights&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the Built-In Mechanism Is Not Good
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Power Platform&lt;/strong&gt; promotes using the &lt;strong&gt;ILogger&lt;/strong&gt; interface combined with automatic data export to an instance of &lt;strong&gt;Application Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Several key limitations make this approach insufficient:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited Functionality — The &lt;strong&gt;ILogger&lt;/strong&gt; interface introduces an abstraction layer over &lt;strong&gt;Application Insights&lt;/strong&gt;, concealing much of its advanced functionality.&lt;/li&gt;
&lt;li&gt;Delayed Telemetry Delivery — Exported telemetry may take up to 24 hours to appear, significantly delaying issue detection and resolution.&lt;/li&gt;
&lt;li&gt;No Authentication Support — The export mechanism does not support authentication for accessing the &lt;strong&gt;Application Insights&lt;/strong&gt; instance.&lt;/li&gt;
&lt;li&gt;Lack of Granularity — There is no way to isolate specific plugin telemetry.&lt;/li&gt;
&lt;li&gt;No Multi-Instance Publishing — Telemetry cannot be routed to multiple &lt;strong&gt;Application Insights&lt;/strong&gt; instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, the built-in mechanism in the &lt;strong&gt;Power Platform&lt;/strong&gt; is both technically constrained and operationally limited.&lt;/p&gt;




&lt;h2&gt;
  
  
  Direct Integration Is the Way to Go
&lt;/h2&gt;

&lt;p&gt;Within the &lt;strong&gt;Power Platform&lt;/strong&gt; plugin, the most efficient way to work with telemetry is to directly integrate with &lt;strong&gt;Application Insights&lt;/strong&gt; using a dedicated client library.&lt;/p&gt;

&lt;p&gt;That was the exact initial reason why the &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt; library was created — to provide an efficient way to integrate with &lt;strong&gt;Application Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The library is lightweight, high-performance, and built specifically to operate under the constraints imposed by the &lt;strong&gt;Power Platform&lt;/strong&gt; plugin runtime. It avoids all the pitfalls of &lt;strong&gt;Microsoft&lt;/strong&gt; libraries while giving you full control over the telemetry pipeline.&lt;/p&gt;

&lt;p&gt;If you’re curious why the standard &lt;strong&gt;Microsoft&lt;/strong&gt; libraries are not suitable for &lt;strong&gt;Power Platform&lt;/strong&gt; plugins, I encourage you to read this article, where I explain in detail the journey behind building the library and the critical problems it solves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/stas_sultanov/azure-monitor-telemetry-client-reinvented-52jj"&gt;Azure Monitor Telemetry Client — Reinvented&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find a fully functional sample that demonstrates how to use the library for &lt;strong&gt;Power Platform&lt;/strong&gt; plugin development here: &lt;a href="https://github.com/stas-sultanov/media-assets/tree/main/telemetry-client/power-platform-plugin" rel="noopener noreferrer"&gt;Samples&lt;/a&gt; on GitHub.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things to Consider While Using the Library
&lt;/h2&gt;

&lt;p&gt;Before using telemetry within a Power Platform plugin via &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt;, there are several important considerations that will influence how you structure the integration and manage configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. How Many Application Insights Instances Are Needed?
&lt;/h3&gt;

&lt;p&gt;Decide how many instances of &lt;strong&gt;Application Insights&lt;/strong&gt; the telemetry client will publish to, and where those instances will be located. There are typically two common scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single Instance (Organization Only): All telemetry is sent to an &lt;strong&gt;Application Insights&lt;/strong&gt; instance managed by the organization.&lt;/li&gt;
&lt;li&gt;Dual Instance (Customer + Vendor): Telemetry is published to both a customer-managed instance and a developer-controlled instance. This gives development teams access to diagnostics without requiring customer-side access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt; library provides a &lt;strong&gt;TelemetryClient&lt;/strong&gt; class that can be configured to use one or many instances of the &lt;strong&gt;HttpTelemetryPublisher&lt;/strong&gt; class, each configured to publish telemetry to a different &lt;strong&gt;Application Insights&lt;/strong&gt; instance.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Will Authentication Be Used?
&lt;/h3&gt;

&lt;p&gt;Decide whether the plugin will use &lt;strong&gt;Entra&lt;/strong&gt;-based authentication when sending telemetry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power Platform&lt;/strong&gt; supports this through &lt;strong&gt;Power Platform Managed Identity&lt;/strong&gt; (not to be confused with &lt;strong&gt;Azure Managed Identity&lt;/strong&gt;), which can be used to securely authorize access to &lt;strong&gt;Application Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;HttpTelemetryPublisher&lt;/strong&gt; class can be initialized either without authorization or with a Bearer token obtained from &lt;strong&gt;Entra&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the time of writing, &lt;strong&gt;Power Platform&lt;/strong&gt; does not support assigning or switching between multiple managed identities within a single plugin. As a result, if dual-publishing is required only one can be authorized.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Where Will Configuration Be Stored?
&lt;/h3&gt;

&lt;p&gt;Each telemetry publisher must be configured with two values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion Endpoint&lt;/strong&gt; (URI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrumentation Key&lt;/strong&gt; (GUID)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A recommended approach is to store the configuration as a JSON-formatted object in a single environment variable of text type.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What Information to Include in Each Telemetry Item?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Application Insights&lt;/strong&gt; data model provides many attributes that can be used to enrich telemetry data with contextual information. The library provides a &lt;strong&gt;TelemetryTags&lt;/strong&gt; class to support this. Key attributes to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudRole&lt;/strong&gt; — A unique name of the component. Use the alias or name of your plugin, or simply “Power Platform”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudRoleInstance&lt;/strong&gt; — A unique identifier of the runtime environment. Use &lt;strong&gt;Environment.MachineName&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OperationId&lt;/strong&gt; — A unique identifier for the operation. Use &lt;strong&gt;IExecutionContext.CorrelationId&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OperationName&lt;/strong&gt; — A human-readable name for the operation. Use &lt;strong&gt;IExecutionContext.MessageName&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ParentOperationId&lt;/strong&gt; — A unique ID of the parent operation. Use &lt;strong&gt;IExecutionContext.OperationId&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AuthenticatedUserId&lt;/strong&gt; — A consistent user identifier across the &lt;strong&gt;Entra&lt;/strong&gt;-connected systems. Use &lt;strong&gt;IPluginExecutionContext2.InitiatingUserAzureActiveDirectoryObjectId&lt;/strong&gt; when applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Careful configuration and proper enrichment ensure telemetry is actionable and easy to interpret — both for debugging and continuous observability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demonstration
&lt;/h2&gt;

&lt;p&gt;One of the most important questions is: What does this telemetry actually look like in practice, and what insights can I get from it?&lt;/p&gt;

&lt;p&gt;This demonstration walks through a practical setup and shows exactly what you can expect to see in &lt;strong&gt;Application Insights&lt;/strong&gt; when using the &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt; library in a real &lt;strong&gt;Power Platform&lt;/strong&gt; plugin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario Setup
&lt;/h3&gt;

&lt;p&gt;The example solution consists of the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Power Platform&lt;/strong&gt; plugin (&lt;strong&gt;ProxyPlugin&lt;/strong&gt;) that is triggered by an event on a &lt;strong&gt;Dataverse&lt;/strong&gt; table&lt;/li&gt;
&lt;li&gt;The plugin publishes a message to an &lt;strong&gt;Azure Storage Queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A backend service (&lt;strong&gt;ProxyService&lt;/strong&gt;) picks up the message, processes it, and deletes it from the &lt;strong&gt;Azure Storage Queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Both the plugin and the backend service are integrated with &lt;strong&gt;Application Insights&lt;/strong&gt; using the &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt; library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup allows tracking the full flow of operations end-to-end, across both systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Map View
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Application Map&lt;/strong&gt; in &lt;strong&gt;Azure Monitor&lt;/strong&gt; is automatically built from telemetry data. It visually shows the interaction between system components.&lt;/p&gt;

&lt;p&gt;In this setup, you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ProxyPlugin&lt;/strong&gt; sends message to &lt;strong&gt;Azure Storage Queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ProxyService&lt;/strong&gt; receives message from the &lt;strong&gt;Azure Storage Queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ProxyService&lt;/strong&gt; deletes message from the &lt;strong&gt;Azure Storage Queue&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F202sg18qucj3s9prlwj8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F202sg18qucj3s9prlwj8.webp" alt="Application Map View" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This high-level visualization makes it easy to confirm that telemetry flows correctly and relationships between components are captured.&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-End Transaction View
&lt;/h3&gt;

&lt;p&gt;One of the most powerful capabilities of &lt;strong&gt;Application Insights&lt;/strong&gt; is distributed tracing — the ability to follow an execution path across multiple components.&lt;/p&gt;

&lt;p&gt;In this demonstration, distributed tracing lets you follow a message as it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is sent by the &lt;strong&gt;ProxyPlugin&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Is recieved up by the &lt;strong&gt;ProxyService&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Is deleted by the &lt;strong&gt;ProxyService&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these steps is captured as a distinct telemetry item, all linked together using a shared OperationId. This correlation creates a single, coherent timeline of the entire operation, which you can visualize and inspect in &lt;strong&gt;Azure Monitor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2xv1rlwwat1095mcjlc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2xv1rlwwat1095mcjlc.jpg" alt="End-to-end" width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This view is essential for understanding how components interact, measuring timing between operations, diagnosing performance issues, and verifying that the system behaves as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin Tracing
&lt;/h3&gt;

&lt;p&gt;If you open the built-in &lt;strong&gt;Power Platform Plugin Trace Logs&lt;/strong&gt;, you can correlate trace messages with the telemetry seen in Azure Monitor.&lt;/p&gt;

&lt;p&gt;This gives development teams confidence that telemetry reflects actual plugin execution and improves their ability to debug logic or timing issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F194u4oatobe95mfv0x3u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F194u4oatobe95mfv0x3u.webp" alt="Plugin Tracking View" width="685" height="890"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may match information with data available with &lt;strong&gt;Azure Montior&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7cszlarofoh6wnom0yk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7cszlarofoh6wnom0yk.png" alt="Telemetry Details View" width="659" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This demonstration proves that a well-configured telemetry strategy gives you complete observability across plugin code and external services — all from within &lt;strong&gt;Azure Monitor&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Power Platform&lt;/strong&gt; plugins are mission-critical components in modern business applications, and their behavior must be observable and measurable to ensure reliability.&lt;/p&gt;

&lt;p&gt;Unfortunately, the built-in telemetry options provided by &lt;strong&gt;Microsoft&lt;/strong&gt; fall short when it comes to flexibility, precision, and real-time diagnostics.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Azure.Monitor.Telemetry&lt;/a&gt; library offers a focused and production-grade alternative that enables direct integration with &lt;strong&gt;Azure Monitor&lt;/strong&gt;, supports multiple &lt;strong&gt;Application Insights&lt;/strong&gt; instances, and honors the execution constraints of &lt;strong&gt;Power Platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By following the guidance in this article, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track telemetry with full control and context&lt;/li&gt;
&lt;li&gt;Improve diagnostic capabilities and system transparency&lt;/li&gt;
&lt;li&gt;Empower development teams with real-time insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observability is no longer optional — it’s a requirement. And with the right tooling, it’s also achievable within &lt;strong&gt;Power Platform&lt;/strong&gt; plugins.&lt;/p&gt;




&lt;p&gt;If you found this article useful, feel free to buy the author &lt;a href="https://ko-fi.com/stas_sultanov" rel="noopener noreferrer"&gt;a cup of coffee&lt;/a&gt; ☕.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>powerfuldevs</category>
      <category>powerplatform</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Azure Monitor — Telemetry Client Reinvented</title>
      <dc:creator>Stas Sultanov</dc:creator>
      <pubDate>Thu, 08 May 2025 06:57:54 +0000</pubDate>
      <link>https://forem.com/stas-sultanov/azure-monitor-telemetry-client-reinvented-52jj</link>
      <guid>https://forem.com/stas-sultanov/azure-monitor-telemetry-client-reinvented-52jj</guid>
      <description>&lt;p&gt;Recently, I was brought on board of yet another project to help build an enterprise-grade IT solution based on Microsoft Power Platform and Azure.&lt;/p&gt;

&lt;p&gt;Like any well-architected system, the solution required robust observability — the ability to track operational behavior, diagnose issues, and maintain visibility across all components. Naturally, Azure Monitor was the go-to choice.&lt;/p&gt;

&lt;p&gt;One of the core components of the solution was a custom plugin for Power Platform. To capture application-level telemetry from the plugin, the obvious approach was to use a telemetry client that integrates with Azure Application Insights, a feature of Azure Monitor. By default, Application Insights allows unauthenticated data ingestion — which makes it a potential target for abuse. To address this, the instance was configured to require Entra authentication for secure access.&lt;/p&gt;

&lt;p&gt;And that’s where things began to fall apart.&lt;/p&gt;

&lt;p&gt;After investing time trying to integrate both OpenTelemetry with the Azure Monitor Exporter and the legacy Application Insights SDK, it became clear that neither option worked reliably in plugin environments.&lt;/p&gt;

&lt;p&gt;As a result, I made the decision to build my own telemetry client library for Application Insights.&lt;/p&gt;

&lt;p&gt;Creating yet another telemetry library for a service already backed by a major corporation may seem unnecessary — even questionable. But in this case, there were good reasons to build it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Plugin-Specific Constraints
&lt;/h2&gt;

&lt;p&gt;Before diving deeper, it’s important to understand the unique constraints of plugin development — especially within the context of Microsoft Power Platform.&lt;/p&gt;

&lt;p&gt;Plugins face several critical limitations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Lightweight
&lt;/h3&gt;

&lt;p&gt;Plugins can be dynamically loaded and unloaded by the host application, so DLL size and dependency count directly impact performance and reliability.&lt;br&gt;
Must manage dependencies carefully&lt;br&gt;
A plugin may be loaded into an application domain where other versions of the same libraries are already present. This creates a real risk of binding conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Host-specific execution rules
&lt;/h3&gt;

&lt;p&gt;Power Platform handles plugins in a very specific way — caching instances and calling the Execute method multiple times. As a result, certain rules must be followed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Target .NET Framework 4.6.2
&lt;/h3&gt;

&lt;p&gt;It may not be the most modern runtime, but within the Power Platform ecosystem, it’s the only supported option — and there’s no way around it.&lt;br&gt;
In short, plugin development demands tight control, a minimal footprint, and strict compatibility — none of which are priorities in the design of most modern SDKs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why OpenTelemetry with Exporter Is Not an Option
&lt;/h2&gt;

&lt;p&gt;According to Microsoft documentation, OpenTelemetry with Azure Monitor Exporter is the recommended way to integrate with Application Insights for modern .NET applications.&lt;/p&gt;

&lt;p&gt;However, this approach falls short — especially in plugin development, and even more so in Power Platform plugin scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Count and Size
&lt;/h3&gt;

&lt;p&gt;When using packages OpenTelemetry 1.11.2 and Azure.Monitor.OpenTelemetry.Exporter 1.3.0 in a .NET project targeting .NET Framework 4.6.2, the resulting output includes 126 files, totaling 5243 KB. That’s far from lightweight.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with Static Classes
&lt;/h3&gt;

&lt;p&gt;The OpenTelemetry model relies heavily on static fields of ActivitySource class.&lt;/p&gt;

&lt;p&gt;Due to the way Power Platform manages plugin lifecycles — reusing cached instances and calling the Execute method multiple times — this leads to repeated initialization and duplicate telemetry data being sent to Application Insights.&lt;/p&gt;

&lt;p&gt;Maybe it is possible to implement a thread-safe singleton wrapper to control initialization. But doing so introduces complexity, and more importantly, violates Microsoft’s own plugin development recommendations for Power Platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verdict
&lt;/h3&gt;

&lt;p&gt;Even without considering the excessive file count and size, the use of static state in OpenTelemetry makes it fundamentally incompatible with plugin-based architectures.&lt;/p&gt;

&lt;p&gt;For Power Platform plugins, OpenTelemetry with Azure Monitor Exporter is simply a no-go solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Wrong with the Microsoft Application Insight SDK
&lt;/h2&gt;

&lt;p&gt;Let’s take a look at the issues encountered when attempting to use the Microsoft Application Insights SDK in plugin development.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Count and Size
&lt;/h3&gt;

&lt;p&gt;When using packages Microsoft.ApplicationInsights 2.23.0 and Azure.Core 1.45.0 in a .NET project targeting .NET Framework 4.6.2, the resulting output includes 109 files, totaling 4643 KB. Not good as for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Target Framework
&lt;/h3&gt;

&lt;p&gt;One of the first surprises is that the SDK doesn’t target .NET Framework 4.6.2, the only version supported for Power Platform plugins, and which support ends January 2027.&lt;/p&gt;

&lt;p&gt;Instead, it targets .NET 4.5.2 and .NET 4.6 — both of which reached end-of-support in April 2022.&lt;/p&gt;

&lt;p&gt;While this isn’t a critical blocker, it clearly signals that the SDK isn’t aligned with the needs of current, real-world development scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flaw in Authentication
&lt;/h3&gt;

&lt;p&gt;To support Entra ID authentication, the SDK offers the method TelemetryConfiguration.SetAzureTokenCredential(object tokenCredential), which expects the provided object to derive from Azure.Core.TokenCredential.&lt;/p&gt;

&lt;p&gt;However, the SDK does not directly reference Azure.Core.dll, the library that defines TokenCredential.&lt;/p&gt;

&lt;p&gt;Instead, it attempts to perform a runtime type check by scanning all loaded assemblies in memory and matching type names via reflection.&lt;/p&gt;

&lt;p&gt;It’s difficult to describe how flawed this design is — and what it implies about the quality of engineering behind it.&lt;/p&gt;

&lt;p&gt;As you can probably guess, this is where things begin to fall apart. The type-checking logic ends up grabbing the first matching assembly loaded into memory, which may not be the version your plugin references.&lt;/p&gt;

&lt;p&gt;Yes, you could try to work around this by referencing the same version of Azure.Core.dll as the one preloaded by Power Platform.&lt;br&gt;
And yes — that might work.&lt;/p&gt;

&lt;p&gt;But I don’t need to explain how quickly — and why — this kind of “solution” will break down over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verdict
&lt;/h3&gt;

&lt;p&gt;While it may be possible to use the Microsoft SDK in basic scenarios that don’t require authentication, that wasn’t an option in my case.&lt;br&gt;
Authentication was a requirement — and that alone made the official SDK a clear no-go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing the Azure.Monitor.Telemetry library.
&lt;/h2&gt;

&lt;p&gt;Faced with the limitations of both OpenTelemetry with Exporter and the Microsoft Application Insights SDK, I made the decision to build a custom telemetry client.&lt;/p&gt;

&lt;p&gt;The goal was simple: create a lightweight, extensible, and reliable library that integrates with Azure Application Insights — without the overhead, complexity, or incompatibilities of the official options.&lt;/p&gt;

&lt;p&gt;What began as a solution to a specific problem has since evolved into a fully-featured, enterprise-grade library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;The result is a robust telemetry client that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ships as just 1 file and approximately 62 KB, compared to hundreds of files and thousands of kilobytes required by existing SDKs.&lt;/li&gt;
&lt;li&gt;Targets .NET Framework 4.6.2, .NET 8, and .NET 9.&lt;/li&gt;
&lt;li&gt;Supports all telemetry types available in Application Insights.&lt;/li&gt;
&lt;li&gt;Works flawlessly in constrained environments like Power Platform, where static state and runtime collisions pose real risks.&lt;/li&gt;
&lt;li&gt;Offers minimal abstractions and zero external dependencies.&lt;/li&gt;
&lt;li&gt;Can be used for solutions and applications of any type: plugins, standalone applications, distributed systems, and other resource-constrained environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check It out&lt;br&gt;
👉 &lt;a href="https://github.com/stas-sultanov/azure-monitor-telemetry" rel="noopener noreferrer"&gt;Repo on GitHub&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://www.nuget.org/packages/Stas.Azure.Monitor.Telemetry" rel="noopener noreferrer"&gt;Package on NuGet.org&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/stas-sultanov/media-assets/tree/main/telemetry-client" rel="noopener noreferrer"&gt;Samples on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repo with samples contains samples for different use case scenarios like Console Application, Power Platform Plugin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Afterword
&lt;/h2&gt;

&lt;p&gt;I couldn’t find any documentation for the Application Insights API — especially the part related to publishing telemetry from the client side.&lt;/p&gt;

&lt;p&gt;Because of this, I had to explore the source code of the official SDKs available on GitHub and even reverse engineer some parts to understand how things work.&lt;/p&gt;

&lt;p&gt;Unfortunately, I must admit that it looks like the engineers who built the Application Insights API were not very familiar with the concept of consistency. It’s difficult to understand the reasoning behind such an inconsistent and fragmented API surface.&lt;/p&gt;

&lt;p&gt;The Microsoft .NET client for Application Insights is a great example of how not to develop libraries. Beyond the issues I’ve described and the absence of design consistency, the implementation is massively overengineered and extremely hard to understand.&lt;/p&gt;

&lt;p&gt;And the most surprising part? According to GitHub, this SDK has been around for almost 10 years and has over 90 contributors — yet still fails to deliver a practical, developer-friendly solution.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>powerplatform</category>
      <category>powerfuldevs</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
