【实时Linux实战系列】实时系统的可观测性:Prometheus 与 Grafana 集成

在实时系统中,系统的性能和稳定性是至关重要的。实时系统通常用于对时间敏感的应用场景,如工业自动化、航空航天、金融交易等。这些场景要求系统能够在严格的时间约束内完成任务,任何延迟都可能导致严重的后果。因此,实时系统的可观测性变得尤为重要。可观测性指的是能够通过外部测量来了解系统内部状态的能力。通过监控关键指标,如任务延迟、CPU利用率等,可以及时发现并解决潜在问题,确保系统的稳定运行。

Prometheus 和 Grafana 是目前最流行的开源监控工具组合。Prometheus 是一个强大的时间序列数据库,用于收集和存储监控数据;Grafana 则是一个功能强大的可视化工具,可以将 Prometheus 中的数据以直观的图表形式展示出来。通过将实时系统的延迟指标(如 cyclictestftrace 的结果)导出为 Prometheus 指标,并使用 Grafana 创建可视化仪表盘,我们可以实现对系统实时性能的持续监控和告警。

掌握 Prometheus 和 Grafana 的集成对于开发者来说具有重要的价值。它不仅可以帮助开发者更好地理解和优化实时系统,还可以在实际项目中提高系统的可靠性和性能。

核心概念

实时任务的特性

实时任务是指那些对时间有严格要求的任务。它们通常需要在规定的时间内完成,否则可能导致系统不稳定或数据错误。实时任务的关键特性包括:

  • 时间约束:任务必须在规定的时间内完成。

  • 优先级:高优先级的任务优先执行。

  • 确定性:任务的执行时间是可以预测的。

Prometheus

Prometheus 是一个开源的监控系统,主要用于收集和存储时间序列数据。它的核心概念包括:

  • 指标:Prometheus 中的数据以指标的形式存储。指标可以是计数器(Counter)、计时器(Gauge)、直方图(Histogram)等。

  • 目标:Prometheus 通过 HTTP API 从目标(如服务或设备)中抓取指标。

  • 存储:Prometheus 将抓取的指标存储在本地的时间序列数据库中。

Grafana

Grafana 是一个开源的可视化工具,用于展示 Prometheus 中的数据。它的核心概念包括:

  • 数据源:Grafana 可以连接到多种数据源,如 Prometheus、InfluxDB 等。

  • 仪表盘:Grafana 通过仪表盘展示数据。仪表盘可以包含多个图表,如折线图、柱状图等。

  • 告警:Grafana 可以设置告警规则,当数据超过阈值时发送通知。

环境准备

软硬件环境

  • 操作系统:Ubuntu 20.04 或更高版本

  • 开发工具 :Prometheus、Grafana、cyclictestftrace

  • 版本信息

    • Prometheus:2.30.0

    • Grafana:8.0.0

    • cyclictest:5.10.0

    • ftrace:5.10.0

环境安装与配置

安装 Prometheus
  1. 下载 Prometheus:

复制代码
   wget https://github.com/prometheus/prometheus/releases/download/v2.30.0/prometheus-2.30.0.linux-amd64.tar.gz
  1. 解压并安装:

    复制代码
    tar xvfz prometheus-2.30.0.linux-amd64.tar.gz
    cd prometheus-2.30.0.linux-amd64
  2. 配置 Prometheus:

    编辑 prometheus.yml 文件,配置 Prometheus 从目标抓取指标:

    复制代码
    global:
      scrape_interval: 15s
    
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
  3. 启动 Prometheus:

复制代码
   ./prometheus --config.file=prometheus.yml
安装 Grafana
  1. 添加 Grafana 的官方仓库:

复制代码
   sudo apt-get install -y apt-transport-https
   sudo apt-get install -y software-properties-common wget
   wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
   echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
  1. 安装 Grafana:

    复制代码
    sudo apt-get update
    sudo apt-get install grafana
  2. 启动 Grafana:

