收集和监控指标#

指标对于监控和故障排查 Ray 应用和集群非常有用。例如,如果节点意外终止,您可能希望访问该节点的指标。

Ray 使用 Prometheus 格式 记录和发射时间序列指标。Ray 不提供原生的指标存储解决方案。用户需要自行管理指标的生命周期。本页提供如何从 Ray 集群收集和监控指标的说明。

对于 Kubernetes 用户,请参阅使用 KubeRay 的 Prometheus 和 Grafana

系统和应用程序指标#

如果你使用 ray[default]其他包含仪表板组件的安装命令,Ray 会导出指标。仪表板代理进程负责将指标聚合并报告给 Prometheus 抓取的端点。

系统指标: Ray 导出了多个系统指标。查看 系统指标 以获取有关所发出指标的更多详细信息。

应用程序指标: 应用程序特定的指标对于监控应用程序状态非常有用。查看 添加应用程序指标 以了解如何记录指标。

设置 Prometheus#

你可以使用 Prometheus 从 Ray 集群中抓取指标。Ray 不会为你启动 Prometheus 服务器。你需要决定在哪里托管并配置它以从集群中抓取指标。

为了快速演示,您可以在本地机器上运行 Prometheus。请按照以下快速入门说明设置 Prometheus 并从本地单节点 Ray 集群中抓取指标。

快速入门:在本地运行 Prometheus#

运行以下命令以使用从本地 Ray 集群抓取指标的配置下载并启动本地 Prometheus。

ray metrics launch-prometheus

你应该看到以下输出:

2024-01-11 16:08:45,805 - INFO - Prometheus installed successfully.
2024-01-11 16:08:45,810 - INFO - Prometheus has started.
Prometheus is running with PID 1234.
To stop Prometheus, use the command: 'kill 1234', or if you need to force stop, use 'kill -9 1234'.

你还应该看到一些来自 Prometheus 的日志:

[...]
ts=2024-01-12T00:47:29.761Z caller=main.go:1009 level=info msg="Server is ready to receive web requests."
ts=2024-01-12T00:47:29.761Z caller=manager.go:1012 level=info component="rule manager" msg="Starting rule manager..."

现在你可以通过默认的 Prometheus URL 访问 Ray 指标,网址为 http://localhost:9090。

要证明 Prometheus 正在从 Ray 抓取指标,请运行以下命令:

ray start --head --metrics-export-port=8080

然后进入 Prometheus UI 并运行以下查询:

ray_dashboard_api_requests_count_requests_total

然后你可以看到 Ray Dashboard API 的请求数量随时间的变化。

要停止 Prometheus,运行 kill <PID>,其中 <PID> 是运行命令时打印出的 Prometheus 进程的 PID。要查找 PID,您还可以运行 ps aux | grep prometheus

[可选] 手册:在本地运行 Prometheus#

如果前面的自动脚本无法工作,或者您更倾向于手动安装并启动 Prometheus,请按照以下说明操作。

首先,下载 Prometheus。确保下载适用于您操作系统的正确二进制文件。例如,Darwin 适用于 macOS X。

然后,使用以下命令将存档解压到本地目录:

tar xvfz prometheus-*.tar.gz
cd prometheus-*

Ray 提供了一个开箱即用的 Prometheus 配置。运行 Ray 后,您可以在 /tmp/ray/session_latest/metrics/prometheus/prometheus.yml 找到该配置。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
# Scrape from each Ray node as defined in the service_discovery.json provided by Ray.
- job_name: 'ray'
  file_sd_configs:
  - files:
    - '/tmp/ray/prom_metrics_service_discovery.json'

接下来,启动 Prometheus:

./prometheus --config.file=/tmp/ray/session_latest/metrics/prometheus/prometheus.yml

注意

如果你使用的是 macOS,在此阶段你可能会收到一个关于尝试启动未经验证开发者的应用程序的错误。请参阅下面的“故障排除”指南以解决问题。

现在,你可以从默认的 Prometheus URL 访问 Ray 指标,http://localhost:9090

在生产环境中运行 Prometheus#

对于生产环境,请查看 Prometheus 文档 以获取设置 Prometheus 服务器的最佳策略。Prometheus 服务器应位于 Ray 集群之外,以便在集群宕机时仍可访问指标。对于 KubeRay 用户,请按照 这些说明 设置 Prometheus。

故障排除#

在 macOS X 上使用 Homebrew 通过 Ray 配置 Prometheus#

Homebrew 将 Prometheus 安装为一个服务,该服务会自动为您启动。要配置这些服务,您不能简单地将配置文件作为命令行参数传递。

相反,将 /usr/local/etc/prometheus.args 文件中的 –config-file 行改为 --config.file /tmp/ray/session_latest/metrics/prometheus/prometheus.yml

