32、数据科学系统的监控:Prometheus 与 Grafana 实战

数据科学系统的监控:Prometheus 与 Grafana 实战

1. 多进程下的 Prometheus 指标处理

在多个进程响应请求的场景中,每个进程都有自己的指标值集合。当 Prometheus 服务器请求 /metrics 时,我们只能获取到响应请求的那个进程的指标值,而无法获取其他进程的指标值,并且下一次轮询时结果可能会改变,这显然无法满足我们的监控需求。

为了解决这个问题,Prometheus 客户端提供了特殊的多进程模式。在该模式下,指标值不再存储在内存中,而是存储在一个专用文件夹的文件里。当调用 /metrics 时,它会加载所有文件并整合所有进程的指标值。

启用此模式需要设置环境变量 PROMETHEUS_MULTIPROC_DIR ,该变量应指向文件系统中用于存储指标文件的有效文件夹。以下是设置该变量并启动带有四个工作进程的 Gunicorn 的命令示例:

(venv) $ PROMETHEUS_MULTIPROC_DIR=./prometheus-tmp gunicorn -w 4 -k uvicorn.workers.UvicornWorker chapter15.chapter15_metrics_01:app

需要注意的是,使用该模式时,进程重启后指标不会被清除。如果更改了指标定义或运行了完全不同的应用程序,可能会导致意外行为。因此,要为每个应用选择专用文件夹,并在运行新版本时清理该文件夹。

2. 为 Dramatiq 添加 Prometheus 指标

Dramatiq 是一个多进程程序,负责处理复杂应用中的一些关键任务,如加载和执行 Stable Diffusion 模型以生成图像。为了确保这部分架构正常运行,需要对其进行监控。

好消息是,Dramatiq 自带内置指标,并默认暴露 /metrics 端点。以下是一个简单的 Dramatiq 工作进程示例:

# chapter15_metrics_03.py
import time
import dramatiq
from dramatiq.brokers.redis import RedisBroker

redis_broker = RedisBroker(host="localhost")
dramatiq.set_broker(redis_broker)

@dramatiq.actor()
def addition_task(a: int, b: int):
    time.sleep(2)
    print(a + b)

由于 Dramatiq 是多进程程序,需要确保 Prometheus 处于多进程模式。除了设置 PROMETHEUS_MULTIPROC_DIR 环境变量外,还需要设置 dramatiq_prom_db 。以下是启动工作进程的命令:

(venv) $ PROMETHEUS_MULTIPROC_DIR=./prometheus-tmp-dramatiq dramatiq_prom_db=./prometheus-tmp-dramatiq dramatiq chapter15.chapter15_metrics_03

为了方便在工作进程中调度任务,可在另一个终端运行以下命令:

(venv) $ python -m chapter15.chapter15_metrics_03

在浏览器中打开 http://localhost:9191/metrics ,可以看到一些指标,如 Dramatiq 处理的消息总数计数器、任务执行时间直方图以及当前正在进行的任务数量指标等。完整的指标列表可参考 Dramatiq 官方文档

3. 添加自定义指标

和 FastAPI 一样,我们可能希望为 Dramatiq 工作进程添加自定义指标。以下是一个以掷骰子为例的自定义指标示例:

# chapter15_metrics_04.py
from prometheus_client import Counter
import random
import time
import dramatiq

DICE_COUNTER = Counter(
    "worker_dice_rolls_total",
    "Total number of dice rolls labelled per face",
    labelnames=["face"],
)

@dramatiq.actor()
def roll_dice_task():
    result = random.randint(1, 6)
    time.sleep(2)
    DICE_COUNTER.labels(result).inc()
    print(result)

只需创建 Counter 对象并在任务中使用它,运行工作进程并请求 /metrics 端点,就可以看到新的指标。

4. Grafana 配置以收集指标

Grafana 是一个开源的用于数据可视化和分析的 Web 应用程序,它可以连接到各种数据源,如时间序列数据库和 Prometheus。为了快速开始,我们使用 Grafana Cloud 这个官方托管平台,它提供免费计划。

