你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

收集和传输指标

适用于:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 是受支持的版本。 如果你使用的是较低的版本,请参阅更新 IoT Edge

你可以使用 Azure Monitor 和内置指标集成远程监视你的 IoT Edge。 若要在设备上启用此功能,请将指标收集器模块添加到部署中,并将其配置为收集模块指标并传输到 Azure Monitor。

若要在 IoT Edge 设备上配置监视,请遵循 教程:监视 IoT Edge 设备。 了解如何将指标收集器模块添加到设备。 本文概述了监视体系结构,并介绍了在设备上配置指标的选项。

IoT Edge 与 Azure Monitor 的集成(4:06)

体系结构

Screenshot of the metrics monitoring architecture with IoT Hub.

注意 说明
1 所有模块都必须使用 Prometheus 数据模型发出指标。 默认情况下,内置指标可显示各种工作负荷,但你还可以使用自定义模块发出特定于方案的指标,以增强监视解决方案的成效。 了解如何使用添加自定义指标 一文中的开源库来检测自定义模块。
2️ 指标收集器模块是 Microsoft 提供的 IoT Edge 模块,用于收集工作负荷模块指标并将其传输到设备外。 指标收集采用拉取模型。 你可以通过配置收集频率、终结点和筛选器来控制从模块传出的数据。 有关详细信息,请参阅本文后面的指标收集器配置部分
3️ 你可以通过两种方法将指标收集器模块中的指标发送到云。 方法 1:将指标发送到 Log Analytics。1你可以使用固定本机表(名为 InsightsMetrics)将收集到的指标引入指定的 Log Analytics 工作区。 此表的架构可与 Prometheus 指标数据模型兼容。

此方法需要访问出站端口 443 上的工作区。 而且必须在模块配置过程中指定 Log Analytics 工作区 ID 及密钥。 若要在受限制的网络中启用,请参阅本文后面的适用于受限网络访问方案的启用程序
4️ 每个指标条目都包含先前已在模块配置过程中指定的 ResourceId。 此关联会自动将指标链接到指定资源(例如,IoT 中心)。 因此,特选 IoT Edge 工作簿模板可以通过对资源发出查询来检索指标。

此方法还允许多个 IoT 中心将单个 Log Analytics 工作区作为指标数据库进行安全共享。
5️ 方法 2:将指标发送到 IoT 中心。1你可以将收集器模块配置为通过 edgeHub 模块将收集到的指标作为 UTF-8 编码的 JSON 设备到云消息进行发送。 此方法会解除对锁定 IoT Edge 设备(此类设备只能对 IoT 中心终结点进行外部访问)的监视。 其还允许监视嵌套配置中的 IoT Edge 子设备,其中子设备只能访问其父设备。
6️ 若要通过 IoT 中心路由指标,则需要设置一个(一次性)云工作流。 该工作流将处理来自指标收集器模块的消息,并将这些消息发送到 Log Analytics 工作区。 即使是通过此可选路径收到的指标,该工作流也能使用特选可视化警报功能。 如需详细了解如何设置此云工作流,请参阅通过 IoT 中心路由指标部分。

1 目前,使用方法 1直接将指标从 IoT Edge 设备传输到 Log Analytics 所需的设置步骤最少,因此操作也更简单。 建议首选方法 1;除非你的特定方案要求使用方法 2,以便让 IoT Edge 设备仅与 IoT 中心通信。

指标收集器模块

你可以将 Microsoft 提供的指标收集器模块添加到 IoT Edge 部署,以收集模块指标并将其发送到 Azure Monitor。 模块代码为开放源代码,可从 IoT Edge GitHub 存储库获取。

指标收集器模块可在 Linux X64、ARM32、ARM64 和 Windows X64(1809 版)上作为多架构 Docker 容器映像提供。 你可以从 mcr.microsoft.com/azureiotedge-metrics-collector 公开获取此指标收集器。

你还可以在 IoT Edge 模块市场上获取此收集器。

指标收集器配置

指标收集器的所有配置都是通过使用环境变量来完成。 至少需要指定此表中标记为 “必需 ”的变量。

Environment variable name 说明
ResourceId 与设备通信的 IoT 中心的资源 ID。 有关详细信息,请参阅资源 ID 部分。

必需

默认值:none
UploadTarget 控制是直接通过 HTTPS 将指标发送到 Azure Monitor,还是将指标作为 D2C 消息发送到 IoT 中心。 有关详细信息,请参阅上传目标