然后你可以使用 brew services start prometheus 启动或重启服务。

macOS 不信任开发者安装 Prometheus#

您可能会收到以下错误:

信任错误

从互联网下载二进制文件时,macOS 要求该二进制文件由受信任的开发者 ID 签名。许多开发者不在 macOS 的信任列表中。用户可以手动覆盖此要求。

请参阅 这些说明 以了解如何覆盖限制并安装或运行应用程序。

使用 Docker Compose 加载 Ray Prometheus 配置#

在 Ray 容器中,符号链接 “/tmp/ray/session_latest/metrics” 指向最新的活动 Ray 会话。然而,Docker 不支持在共享卷上挂载符号链接,您可能无法加载 Prometheus 配置文件。

要解决这个问题,可以使用一个自动化的shell脚本来无缝地将Prometheus配置从Ray容器传输到一个共享卷。为了确保正确设置,请将共享卷挂载到容器的相应路径,该路径包含启动Prometheus服务器所需的推荐配置。

抓取指标#

Ray 在每个节点上运行一个指标代理,以导出系统和应用程序指标。每个指标代理从本地节点收集指标,并以 Prometheus 格式公开它们。然后,您可以抓取每个端点以访问这些指标。

为了抓取端点,我们需要确保服务发现,这使得 Prometheus 能够在每个节点上找到指标代理的端点。

自动发现指标端点#

您可以通过使用 Prometheus 的 基于文件的服务发现 让 Prometheus 动态找到要抓取的端点。在使用 Ray 集群启动器 时,使用自动发现来导出 Prometheus 指标,因为节点 IP 地址在集群扩展和缩减时经常会发生变化。

Ray 在头节点上自动生成一个 Prometheus 服务发现文件,以方便指标代理的服务发现。此功能允许您在不了解其IP的情况下抓取集群中的所有指标。以下信息指导您进行设置。

服务发现文件是在 头节点 上生成的。在这个节点上,查找 /tmp/ray/prom_metrics_service_discovery.json (或者如果使用自定义的 Ray temp_dir,查找相应的文件)。Ray 会定期更新这个文件,其中包含集群中所有指标代理的地址。

Ray 自动生成一个 Prometheus 配置,该配置会抓取位于 /tmp/ray/session_latest/metrics/prometheus/prometheus.yml 的服务发现文件。您可以选择使用此配置,或修改您自己的配置以启用此行为。请参阅下面的配置详情。完整的文档可以在 这里 找到。

通过此配置,Prometheus 会根据 Ray 的服务发现文件内容自动更新其抓取的地址。

# Prometheus config file

# my global config
global:
  scrape_interval:     2s
  evaluation_interval: 2s

# Scrape from Ray.
scrape_configs:
- job_name: 'ray'
  file_sd_configs:
  - files:
    - '/tmp/ray/prom_metrics_service_discovery.json'

手动发现指标端点#

如果你知道 Ray 集群中节点的 IP 地址,你可以配置 Prometheus 从一个静态端点列表中读取指标。设置 Ray 应使用的固定端口来导出指标。如果你使用的是 VM 集群启动器,请向 ray start 传递 --metrics-export-port=<port>。如果你使用的是 KubeRay,请在 RayCluster 配置文件中指定 rayStartParams.metrics-export-port。你必须在集群中的所有节点上指定该端口。

如果你不知道Ray集群中节点的IP地址,你也可以通过读取Ray集群信息来编程发现端点。以下示例使用Python脚本和ray.nodes API来查找指标代理的URL,通过将NodeManagerAddressMetricsExportPort结合。

# On a cluster node:
import ray
ray.init()
from pprint import pprint
pprint(ray.nodes())

"""
Pass the <NodeManagerAddress>:<MetricsExportPort> from each of these entries
to Prometheus.
[{'Alive': True,
  'MetricsExportPort': 8080,
  'NodeID': '2f480984702a22556b90566bdac818a4a771e69a',
  'NodeManagerAddress': '192.168.1.82',
  'NodeManagerHostname': 'host2.attlocal.net',
  'NodeManagerPort': 61760,
  'ObjectManagerPort': 61454,
  'ObjectStoreSocketName': '/tmp/ray/session_2020-08-04_18-18-16_481195_34255/sockets/plasma_store',
  'RayletSocketName': '/tmp/ray/session_2020-08-04_18-18-16_481195_34255/sockets/raylet',
  'Resources': {'CPU': 1.0,
                'memory': 123.0,
                'node:192.168.1.82': 1.0,
                'object_store_memory': 2.0},
  'alive': True},
{'Alive': True,
  'MetricsExportPort': 8080,
  'NodeID': 'ce6f30a7e2ef58c8a6893b3df171bcd464b33c77',
  'NodeManagerAddress': '192.168.1.82',
  'NodeManagerHostname': 'host1.attlocal.net',
  'NodeManagerPort': 62052,
  'ObjectManagerPort': 61468,
  'ObjectStoreSocketName': '/tmp/ray/session_2020-08-04_18-18-16_481195_34255/sockets/plasma_store.1',
  'RayletSocketName': '/tmp/ray/session_2020-08-04_18-18-16_481195_34255/sockets/raylet.1',
  'Resources': {'CPU': 1.0,
                'memory': 134.0,
                'node:192.168.1.82': 1.0,
                'object_store_memory': 2.0},
  'alive': True}]
"""

