收集和监控指标#

指标对于监控和排除 Ray 应用及集群的故障非常有用。例如,如果节点意外终止,您可能需要访问其指标。

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

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

系统和应用指标#

如果您使用 ray[default] 或包含 Dashboard 组件的其他安装命令,Ray 会导出指标。Dashboard agent 进程负责聚合指标并将其报告给 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 http://localhost: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 http://localhost:9090 访问 Ray 指标。

在生产环境中运行 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#

您可能会收到以下错误

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 集群启动器时,由于节点 IP 地址会随集群的扩展和收缩而经常变化,请使用自动发现来导出 Prometheus 指标。

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 集群启动器,请将 --metrics-export-port=<port> 传递给 ray start。如果您使用的是 KubeRay,请在 RayCluster 配置文件中指定 rayStartParams.metrics-export-port。您必须在集群中的所有节点上指定该端口。

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

# 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 可视化,可以在一个面板中同时查看指标、日志、作业信息等。

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

注意

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

grafana login

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

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 查询作为参考。