可以是 AzureMonitor 或 IoTMessage

不需要

默认值:AzureMonitor
LogAnalyticsWorkspaceId Log Analytics 工作区 ID

仅当“UploadTarget”为“AzureMonitor”时,才“必需”

默认值:none
LogAnalyticsSharedKey Log Analytics 工作区密钥

仅当“UploadTarget”为“AzureMonitor”时,才“必需”

默认值:none
ScrapeFrequencyInSecs 收集和传输指标的重复时间间隔(秒)。

示例:600

不需要

默认值:300
MetricsEndpointsCSV 终结点列表(以英文逗号分隔),用于从中收集 Prometheus 指标。 要从中收集指标的所有模块终结点都必须在此列表中显示。

示例:http://edgeAgent:9600/metrics、http://edgeHub:9600/metrics、http://MetricsSpewer:9417/metrics

不需要

默认值:http://edgeHub:9600/metrics, http://edgeAgent:9600/metrics
AllowedMetrics 要收集的指标列表,将忽略所有其他指标。 设置为空字符串以禁用。 有关详细信息,请参阅允许和禁止列表

示例:metricToScrape{quantile=0.99}[endpoint=http://MetricsSpewer:9417/metrics]

不需要

默认值:empty
BlockedMetrics 要忽略的指标列表。 重写 AllowedMetrics,因此,如果指标包含在这两个列表中,则不会报告该指标。 有关详细信息,请参阅允许和禁止列表

示例:metricToIgnore{quantile=0.5}[endpoint=http://VeryNoisyModule:9001/metrics], docker_container_disk_write_bytes

不需要

默认值:empty
CompressForUpload 控制是否应在上传指标时进行压缩。 适用于所有上传目标。

示例:true

不需要

默认值:true
AzureDomain 指定在将指标直接引入 Log Analytics 时要使用的顶级 Azure 域。

示例:azure.us

不需要

默认值:azure.com

资源 ID

指标收集器模块需要 IoT Edge 设备所属之 IoT 中心的 Azure 资源管理器 ID。 因此,请提供此 ID 作为 ResourceID 环境变量的值。

资源 ID 采用的格式如下:

/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Devices/IoTHubs/<iot hub name>

你可以前往 Azure 门户,在 IoT 中心的“属性”页中找到资源 ID。

Screenshot the shows how to retrieve your resource ID from the IoT Hub properties.

你也可以使用 az resource show 命令来检索资源 ID:

az resource show -g <resource group> -n <hub name> --resource-type "Microsoft.Devices/IoTHubs"

上传目标

“UploadTarget”配置选项用于控制是将指标直接发送到 Azure Monitor 还是 IoT 中心。

如果将“UploadTarget”设置为“IoTMessage”,则模块指标将作为 IoT 消息发布。 这些消息将作为 UTF8 编码的 json 从终结点 /messages/modules/<metrics collector module name>/outputs/metricOutput 发出。 例如,如果 IoT Edge 指标收集器模块名为 IoTEdgeMetricsCollector,则终结点为 /messages/modules/IoTEdgeMetricsCollector/outputs/metricOutput。 格式如下所示:

[{
    "TimeGeneratedUtc": "<time generated>",
    "Name": "<prometheus metric name>",
    "Value": <decimal value>,
    "Label": {
        "<label name>": "<label value>"
    }
}, {
    "TimeGeneratedUtc": "2020-07-28T20:00:43.2770247Z",
    "Name": "docker_container_disk_write_bytes",
    "Value": 0.0,
    "Label": {
        "name": "AzureMonitorForIotEdgeModule"
    }
}]

允许和禁止列表

AllowedMetricsBlockedMetrics 配置选项用于使用以空格或逗号分隔的指标选择器列表。 如果指标与任一列表中的一个或多个指标匹配,则会包含或排除该指标。

指标选择器使用的格式类似于 PromQL 查询语言的子集。

metricToSelect{quantile=0.5,otherLabel=~Re[ge]*|x}[http://VeryNoisyModule:9001/metrics]

指标选择器由三部分构成:

指标名称 (metricToSelect)。

  • 指标名称中可以使用通配符 *(任何字符)和 ?(任何单字符)。 例如,*CPU 将匹配 maxCPUminCPU,但无法匹配 CPUMaximum???CPU 将匹配 maxCPUminCPU,但无法匹配 maximumCPU
  • 指标选择器必需包含此组件。

基于标签的选择器 ({quantile=0.5,otherLabel=~Re[ge]*|x})。

  • 花括号内可以包含多个指标值, 但这些值应以逗号进行分隔。
  • 如果选择器中的所有标签都存在并且也匹配,则会匹配指标。
  • 与 PromQL 一样,允许使用以下匹配运算符。
    • = 匹配与所提供字符串完全相等的标签(区分大小写)。
    • != 匹配与所提供字符串不完全相等的标签。
    • =~ 匹配与所提供正则表达式对应的标签。 例如,label=~CPU|Mem|[0-9]*
    • !~ 匹配不适用于所提供正则表达式的标签。
    • 正则表达式已完全定位(A ^$ 自动添加到每个正则表达式的开头和结尾)
    • 此组件在指标选择器中是可选的。

终结点选择器 ([http://VeryNoisyModule:9001/metrics])。

  • 此 URL 应与 MetricsEndpointsCSV 中列出的 URL 完全匹配。
  • 此组件在指标选择器中是可选的。

指标必须与给定待选选择器的所有部分匹配。 其必须匹配名称,且包含所有带匹配值的相同标签,而且来自给定终结点。 例如,mem{quantile=0.5,otherLabel=foobar}[http://VeryNoisyModule:9001/metrics] 就无法匹配选择器 mem{quantile=0.5,otherLabel=~foo|bar}[http://VeryNoisyModule:9001/metrics]。 而且,你应该使用多个选择器来创建 or-like 行为,而不是 and-like 行为。

例如,要允许来自 module1 模块的自定义指标 mem(带有任意标签),但仅允许来自 module2(带 agg=p99 标签)的相同指标,可以将以下选择器添加到 AllowedMetrics

mem{}[http://module1:9001/metrics] mem{agg="p99"}[http://module2:9001/metrics]

或者,要允许适用于任意标签或终结点的自定义指标 memcpu,可以将以下内容添加到 AllowedMetrics

mem cpu

适用于受限网络访问方案的启用程序

如果要将指标直接发送到 Log Analytics 工作区,则允许出站访问以下 URL:

  • https://<LOG_ANALYTICS_WORKSPACE_ID>.ods.opinsights.azure.com/*
  • https://<LOG_ANALYTICS_WORKSPACE_ID>.oms.opinsights.azure.com/*

代理注意事项

指标收集器模块的编写平台为 .NET Core。 因此,请使用适用系统模块的相同指导来 允许通过代理服务器进行通信

收集来自本地模块的指标时,则使用 http 协议。 通过设置 NO_PROXY 环境变量,排除通过代理服务器进行的本地通信。

NO_PROXY 值设置为应排除的主机名列表(以英文逗号分隔)。 使用主机名的模块名称。 例如:edgeHub,edgeAgent,myCustomModule

路由指标

有时需要通过IoT 中心引入指标,而不是将其直接发送到 Log Analytics。 例如,监视嵌套配置中的 IoT Edge 设备时(其中子设备只能访问其父设备的 IoT Edge 中心)。 另一个示例是部署仅具有出站网络访问权限的 IoT Edge 设备以IoT 中心。

若要在此方案中启用监视,可以将指标收集器模块配置为通过 edgeHub 模块将指标作为设备到云 (D2C) 消息进行发送。 通过在收集器配置中将环境变量 UploadTarget 设置为 IoTMessage,即可启用此功能。

提示

请记住添加 edgeHub 路由,以将指标消息从收集器模块传递到 IoT 中心。 应类似于 FROM /messages/modules/replace-with-collector-module-name/* INTO $upstream

此选项需要额外的设置(云工作流)才能将到达IoT 中心的指标消息传送到 Log Analytics 工作区。 如果未进行此设置,集成的其他部分(如 特选可视化效果警报 )不起作用。

注意

请注意使用此方法将产生的额外成本。 指标消息将占用你的 IoT 中心消息配额。 此外,你还要为 Log Analytics 引入和云工作流资源付费。

云工作流示例

将指标消息从 IoT 中心传递到 Log Analytics 的云工作流可作为 IoT Edge 日志记录和监视示例的一部分提供。 你可以将此示例部署到现有云资源上,也可以将其用作生产部署引用。

后续步骤

了解 Azure Monitor 将会启用的特选可视化类型。