处理和导出指标#

如果你需要将指标处理并导出到其他存储或管理系统,可以查看像 [Vector][Vector] 这样的开源指标处理工具。

监控指标#

要可视化和监控收集的指标,有3种常见路径:

  1. 最简单:使用 Grafana 与 Ray 提供的配置,其中包括显示一些最有价值的调试 Ray 应用程序指标的默认 Grafana 仪表板。

  2. 推荐:使用 Ray 仪表板,它嵌入了 Grafana 可视化,并在单一视图中查看指标、日志、作业信息等。

  3. 手册:从头开始设置 Grafana 或其他工具,如 CloudWatch、Cloud Monitoring 和 Datadog。

以下是每条路径的一些说明:

最简单:使用 Ray 提供的配置设置 Grafana#

Grafana 是一个支持 Prometheus 指标高级可视化的工具,并允许您使用您喜欢的指标创建自定义仪表板。

注意

以下说明描述了在macOS机器上启动Grafana服务器的一种方法。有关如何在不同系统上启动Grafana服务器的详细信息,请参阅 Grafana文档

对于 KubeRay 用户,请按照 这些说明 设置 Grafana。

首先,下载 Grafana。按照下载页面上的说明,下载适用于您操作系统的正确二进制文件。

前往二进制文件的位置,并使用 /tmp/ray/session_latest/metrics/grafana 文件夹中的内置配置运行 Grafana。

./bin/grafana-server --config /tmp/ray/session_latest/metrics/grafana/grafana.ini web

使用默认的 Grafana URL http://localhost:3000 访问 Grafana。通过转到仪表板 -> 管理 -> Ray -> 默认仪表板来查看默认仪表板。在将 Grafana 与 Ray 仪表板集成后,您可以在 Ray 仪表板 中访问相同的 指标图表

注意

如果你是第一次使用 Grafana,请使用用户名:admin 和密码 admin 登录。

grafana 登录

故障排除 在 macOS X 上使用 Homebrew 配置 Grafana 中的 Ray

Homebrew 将 Grafana 安装为一个服务,该服务会自动为您启动。因此,要配置这些服务,您不能简单地将配置文件作为命令行参数传递。

相反,更新 /usr/local/etc/grafana/grafana.ini 文件,使其与 /tmp/ray/session_latest/metrics/grafana/grafana.ini 的内容匹配。

然后,您可以使用 brew services start grafanabrew services start prometheus 启动或重启服务。

使用 Docker Compose 加载 Ray Grafana 配置 在 Ray 容器中,符号链接 “/tmp/ray/session_latest/metrics” 指向最新的活动 Ray 会话。然而,Docker 不支持在共享卷上挂载符号链接,您可能无法加载 Grafana 配置文件和默认仪表板。

要解决此问题,请使用一个自动化的shell脚本来无缝传输必要的Grafana配置和仪表板,从Ray容器到共享卷。为了确保正确设置,请将共享卷挂载到容器的相应路径,该路径包含推荐的配置和默认仪表板,以启动Grafana服务器。

在您的 Grafana 服务器运行后,启动一个 Ray 集群,并在 /tmp/ray/session_latest/metrics/grafana/dashboards 找到 Ray 提供的默认 Grafana 仪表板 JSON 文件。复制这些 JSON 文件并导入到您的 Grafana 仪表板

如果Grafana报告找不到数据源,请添加一个数据源变量。数据源的名称必须与RAY_PROMETHEUS_NAME环境变量中的值相同。默认情况下,RAY_PROMETHEUS_NAME等于Prometheus

手册:从头开始设置 Grafana,或其他工具如 CloudWatch、Cloud Monitoring 和 Datadog#

请参考这些工具的文档,了解如何查询和可视化指标。

提示

如果你需要手动编写 Prometheus 查询,可以参考 Ray 提供的 Grafana 仪表板 JSON 文件 /tmp/ray/session_latest/metrics/grafana/dashboards/default_grafana_dashboard.json 中的 Prometheus 查询以获取灵感。