收集和监控指标#

指标对于监控和排查 Ray 应用程序和集群非常有用。例如,如果某个节点意外终止,您可能需要访问该节点的指标。

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

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

系统和应用程序指标#

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

系统指标:Ray 导出了许多系统指标。有关导出的指标的更多详细信息,请参阅 系统指标

应用程序指标:特定于应用程序的指标对于监控您的应用程序状态非常有用。有关如何记录指标的说明,请参阅 添加应用程序指标

设置 Prometheus#

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

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

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

注意

如果您需要通过在 Ray 集群设置中使用“–temp-dir”来更改根临时目录,请按照 手动步骤 设置本地 Prometheus。

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

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 https://:9090 访问 Ray 指标。

为了演示 Prometheus 正在从 Ray 抓取指标,请运行以下命令

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

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

ray_dashboard_api_requests_count_requests_total

然后,您可以看到请求 Ray Dashboard API 的次数随时间的变化。

要停止 Prometheus,请运行以下命令

# case 1: Ray > 2.40
ray metrics shutdown-prometheus

# case 2: Otherwise
# Run `ps aux | grep prometheus` to find the PID of the Prometheus process. Then, kill the process.
kill <PID>

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

如果前面的自动脚本不起作用,或者您更喜欢手动安装和启动 Prometheus,请按照以下说明进行操作。

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

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

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

Ray 提供了一个开箱即用的 Prometheus 配置。运行 Ray 后,您可以在 /tmp/ray/session_latest/metrics/prometheus/prometheus.yml 找到该配置。如果您在启动 Ray 集群时指定了 --temp-dir={your_temp_path},则配置文件位于 {your_temp_path}/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' # or '${your_temp_path}/prom_metrics_service_discovery.json' if --temp-dir is specified

接下来,启动 Prometheus

# With default settings
./prometheus --config.file=/tmp/ray/session_latest/metrics/prometheus/prometheus.yml

# With specified --temp-dir
./prometheus --config.file={your_temp_path}/session_latest/metrics/prometheus/prometheus.yml

注意

如果您使用的是 macOS,此时可能会收到一个关于尝试启动未经验证开发者的应用程序的错误。请参阅下面的“故障排除”指南来修复该问题。

现在,您可以从默认的 Prometheus URL https://:9090 访问 Ray 指标。

在生产环境中运行 Prometheus#

对于生产环境,请参阅 Prometheus 文档 以了解设置 Prometheus 服务器的最佳策略。Prometheus 服务器应独立于 Ray 集群运行,以便在集群down机时仍可访问指标。对于 KubeRay 用户,请按照 这些说明 来设置 Prometheus。

故障排除#

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

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#

您可能会收到以下错误

trust error

从互联网下载二进制文件时,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 在 head 节点上自动生成一个 Prometheus 服务发现文件,以方便指标代理的服务发现。此功能允许您抓取集群中的所有指标,而无需知道它们的 IP 地址。以下信息将指导您进行设置。

服务发现文件生成在 head 节点 上。在此节点上,查找 `/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'

HTTP 服务发现#

Ray 还通过 HTTP 端点公开相同的地址列表以供抓取,该端点与 Prometheus HTTP 服务发现 兼容。

在 Prometheus 配置中使用以下内容来使用 HTTP 端点进行服务发现(HTTP SD 文档

scrape_configs:
- job_name: 'ray'
  http_sd_configs:
  - url: 'http://<RayHeadnodeAddress>:<DashboardPort>/api/prometheus/sd'
    refresh_interval: 60s
  • 默认情况下,`` 为 `8265`。有关更多详细信息,请参阅 配置和管理 Ray Dashboard

  • 该端点返回一个 JSON 格式的目标列表,用于 Prometheus 指标。当没有目标可用时,它返回 `[]`。

手动发现指标端点#

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

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

# 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 等开源指标处理工具。

监控指标#

为了可视化和监控收集到的指标,有 3 种常见途径

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

  2. 推荐:使用 Ray Dashboard,它嵌入了 Grafana 可视化,并在一个统一的视图中查看指标、日志、Job 信息等。

  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 https://:3000 访问 Grafana。通过转到 dashboards -> manage -> Ray -> Default Dashboard 来查看默认仪表板。在将 Grafana 与 Ray Dashboard 集成后,您可以在 Ray Dashboard 中访问相同的 指标图表

注意

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

grafana login

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

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

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

然后,您可以使用 `brew services start grafana` 和 `brew 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。

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

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

有关如何查询和可视化指标的信息,请参阅这些工具的文档。

提示

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