复制代码
   sudo systemctl start grafana-server
   sudo systemctl enable grafana-server
安装 cyclictestftrace
  1. 安装 cyclictest

复制代码
   sudo apt-get install rt-tests
  1. 启用 ftrace

复制代码
   sudo echo 1 > /sys/kernel/debug/tracing/tracing_on
   sudo echo function > /sys/kernel/debug/tracing/current_tracer

实际案例与步骤

步骤 1:导出 cyclictest 指标

  1. 运行 cyclictest

复制代码
   cyclictest -t -p 80 -n -i 1000 -l 100000

这条命令会以 1000 微秒的间隔运行 cyclictest,持续 100000 次。
3. 导出指标

创建一个简单的 Prometheus 导出器脚本 cyclictest_exporter.py

复制代码
   #!/usr/bin/env python3
   import subprocess
   import time
   from prometheus_client import start_http_server, Gauge

   CYCLICTEST_CMD = "cyclictest -t -p 80 -n -i 1000 -l 100000"
   CYCLICTEST_GAUGE = Gauge('cyclictest_latency', 'Cyclictest latency')

   def run_cyclictest():
       process = subprocess.Popen(CYCLICTEST_CMD.split(), stdout=subprocess.PIPE)
       while True:
           output = process.stdout.readline()
           if not output:
               break
           latency = float(output.split()[1])
           CYCLICTEST_GAUGE.set(latency)

   if __name__ == '__main__':
       start_http_server(8000)
       while True:
           run_cyclictest()
           time.sleep(1)
  1. 启动导出器

复制代码
   python3 cyclictest_exporter.py

步骤 2:配置 Prometheus 抓取 cyclictest 指标

  1. 编辑 Prometheus 配置文件

    prometheus.yml 文件中添加一个新的抓取任务:

复制代码
   scrape_configs:
     - job_name: 'cyclictest'
       static_configs:
         - targets: ['localhost:8000']
  1. 重启 Prometheus

复制代码
   ./prometheus --config.file=prometheus.yml

