MQTT协议下温度数据上报观测云最佳实践

MQTT 介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计,广泛应用于物联网(IoT)、移动应用和分布式系统中,用于实现设备之间的高效通信。它通过减少数据传输量和简化通信流程,确保消息的可靠传输,同时支持多种服务质量(QoS)等级,以满足不同的业务需求。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

Func 平台

观测云 Func 平台(DataFlux Func)是一个基于 Python 的函数计算与数据处理开发平台,旨在帮助用户快速搭建、管理和执行数据处理任务。它主要由 Server(提供 Web UI 和 API 接口)和 Worker(提供 Python 脚本执行环境)两部分组成。该平台支持多源数据对接,内置丰富的数据源连接器,可快速实现数据汇聚与处理。此外,Func 平台还具备定时任务管理、API 接口发布等功能,支持同步、异步和定时调用,极大简化了开发流程。通过与观测云的深度集成,用户可以利用其强大的可观测性能力,实现数据的实时处理、分析和可视化。

通过各类传感器接收设备数据,进行处理并通过 MQTT 协议上报,通过 Func 消费来自 MQTT 协议的数据并上报至观测云平台进行存储、展示、分析、预警等操作。

实战

  • 场景:采集 Linux 主机温度,上报至观测云。
  • 准备工作:EMQX,接收 MQTT 协议的数据并供 Client 端消费数据

采集温度

Sensors(传感器)采集温度是通过物理或化学原理将温度变化转换为电信号的过程。常见的温度传感器包括热敏电阻(NTC/PTC)、热电偶、热敏二极管和数字温度传感器(如DS18B20)。这些传感器通过感知环境温度的变化,输出与温度成正比或符合特定函数关系的电压、电流或数字信号。这些信号经过放大、滤波和模数转换后,可被微控制器或数据采集系统读取,从而实现对温度的实时监测和记录。

在 Shell 中执行 sensors 可以获取到当前 CPU、硬盘等温度信息。

通过脚本方式获取温度信息:

python 复制代码
import psutil

def get_system_temperatures():
    temps = psutil.sensors_temperatures()if not temps:return "No temperature sensors found."
    
    result = ""for chip, sensors in temps.items():
        result += f"{chip}:\n"for sensor in sensors:
            result += f"  {sensor.label or 'Sensor'}: {sensor.current}°C (high={sensor.high}, critical={sensor.critical})\n"return result

# 调用函数并打印结果
system_temps = get_system_temperatures()print(system_temps)

说明:

  • psutil.sensors_temperatures() 返回系统中所有温度传感器的信息。
  • 每个传感器有 current(当前温度)、high(高温警戒值)和 critical(临界温度)等属性。

上报到 EMQX

python 复制代码
import psutil
import paho.mqtt.client as mqtt
import time
import json

def get_system_temperatures():
    temps = psutil.sensors_temperatures()
    if not temps:
        return "No temperature sensors found."
    
    result = {}
    for chip, sensors in temps.items():
        result[chip] = []
        for sensor in sensors:
            if sensor.label is not None and sensor.label != "":
                result[chip].append({
                    'host': "liurui",
                    'label': sensor.label,
                    'current': sensor.current,
                    'high': sensor.high,
                    'critical': sensor.critical
                })
    return result

def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")

def publish_temperatures(temps, broker, port, topic):
    client = mqtt.Client()
    client.on_connect = on_connect
    client.connect(broker, port, 60)
    client.loop_start()

    # 打包所有传感器数据成一个JSON对象
    payload = json.dumps(temps)
    client.publish(topic, payload)
    print(f"Published: {payload}")

    client.loop_stop()

if __name__ == "__main__":
    broker = "1.1.1.1"  # 替换为你的EMQX broker地址
    port = 1883  # 默认MQTT端口
    topic = "temperature"  # 替换为你想要发布的主题

    while True:
        system_temps = get_system_temperatures()
        if isinstance(system_temps, str):
            print(system_temps)
        else:
            publish_temperatures(system_temps, broker, port, topic)
        time.sleep(5)  # 每5秒采集并上报一次

申请观测云 API Key

登陆观测云控制台,点击菜单「管理」-「API Key 管理」,新建 API Key。

保存 Key ID 和 Key,后续 Func 平台需要用到。

Func 消费 MQTT 数据

1、新建脚本集

2、新建脚本

脚本内容如下:

python 复制代码
import json

guance = DFF.CONN('GuanceAPI')

@DFF.API('Message Handler')
def message_handler(topic, message):
    print(f"Received message: {message} on topic {topic}")
    if topic == "temperature":
        parse_and_print_temperatures(message)

def parse_and_print_temperatures(temps_json):
    # 解析 JSON 字符串为 Python 字典
    temps_dict = json.loads(temps_json)
    result = []
    # 遍历每个芯片
    for chip, sensors in temps_dict.items():
        print(f"Chip: {chip}")
        # 遍历每个传感器
        for sensor in sensors:
            result.append({
                    'measurement': 'temperature',
                    'tags': {
                        'host': sensor['host'],
                        'chip': chip,
                        'label': sensor['label']
                    },
                    'fields': {
                        'current': sensor['current'],
                        'high': sensor['high'],
                        'critical': sensor['critical']
                    }
                })

    uploadDataKit(result)

def uploadDataKit(data):
        # 获取 DataKit 操作对象
    status_code, result = guance.dataway.write_by_category_many(category='metric', data=data)
    print(f"上报结果:{status_code}")

3、发布脚本

点击发布按钮进行发布。

4、创建观测云连接器

  • 类型:观测云
  • ID: GuanceAPI

注意:ID 需要与脚本 guance = DFF.CONN('GuanceAPI') 的 ID 一致,其他字段按照实际情况填写。

5、创建 MQTT 连接器

  • 类型为 MQTT Broker (v5.0)
  • 填写 ID、主机、端口
  • 选择主题以及对应主题消费的脚本
  • 点击测试连通性,确保 MQTT 可以正常链接
  • 点击保存即可

效果展示

数据上报至观测云后,可以通过仪表板使用以下 DQL 语句可以查看温度的趋势图。

perl 复制代码
M::`temperature`:(last(`current`)) BY `chip`, `label`

总结

通过观测云 Func 平台接收来自 MQTT 协议的指标、日志、链路等数据,并通过观测云提供的 API 进行封装,上报至观测云平台进行统一的管理、可视化分析、告警等。

相关推荐
小黑_深呼吸9 天前
Prometheus实战教程:k8s平台-Redis监控案例
运维·kubernetes·prometheus·监控
小马爱打代码15 天前
Spring Boot Actuator - 应用监控与管理
spring boot·监控
ak啊24 天前
基于 Prometheus 的后端服务性能故障监控方案
监控
刘大猫2625 天前
Arthas monitor(方法执行监控)
人工智能·后端·监控
可观测性用观测云25 天前
Neo4j 可观测性最佳实践
监控
ak啊1 个月前
基于Python的自动化运维中服务器性能监控与告警
python·监控
ak啊1 个月前
Sentry 私有化部署监控前端应用
监控
vivo互联网技术1 个月前
vivo Trace 监控追求极致的建设历程
监控
企鹅侠客1 个月前
Prometheus告警从触发到收到通知延迟在哪?
运维·prometheus·监控
cxy_61 个月前
centos7系统搭建nagios监控
监控·nagios