- 可观测性
- AI 评测
- LLMOps
- AI 应用
- 人工智能
【免费下载链接】phoenix
AI Observability & Evaluation
本篇指南系统讲解 Phoenix 项目中arize-phoenix-otel包官方文档站(Sphinx 文档)的构建、结构、自动部署与维护更新全流程:你将掌握在本地把文档从源码构建为可浏览 HTML 的完整命令链,理解conf.py中 autodoc、MyST、版本切换等关键配置的用途,并学会如何为新增模块维护 API 参考页面。同时,指南会结合phoenix/otel的源码实现,带你看清这套文档站实际描述的核心 API(register()、TracerProvider、Span Processors、Exporters)以及它们背后的 Phoenix 感知默认值逻辑。
一、这套文档站描述的是什么:arize-phoenix-otel 概览
文档站的核心目录是 packages/phoenix-otel/docs/,它为arize-phoenix-otel包提供 Sphinx 参考文档。根据文档主页 source/index.md 的介绍,该包是 OpenTelemetry 原语之上的一层轻量封装,为 Phoenix 用户提供:
- 常用 OpenTelemetry 原语的Phoenix 感知默认值(Phoenix-aware defaults);
- 从环境变量进行的自动配置;
- 对 OTel 类的即插即用替代实现(drop-in replacements),并附带增强功能;
- 通过
register()函数实现的简化追踪设置; - 针对常见 GenAI 模式的追踪装饰器。
文档站将包的五个核心组成部分作为 API 参考页面的主线:
| 文档页(API 参考) | 对应模块组件 | 作用 |
|---|---|---|
| api/register.rst | phoenix.otel.register | 一站式注册与配置入口 |
| api/provider.rst | TracerProvider、Resource | Phoenix 感知的 TracerProvider 与资源属性 |
| api/processors.rst | SimpleSpanProcessor、BatchSpanProcessor | 简单与批量 Span 处理器 |
| api/exporters.rst | HTTPSpanExporter、GRPCSpanExporter | HTTP 与 gRPC Span 导出器 |
| api/settings.rst | phoenix.otel.settings | 配置与环境变量解析 |
理解这些页面描述的对象,是理解文档站为何如此组织的前提;后文将结合 otel.py 与 settings.py 的源码进一步展开。
二、在本地构建文档
原文档 docs/README.md 给出了三条构建步骤,这是任何文档维护工作的起点。
1. 安装依赖
pip install -r requirements.txt pip install -e .. # Install phoenix-otel package in development mode第一条命令安装 Sphinx 文档构建所需的依赖。查看 docs/requirements.txt 可知,构建环境包含以下组件:
myst_parser:让 Sphinx 支持 Markdown(MyST)语法,文档主页index.md正是靠它渲染;sphinx==7.3.7:文档构建器本体,版本被固定以保证构建可复现;pydata-sphinx-theme:文档 HTML 主题;linkify-it-py:MyST 的链接自动补全(autolink)支持;sphinx_design:提供卡片、网格等页面设计组件;-e packages/phoenix-otel:以可编辑模式(development mode)把包自身链接进环境——注意这里是相对当前仓库根目录的写法,在仓库根目录执行即可让pip install -e packages/phoenix-otel同时生效。
第二条pip install -e ..表示从docs/的上级目录(即包根目录)以可编辑模式安装arize-phoenix-otel。这样做的关键原因在 source/conf.py 中可以看到:Sphinx 的 autodoc 扩展需要在构建时import被文档化的包,conf.py 将BASE_DIR设为文档目录的上三级(即包根目录),并把src/phoenix插入sys.path,随后 autodoc 才能从源码中抽取 docstring 生成 API 文档。
2. 构建 HTML
make html该命令由 docs/Makefile 定义:SPHINXOPTS可选附加构建参数,SOURCEDIR = source指向文档源,BUILDDIR = build是输出目录。make html实际执行sphinx-build -M html source build。在 Windows 环境下,仓库同时提供了 make.bat,可执行make.bat html达到同样效果。执行后,生成的 HTML 输出在build/html/目录下。
3. 本地查看
open build/html/index.html在 Linux 桌面环境可改用xdg-open build/html/index.html;文档主体从build/html/index.html进入。构建过程中,autodoc 会读取phoenix.otel各模块的 docstring 并渲染出Register、TracerProvider、Processors、Exporters、Settings五个 API 页面,与index.md中的 toctree 一一对应。
三、文档目录结构逐层解析
原文档列出的结构如下,结合仓库实际内容可逐项展开:
docs/ ├── source/ │ ├── conf.py # Sphinx 配置 │ ├── index.md # 主文档页 │ ├── api/ # API 参考文件(5 个 .rst) │ ├── _static/ # 静态资源(CSS、图片等) │ └── _templates/ # Sphinx 模板 ├── requirements.txt # 构建文档的 Python 依赖 ├── Makefile # Unix 构建入口 └── make.bat # Windows 构建入口conf.py:构建行为的心脏
source/conf.py 中值得注意的配置点包括:
- 项目元信息与版本(L14-L27):
project = "Phoenix OTEL Reference";版本号直接从包内读取:from phoenix.otel import __version__,若导入失败则回退为"latest",保证每次构建的版本号与实际包版本一致。 - 源码后缀(L31):
source_suffix = [".rst", ".md", ".txt"],因此index.md能作为 Sphinx 源文件参与构建。 - 扩展列表(L33-L39):
autodoc(从 docstring 生成 API 文档)、autosummary(生成 API 摘要表)、napoleon(解析 Google/Numpy 风格 docstring)、myst_parser(Markdown 支持)、sphinx_design(页面组件)。 - autodoc 行为(L63-L77):
autoclass_content = "class"(类文档含__init__docstring)、autodoc_typehints = "none"(不渲染类型注解)、autodoc_preserve_defaults = True(保留参数默认值原文)、add_module_names = False(不显示模块前缀),并默认对类成员members: True、show-inheritance: False。这些配置直接决定了五个api/*.rst页面中函数与类的呈现方式。 - MyST 扩展(L60-L61):启用
colon_fence(冒号围栏代码块)、linkify(链接自动化)、substitution(文本替换),myst_heading_anchors = 2让标题自动生成锚点。 - 主题与版本切换(L93-L131):HTML 使用
pydata_sphinx_theme,加载 custom.css 与 custom_sidebar.html;json_url指向 Read the Docs 的 switcher.json,配合READTHEDOCS_VERSION环境变量实现多版本切换下拉框(L85-L89)。
其余组成部分
- index.md:文档主页,同时承担"快速开始"职责,内含
register()用法、端点配置、环境变量、装饰器(chain/agent/tool/llm/retriever/embedding)等大量可运行示例,并以toctree收纳五个 API 参考页(见 index.md)。 - api/*.rst:五个 RST 文件分别通过
autofunction、autoclass、automodule指令,把源码中的符号实时渲染为文档(如 api/register.rst 中.. autofunction:: phoenix.otel.register)。因此维护文档的主要内容是维护源码 docstring,RST 文件只是"索引"。 - _static/:
custom.css(主题定制样式)、logo.png(站点 Logo)、switcher.json(版本切换数据)。 - _templates/:
custom_sidebar.html,替换默认侧边栏渲染。
四、Read the Docs 自动部署
原文档说明:文档在以下时机被自动构建并部署到 Read the Docs(RTD):
- 代码推送到
main分支时; - 创建新 tag 时。
这样,每次合并文档改动或发布新版本,文档站都会自动重建,无需手动触发部署。原文档还指出 RTD 配置文件位于包根目录的.readthedocs.yaml;需要注意的是,该文件属于被忽略的发布配置(当前仓库文件列表中没有出现该文件),实际部署时的项目配置以发布流程使用的为准,本地构建与验证流程不受其影响。
conf.py中已经内置了 RTD 相关的适配逻辑:通过读取READTHEDOCS_VERSION环境变量(conf.py L86-L89)来匹配switcher.json中的版本条目,从而实现文档站的"latest/stable/特定版本"切换。这意味着只要在 RTD 上开启构建,版本下拉框即可自动工作。
五、维护与更新 API 文档
原文档给出了更新 API 文档的五个步骤,结合仓库实际组织方式可细化如下:
- 新增模块时生成 RST:运行
sphinx-apidoc为新的包/模块生成.rst文件(例如sphinx-apidoc -o source/api ../src/phoenix/otel)。 - 更新 API 参考索引:当前仓库将 API 参考拆分为五个主题文件而非单一的
otel.rst,因此新符号应按主题放入对应的 register.rst、provider.rst、processors.rst、exporters.rst 或 settings.rst;若符号所属主题在文档中尚无对应页面,则需新建 RST 文件,并在 index.md 的 toctree 中登记。 - 必要时更新 index.md:主页上的快速开始示例、环境变量表、装饰器示例等若有变化,需同步维护(例如
register()新参数、新增环境变量)。 - 本地验证:执行
make html,重点检查新增 API 页是否被正确渲染、toctree 是否报出"文档未包含在任意 toctree"警告。 - 提交并推送:推送到
main分支后由 RTD 自动部署。
由于 autodoc 直接从 docstring 取内容,以下源码注释规范会直接影响文档质量:conf.py中启用了napoleon_google_docstring = True与napoleon_numpy_docstring = True(conf.py L52-L54),因此为新增函数/类编写 Google 或 NumPy 风格的 docstring(含Args:、Returns:、Raises:、Examples:小节),即可被自动渲染为标准 API 文档。
六、被文档化的核心 API:结合源码深入理解
文档站描述的 API 不仅是"使用说明",其行为可以从 otel.py 与 settings.py 的源码得到验证。
register():一站式入口
register()定义于 otel.py L65-L197,是文档主页推荐的入门方式。其完整参数如下(均带默认值,全部为关键字参数):
| 参数 | 默认值 | 作用 |
|---|---|---|
endpoint | None | 收集器端点;未指定时读取PHOENIX_COLLECTOR_ENDPOINT,并默认落到http://localhost:6006(HTTP 路径)或 gRPC 默认端口 |
project_name | None | 项目名;未指定时读取PHOENIX_PROJECT_NAME |
batch | False | True时使用BatchSpanProcessor批量导出;False时逐条使用SimpleSpanProcessor |
set_global_tracer_provider | True | 是否将生成的 TracerProvider 设为 OpenTelemetry 全局默认 |
headers | None | 发往收集器的请求头;未指定时读取PHOENIX_CLIENT_HEADERS |
protocol | None | 传输协议,仅允许"http/protobuf"或"grpc";不指定时按端点自动推断 |
verbose | True | 是否向 stdout 打印配置明细 |
auto_instrument | False | 是否自动插桩所有已安装的 OpenInference 库 |
api_key | None | API 密钥;未指定时读取PHOENIX_API_KEY |
源码中几个值得注意的实现细节:
- project_name 的强制注入(otel.py L146-L159):若未显式传
resource,register()会用Resource.create({PROJECT_NAME: project_name})创建资源;若已传resource,则通过existing_resource.merge(project_resource)把项目名合并进去,避免覆盖用户自定义属性。 - api_key 的 header 注入(otel.py L164-L170):传入
api_key时会自动生成authorization: Bearer <key>请求头(对原headers字典做拷贝,不污染调用方对象)。 - 自动插桩机制(otel.py L819-L831):
auto_instrument=True通过importlib.metadata.entry_points(group="openinference_instrumentor")发现并加载所有已安装的 OpenInference 插桩库(如openinference-instrumentation-openai、-langchain、-llama-index等),逐一调用其instrument()。若未安装任何插桩库,会输出警告并跳过,这解释了文档主页中的提示"需先安装对应的 OpenInference instrumentation 包"。
TracerProvider:Phoenix 感知的端点推断
TracerProvider 继承自 OpenInference 的 TracerProvider,核心增强点:
- 端点自动推断(otel.py L263-L276):协议由
OTLPTransportProtocol枚举(http/protobuf、grpc、infer)归一化;_maybe_http_endpoint依据 URL 路径是否为/v1/traces判断 HTTP 端点,_maybe_grpc_endpoint依据路径为空且端口等于PHOENIX_GRPC_PORT(默认 4317)判断 gRPC 端点(otel.py L707-L716)。这就是文档所述"HTTP 需完整路径http://localhost:6006/v1/traces,而 gRPC 默认端口是 4317"的代码依据。 - 默认处理器语义(otel.py L280-L311):TracerProvider 会自动创建一个默认 SpanProcessor;此时调用
add_span_processor()默认会替换该默认处理器(先_shutdown_default_processor()再挂新处理器),传入replace_default_processor=False则保留默认处理器、追加新处理器——对应文档中的"Multiple Span Processors"示例。 - verbose 明细输出(otel.py L313-L379):打印项目名、Span Processor 类型、收集器端点、传输协议(HTTP+protobuf 或 gRPC)、请求头(值被
_printable_headers统一打码为****,避免泄露密钥),并在使用SimpleSpanProcessor时提示生产环境建议改用BatchSpanProcessor。
Span Processors 与 Exporters
SimpleSpanProcessor 与 BatchSpanProcessor 均支持直接传入endpoint/headers/protocol而省略span_exporter,由内部自动选择HTTPSpanExporter或GRPCSpanExporter;若端点无法推断协议,会warnings.warn并回退到 HTTP。Batch 处理器还透传max_queue_size、schedule_delay_millis、max_export_batch_size、export_timeout_millis等批处理参数(对应OTEL_BSP_*系列环境变量)。
HTTPSpanExporter 与 GRPCSpanExporter 在未显式传headers时,会合并PHOENIX_CLIENT_HEADERS解析出的请求头与PHOENIX_API_KEY生成的authorization头;若显式传了headers,则统一转为小写键,并在缺失authorization时自动补上 API Key 头。
环境变量与配置解析
文档主页列出的 Phoenix 专属环境变量及其在 settings.py 中的实现:
| 环境变量 | 作用 | 源码依据 |
|---|---|---|
PHOENIX_COLLECTOR_ENDPOINT | 收集器端点,如https://your-phoenix.com:6006;优先级高于OTEL_EXPORTER_OTLP_ENDPOINT | get_env_collector_endpoint |
PHOENIX_PROJECT_NAME | Span 关联的项目名,默认"default";PHOENIX_PROJECT是其规范名(两者同时设置时规范名优先并发出一次性警告) | get_env_project_name |
PHOENIX_API_KEY | 用户/系统 API Key,自动生成authorization: Bearer <key>头 | get_env_phoenix_auth_header |
PHOENIX_GRPC_PORT | gRPC 端口覆盖,默认 4317(OTLP/gRPC 标准端口);非法值在进程环境中直接抛ValueError | get_env_grpc_port |
PHOENIX_CLIENT_HEADERS | 附加请求头,按 W3C Baggage HTTP Header 格式编码(如Authorization=Bearer token,custom-header=value),支持 URL 编码并会尝试纠正未编码的值 | get_env_client_headers、parse_env_headers |
此外,settings.py还支持从当前工作目录向上查找.env.phoenix凭据交接文件(settings.py L81-L96):进程环境变量始终优先;文件仅接受PHOENIX_前缀的合法键,且必须是当前用户拥有的常规文件(超过 64KB 会被忽略并告警),文件权限对其他用户开放时(如chmod 600建议)会记录日志警告;可通过PHOENIX_DISCOVER_CONFIG=false关闭文件发现,长驻进程修改文件后调用clear_env_file_cache()可重新发现。这些细节并未全部写入文档主页,但属于api/settings.rst所文档化的phoenix.otel.settings模块行为,是排查"为何环境变量不生效"问题时的关键线索。
七、维护与排障要点
综合原文档与源码,在构建文档站和使用其描述的 API 时,有几个容易踩坑的地方值得特别注意:
- 本地构建前必须先安装包:
pip install -e packages/phoenix-otel缺一不可,否则conf.py中from phoenix.otel import __version__会失败,autodoc 页面也将缺少内容。 - HTTP 端点必须带完整路径:
register(endpoint="http://localhost:6006/v1/traces")是完整形式;仅写http://localhost:6006会被按 gRPC 端口语义处理。也可用protocol参数强制指定"http/protobuf"或"grpc"来绕过推断。 - 生产环境优先
batch=True:SimpleSpanProcessor是逐条同步导出;BatchSpanProcessor在后台批量导出、不阻塞应用,这也是TracerProviderverbose 输出会主动提示的原因。 - 文档内容主要靠 docstring 驱动:RST 文件只做符号索引,维护文档的实质是维护
phoenix.otel各模块的 Google/NumPy 风格 docstring,改完务必make html验证再推送main分支触发 RTD 重建。 - 敏感信息打码:
register(verbose=True)打印的请求头值均为****;排查认证问题时不要指望从 stdout 看到完整 token,应以PHOENIX_API_KEY/PHOENIX_CLIENT_HEADERS的实际配置为准。
文档站的测试保障可以从 tests/ 目录中看到端倪:test_exports.py、test_otel.py、test_settings.py三个测试文件分别覆盖导出器、register/TracerProvider组合行为与 settings 环境变量解析,说明文档所描述的行为(端点推断、请求头合并、环境变量优先级等)均有自动化测试背书,可作为维护文档时的行为参照。
本文核心要点:arize-phoenix-otel的文档站是一套由 Sphinx + autodoc + MyST + pydata-sphinx-theme 驱动的标准 API 文档项目,构建链路为pip install -r requirements.txt && pip install -e packages/phoenix-otel && make html;其五个 API 参考页全部由源码 docstring 实时生成,维护文档即维护 docstring;推送到main或打 tag 后由 Read the Docs 自动部署并支持版本切换。掌握这套流程后,你既可以独立复现本地构建,也能为新增的追踪能力、导出器或环境变量顺畅地补充官方文档。
- 可观测性
- AI 评测
- LLMOps
- AI 应用
- 人工智能
【免费下载链接】phoenix
AI Observability & Evaluation
相关推荐
Phoenix API 参考文档构建与托管指南:基于 Sphinx + Read the Docs 的维护实战
Phoenix API 参考文档构建与托管指南:基于 Sphinx + Read the Docs 的维护实战 导读 本指南完整讲解 Arize Phoenix
可观测性AI 评测LLMOpsAI 应用人工智能Read the Docs 文档构建实践指南:Sphinx + sphinx-multiproject 双文档集与本地热重载工作流
Read the Docs 文档构建实践指南:Sphinx + sphinx multiproject 双文档集与本地热重载工作流 Read the Docs
后端文档gpt-engineer 文档构建指南:基于 Sphinx + Read the Docs 的本地与云端构建全流程
gpt engineer 文档构建指南:基于 Sphinx + Read the Docs 的本地与云端构建全流程 gpt engineer 的官方文档位于仓库
人工智能AI 应用代码智能体AI AgentAI 评测
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考