在你自己搭建的物联网栈中,几个应用负责提供、解析和存储数据。你可能把这些应用都安装在同一台或多台机器上。你可能有不同的传感器提供数据,使用不同的方法来访问和存储数据。对于一个业余项目来说,这些都还好,直到系统出问题为止。
首先应该检查所有系统和传感器的指标。无论是传统的系统还是单板计算机系统,都可以查询其负载、内存和磁盘使用情况、网络使用情况。传感器可以查询其功耗和计算周期。所有这些都可以检查其是否活跃。但是,如何收集这些指标呢?如何存储这些指标?如何访问这些指标——根据错误情况按需访问,或通过触发警报主动访问?
这篇文章的目标是提供关于DIY物联网堆栈中系统性指标收集和存储的简要概述和介绍。首先,我将提供一个指南,包括一系列问题,以帮助制定指标收集方法。其次,我将介绍几个具体的应用和系统,它们承担了收集、聚合和存储指标中的一项或几项任务。
本文最早发表在我的博客,请参阅:admantium.com
(指标的收集和存储指南)在您的物联网网络里,应用程序和技术栈决定了可用的指标,第一步是制作一份所有计算机和传感器的清单。
- 我都有哪些电脑?
- 我都有哪些传感器?
- 传感器的信息是怎么流到应用程序里的?(推送 vs. 拉取,即主动发送 vs. 被动接收)
一旦你找到答案后,你就能大致了解设备间的通信方式和数据交换过程。然后列出你想要记录的其他指标。
- 我是否想测量设备的整体活跃性?
- 对于我的计算机,哪些硬件指标是必须要监控的?
- 对于我的计算机,哪些额外的硬件指标是监控时有用的?
- 对于我的传感器,除了传感器数据外,哪些非传感器相关的软件指标有助于监控?
- 对于所有计算机指标,应该多久记录一次指标?
- 对于所有传感器指标,我们应该多久记录一次指标?
当你回答完这些问题后,拼图的最后一块就是决定度量收集与存储系统的选定。
- 这些指标是哪个系统收集的?
- 指标系统是采用推送式还是拉取式来收集数据的?
- 这些指标数据会保存多久?
- 多个系统收集的数据是否应该汇总到一台机器上?
当你理解了度量系统时,你可能会发现你想要收集的度量指标、度量系统能记录的数据以及它们之间的数据流之间存在不匹配。也许你需要使用一个额外的系统,例如一个代理,来传递数据。或者度量数据在某些系统或传感器上可能根本无法获取。这形成了一种循环,你需要反复调整和优化,才能达到一个既可管理和可持续的概念。
实践:数据收集与存储考虑了通用选项之后,我们来谈谈您在指标收集和存储方面的实际设计范围。你需要区分并考虑以下与指标收集相关的组件或角色:
- 代理:负责从计算机或传感器收集指标的系统或过程。代理可以在产生指标的同一台机器上运行,也可以在另一台机器上运行并通过联系目标来获取指标。
- 聚合器:聚合器协调代理收集指标,然后与存储系统连接,保存指标。
- 存储:长期存储指标数据的存储
在考虑具体应用时,让我惊讶的是,有些系统正好符合单一角色,而其他系统则能扮演多个角色。以下是一些示例。请注意,这里列出的系统仅限于我了解并一直在使用的那些。
代理聚合器 CollectD X Node Exporter X SNMP X Telegraf X HomeAssistant X Node Red X StatsD X Prometheus X Graphite X InfluxDB X
在下面几节里,我们将简要讨论每个应用。
CollectD,一个数据收集工具角色: 代理人
CollectD 是一款轻量级的 Linux 指标收集工具。它作为系统服务进行安装和配置,并提供大量的插件来收集各种指标。下面是一个收集 CPU 和磁盘指标的示例:
主机名 "nexus"
时间间隔 60
插件 cpu
插件 disk
<插件 cpu>
按状态汇报 true
百分比值 true
</插件>
<插件 disk>
磁盘路径 "/sda1/"
磁盘路径 "/sda2/"
</插件>
Node Exporter
角色:代理
The Node exporter 是一款适用于各种指标收集的工具,适用于 Linux 系统。它以一个单一的可执行文件形式提供,并在其主机上暴露一个指标端点。这里举个例子:
curl localhost:9000
# 说明:node_boot_time_seconds 是节点启动时间,以 Unix 时间表示。
# 类型:node_boot_time_seconds 是一个 gauge 类型的指标
node_boot_time_seconds 1.642755791e+09
# 说明:node_context_switches_total 是总的上下文切换次数。
# 类型:node_context_switches_total 是 counter 类型
node_context_switches_total 6.1337805256e+10
# 说明:node_cpu_seconds_total 表示 CPU 在每种模式下花费的秒数。
# 类型:node_cpu_seconds_total 是 counter 类型
node_cpu_seconds_total{cpu="0",mode="空闲"} 2.950242349e+07
node_cpu_seconds_total{cpu="0",mode="等待I/O"} 117189.98
node_cpu_seconds_total{cpu="0",mode="中断"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 1106.33
node_cpu_seconds_total{cpu="0",mode="软中断"} 24949.86
node_cpu_seconds_total{cpu="0",mode="被窃取"} 0
node_cpu_seconds_total{cpu="0",mode="系统"} 382452.13
SNMP(简单网络管理协议)
角色: 代理人
SNMP(简单网络管理协议,详情请参见此处)是一种较旧的协议,主要用于公开网络设备(如路由器、交换机和防火墙)的指标。支持SNMP的设备被称为,并查询时使用一种分层编号系统来结构化可用指标。例如,要查询系统15分钟的负载,你需要查询标识符1.3.6.1.4.1.2021.10.1.3,可以使用以下命令:
snmpwalk -v2c -c public localhost 1.3.6.1.4.1.2021.10.1.3.3
UCD-SNMP-MIB::systemLoad.3 = Counter32: 0.4
注:以上命令及输出未翻译,因其为技术术语或命令输出,保持原样有助于在IT领域中的标准使用和理解。
Telegraf (注:Telegraf 为原文专有名词,未翻译)身份:代理,聚合者
Telegraf 是一个高度可定制的,指标采集器和聚合器。
当以代理模式运行时,它从所有已配置的input插件收集数据。例如,这里有一个收集CPU和内存指标的基本配置:
# 代表CPU的输入
[[inputs.cpu]]
# 代表内存的输入
[[inputs.mem]]
# 配置代理的设置
[agent]
# 一个轮询间隔时间为60秒
interval = "60秒"
# 是否将时间间隔四舍五入到最近的轮询间隔
round_interval = true
作为聚合器,这里也有几个输出插件。这里是如何写入InfluxDB实例的例子:
[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "telegraf"
write_consistency = "any"
timeout = "5s"
# HTTP Basic Auth
username = REDACTED
password = REDACTED
家庭助手
角色为:代理,聚合者
Home Assistant 是一个完全可定制的平台。它的主要作用是提供一个综合的仪表盘界面,用于连接各类传感器,这些传感器通过各种协议和技术连接。HA 还提供了自动化和脚本功能来定义程序,例如,当检测到移动时自动打开灯光,定义在传感器值变化时触发的程序。
HA可以通过在配置文件中激活systemmonitor
模块来收集其主机的硬件指标信息:
传感器:
- 平台: systemmonitor
资源:
- 类型: disk_use_percent
路径: /config
- 类型: disk_use
- 类型: disk_free
- 类型: memory_use_percent
- 类型: memory_use
- 类型: memory_free
- 类型: swap_use_percent
- 类型: swap_use
- 类型: swap_free
- 类型: load_1m
- 类型: load_5m
- 类型: load_15m
- 类型: processor_use
- 类型: processor_temperature
- 类型: last_boot
基本上,所有传感器数据都存储在内部数据库中。由于存在多种不同的传感器平台和技术,你只需将它们添加为称为 传感器
的项目,Home Assistant 就会开始聚合数据。例如,要监听 CPU 温度的 MQTT 消息,可以使用以下配置:
- platform: mqtt
state_topic: '/node/nexus/cpu_temperatures'
name: 'CPU温度'
unit_of_measurement: '°C'
Node Red
角色:聚合
Node Red 是一个独特的应用程序,提供了图形化的编程环境。使用这个工具,你可以定义从输入到输出的转换过程,无论复杂程度如何,包括但不限于读取、解析、格式化和输出,并可根据需要添加条件判断。例如,这里是一个流程定义,用于解析MQTT JSON消息并判断节点是否存活,然后将这些信息存储到InfluxDB中:
角色:聚合
StatsD 是一个轻量级的内存占用较小的指标聚合器。它通常通过 UDP 接收自定义的一行格式的数据,然后把这些数据转发给其他系统。
这里是从Github仓库中提取的一个示例配置,定义了statsd实例需要监听的端口或地址,以及度量服务器的配置信息。
// 源自: https://github.com/statsd/statsd/blob/master/exampleProxyConfig.js
// 配置如下:
{
nodes: [
{host: '127.0.0.1', port: 8127, adminport: 8128},
{host: '127.0.0.1', port: 8129, adminport: 8130},
{host: '127.0.0.1', port: 8131, adminport: 8132}
],
server: './servers/udp',
host: '0.0.0.0',
port: 8125,
udp_version: 'udp4',
mgmt_port: 8126,
forkCount: 0,
checkInterval: '检查时间间隔',
cacheSize: '缓存容量'
}
普罗米修斯(Púluómǐxiūsī,希腊神话中的盗火者)
角色:聚合,存储器
Prometheus 是一种广泛应用于行业的生产级别的指标聚合工具。它提供了多种导出器来获取指标。例如,要抓取 node exporter 提供的指标,你需要添加如下抓取配置:
- job_name: 'nodes'
static_configs:
- targets: ['http://nexus:9100']
这表示我们正在监控Nexus节点的指标。
社区还提供了其他聚合器,例如“还有其他的聚合器,例如mqtt-exporter这样的工具,它会监听MQTT消息并提供与Prometheus兼容的指标数据。”
普罗米修斯内置了一个时序数据库,用于存储所有收集的指标。可以通过组合指标名称、目标属性以及附加函数来查询数据。例如,参见一些普罗米修斯查询示例。
石墨角色:聚合,存储器
Graphite 由三个部分组成:Carbon(指标聚合器守护进程),Whisper(时间序列数据存储),这是一个使用内部 SQLite 数据库的数据存储;以及用于访问指标的 web 前端。
为了收集并通过 TCP 发送并以字符串 nodes
开头的指标,并在发送到数据库之前缓存 60 秒,需要定义如下配置:
[stats]
pattern = ^nodes/.*
retentions = 60s:30d
要获取指标信息,通常使用控制面板,同时也允许通过文本进行查询。查询 CPU 负载总和的示例如下:
目标=aggregate(host.cpu.value, "sum") # 这表示聚合主机CPU值的总和
InfluxDB (InfluxDB 是一个时间序列数据库)
角色:商店
InfluxDB 是一个为高性能优化的时序数据库。InfluxDB 中的数据点由标签(离散数据)、字段(连续数据)和基于 Unix 时间戳索引组成。下面是一个温度数据表示的例子:
> select * from cpu_temperatures limit 10
表名: cpu_temperatures
时间戳 节点名称 温度(℃)
---- ---- -----------
1629979793360140718 raspberrypi 51.5
1629981542154078749 raspberrypi 52.6
1629981601660331504 raspberrypi 53.7
结论
收集您的物联网设备的硬件指标数据可以使用各种技术和协议实现。在本文的第一部分,我们提供了一套关于您想要达到的指标目标的指南和问题列表。通过明确监控哪些设备、收集哪些指标以及如何存储这些指标的连贯策略,您可以获得一个清晰的认识。在本文的第二部分,您了解了一些具体的用途和系统,并附有简短的使用案例。这些系统在收集、聚合和存储指标数据方面扮演着不同的角色。在接下来的文章中,我将具体介绍我在物联网堆栈架构中实现指标监控的方式。
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質文章