可视化工具Grafana与ECharts在物联网设备监控中的应用

267 阅读6分钟

一、两款可视化工具的详细介绍

1. Grafana

Grafana 是一款诞生于 2014 年的开源可视化监控平台,由瑞典公司 Grafana Labs 开发并维护。它的核心定位是 “连接数据与决策”,通过统一的界面整合多源数据,让复杂的监控指标变得直观可懂。

其核心特性包括:

  • 多数据源兼容:原生支持 Prometheus、InfluxDB、MySQL、Elasticsearch 等 50+ 数据源,物联网场景中最常与 Prometheus 搭配,实现设备时序数据的实时可视化。
  • 模板化仪表盘:社区提供数千种现成模板(如服务器监控、物联网传感器监控模板),新手无需从零设计,导入模板后修改数据源即可使用。
  • 动态交互能力:支持图表联动(点击一个面板筛选另一个面板数据)、时间范围缩放、指标下钻等操作,方便运维人员快速定位问题。
  • 告警生态完善:可基于指标阈值设置多级告警(如警告、严重、紧急),并通过 Webhook 对接企业微信、钉钉、PagerDuty 等工具,确保异常信息及时触达。

2. ECharts

ECharts 是百度开源的 JavaScript 可视化库,2013 年首次发布,目前由 Apache 基金会维护。它更像一套 “可视化绘图工具包”,开发者可通过代码调用 API 绘制几乎任何形态的图表。

其核心特性包括:

  • 图表类型丰富:支持折线图、柱状图等基础图表,以及热力图、桑基图、3D 地球等复杂图表,尤其在地理信息可视化(如设备分布地图)方面表现突出。
  • 高度定制化:从颜色、字体到动画效果均可通过代码精细调整,例如可将物联网设备的温度数据映射到户型图的对应房间位置,实现 “数据与物理空间” 的绑定展示。
  • 轻量易集成:体积仅 100KB 左右,可嵌入网页、移动端 App 或桌面软件,通过 JSON 格式与后端(如 Python Flask/Django)交互获取数据。
  • 开源免费:无商业授权限制,企业级应用无需支付费用,且社区活跃,问题解决文档丰富。

二、Grafana 与 ECharts 优缺点对比表

工具优点缺点适用场景
Grafana1. 支持多数据源(Prometheus、MySQL 等)2. 自带告警功能,可联动微信 / 邮件3. 开箱即用的仪表盘模板4. 无需编程基础,鼠标点选即可配置1. 定制化程度有限,复杂图表难实现2. 依赖数据源配置,新手易踩坑3. 界面风格较固定,个性化弱实时监控仪表盘、多设备集中监控
ECharts1. 完全自定义图表样式,支持 3D / 地理信息等复杂图表2. 轻量级,可嵌入网页 / APP3. 结合 Python 等语言可实现高度定制1. 需要编写代码(JavaScript)2. 无内置告警功能,需自行开发3. 数据源需手动对接定制化报表、业务大屏、特殊可视化需求

三、用 Prometheus 采集数据并构建动态仪表盘

1. Prometheus 安装与配置

先去 Prometheus 官网下载适合自己系统的安装包,解压后找到配置文件prometheus.yml。用记事本打开,在scrape_configs节点下添加要监控的设备信息,就像给快递员留收货地址一样。比如要监控前面 Python 脚本模拟的温度传感器,就加这段:

scrape_configs:
  - job_name: 'iot_sensors'
    static_configs:
      - targets: ['localhost:8000']  # 传感器数据接口地址

保存后双击prometheus.exe启动,打开浏览器访问http://localhost:9090,能看到界面就说明装好了。点左上角的 “Status”→“Targets”,如果iot_sensors那一行显示 “UP”,就表示数据开始采集了。

2. 构建 Grafana 动态仪表盘