配置步骤如下:
1. 创建 Grafana Cloud 账户:访问 Grafana 注册页面 创建账户。
2. 创建实例:选择子域名和数据中心区域创建 “Grafana Stack”,建议选择靠近自己地理位置的区域。
3. 添加 Prometheus 指标:点击 “Scale and centralize existing data”,然后选择 “Hosted Prometheus metrics”,进入配置页面。
4. 选择转发方式:有两种方式转发指标,通过 Grafana Agent 或 Prometheus 服务器。这里推荐使用 Grafana Agent,它是一个小型命令行程序,带有单个配置文件。
5. 下载并执行 Grafana Agent:按照页面上的命令下载、解压并执行 Grafana Agent 程序。
6. 创建 API 令牌:创建 API 令牌,以便 Grafana Agent 可以将数据发送到实例。创建后会出现一个新命令,用于创建代理的配置文件。
7. 编辑配置文件:编辑 agent-config.yaml 文件,配置要收集指标的应用程序。示例配置如下:

# agent-config.yaml
metrics:
  global:
    scrape_interval: 60s
  configs:
  - name: hosted-prometheus
    scrape_configs:
    - job_name: app
      static_configs:
      - targets: ['localhost:8000']
    - job_name: worker
      static_configs:
      - targets: ['localhost:9191']
    remote_write:
    - url: https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push
      basic_auth:
        username: 811873
        password: __YOUR_API_TOKEN__
  1. 启动 Grafana Agent:确保 FastAPI 和 Dramatiq 应用程序正在运行,然后启动 Grafana Agent:
$ ./grafana-agent-linux-amd64 --config.file=agent-config.yaml

以下是配置 Grafana 收集指标的流程图:

graph LR
    A[创建 Grafana Cloud 账户] --> B[创建实例]
    B --> C[添加 Prometheus 指标]
    C --> D{选择转发方式}
    D -->|Grafana Agent| E[下载并执行 Grafana Agent]
    E --> F[创建 API 令牌]
    F --> G[编辑配置文件]
    G --> H[启动 Grafana Agent]
    D -->|Prometheus 服务器| I[安装 Prometheus 服务器]
5. 在 Grafana 中可视化指标

现在指标数据已经发送到 Grafana,我们可以查询数据并创建图表。步骤如下:
1. 创建新仪表盘:点击右上角的加号,选择 “New dashboard”。
2. 添加新面板:点击 “Add a new panel”,出现构建新图表的界面,主要包括三部分:
- 左上角的图表预览,开始时为空。
- 左下角的查询构建器,用于查询指标数据。
- 右侧的图表设置,用于选择图表类型并精细配置其外观和感觉。
3. 创建图表:以创建 FastAPI 应用中 HTTP 请求持续时间的图表为例,在 “Metric” 选择菜单中选择 http_request_duration_seconds_bucket 指标,然后点击 “Run queries”。
4. 选择时间范围:在图表右上角选择较短的时间范围,如 “Last 15 minutes”,以便更清晰地查看数据。
5. 处理数据:原始数据可能不太方便阅读和分析,可以使用 PromQL 中的数学运算来整理数据。例如,点击 Grafana 建议的 “add histogram_quantile” 按钮,Grafana 会自动添加三个操作:Rate、Sum by le 和 Histogram quantile(默认设置为 0.95)。
6. 选择单位:由于我们处理的是秒,在图表选项中选择 “seconds (s)” 作为 y 轴单位。
7. 自定义图表:可以复制查询以显示其他分位数,自定义图例名称,设置面板标题,最后点击 “Apply” 将图表添加到仪表盘。

以下是创建 Grafana 图表的步骤列表:
1. 创建新仪表盘
2. 添加新面板
3. 选择指标
4. 运行查询
5. 选择时间范围
6. 处理数据
7. 选择单位
8. 自定义图表
9. 应用并保存

通过以上步骤,我们可以在 Grafana 中有效地监控 FastAPI 和 Dramatiq 应用程序的性能。同时,还可以根据需要创建其他类型的图表,如柱状图,对不同的指标进行可视化展示。

数据科学系统的监控:Prometheus 与 Grafana 实战

6. 不同类型图表的创建与优化

在 Grafana 中,除了前面提到的用于展示 HTTP 请求持续时间的图表,还可以创建其他类型的图表来满足不同的监控需求。

6.1 柱状图的创建与优化

