<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m" -->

---
title: OpenTelemetry Exporters in .NET: OTLP, Prometheus,...
description: A practical guide to configuring OpenTelemetry exporters in .NET applications. Covers the Console exporter for local development, OTLP for universal production...
canonical: https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: OpenTelemetry Exporters in .NET: OTLP, Prometheus, Jaeger, and Azure Monitor | daily.dev
og:description: A practical guide to configuring OpenTelemetry exporters in .NET applications. Covers the Console exporter for local development, OTLP for universal production...
og:url: https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m
og:image: https://api.daily.dev/og/posts/oKXbsH01m.png
og:image:alt: OpenTelemetry Exporters in .NET: OTLP, Prometheus, Jaeger, and Azure Monitor
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenTelemetry Exporters in .NET: OTLP, Prometheus, Jaeger, and Azure Monitor

**[We Are .NET](https://daily.dev/sources/wearedotnet)** · 15 min read · 0 upvotes · 0 comments

## Summary

A practical guide to configuring OpenTelemetry exporters in .NET applications. Covers the Console exporter for local development, OTLP for universal production compatibility (including Jaeger via OTLP since the dedicated Jaeger package is deprecated), Prometheus for pull-based metrics scraping in ASP.NET Core, and Azure Monitor for Application Insights integration. Explains the difference between BatchExportProcessor and SimpleExportProcessor, how to use multiple exporters simultaneously, environment variable configuration for containerized deployments, and authentication with hosted observability backends.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.devleader.ca/2026/07/31/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor>

## Questions this post answers

### Should I still use the OpenTelemetry.Exporter.Jaeger NuGet package for .NET, or use OTLP instead?

Use the OTLP exporter instead of the OpenTelemetry.Exporter.Jaeger package, which is deprecated and should not be used in new projects. Jaeger has supported the OTLP protocol natively since version 1.35, so configuring OpenTelemetry.Exporter.OpenTelemetryProtocol pointed at Jaeger's OTLP port (4317 for gRPC or 4318 for HTTP/protobuf) is the current recommended approach, and it also works unchanged against Tempo, Honeycomb, or SigNoz.

_Teams migrating off deprecated Jaeger exporters can track .NET observability changes like this via daily.dev._

### Should I use BatchExportProcessor or SimpleExportProcessor for OpenTelemetry exporters in a production .NET app?

Use BatchExportProcessor in production, since it is the default for OTLP and buffers completed spans in memory, exporting them asynchronously on a background thread so span completion never blocks the application thread on a network call. SimpleExportProcessor exports synchronously and is appropriate only for the console exporter's cheap stdout writes; over the network it becomes a throughput bottleneck at scale.

_Developers tuning export performance under load can follow production observability guidance like this on daily.dev._

### Why is my Prometheus scrape returning 404 after adding AddPrometheusExporter in ASP.NET Core?

The scraping endpoint is never mounted unless you explicitly call app.MapPrometheusScrapingEndpoint() after building the app; registering AddPrometheusExporter() alone only wires up the exporter without exposing the /metrics HTTP endpoint, so Prometheus scrapes return 404 until that call is added. In production it's also recommended to restrict access to this endpoint, for example with RequireHost, since it can expose GC heap sizes and internal business metrics.

_Developers debugging metrics scraping gaps can find configuration fixes like this through daily.dev._

## Similar posts on daily.dev

- [Dual-exporting .NET metrics with OTLP and Prometheus](https://daily.dev/posts/dual-exporting-net-metrics-with-otlp-and-prometheus-bnnpqjfa6) · OpenTelemetry · 1 upvotes · 0 comments
- [OpenTelemetry ASP.NET Core: Setup, Auto-Instrumentation, and Configuration](https://daily.dev/posts/opentelemetry-asp-net-core-setup-auto-instrumentation-and-configuration-tiydmwrgx) · We Are .NET · 1 upvotes · 0 comments
- [OpenTelemetry Logging .NET: ILogger Integration and Structured Log Export](https://daily.dev/posts/opentelemetry-logging-net-ilogger-integration-and-structured-log-export-5b3h28qfa) · We Are .NET · 1 upvotes · 0 comments
- [How Prometheus Exporters Work With OpenTelemetry](https://daily.dev/posts/how-prometheus-exporters-work-with-opentelemetry-hxjdcu2qr) · Last9 · 4 upvotes · 0 comments

---

Tags: [#azure](https://daily.dev/tags/azure), [#.net](https://daily.dev/tags/.net), [#observability](https://daily.dev/tags/observability), [#opentelemetry](https://daily.dev/tags/opentelemetry), [#prometheus](https://daily.dev/tags/prometheus)

[View this post on daily.dev](https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"OpenTelemetry Exporters in .NET: OTLP, Prometheus, Jaeger, and Azure Monitor","url":"https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m"},"datePublished":"2026-07-31T23:31:48.411Z","dateModified":"2026-09-13T20:32:31.883Z","description":"A practical guide to configuring OpenTelemetry exporters in .NET applications. Covers the Console exporter for local development, OTLP for universal production...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/ee9331bcc4ef69853ff0f188b5d7cf06?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/ee9331bcc4ef69853ff0f188b5d7cf06?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"We Are .NET","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"We Are .NET","logo":"https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet","url":"https://daily.dev/sources/wearedotnet"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"azure,.net,observability,opentelemetry,prometheus","timeRequired":"PT15M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"We Are .NET","item":"https://daily.dev/sources/wearedotnet"},{"@type":"ListItem","position":3,"name":"OpenTelemetry Exporters in .NET: OTLP, Prometheus, Jaeger, and Azure Monitor"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/opentelemetry-exporters-in-net-otlp-prometheus-jaeger-and-azure-monitor-okxbsh01m#faq","mainEntity":[{"@type":"Question","name":"Should I still use the OpenTelemetry.Exporter.Jaeger NuGet package for .NET, or use OTLP instead?","acceptedAnswer":{"@type":"Answer","text":"Use the OTLP exporter instead of the OpenTelemetry.Exporter.Jaeger package, which is deprecated and should not be used in new projects. Jaeger has supported the OTLP protocol natively since version 1.35, so configuring OpenTelemetry.Exporter.OpenTelemetryProtocol pointed at Jaeger's OTLP port (4317 for gRPC or 4318 for HTTP/protobuf) is the current recommended approach, and it also works unchanged against Tempo, Honeycomb, or SigNoz. Teams migrating off deprecated Jaeger exporters can track .NET observability changes like this via daily.dev."}},{"@type":"Question","name":"Should I use BatchExportProcessor or SimpleExportProcessor for OpenTelemetry exporters in a production .NET app?","acceptedAnswer":{"@type":"Answer","text":"Use BatchExportProcessor in production, since it is the default for OTLP and buffers completed spans in memory, exporting them asynchronously on a background thread so span completion never blocks the application thread on a network call. SimpleExportProcessor exports synchronously and is appropriate only for the console exporter's cheap stdout writes; over the network it becomes a throughput bottleneck at scale. Developers tuning export performance under load can follow production observability guidance like this on daily.dev."}},{"@type":"Question","name":"Why is my Prometheus scrape returning 404 after adding AddPrometheusExporter in ASP.NET Core?","acceptedAnswer":{"@type":"Answer","text":"The scraping endpoint is never mounted unless you explicitly call app.MapPrometheusScrapingEndpoint() after building the app; registering AddPrometheusExporter() alone only wires up the exporter without exposing the /metrics HTTP endpoint, so Prometheus scrapes return 404 until that call is added. In production it's also recommended to restrict access to this endpoint, for example with RequireHost, since it can expose GC heap sizes and internal business metrics. Developers debugging metrics scraping gaps can find configuration fixes like this through daily.dev."}}]}
```

