azure-monitor-opentelemetry-exporter-java
Azure Monitor OpenTelemetry Exporter for Java. Export OpenTelemetry traces, metrics, and logs to Azure Monitor/Application Insights. Triggers: "AzureMonitorExporter java", "opentelemetry azure java", "application insights java otel", "azure monitor tracing java". Note: This packa
Install
npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-monitor-opentelemetry-exporter-java
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
git clone https://github.com/microsoft/skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Azure Monitor OpenTelemetry Exporter for Java
⚠️ DEPRECATION NOTICE: This package is deprecated. Migrate to
azure-monitor-opentelemetry-autoconfigure.See Migration Guide for detailed instructions.
Export OpenTelemetry telemetry data to Azure Monitor / Application Insights.
Installation (Deprecated)
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-monitor-opentelemetry-exporter</artifactId>
<version>1.0.0-beta.x</version>
</dependency>
Recommended: Use Autoconfigure Instead
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId>
<version>LATEST</version>
</dependency>
Environment Variables
APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/
Basic Setup with Autoconfigure (Recommended)
Using Environment Variable
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder;
import io.opentelemetry.api.OpenTelemetry;
import com.azure.monitor.opentelemetry.exporter.AzureMonitorExporter;
// Connection string from APPLICATIONINSIGHTS_CONNECTION_STRING env var
AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder();
AzureMonitorExporter.customize(sdkBuilder);
OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk();
With Explicit Connection String
AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder();
AzureMonitorExporter.customize(sdkBuilder, "{connection-string}");
OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk();
Creating Spans
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Scope;
// Get tracer
Tracer tracer = openTelemetry.getTracer("com.example.myapp");
// Create span
Span span = tracer.spanBuilder("myOperation").startSpan();
try (Scope scope = span.makeCurrent()) {
// Your application logic
doWork();
} catch (Throwable t) {
span.recordException(t);
throw t;
} finally {
span.end();
}
Adding Span Attributes
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
Span span = tracer.spanBuilder("processOrder")
.setAttribute("order.id", "12345")
.setAttribute("customer.tier", "premium")
.startSpan();
try (Scope scope = span.makeCurrent()) {
// Add attributes during execution
span.setAttribute("items.count", 3);
span.setAttribute("total.amount", 99.99);
processOrder();
} finally {
span.end();
}
Custom Span Processor
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.ReadWriteSpan;
import io.opentelemetry.sdk.trace.ReadableSpan;
import io.opentelemetry.context.Context;
private static final AttributeKey<String> CUSTOM_ATTR = AttributeKey.stringKey("custom.attribute");
SpanProcessor customProcessor = new SpanProcessor() {
@Override
public void onStart(Context context, ReadWriteSpan span) {
// Add custom attribute to every span
span.setAttribute(CUSTOM_ATTR, "customValue");
}
@Override
public boolean isStartRequired() {
return true;
}
@Override
public void onEnd(ReadableSpan span) {
// Post-processing if needed
}
@Override
public boolean isEndRequired() {
return false;
}
};
// Register processor
AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder();
AzureMonitorExporter.customize(sdkBuilder);
sdkBuilder.addTracerProviderCustomizer(
(sdkTracerProviderBuilder, configProperties) ->
sdkTracerProviderBuilder.addSpanProcessor(customProcessor)
);
OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk();
Nested Spans
public void parentOperation() {
Span parentSpan = tracer.spanBuilder("parentOperation").startSpan();
try (Scope scope = parentSpan.makeCurrent()) {
childOperation();
} finally {
parentSpan.end();
}
}
public void childOperation() {
// Automatically links to parent via Context
Span childSpan = tracer.spanBuilder("childOperation").startSpan();
try (Scope scope = childSpan.makeCurrent()) {
// Child work
} finally {
childSpan.end();
}
}
Recording Exceptions
Span span = tracer.spanBuilder("riskyOperation").startSpan();
try (Scope scope = span.makeCurrent()) {
performRiskyWork();
} catch (Exception e) {
span.recordException(e);
span.setStatus(StatusCode.ERROR, e.getMessage());
throw e;
} finally {
span.end();
}
Metrics (via OpenTelemetry)
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.LongHistogram;
Meter meter = openTelemetry.getMeter("com.example.myapp");
// Counter
LongCounter requestCounter = meter.counterBuilder("http.requests")
.setDescription("Total HTTP requests")
.setUnit("requests")
.build();
requestCounter.add(1, Attributes.of(
AttributeKey.stringKey("http.method"), "GET",
AttributeKey.longKey("http.status_code"), 200L
));
// Histogram
LongHistogram latencyHistogram = meter.histogramBuilder("http.latency")
.setDescription("Request latency")
.setUnit("ms")
.ofLongs()
.build();
latencyHistogram.record(150, Attributes.of(
AttributeKey.stringKey("http.route"), "/api/users"
));
Key Concepts
| Concept | Description |
|---|---|
| Connection String | Application Insights connection string with instrumentation key |
| Tracer | Creates spans for distributed tracing |
| Span | Represents a unit of work with timing and attributes |
| SpanProcessor | Intercepts span lifecycle for customization |
| Exporter | Sends telemetry to Azure Monitor |
Migration to Autoconfigure
The azure-monitor-opentelemetry-autoconfigure package provides:
- Automatic instrumentation of common libraries
- Simplified configuration
- Better integration with OpenTelemetry SDK
Migration Steps
Replace dependency:
<!-- Remove --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-exporter</artifactId> </dependency> <!-- Add --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId> </dependency>Update initialization code per Migration Guide
Best Practices
- Use autoconfigure — Migrate to
azure-monitor-opentelemetry-autoconfigure - Set meaningful span names — Use descriptive operation names
- Add relevant attributes — Include contextual data for debugging
- Handle exceptions — Always record exceptions on spans
- Use semantic conventions — Follow OpenTelemetry semantic conventions
- End spans in finally — Ensure spans are always ended
- Use try-with-resources — Scope management with try-with-resources pattern
Reference Links
Files (skills)
-
references
-
examples.md 5.4 KB
# Azure Monitor OpenTelemetry Exporter Java - Migration Guide > **⚠️ DEPRECATION NOTICE**: This package (`azure-monitor-opentelemetry-exporter`) is deprecated. > > **Migrate to `azure-monitor-opentelemetry-autoconfigure`** for automatic instrumentation and simplified configuration. ## Migration Overview | Old Package | New Package | |-------------|-------------| | `azure-monitor-opentelemetry-exporter` | `azure-monitor-opentelemetry-autoconfigure` | ## Maven Dependency ### Remove (Deprecated) ```xml <!-- REMOVE THIS --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-exporter</artifactId> <version>1.0.0-beta.x</version> </dependency> ``` ### Add (Recommended) ```xml <!-- ADD THIS --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId> <version>1.0.0</version> </dependency> ``` ## Environment Variables ```bash APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/ ``` ## Basic Setup with Autoconfigure ### Using Environment Variable (Simplest) ```java import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.api.OpenTelemetry; import com.azure.monitor.opentelemetry.exporter.AzureMonitorExporter; // Connection string from APPLICATIONINSIGHTS_CONNECTION_STRING env var AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ### With Explicit Connection String ```java String connectionString = System.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING"); AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder, connectionString); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ## Creating Traces ```java import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; // Get tracer Tracer tracer = openTelemetry.getTracer("com.example.myapp"); // Create span Span span = tracer.spanBuilder("processOrder").startSpan(); try (Scope scope = span.makeCurrent()) { // Your application logic span.setAttribute("order.id", "12345"); span.setAttribute("customer.tier", "premium"); processOrder(); } catch (Throwable t) { span.recordException(t); throw t; } finally { span.end(); } ``` ## Creating Metrics ```java import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributeKey; Meter meter = openTelemetry.getMeter("com.example.myapp"); // Counter LongCounter requestCounter = meter.counterBuilder("http.requests") .setDescription("Total HTTP requests") .setUnit("requests") .build(); requestCounter.add(1, Attributes.of( AttributeKey.stringKey("http.method"), "GET", AttributeKey.longKey("http.status_code"), 200L )); ``` ## Custom Span Processor ```java import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.context.Context; SpanProcessor customProcessor = new SpanProcessor() { @Override public void onStart(Context context, ReadWriteSpan span) { span.setAttribute("custom.attribute", "value"); } @Override public boolean isStartRequired() { return true; } @Override public void onEnd(ReadableSpan span) { } @Override public boolean isEndRequired() { return false; } }; AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder); sdkBuilder.addTracerProviderCustomizer( (sdkTracerProviderBuilder, configProperties) -> sdkTracerProviderBuilder.addSpanProcessor(customProcessor) ); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ## Why Migrate? The `azure-monitor-opentelemetry-autoconfigure` package provides: 1. **Automatic instrumentation** — Common libraries instrumented automatically 2. **Simplified configuration** — Less boilerplate code 3. **Better integration** — Native OpenTelemetry SDK integration 4. **Active maintenance** — Ongoing updates and improvements 5. **Production ready** — GA (Generally Available) status ## Migration Steps Summary 1. Update Maven/Gradle dependency 2. Replace manual exporter setup with `AzureMonitorExporter.customize()` 3. Use `AutoConfiguredOpenTelemetrySdk.builder()` for SDK initialization 4. Remove manual span processor registration (unless custom processors needed) 5. Set `APPLICATIONINSIGHTS_CONNECTION_STRING` environment variable ## Reference Links | Resource | URL | |----------|-----| | Migration Guide | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-opentelemetry-exporter/MIGRATION.md | | Autoconfigure Package | https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-autoconfigure | | OpenTelemetry Java | https://opentelemetry.io/docs/languages/java/ | | Application Insights | https://learn.microsoft.com/azure/azure-monitor/app/app-insights-overview |
-
-
SKILL.md 8.6 KB
--- name: azure-monitor-opentelemetry-exporter-java description: | Azure Monitor OpenTelemetry Exporter for Java. Export OpenTelemetry traces, metrics, and logs to Azure Monitor/Application Insights. Triggers: "AzureMonitorExporter java", "opentelemetry azure java", "application insights java otel", "azure monitor tracing java". Note: This package is DEPRECATED. Migrate to azure-monitor-opentelemetry-autoconfigure. license: MIT metadata: author: Microsoft version: "1.0.0" package: com.azure:azure-monitor-opentelemetry-exporter --- # Azure Monitor OpenTelemetry Exporter for Java > **⚠️ DEPRECATION NOTICE**: This package is deprecated. Migrate to `azure-monitor-opentelemetry-autoconfigure`. > > See [Migration Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-opentelemetry-exporter/MIGRATION.md) for detailed instructions. Export OpenTelemetry telemetry data to Azure Monitor / Application Insights. ## Installation (Deprecated) ```xml <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-exporter</artifactId> <version>1.0.0-beta.x</version> </dependency> ``` ## Recommended: Use Autoconfigure Instead ```xml <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId> <version>LATEST</version> </dependency> ``` ## Environment Variables ```bash APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/ ``` ## Basic Setup with Autoconfigure (Recommended) ### Using Environment Variable ```java import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.api.OpenTelemetry; import com.azure.monitor.opentelemetry.exporter.AzureMonitorExporter; // Connection string from APPLICATIONINSIGHTS_CONNECTION_STRING env var AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ### With Explicit Connection String ```java AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder, "{connection-string}"); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ## Creating Spans ```java import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; // Get tracer Tracer tracer = openTelemetry.getTracer("com.example.myapp"); // Create span Span span = tracer.spanBuilder("myOperation").startSpan(); try (Scope scope = span.makeCurrent()) { // Your application logic doWork(); } catch (Throwable t) { span.recordException(t); throw t; } finally { span.end(); } ``` ## Adding Span Attributes ```java import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; Span span = tracer.spanBuilder("processOrder") .setAttribute("order.id", "12345") .setAttribute("customer.tier", "premium") .startSpan(); try (Scope scope = span.makeCurrent()) { // Add attributes during execution span.setAttribute("items.count", 3); span.setAttribute("total.amount", 99.99); processOrder(); } finally { span.end(); } ``` ## Custom Span Processor ```java import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.context.Context; private static final AttributeKey<String> CUSTOM_ATTR = AttributeKey.stringKey("custom.attribute"); SpanProcessor customProcessor = new SpanProcessor() { @Override public void onStart(Context context, ReadWriteSpan span) { // Add custom attribute to every span span.setAttribute(CUSTOM_ATTR, "customValue"); } @Override public boolean isStartRequired() { return true; } @Override public void onEnd(ReadableSpan span) { // Post-processing if needed } @Override public boolean isEndRequired() { return false; } }; // Register processor AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder(); AzureMonitorExporter.customize(sdkBuilder); sdkBuilder.addTracerProviderCustomizer( (sdkTracerProviderBuilder, configProperties) -> sdkTracerProviderBuilder.addSpanProcessor(customProcessor) ); OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk(); ``` ## Nested Spans ```java public void parentOperation() { Span parentSpan = tracer.spanBuilder("parentOperation").startSpan(); try (Scope scope = parentSpan.makeCurrent()) { childOperation(); } finally { parentSpan.end(); } } public void childOperation() { // Automatically links to parent via Context Span childSpan = tracer.spanBuilder("childOperation").startSpan(); try (Scope scope = childSpan.makeCurrent()) { // Child work } finally { childSpan.end(); } } ``` ## Recording Exceptions ```java Span span = tracer.spanBuilder("riskyOperation").startSpan(); try (Scope scope = span.makeCurrent()) { performRiskyWork(); } catch (Exception e) { span.recordException(e); span.setStatus(StatusCode.ERROR, e.getMessage()); throw e; } finally { span.end(); } ``` ## Metrics (via OpenTelemetry) ```java import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.metrics.LongHistogram; Meter meter = openTelemetry.getMeter("com.example.myapp"); // Counter LongCounter requestCounter = meter.counterBuilder("http.requests") .setDescription("Total HTTP requests") .setUnit("requests") .build(); requestCounter.add(1, Attributes.of( AttributeKey.stringKey("http.method"), "GET", AttributeKey.longKey("http.status_code"), 200L )); // Histogram LongHistogram latencyHistogram = meter.histogramBuilder("http.latency") .setDescription("Request latency") .setUnit("ms") .ofLongs() .build(); latencyHistogram.record(150, Attributes.of( AttributeKey.stringKey("http.route"), "/api/users" )); ``` ## Key Concepts | Concept | Description | |---------|-------------| | Connection String | Application Insights connection string with instrumentation key | | Tracer | Creates spans for distributed tracing | | Span | Represents a unit of work with timing and attributes | | SpanProcessor | Intercepts span lifecycle for customization | | Exporter | Sends telemetry to Azure Monitor | ## Migration to Autoconfigure The `azure-monitor-opentelemetry-autoconfigure` package provides: - Automatic instrumentation of common libraries - Simplified configuration - Better integration with OpenTelemetry SDK ### Migration Steps 1. Replace dependency: ```xml <!-- Remove --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-exporter</artifactId> </dependency> <!-- Add --> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId> </dependency> ``` 2. Update initialization code per [Migration Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-opentelemetry-exporter/MIGRATION.md) ## Best Practices 1. **Use autoconfigure** — Migrate to `azure-monitor-opentelemetry-autoconfigure` 2. **Set meaningful span names** — Use descriptive operation names 3. **Add relevant attributes** — Include contextual data for debugging 4. **Handle exceptions** — Always record exceptions on spans 5. **Use semantic conventions** — Follow OpenTelemetry semantic conventions 6. **End spans in finally** — Ensure spans are always ended 7. **Use try-with-resources** — Scope management with try-with-resources pattern ## Reference Links | Resource | URL | |----------|-----| | Maven Package | https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-exporter | | GitHub | https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/monitor/azure-monitor-opentelemetry-exporter | | Migration Guide | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-opentelemetry-exporter/MIGRATION.md | | Autoconfigure Package | https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-autoconfigure | | OpenTelemetry Java | https://opentelemetry.io/docs/languages/java/ | | Application Insights | https://learn.microsoft.com/azure/azure-monitor/app/app-insights-overview |
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.