<?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>DEV Community: Shubham Chavan</title>
    <description>The latest articles on DEV Community by Shubham Chavan (@shubham_chavan).</description>
    <link>https://dev.to/shubham_chavan</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3023794%2F04fc4a6b-d2fe-484f-938d-56aba7238243.jpg</url>
      <title>DEV Community: Shubham Chavan</title>
      <link>https://dev.to/shubham_chavan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubham_chavan"/>
    <language>en</language>
    <item>
      <title>🚀 Getting Started with OpenTelemetry for Python Microservices on Kubernetes</title>
      <dc:creator>Shubham Chavan</dc:creator>
      <pubDate>Sun, 04 May 2025 18:38:00 +0000</pubDate>
      <link>https://dev.to/shubham_chavan/getting-started-with-opentelemetry-for-python-microservices-on-kubernetes-3a9h</link>
      <guid>https://dev.to/shubham_chavan/getting-started-with-opentelemetry-for-python-microservices-on-kubernetes-3a9h</guid>
      <description>&lt;p&gt;Here’s a clean, step-by-step guide to help you get up and running with OpenTelemetry in a real-world, containerized setup ideal for Python-based services running in Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🆚 Auto-Instrumentation vs Manual-Instrumentation in OpenTelemetry&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Auto-Instrumentation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Manual Instrumentation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Definition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatically instruments supported libraries and frameworks using OpenTelemetry wrappers.&lt;/td&gt;
&lt;td&gt;Requires you to explicitly define spans in code using the OpenTelemetry API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal changes — just install dependencies and run via &lt;code&gt;opentelemetry-instrument&lt;/code&gt; CLI.&lt;/td&gt;
&lt;td&gt;Requires importing OTEL SDK and wrapping logic with spans manually.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick observability setup, ideal for supported web frameworks like Flask, Django, FastAPI, SQLAlchemy, etc.&lt;/td&gt;
&lt;td&gt;Fine-grained control — custom logic, background jobs, async flows, or business-critical code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;opentelemetry-instrument python app.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;python with tracer.start_as_current_span("process-order"): do_work()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy, fast, low effort. Captures most useful traces out of the box.&lt;/td&gt;
&lt;td&gt;Complete control over what is traced, how it’s labeled, and where context is passed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited to what the SDK supports; may miss custom logic or async paths.&lt;/td&gt;
&lt;td&gt;Requires effort, code changes, and understanding of OTEL trace context.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;🧩 Architecture Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ll use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;OpenTelemetry SDK in a Python app&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OTEL Collector Agent (sidecar or DaemonSet on app clusters)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OTEL Collector Gateway (centralized, on a GitOps or management cluster)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SigNoz as the visualization backend (optional – you can swap with Jaeger, Datadog, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;📦 Step 1: Instrument Your Python Application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install OpenTelemetry dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install opentelemetry-sdk \
            opentelemetry-exporter-otlp \
            opentelemetry-instrumentation \
            opentelemetry-instrumentation-flask  # or your framework
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialize OTEL in your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)

otlp_exporter = OTLPSpanExporter(endpoint="http://otel-collector:4318/v1/traces")
span_processor = BatchSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instrument libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opentelemetry-instrument python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🏗️ Step 2: Deploy OpenTelemetry Collector Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the official Helm chart or a custom otel-agent.yaml.&lt;/p&gt;

&lt;p&gt;Basic example (DaemonSet mode):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;receivers:
  otlp:
    protocols:
      http:
      grpc:

exporters:
  otlp:
    endpoint: &amp;lt;gateway-collector&amp;gt;:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [otlp]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🌐 Step 3: Deploy OTEL Collector Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This collector aggregates all telemetry. Example config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;receivers:
  otlp:
    protocols:
      grpc:
      http:

exporters:
  signoz:
    endpoint: http://signoz-otel-collector:4317

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [signoz]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📊 Step 4: Install SigNoz or Jaeger as Your Observability Backend &lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm repo add signoz https://charts.signoz.io&lt;br&gt;
helm install signoz signoz/signoz&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠 Tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use resource attributes to tag services (service.name, env, etc.).&lt;/li&gt;
&lt;li&gt;Add custom spans around critical code blocks.&lt;/li&gt;
&lt;li&gt;Use batch processors to reduce export overhead.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>opentelemetry</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
