mcpField
A
azure-monitor-opentelemetry-exporter-java

azure-monitor-opentelemetry-exporter-java

github.com/sickn33云与 DevOps48.7k54 次安装今天更新
代码仓库

关于 azure-monitor-opentelemetry-exporter-java

面向 Java 的技能,用于将 OpenTelemetry 遥测数据导出到 Azure Monitor 和 Application Insights。内容涵盖导出器配置及 Span、指标记录,并指出该包已弃用,应迁移到 `azure-monitor-opentelemetry-autoconfigure`。

主要功能

  1. 01将 OpenTelemetry 数据导出到 Azure Monitor
  2. 02使用连接字符串配置
  3. 03创建并自定义 Span
  4. 04记录指标和异常

适用场景

  1. 01将 Java 应用遥测发送到 Application Insights
  2. 02为跟踪添加 Span 和属性
  3. 03记录已检测操作中的错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-monitor-opentelemetry-exporter-java

安装后在 Claude Code 中输入/azure-monitor-opentelemetry-exporter-java确认已加载。

详细介绍

Java 版 Azure Monitor OpenTelemetry 导出器

⚠️ 弃用通知:此软件包已弃用。请迁移到 azure-monitor-opentelemetry-autoconfigure。

详细说明请参阅迁移指南。

将 OpenTelemetry 遥测数据导出到 Azure Monitor / Application Insights。

安装(已弃用)

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-monitor-opentelemetry-exporter</artifactId>
    <version>1.0.0-beta.x</version>
</dependency>

推荐:改用 Autoconfigure

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId>
    <version>REPLACE_WITH_REVIEWED_COMPATIBLE_VERSION</version>
</dependency>

环境变量

APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/

版本和遥测范围

请从链接的官方迁移文档/软件包文档中确定实际兼容的版本;占位版本无法用于构建依赖项。配置导出器并不能证明应用程序的每个库都已完成检测:请验证指定集成的跟踪、指标和日志导出,并避免初始化重复的 SDK。请对敏感属性和异常信息进行脱敏,使用获批的遥测目标,并通过应用程序生命周期管理 SDK 的关闭和刷新。

使用 Autoconfigure 进行基本设置(推荐)

使用环境变量
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();
使用显式连接字符串
AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder();
AzureMonitorExporter.customize(sdkBuilder, "{connection-string}");
OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk();

创建 Span

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();
}

添加 Span 属性

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();
}

自定义 Span 处理器

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();

嵌套 Span

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();
    }
}

记录异常

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();
}

指标(通过 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"
));

核心概念

概念说明
连接字符串包含检测密钥的 Application Insights 连接字符串
Tracer为分布式跟踪创建 Span
Span表示带有计时和属性的工作单元
SpanProcessor拦截 Span 生命周期以进行自定义处理
导出器将遥测数据发送到 Azure Monitor

迁移到 Autoconfigure

azure-monitor-opentelemetry-autoconfigure 软件包提供:

  • 对常见库进行自动检测
  • 简化配置
  • 与 OpenTelemetry SDK 更好地集成
迁移步骤
  1. 替换依赖项:

    
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-monitor-opentelemetry-exporter</artifactId>
    </dependency>
    
    
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId>
    </dependency>
    
  2. 按照迁移指南更新初始化代码

最佳实践

  1. 使用 autoconfigure — 迁移到 azure-monitor-opentelemetry-autoconfigure
  2. 设置有意义的 Span 名称 — 使用描述性操作名称
  3. 添加相关属性 — 包含用于调试的上下文数据
  4. 处理异常 — 始终在 Span 上记录异常
  5. 使用语义约定 — 遵循 OpenTelemetry 语义约定
  6. 在 finally 中结束 Span — 确保始终结束 Span
  7. 使用 try-with-resources — 使用 try-with-resources 模式管理作用域

参考链接

资源URL
Maven 软件包https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-exporter
GitHubhttps://github.com/Azure/azure-sdk-for-java/tree/main/sdk/monitor/azure-monitor-opentelemetry-exporter
迁移指南https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-opentelemetry-exporter/MIGRATION.md
Autoconfigure 软件包https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-autoconfigure
OpenTelemetry Javahttps://opentelemetry.io/docs/languages/java/
Application Insightshttps://learn.microsoft.com/azure/azure-monitor/app/app-insights-overview

适用场景

当任务与概述中描述的工作流或操作明确匹配时,可使用此技能。

局限性

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 请勿将输出视为环境特定验证、测试或专家审查的替代品。
  • 如果缺少必需的输入、权限、安全边界或成功标准,请停止并请求澄清。

评论

支持 Markdown