打开 Grafana(默认地址http://localhost:3000,初始账号密码都是 admin),先把 Prometheus 加为数据源:

  1. 点左边齿轮图标→“Data Sources”→“Add data source”,选 “Prometheus”
  1. 在 “URL” 栏填http://localhost:9090,拉到最下面点 “Save & Test”,显示绿色对勾就成了

接着做仪表盘:

  1. 点左边 “+” 号→“Dashboard”→“Add new panel”
  1. 在 “Query” 标签页,数据源选刚加的 Prometheus,查询框输入room_temperature{room=~"$room"}
  1. 点右上角 “Apply”,就能看到温度曲线了。想同时看多个房间?点 “Variables”→“Add variable”,类型选 “Query”,查询写label_values(room_temperature, room),这样就能下拉切换房间了
  1. 觉得数据刷新慢?点仪表盘右上角的时钟图标,把刷新频率改成 “5s”,曲线就会跟着实时变

要是想温度超 30℃时报警,点面板右上角的三个点→“Edit”→“Alert”:

  1. 点 “Create Alert”,“Condition” 选 “Last () > 30”
  1. “Notifications” 里选 “Add notification channel”,类型选 “Email”,填自己的邮箱
  1. 保存后,温度超标的时候就能收到邮件提醒了

3. 数据流转全过程

简单说就是:Python 脚本模拟传感器不断产生温度数据→Prometheus 每隔 5 秒去脚本的 8000 端口 “抄数”→Grafana 从 Prometheus 里把数据读出来,用图表显示,同时盯着数值看要不要报警。整个过程就像快递流程:卖家(传感器)备货→快递员(Prometheus)定时取货→驿站(Grafana)展示存货并提醒收件人(运维人员)。

四、Python 代码实例分析

1. 用 Python+Prometheus+Grafana 实现温度监控

场景:用 Python 脚本模拟传感器数据,通过 Prometheus 采集,再在 Grafana 展示。

# 安装依赖:pip install prometheus-client
from prometheus_client import start_http_server, Gauge
import random
import time
# 定义一个Gauge类型指标(可增可减的数值)
temperature_gauge = Gauge(
    'room_temperature',  # 指标名
    'Temperature of each room',  # 描述
    ['room']  # 标签:区分不同房间
)
def generate_data():
    # 模拟3个房间的温度(18-30℃)
    rooms = ['living_room', 'bedroom', 'kitchen']
    while True:
        for room in rooms:
            temp = round(random.uniform(18, 30), 1)
            temperature_gauge.labels(room=room).set(temp)
        time.sleep(5)  # 每5秒更新一次
if __name__ == '__main__':
    start_http_server(8000)  # 启动HTTP服务,供Prometheus采集
    generate_data()

操作步骤

  • 在 Prometheus 配置文件中添加数据源:targets: ['localhost:8000']
  • Grafana 中导入room_temperature指标,拖拽生成温度曲线(参考前文步骤)

2. 用 Python+ECharts 实现温度分布图

场景:从 Prometheus 取数据,用 Python 处理后,生成带户型图的温度热力图。

# 安装依赖:pip install requests pyecharts
import requests
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
# 从Prometheus获取数据
def get_temperature():
    url = "http://localhost:9090/api/v1/query?query=room_temperature"
    response = requests.get(url).json()
    data = []
    for item in response['data']['result']:
        room = item['metric']['room']
        temp = float(item['value'][1])
        # 模拟房间坐标(x,y)
        positions = {
            'living_room': [100, 200],
            'bedroom': [300, 200],
            'kitchen': [200, 400]
        }
        data.append((room, temp, positions[room]))
    return data
# 生成ECharts图表
def draw_heatmap():
    data = get_temperature()
    geo = Geo()
    # 添加房间坐标
    for room, _, pos in data:
        geo.add_coordinate(room, pos[0], pos[1])
    # 添加温度数据(值越大颜色越红)
    geo.add(
        "温度",
        [(d[0], d[1]) for d in data],
        type_=ChartType.HEATMAP,
        symbol_size=50
    )
    geo.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            min_=18, max_=30, range_text=['高温', '低温']
        )
    )
    geo.render("room_heatmap.html")  # 生成网页文件
if __name__ == '__main__':
    draw_heatmap()

效果:运行后生成room_heatmap.html,打开可看到带颜色渐变的房间温度分布,红色表示高温,蓝色表示低温。

五、总结

  • 想快速搭监控系统?用 Grafana+Prometheus,跟着步骤点鼠标就行,报警功能还现成
  • 要做酷炫的定制大屏?ECharts+Python 更灵活,就是得写点代码
  • 实际用的时候,一般是 Grafana 盯实时数据,ECharts 做汇报用的报表,两者配合着来更高效