Mark Johnson
Mark Johnson
@tazmainiandevil.bsky.social
Staff‑Level Platform Engineer | Multi‑Cloud (Azure/AWS) | Kubernetes | GitOps | IaC | DevSecOps

http://codingwithtaz.blog
Part 4 – Event‑Driven Systems with Dapr Pub/Sub

In Part 3, we used Dapr’s state management building block to store and retrieve data without database‑specific SDKs. Now we’ll shift to another core pattern in distributed systems: event‑driven communication. As systems grow, synchronous…
Part 4 – Event‑Driven Systems with Dapr Pub/Sub
In Part 3, we used Dapr’s state management building block to store and retrieve data without database‑specific SDKs. Now we’ll shift to another core pattern in distributed systems: event‑driven communication. As systems grow, synchronous service‑to‑service calls become brittle. Tight coupling, cascading failures, and deployment coordination all get harder. Event‑driven architectures help but they often introduce new complexity: broker‑specific SDKs, consumer groups, retry logic, and environment‑specific configuration.
codingwithtaz.blog
February 16, 2026 at 9:01 AM
🚀 Part 3 of my Dapr series is live: State Management Without SDKs
One of the biggest sources of accidental complexity in distributed systems is state.
Every service ends up tightly coupled to a specific database client, connection logic, retry behaviour, and environment‑specific configuration.
Part 3 – State Management with Dapr: Redis and Postgres Without the SDKs
In Part 2, we got Dapr running locally and saw how the sidecar fits into a normal development workflow. Now we can start using Dapr for real work and state management is usually the first building block teams adopt. State is one of the earliest places where infrastructure concerns leak into application code. Even simple services end up tightly coupled to a specific database client, connection logic, retry behavior, and environment‑specific configuration.
codingwithtaz.blog
February 9, 2026 at 9:06 AM
🚀 Part 2 of my Dapr series is live: Running Dapr Locally
In Part 1, I introduced why Dapr exists and the problems it solves.
Today, Part 2 goes hands‑on — showing how to run Dapr locally in a clean, predictable way without pulling in any cloud SDKs or infrastructure dependencies.
Part 2 – Running Dapr Locally: Setup, Run, and Debug Your First Service
In Part 1, we explored what Dapr is and why it exists. Now it’s time to make it real. Before you can use state management, pub/sub, or any other building block, you need a smooth local development workflow, one that feels natural, fast, and familiar. Dapr is often associated with Kubernetes and cloud deployments, but most development happens on a laptop.
codingwithtaz.blog
February 5, 2026 at 9:04 AM
🚀 New Series: Building Distributed Systems with Dapr
Over the next several weeks, I’m publishing a deep‑dive series on Dapr, a CNCF project that brings structure, consistency, and portability to distributed systems without locking you into any cloud, language, or vendor SDK.
Part 1 – What is Dapr, and Why Would You Use It?
Distributed systems are powerful, but they come with a familiar cost: every service ends up carrying a surprising amount of infrastructure code. Database clients, message broker SDKs, storage SDKs, retry logic, connection handling, secrets, configuration, observability, the list grows quickly. Most teams don’t notice this at first. It feels normal.But over time, the weight becomes obvious: Every service looks different…
codingwithtaz.blog
February 2, 2026 at 9:02 AM
Part 5 of my “Modern Observability with Jaeger v2, OpenTelemetry & GitOps” series is now live — the final chapter.
This one focuses on the real‑world side of running tracing in production:
troubleshooting, scaling, and hardening Jaeger v2 + OpenTelemetry.
In this post, I cover:
- How to debug…
Part 5 – Troubleshooting, Scaling, and Production Hardening
By this point in the series, you now have a fully working, multi‑environment observability pipeline, deployed and reconciled entirely through GitOps: Jaeger v2 running on the OpenTelemetry Collector Applications emitting traces automatically via the OpenTelemetry Operator Environment‑scoped Collectors and Instrumentation CRs Argo CD managing everything through ApplicationSets and sync waves This final part focuses on what matters most in real‑world environments: …
codingwithtaz.blog
January 26, 2026 at 9:00 AM
Part 4 of my “Modern Observability with Jaeger v2, OpenTelemetry & GitOps” series is now live.
This one dives into the architecture behind scalable, multi‑environment GitOps — the patterns that make real‑world platform engineering work.
In this post, I break down:
- How to structure a GitOps repo…
Part 4 – Building a Scalable, Multi‑Environment GitOps Architecture with Argo CD
In the previous parts of this series, we focused on instrumentation, the OpenTelemetry Operator, and the Collector. Now we shift gears and build the GitOps architecture that will manage everything, platform components, workloads, and environment‑specific configuration in a clean, scalable, production‑ready way. This is where the project becomes a real platform. All manifests, ApplicationSets, and configuration used in this series are available in the companion…
codingwithtaz.blog
January 19, 2026 at 9:01 AM
Part 3 of my “Modern Observability with Jaeger v2, OpenTelemetry & GitOps” series is now live.
This one is all about auto‑instrumenting .NET applications with the OpenTelemetry Operator, no code changes, no SDK boilerplate, just declarative instrumentation managed through GitOps.
In this post, I…
Part 3 – Auto‑Instrumenting .NET with OpenTelemetry
In Part 2, we deployed Jaeger v2 using the OpenTelemetry Collector and exposed the Jaeger UI. Now it’s time to generate real traces without modifying application code or rebuilding container images. This part shows how to use the OpenTelemetry Operator to inject the .NET auto‑instrumentation agent automatically. This approach is fully declarative, GitOps‑friendly, and ideal for platform teams who want consistent instrumentation across many services.
codingwithtaz.blog
January 12, 2026 at 9:01 AM
Part 2 of my OpenTelemetry + Jaeger v2 + GitOps series is now live.
This one gets hands‑on: deploying Jaeger v2 using the OpenTelemetry Collector, exposing the Jaeger UI, and wiring everything together in a clean, declarative way.

codingwithtaz.blog/2026/01/05/p...
Part 2 – Deploying Jaeger v2 with the OpenTelemetry Collector
In Part 1, we explored why Jaeger v2, OpenTelemetry, and GitOps form a natural, modern observability stack. Now we get hands‑on. This part walks through deploying Jaeger v2 using the OpenTelemetry …
codingwithtaz.blog
January 5, 2026 at 6:18 PM
Just published Part 1 of a new technical series on building a modern, OpenTelemetry‑powered observability platform. codingwithtaz.blog/2026/01/05/p...
Part 1 – Why Jaeger v2, OpenTelemetry, and GitOps Belong Together
Modern distributed systems generate a staggering amount of telemetry. Logs, metrics, and traces flow from dozens or hundreds of independently deployed services. Teams want deep visibility without d…
codingwithtaz.blog
January 5, 2026 at 6:16 PM