以之前添加的掷骰子自定义指标为例,我们可以将其以柱状图的形式展示。具体操作步骤如下:
1. 添加新面板 :在 Grafana 仪表盘上点击 “Add a new panel”。
2. 选择指标 :在 “Metric” 选择菜单中选择 app_dice_rolls_total 指标。此时会看到默认的柱状图展示,但存在每个时间点都有柱子的情况,这是因为 Prometheus 指标以时间序列存储。
3. 设置为即时值 :在指标面板的 “Options” 部分,将 “Type” 设置为 “Instant”,这样就只会显示所选时间范围内的最新值。
4. 自定义图例 :为了让图例只显示骰子的面标签,在 “Options” 中使用 “Custom label” 并输入 {{face}}
5. 转换数据 :点击 “Transform” 标签,选择 “Reduce” 函数,将 x 轴转换为面标签。

通过以上步骤,我们就可以得到一个清晰的柱状图,每个柱子代表骰子某一面出现的次数。

6.2 不同指标的柱状图注意事项

对于 Dramatiq 中任务执行时间的指标 dramatiq_message_duration_milliseconds_bucket ,它以毫秒为单位,在创建图表时需要特别注意选择正确的单位。这体现了 Prometheus 指标命名规范的好处,能让我们清晰地了解指标的含义和单位。

以下是创建柱状图的步骤表格:
|步骤|操作|
| ---- | ---- |
|1|添加新面板|
|2|选择指标|
|3|设置为即时值|
|4|自定义图例|
|5|转换数据|

7. 多指标与多图表的综合监控

在实际的监控场景中,我们通常需要同时监控多个指标,并使用不同类型的图表进行展示。以下是一个综合监控的示例流程:

graph LR
    A[确定监控指标] --> B{选择图表类型}
    B -->|折线图| C[创建时间序列指标图表]
    B -->|柱状图| D[创建计数指标柱状图]
    B -->|其他| E[根据指标特性选择合适图表]
    C --> F[配置图表参数]
    D --> F
    E --> F
    F --> G[添加到仪表盘]
    G --> H[调整布局与刷新设置]
    H --> I[保存仪表盘]

具体操作步骤如下:
1. 确定监控指标 :明确需要监控的指标,如 FastAPI 的 HTTP 请求响应时间、Dramatiq 的任务执行时间、自定义的掷骰子指标等。
2. 选择图表类型 :根据指标的特性选择合适的图表类型,如时间序列指标适合用折线图,计数指标适合用柱状图。
3. 创建图表 :按照前面介绍的方法创建相应的图表。
4. 配置图表参数 :包括选择指标、设置时间范围、处理数据、选择单位、自定义图例等。
5. 添加到仪表盘 :将创建好的图表添加到 Grafana 仪表盘。
6. 调整布局与刷新设置 :调整图表在仪表盘上的布局,设置自动刷新时间,以便实时监控数据。
7. 保存仪表盘 :点击 “Save” 按钮保存仪表盘。

8. 监控系统的维护与扩展

为了确保监控系统的稳定运行和满足不断变化的监控需求,需要进行定期的维护和扩展。

8.1 数据清理与备份

由于 Prometheus 会存储大量的指标数据,需要定期清理过期的数据,以节省存储空间。同时,要对 Prometheus 服务器和 Grafana 实例进行定期备份,防止数据丢失。

8.2 指标更新与扩展

随着应用程序的发展,可能需要添加新的监控指标或更新现有指标。在添加新指标时,要确保按照 Prometheus 的命名规范进行命名,以便在 Grafana 中能够方便地进行查询和展示。

8.3 系统性能优化

监控系统本身也需要进行性能优化,如调整 Grafana Agent 的采集间隔、优化 Prometheus 服务器的配置等,以确保能够高效地收集和处理指标数据。

以下是监控系统维护与扩展的操作列表:
1. 定期清理 Prometheus 过期数据
2. 定期备份 Prometheus 服务器和 Grafana 实例
3. 根据应用变化添加或更新监控指标
4. 优化 Grafana Agent 和 Prometheus 服务器配置

通过以上的操作和方法,我们可以构建一个完整、高效的监控系统,对数据科学系统中的 FastAPI 和 Dramatiq 应用进行全面的性能监控和可视化展示,及时发现和解决潜在的问题,保障系统的稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值