步骤 3:配置 Grafana

  1. 添加 Prometheus 数据源

    打开 Grafana 的 Web 界面(默认地址为 http://localhost:3000),登录后进入设置页面,添加 Prometheus 作为数据源。

  2. 创建仪表盘

    创建一个新的仪表盘,添加一个图表,选择 cyclictest_latency 指标作为数据源。

  3. 配置告警

    在 Grafana 中设置告警规则,当 cyclictest_latency 超过某个阈值时发送通知。

步骤 4:导出 ftrace 指标

  1. 运行 ftrace

复制代码
   sudo echo 1 > /sys/kernel/debug/tracing/tracing_on
   sudo echo function > /sys/kernel/debug/tracing/current_tracer
  1. 导出指标

    创建一个简单的 Prometheus 导出器脚本 ftrace_exporter.py

复制代码
   #!/usr/bin/env python3
   import subprocess
   import time
   from prometheus_client import start_http_server, Gauge

   FTRACE_CMD = "cat /sys/kernel/debug/tracing/trace"
   FTRACE_GAUGE = Gauge('ftrace_latency', 'Ftrace latency')

   def run_ftrace():
       process = subprocess.Popen(FTRACE_CMD.split(), stdout=subprocess.PIPE)
       while True:
           output = process.stdout.readline()
           if not output:
               break
           latency = float(output.split()[1])
           FTRACE_GAUGE.set(latency)

   if __name__ == '__main__':
       start_http_server(8
  1. while True: run_ftrace() time.sleep(1)

    1. 启动导出器
    bash 复制代码
    python3 ftrace_exporter.py

步骤 5:配置 Prometheus 抓取 ftrace 指标

  1. 编辑 Prometheus 配置文件

    prometheus.yml 文件中添加一个新的抓取任务:

复制代码
   scrape_configs:
     - job_name: 'ftrace'
       static_configs:
         - targets: ['localhost:8001']
  1. 重启 Prometheus

复制代码
   ./prometheus --config.file=prometheus.yml

步骤 6:在 Grafana 中添加 ftrace 指标

  1. 添加图表

    在 Grafana 的仪表盘中添加一个新的图表,选择 ftrace_latency 指标作为数据源。

  2. 配置告警

    设置告警规则,当 ftrace_latency 超过某个阈值时发送通知。

常见问题与解答

Q1: Prometheus 无法抓取指标

问题描述:Prometheus 无法从目标中抓取指标。

解决方案

  1. 确保目标服务正在运行,并且端口已正确配置。

  2. 检查 Prometheus 的配置文件,确保抓取任务的配置正确。

  3. 使用 curl 测试目标服务是否可以访问:

复制代码
   curl http://localhost:8000/metrics

Q2: Grafana 无法显示指标

问题描述:Grafana 无法显示 Prometheus 中的指标。

解决方案

  1. 确保 Grafana 已正确添加 Prometheus 作为数据源。

  2. 检查 Grafana 的查询语句是否正确。

  3. 确保 Prometheus 中的指标名称和 Grafana 中的查询一致。

Q3: 告警规则无法触发

问题描述:Grafana 中的告警规则无法触发。

解决方案

  1. 确保告警规则的阈值设置合理。

  2. 检查告警规则的查询语句是否正确。

  3. 确保 Prometheus 中的指标数据是实时更新的。

实践建议与最佳实践

调试技巧

  1. 使用 Prometheus 的 Web 界面:Prometheus 提供了一个 Web 界面,可以用来测试查询语句和查看指标数据。

  2. 查看 Grafana 的日志:如果 Grafana 无法显示数据,可以通过查看 Grafana 的日志来排查问题。

性能优化

  1. 合理设置抓取间隔:抓取间隔过短会增加系统负担,过长则可能导致数据不及时。建议根据实际需求设置合理的抓取间隔。

  2. 优化 Grafana 的查询语句:复杂的查询语句会影响 Grafana 的性能,建议优化查询语句以提高性能。

常见错误解决方案

  1. 指标名称冲突:如果 Prometheus 中存在多个相同名称的指标,可能会导致数据不一致。建议为指标添加唯一的标签。

  2. 数据源连接失败:如果 Grafana 无法连接到 Prometheus 数据源,可能是由于网络问题或配置错误。建议检查网络连接和数据源配置。

总结与应用场景

通过本教程,我们学习了如何将实时系统的关键延迟指标(如 cyclictestftrace 的结果)导出为 Prometheus 指标,并使用 Grafana 创建可视化仪表盘。我们还探讨了如何配置 Prometheus 和 Grafana,以及如何解决常见问题。掌握这些技能对于开发者来说具有重要的价值,可以帮助他们在实际项目中更好地监控和优化实时系统的性能。

实时系统的可观测性是确保系统稳定运行的关键。通过 Prometheus 和 Grafana 的集成,我们可以实现对系统实时性能的持续监控和告警。希望读者能够将所学知识应用到真实项目中,提高系统的可靠性和性能。

相关推荐
捷智算云服务3 小时前
H200服务器维修服务体系构建:捷智算的全链条保障方案
运维·服务器
hweiyu003 小时前
Linux 命令:mount
linux·运维·服务器
zhmy_0063 小时前
linux 多服务器下目录数据文件实时同步
linux·文件实时同步
AI视觉网奇3 小时前
redis 配置学习笔记
linux·服务器
加油吧zkf3 小时前
Python入门:从零开始的完整学习指南
开发语言·前端·python
红尘客栈23 小时前
K8s-kubeadmin 1.28安装
java·网络·kubernetes
红尘客栈23 小时前
K8S基本命令操作
linux·容器·kubernetes
hello_2503 小时前
动手模拟k8s网络-vxlan模式
网络·容器·kubernetes
xqlily4 小时前
Kotlin:现代编程语言的革新者
android·开发语言·kotlin