使用 Azure SDK for Rust 包时,您需要了解 SDK 操作,以便调试问题、监控性能,以及了解您的应用程序如何与 Azure 服务交互。 本文介绍如何实施基于 OpenTelemetry 的有效日志记录和遥测策略,以便深入了解 Azure 上的 Rust 应用程序的内部工作。
Azure 开发人员的遥测
Azure SDK for Rust 包通过与 OpenTelemetry 集成提供全面的可观测性,我们建议将其用于监控和分布式跟踪场景。 无论是在进行身份验证流的故障排除、监控 API 请求周期,还是分析性能瓶颈,本指南都涵盖了您需要掌握的 OpenTelemetry 工具和技术,以便深入了解 Azure SDK 操作。
用于 Rust 的 Azure SDK 包使用 OpenTelemetry 作为可观测性的标准方法,提供:
- 行业标准遥测:使用与监视平台兼容的 OpenTelemetry 格式
- 分布式跟踪:跟踪跨多个服务和 Azure 资源的请求
- 高级导出程序:将数据发送到 Jaeger、Prometheus、Grafana 和其他可观测性平台
- 跨服务关联:在微服务之间自动传播跟踪上下文
- 生产监视:专为具有采样和性能优化的大规模生产环境而构建
重要
目前,Microsoft不提供针对 Rust 应用程序的直接 Azure Monitor OpenTelemetry 导出程序。 Azure Monitor OpenTelemetry 发行版仅支持 .NET、Java、Node.js和 Python。 对于 Rust 应用程序,需要将 OpenTelemetry 数据导出到中间系统(例如 Azure 存储、事件中心或 OpenTelemetry 收集器),然后使用支持的引入方法将数据导入 Azure Monitor。
设置 OpenTelemetry 日志记录
若要使用 OpenTelemetry,需要 azure_core_opentelemetry 箱。 仅 azure_core 包不包含 OpenTelemetry 支持。
登录到 Azure CLI:
az login使用 Azure CLI 创建 Azure Monitor 资源:
# Set variables RESOURCE_GROUP="rust-telemetry-rg" LOCATION="eastus" APP_INSIGHTS_NAME="rust-app-insights" LOG_ANALYTICS_WORKSPACE="rust-logs-workspace" # Create resource group az group create --name $RESOURCE_GROUP --location $LOCATION # Create Log Analytics workspace WORKSPACE_ID=$(az monitor log-analytics workspace create \ --resource-group $RESOURCE_GROUP \ --workspace-name $LOG_ANALYTICS_WORKSPACE \ --location $LOCATION \ --query id -o tsv) # Create Application Insights instance az extension add --name application-insights INSTRUMENTATION_KEY=$(az monitor app-insights component create \ --app $APP_INSIGHTS_NAME \ --location $LOCATION \ --resource-group $RESOURCE_GROUP \ --workspace $WORKSPACE_ID \ --query instrumentationKey -o tsv) # Get connection string CONNECTION_STRING=$(az monitor app-insights component show \ --app $APP_INSIGHTS_NAME \ --resource-group $RESOURCE_GROUP \ --query connectionString -o tsv) echo "Application Insights Connection String: $CONNECTION_STRING"配置 Rust 项目。 将所需的依赖项添加到
Cargo.toml:[dependencies] azure_core_opentelemetry = "*" azure_security_keyvault_secrets = "*" azure_identity = "*" opentelemetry = "0.31" opentelemetry_sdk = "0.31" opentelemetry-otlp = "0.31" # For exporting to OpenTelemetry Collector tokio = { version = "1.47.1", features = ["full"] }注释
包含
opentelemetry-otlp的库用于将遥测数据导出到 OpenTelemetry 收集器,收集器随后可将数据转发到 Azure Monitor。 不支持从 Rust 应用程序直接导出 Azure Monitor。使用 OpenTelemetry 配置创建主应用程序。 有关详细信息 ,请参阅azure_core_opentelemetry 文档。
设置所需的环境变量并运行应用程序:
# Set Key Vault URL (replace with your actual Key Vault URL) export AZURE_KEYVAULT_URL="https://mykeyvault.vault.azure.net/" # Run the application cargo run
在应用程序中配置 OpenTelemetry 并运行它后,可以添加自定义检测并监视遥测数据。
将遥测数据导出到 Azure Monitor
由于 Rust 没有直接的 Azure Monitor OpenTelemetry 导出程序,需要实现间接方法,以便将遥测数据引入 Azure Monitor。 下面是建议的方法:
选项 1:OpenTelemetry 收集器(建议)
OpenTelemetry 收集器充当中间层,可以从 Rust 应用程序接收遥测数据并将其转发到 Azure Monitor:
- 将 OpenTelemetry 收集器部署到你的环境中(作为 sidecar、agent 或网关)
- 将 Rust 应用程序配置为 使用 OTLP(OpenTelemetry 协议)导出到收集器
- 使用 Azure Monitor 导出程序配置收集器以将数据转发到 Application Insights
选项 2:Azure 存储 + 数据引入 API
对于需要更好地控制数据处理的方案:
- 将遥测数据导出到 Azure 存储 (Blob 存储或 Data Lake)
- 使用 Azure Functions、逻辑应用或自定义应用程序处理数据
- 使用日志引入 API 将处理的数据引入 Azure Monitor
选项 3:事件中心流式处理
对于实时遥测处理:
- 将遥测数据从 Rust 应用程序流式传输到 Azure 事件中心
- 使用 Azure 流分析、Azure Functions 或自定义使用者处理事件
- 将已处理的遥测转发 到 Azure Monitor 或 Application Insights
自定义遥测数据
OpenTelemetry 提供了一个灵活的框架,用于自定义遥测数据以满足应用程序的需求。 使用这些策略增强遥测:
为应用程序代码添加检测工具
将自定义检测添加到应用程序代码有助于将业务逻辑与 Azure SDK作相关联。 通过这种关联,可以更轻松地了解完整的作流。
| Technique | 目的 | Implementation |
|---|---|---|
| Azure自定义的操作范围 | 创建一个清晰层次结构,显示应用程序逻辑与 Azure作的关系 | 使用 OpenTelemetry 跨度创建方法包装 Azure SDK 调用 |
| 将应用程序逻辑与 SDK 调用相关联 | 将业务操作与底层 Azure SDK 调用连接 | 使用跨度上下文将业务操作与触发的 Azure 服务调用进行链接 |
| 创建诊断痕迹导航 | 捕获跨工作流遥测的重要上下文 | 将结构化字段(用户 ID、请求 ID、业务对象标识符)添加到范围 |
性能分析
OpenTelemetry 提供有关 Azure SDK 性能模式的详细见解。 这些见解可帮助你识别和解决性能瓶颈。
| 分析类型 | 它揭示的内容 | 使用方法 |
|---|---|---|
| SDK操作时长 | 不同的 Azure 操作所需时间 | 使用 OpenTelemetry 自动捕获的跨度计时来识别慢速操作 |
| 服务调用瓶颈 | 应用程序花费时间等待 Azure 响应的位置 | 比较 Azure 服务和操作之间的时间安排,以查找性能问题 |
| 并发操作模式 | 操作之间的重叠和依赖关系 | 分析遥测数据,了解进行多个 Azure 调用时的并行化机会 |
错误诊断
OpenTelemetry 捕获丰富的错误上下文,这些上下文超出了简单的错误消息。 此背景不仅有助于你了解失败的原因,还帮助你理解失败发生的原因及具体情况下。
了解 SDK 错误传播:跟踪错误如何在应用程序代码和 Azure SDK 层中向上冒泡。 此跟踪可帮助你了解完整的错误路径并识别根本原因。
日志暂时性故障与永久性故障:区分临时故障(例如在重试时可能会成功的网络超时)和永久性失败(例如需要配置更改的身份验证错误)。 这种区别有助于构建可复原的应用程序。
了解日志、指标和警报
应用程序和服务生成遥测数据,以帮助监视其运行状况、性能和使用情况。 Azure 将此遥测数据分类为日志、指标和警报。
Azure 提供四种类型的遥测:
| 遥测类型 | 它给你什么 | 在何处查找每个服务 |
|---|---|---|
| Metrics | 数值、时序数据(CPU、内存等) | 门户或 CLI 中的az monitor metrics |
| Alerts | 达到阈值时主动通知 | 门户或 CLI 中的az monitor metrics alert |
| 日志 | 基于文本的事件和诊断 (Web, 应用) | 应用服务 日志、函数 监视器、容器应用 诊断 |
| 自定义日志 | 通过 App Insights 创建自己的应用程序遥测数据 | Application Insights 资源的 日志(跟踪) 表 |
为问题选取正确的遥测数据:
| Scenario | 使用日志... | 使用指标... | 使用警报... |
|---|---|---|---|
| “我的 Web 应用是否启动并响应? | 应用服务 Web 服务器日志(日志) | N/A | N/A |
| “我的函数是否超时或失败?” | 函数调用日志 (监视器) | 函数执行持续时间指标 | 有关“函数错误 >0”的警报 |
| “我的服务有多忙,能否扩展?” | N/A | 指标中的服务吞吐量/CPU | CPU% > 70% 时的自动缩放警报 |
| “我的代码引发什么异常? | Application Insights 中的自定义跟踪日志 | N/A | 有关“ServerExceptions 0”的 >警报 |
| 我是否超出了交易或配额限制? | N/A | 与配额相关的指标(事务、节流) | 有关“ThrottlingCount >0”的警报 |
在 Azure Monitor 中查看遥测数据
在 Rust 应用程序中设置 OpenTelemetry 并配置中间导出机制后,可以通过 Application Insights 查看 Azure Monitor 中的遥测数据。 由于 Rust 没有直接的 Azure Monitor 导出功能,因此需要实现以下方法之一:
- OpenTelemetry 收集器:将 OpenTelemetry 收集器 配置为从 Rust 应用程序接收数据并将其转发到 Azure Monitor
- Azure 存储集成:将遥测数据导出到 Azure 存储,并使用 Azure Monitor 数据引入 API 导入数据
- 事件中心流式处理:通过 Azure 事件中心流式传输遥测数据并将其处理为 Azure Monitor 引入
遥测数据通过以下方法之一到达 Azure Monitor 后,可以对其进行分析:
在 Azure 门户中导航到 Application Insights:
az monitor app-insights component show \ --app $APP_INSIGHTS_NAME \ --resource-group $RESOURCE_GROUP \ --query "{name:name,appId:appId,instrumentationKey:instrumentationKey}"查看跟踪和日志:
- 转到 Application Insights>事务搜索
- 查找具有操作名称的跟踪,例如
get_keyvault_secrets - 检查 日志 部分并运行 KQL 查询:
traces | where timestamp > ago(1h) | where message contains "Azure operations" or message contains "secrets" | order by timestamp desc查看分布式跟踪:
- 转到 应用程序映射 以查看服务依赖项
- 选择 性能 以查看操作时间
- 使用 端到端事务详细信息 查看完整的请求流
Rust 应用程序的自定义 KQL 查询:
// View all custom logs from your Rust app traces | where customDimensions.["service.name"] == "rust-azure-app" | order by timestamp desc // View Azure SDK HTTP operations dependencies | where type == "HTTP" | where target contains "vault.azure.net" | order by timestamp desc // Monitor error rates traces | where severityLevel >= 3 // Warning and above | summarize count() by bin(timestamp, 1m), severityLevel | render timechart
实时监视
设置实时监视以在数据到达时查看数据:
# Stream live logs (requires Azure CLI)
az monitor app-insights events show \
--app $APP_INSIGHTS_NAME \
--resource-group $RESOURCE_GROUP \
--event traces \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S)
成本优化
通过了解配置选项的最佳做法和减少 Azure Monitor 收集的数据量的机会,可以显著降低 Azure Monitor 的成本。
Rust 应用程序的关键策略:
- 使用适当的日志级别:为生产适当配置 OpenTelemetry 日志级别以减少日志数据量
- 实现采样:为大容量应用程序配置 OpenTelemetry 采样
- 过滤敏感数据:避免记录机密信息、令牌或可能增加成本的大型有效负载
- 监视数据引入:定期查看 Application Insights 数据使用情况和成本