跟踪#
为了帮助调试和监控 Ray 应用程序,Ray 集成了 OpenTelemetry,以便于将追踪数据导出到 Jaeger 等外部追踪系统。
备注
跟踪是一个 Alpha 功能,不再处于活跃开发/维护状态。API 可能会发生变化。
安装#
首先,安装 OpenTelemetry:
pip install opentelemetry-api==1.1.0
pip install opentelemetry-sdk==1.1.0
pip install opentelemetry-exporter-otlp==1.1.0
跟踪启动钩子#
要启用跟踪,您必须提供一个跟踪启动钩子,该钩子包含一个设置 Tracer Provider、远程跨度处理器 和 附加工具 的函数。跟踪启动钩子应是一个不带参数或关键字参数的函数。此钩子需要在所有工作进程的Python环境中可用。
下面是一个设置默认跟踪提供程序、将跨度导出到 /tmp/spans
文件中且没有任何额外仪器的启动钩子示例。
import ray
import os
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
ConsoleSpanExporter,
SimpleSpanProcessor,
)
def setup_tracing() -> None:
# Creates /tmp/spans folder
os.makedirs("/tmp/spans", exist_ok=True)
# Sets the tracer_provider. This is only allowed once per execution
# context and will log a warning if attempted multiple times.
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
SimpleSpanProcessor(
ConsoleSpanExporter(
out=open(f"/tmp/spans/{os.getpid()}.json", "a")
)
)
)
对于想要尝试追踪的开源用户,Ray 有一个默认的追踪启动钩子,它将跨度导出到文件夹 /tmp/spans
。要使用此默认钩子运行,请运行以下代码示例以设置追踪并追踪一个简单的 Ray 任务。
$ ray start --head --tracing-startup-hook=ray.util.tracing.setup_local_tmp_tracing:setup_tracing
$ python
ray.init()
@ray.remote
def my_function():
return 1
obj_ref = my_function.remote()
ray.init(_tracing_startup_hook="ray.util.tracing.setup_local_tmp_tracing:setup_tracing")
@ray.remote
def my_function():
return 1
obj_ref = my_function.remote()
如果你想提供自己的自定义跟踪启动钩子,请以 module:attribute
的格式提供,其中 attribute 是要运行的 setup_tracing
函数。
Tracer provider
#
此配置用于收集跟踪的方式。查看 TracerProvider API 这里。
远程跨度处理器#
这配置了导出跟踪的位置。查看 SpanProcessor API 这里。
想要尝试追踪的用户可以配置他们的远程跨度处理器将跨度导出到本地JSON文件。在本地开发的严肃用户可以通过 Jaeger exporter 将他们的追踪推送到Jaeger容器。
附加工具#
如果你使用的库内置了跟踪支持,你提供的 setup_tracing
函数也应该修补这些库。你可以在 这里 找到更多关于这些库的检测文档。
自定义追踪#
在您的程序中添加自定义跟踪。在您的程序中,使用 trace.get_tracer(__name__)
获取跟踪器对象,并使用 tracer.start_as_current_span(...)
开始一个新的跨度。
请参见下方添加自定义追踪的简单示例。
from opentelemetry import trace
@ray.remote
def my_func():
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("foo"):
print("Hello world from OpenTelemetry Python!")