本指南介绍了 Azure Monitor OpenTelemetry 如何自动收集遥测数据、如何添加社区仪器库,以及如何配置资源检测器以使用一致的元数据丰富这些遥测数据。 你了解默认收集哪些信号,以及资源检测器如何填充服务标识和环境详细信息等属性,以便 Application Insights 数据更易于筛选、关联和排查 .NET、Java、Node.js和 Python 应用程序。
本指南提供有关在 Azure Monitor Application Insights 中集成和自定义 OpenTelemetry (OTel) 仪表的说明。
若要了解有关 OpenTelemetry 概念的详细信息,请参阅 OpenTelemetry 概述 或 OpenTelemetry 常见问题解答。
自动数据收集
发行版通过捆绑 OpenTelemetry 检测库来自动收集数据。
包含的检测库
请求
依赖
日志记录
若要减少或增加发送到 Azure Monitor 的日志数,请配置日志记录以设置相应的日志级别或应用筛选器。 例如,您可以选择仅将 Warning 和 Error 日志发送到 OpenTelemetry/Azure Monitor。 OpenTelemetry 不负责控制日志路由或筛选——这些决策由您的 ILogger 配置来决定。 有关配置 ILogger的详细信息,请参阅 “配置日志记录”。
有关 ILogger 的详细信息,请参阅 在 C# 和 .NET 中的日志记录 以及 代码示例。
Azure监视器导出程序不包含任何检测库。
可以使用以下代码示例从 Azure 软件开发工具包(SDK) 收集依赖项,以手动订阅源。
// Create an OpenTelemetry tracer provider builder.
// It is important to keep the TracerProvider instance active throughout the process lifetime.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
// The following line subscribes to dependencies emitted from Azure SDKs
.AddSource("Azure.*")
.AddAzureMonitorTraceExporter()
.AddHttpClientInstrumentation(o => o.FilterHttpRequestMessage = (_) =>
{
// Azure SDKs create their own client span before calling the service using HttpClient
// In this case, we would see two spans corresponding to the same operation
// 1) created by Azure SDK 2) created by HttpClient
// To prevent this duplication we are filtering the span from HttpClient
// as span from Azure SDK contains all relevant information needed.
var parentActivity = Activity.Current?.Parent;
if (parentActivity != null && parentActivity.Source.Name.Equals("Azure.Core.Http"))
{
return false;
}
return true;
})
.Build();
若要减少或增加发送到 Azure Monitor 的日志数,请配置日志记录以设置相应的日志级别或应用筛选器。 例如,您可以选择仅将 Warning 和 Error 日志发送到 OpenTelemetry/Azure Monitor。 OpenTelemetry 不负责控制日志路由或筛选——这些决策由您的 ILogger 配置来决定。 有关配置 ILogger的详细信息,请参阅 “配置日志记录”。
请求
- Java 消息服务 (JMS) 使用者
- Kafka 使用者
- Netty
- 石英
- RabbitMQ
- Servlet
- 春季日程安排
注释
Servlet 和 Netty 自动检测涵盖大多数 Java HTTP 服务,包括 Java EE、Jakarta EE、Spring Boot、Quarkus 和 Micronaut。
依赖项(加上下游分布式跟踪传播)
- Apache HttpClient
- Apache HttpAsyncClient
- AsyncHttpClient
- Google HttpClient
- gRPC
- java.net.HttpURLConnection
- Java 11 HttpClient
- JAX-RS 客户端
- Jetty HttpClient (Jetty HTTP客户端)
- Java 消息服务 (JMS)
- Kafka
- Netty 客户端
- OkHttp
- RabbitMQ
依赖项(没有下游分布式跟踪传播)
- 支持 Cassandra
- 支持 Java 数据库连接 (JDBC)
- 支持 MongoDB (异步和同步)
- 支持 Redis (Lettuce 和 Jedis)
指标
- Micrometer 指标,包括 Spring Boot Actuator 指标
- Java 管理扩展 (JMX) 指标
日志
- Logback(包含 MDC 属性) ¹
- Log4j(包括 MDC/线程上下文属性) ¹
- JBoss 日志记录功能(包括 MDC 属性) ¹
- java.util.logging ¹
若要减少或增加 Azure Monitor 收集的日志数,请先在应用程序的日志记录库中设置所需的日志记录级别(例如 WARNING 或 ERROR)。
默认集合
默认情况下,会自动收集以下Azure SDK 发出的遥测数据:
[//]: # "Azure Cosmos DB 4.22.0+ due to https://github.com/Azure/azure-sdk-for-java/pull/25571"
[//]: # "the remaining above names and links scraped from https://azure.github.io/azure-sdk/releases/latest/java.html"
[//]: # "and version synched manually against the oldest version in maven central built on azure-core 1.14.0"
[//]: # ""
[//]: # "var table = document.querySelector('#tg-sb-content > div > table')"
[//]: # "var str = ''"
[//]: # "for (var i = 1, row; row = table.rows[i]; i++) {"
[//]: # " var name = row.cells[0].getElementsByTagName('div')[0].textContent.trim()"
[//]: # " var stableRow = row.cells[1]"
[//]: # " var versionBadge = stableRow.querySelector('.badge')"
[//]: # " if (!versionBadge) {"
[//]: # " continue"
[//]: # " }"
[//]: # " var version = versionBadge.textContent.trim()"
[//]: # " var link = stableRow.querySelectorAll('a')[2].href"
[//]: # " str += '* [' + name + '](' + link + ') ' + version + '\n'"
[//]: # "}"
[//]: # "console.log(str)"
Spring Boot 原生应用程序的请求
- Spring Web
- Spring Web MVC(模型-View-Controller)
- Spring WebFlux
Spring Boot 本机应用程序的依赖项
指标
Spring Boot 本机应用程序的日志
若要减少或增加 Azure Monitor 收集的日志数,请先在应用程序的日志记录库中设置所需的日志记录级别(例如 WARNING 或 ERROR)。
有关 Quartz 原生应用程序,请查看 Quarkus 文档。
注释
Quarkus 社区支持和维护 Quarkus 扩展。 寻求帮助,请使用 Quarkus 社区支持渠道。 Azure 不提供对此集成的技术支持。
以下 OpenTelemetry Instrumentation 库包含在 Azure Monitor Application Insights 发行版中。 有关详细信息,请参阅 Azure SDK for JavaScript。
请求
依赖
日志
若要减少或增加 Azure Monitor 收集的日志数,请先在应用程序的日志记录库中设置所需的日志记录级别(例如 WARNING 或 ERROR)。
可以使用 AzureMonitorOpenTelemetryOptions 配置检测:
export class BunyanInstrumentationSample {
static async run() {
// Dynamically import Azure Monitor and Bunyan
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const bunyanMod = await import("bunyan");
const bunyan = (bunyanMod as any).default ?? bunyanMod;
// Enable Azure Monitor integration and bunyan instrumentation
const options = {
instrumentationOptions: {
bunyan: { enabled: true },
},
};
const monitor = useAzureMonitor(options);
// Emit a test log entry
const log = (bunyan as any).createLogger({ name: "testApp" });
log.info(
{
testAttribute1: "testValue1",
testAttribute2: "testValue2",
testAttribute3: "testValue3",
},
"testEvent"
);
console.log("Bunyan log emitted");
}
}
请求
依赖
日志
若要减少或增加 Azure Monitor 收集的日志数,请先在应用程序的日志记录库中设置所需的日志记录级别(例如 WARNING 或 ERROR)。
可以在 GitHub 上找到使用 Python 日志记录库的示例。
默认情况下,会自动 收集 Azure 软件开发工具包(SDK)发出的遥测数据。
脚注
- ¹:支持未经处理的/未捕获的异常的自动报告
- ²:支持 OpenTelemetry 指标
小窍门
所有 OpenTelemetry 指标,无论是从仪器化库自动收集的还是从手动编码中收集的,现在都被认为是用于计费目的的 Application Insights“自定义指标”。
了解详细信息。
当您使用 OpenTelemetry 社区的工具库时,可以自动收集更多数据。
注意
我们不支持也不保证社区检测库的质量。 要为我们的发行版推荐一个,请在反馈社区中发帖或投票。 请注意,某些检测基于实验性的 OpenTelemetry 规范,未来可能会引入中断性变更。
若要添加社区库,请在为库添加 NuGet 包后使用 ConfigureOpenTelemetryMeterProvider 或 ConfigureOpenTelemetryTracerProvider 方法。
以下示例演示如何添加 运行时检测 以收集额外的指标:
dotnet add package OpenTelemetry.Instrumentation.Runtime
// Create a new ASP.NET Core web application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry meter provider to add runtime instrumentation.
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddRuntimeInstrumentation());
// Add the Azure Monitor telemetry service to the application.
// This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core web application.
var app = builder.Build();
// Start the ASP.NET Core web application.
app.Run();
以下示例演示如何添加 运行时检测 以收集额外的指标:
// Create a new OpenTelemetry meter provider and add runtime instrumentation and the Azure Monitor metric exporter.
// It is important to keep the MetricsProvider instance active throughout the process lifetime.
var metricsProvider = Sdk.CreateMeterProviderBuilder()
.AddRuntimeInstrumentation()
.AddAzureMonitorMetricExporter();
不能使用社区检测库来扩展 Java 发行版。 若要请求我们包括另一个检测库,请在GitHub页面上提出问题。 可以在 后续步骤中找到指向 GitHub 页面的链接。
不能将社区检测库与 GraalVM Java 原生应用程序一起使用。
export class RegisterExpressInstrumentationSample {
static async run() {
// Dynamically import Azure Monitor and Express instrumentation
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { registerInstrumentations } = await import("@opentelemetry/instrumentation");
const { ExpressInstrumentation } = await import("@opentelemetry/instrumentation-express");
// Initialize Azure Monitor (uses env var if set)
const monitor = useAzureMonitor();
// Register the Express instrumentation
registerInstrumentations({
instrumentations: [new ExpressInstrumentation()],
});
console.log("Express instrumentation registered");
}
}
若要添加社区仪器库(Azure Monitor 发行版中未正式支持/包含),可以直接使用该仪器进行监测。 可在 此处找到社区检测库的列表。
注释
建议不要使用 和发行库 instrument() 手动检测configure_azure_monitor()。 这不是受支持的场景,可能会导致遥测出现非预期行为。
# Import the `configure_azure_monitor()`, `SQLAlchemyInstrumentor`, `create_engine`, and `text` functions from the appropriate packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
from sqlalchemy import create_engine, text
# Configure OpenTelemetry to use Azure Monitor.
configure_azure_monitor()
# Create a SQLAlchemy engine.
engine = create_engine("sqlite:///:memory:")
# SQLAlchemy instrumentation is not officially supported by this package, however, you can use the OpenTelemetry `instrument()` method manually in conjunction with `configure_azure_monitor()`.
SQLAlchemyInstrumentor().instrument(
engine=engine,
)
# Database calls using the SQLAlchemy library will be automatically captured.
with engine.connect() as conn:
result = conn.execute(text("select 'hello world'"))
print(result.all())
资源检测器
资源检测器在启动时发现环境元数据,并填充 OpenTelemetry 资源属性 ,例如 service.name, cloud.provider和 cloud.resource_id。 此元数据为 Application Insights 中的体验提供支持,例如应用程序映射和计算链接,并改进了跟踪、指标和日志之间的关联。
小窍门
资源属性描述过程及其环境。 Span 属性描述单个操作。 将资源属性用于应用级属性,例如 service.name。
支持的环境
| 环境 |
检测的工作原理 |
备注 |
| Azure App 服务 |
语言 SDK 或 Azure Monitor 发行版会读取已知的 App Service 环境变量和主机元数据 |
使用本文中的指南时,请与 .NET、Java、Node.js和 Python 配合使用。 |
| Azure Functions |
请参阅 Azure Functions OpenTelemetry 指南 |
所有 Azure Functions 指南都位于该处。 |
| Azure 虚拟机 |
语言软件开发工具包或发行版会查询Azure实例元数据服务 |
确保 VM 能够访问实例元数据服务终结点。 |
| Azure Kubernetes Service (AKS) |
使用 OpenTelemetry 收集器 k8sattributes 处理器来添加 Kubernetes 元数据 |
建议用于 AKS 中运行的所有语言。 |
| Azure 容器应用 |
检测器在可用时映射环境变量和资源标识符 |
您还可以设置OTEL_RESOURCE_ATTRIBUTES以填补空白。 |
手动和自动仪器
在受支持的 Azure 环境中运行时,自动化工具和 Azure Monitor 发行版启用资源检测功能。
对于手动设置,可以使用标准 OpenTelemetry 选项直接设置资源属性:
# Applies to .NET (ASP.NET/ASP.NET Core), Java, Node.js, and Python
export OTEL_SERVICE_NAME="my-service"
export OTEL_RESOURCE_ATTRIBUTES="cloud.provider=azure,cloud.region=chinanorth,cloud.resource_id=/subscriptions/<SUB>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<APP>"
在 Windows PowerShell 上:
$Env:OTEL_SERVICE_NAME="my-service"
$Env:OTEL_RESOURCE_ATTRIBUTES="cloud.provider=azure,cloud.region=chinanorth,cloud.resource_id=/subscriptions/<SUB>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<APP>"
OTLP 引入注意事项
后续步骤
注释
Quarkus 社区支持和维护 Quarkus 扩展。 寻求帮助,请使用 Quarkus 社区支持渠道。 Azure 不提供对此集成的技术支持。