> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coze.cn/llms.txt
> Use this file to discover all available pages before exploring further.

本文介绍如何基于 OpenTelemetry 协议将 LlamaIndex 运行过程的 Trace 数据自动上报到扣子罗盘。 
## 功能介绍 {#9fd93d60}
[LlamaIndex](https://developers.llamaindex.ai/python/workflows/) 是一个用于灵活的事件型驱动框架，旨在构建稳健的 AI Agent。在 LlamaIndex 中，工作流通过多个步骤串联而成，每个步骤均会处理特定类型的事件，从而让你能够编排复杂流程，例如 Agent 协作、RAG 流程、数据提取等。
Llamaindex 通过与 OpenTelemetry 集成，能够自动捕获 LlamaIndex 运行过程中的关键操作和性能指标，并将这些数据作为 Trace 数据上报到扣子罗盘，完成可视化分析。本集成方案适用于需要监控 LlamaIndex 调用 OpenAI 模型的过程、分析 AI 应用性能或排查 Agent 执行问题的场景。
本文以 Python SDK 为例，介绍如何通过 OpenTelemetry  SDK 将应用程序的 Trace 数据上报至扣子罗盘平台，从而实现对应用程序性能和行为的高效监控与分析。
## 准备工作  {#9e22d6f3}
使用 OpenTelemetry Python SDK 前，需要先安装 Python SDK 以及相关的依赖库。 

1. 安装 Python SDK。 
   Opentelemetry Python SDK 要求 Python 3.9 或以上版本。你可以通过如下方法查看 Python 版本 。 
   ```Python
   # 查看 Python 版本   
   python --version 
    
   # 回显信息显示已安装 3.9.2 版本 
   Python 3.9.2
   ```

2. 安装依赖库。 
   安装 Python 依赖库，分别用于调用 AI 模型、对调用过程进行可观测性管理以及将 Trace 数据导出到后端系统。 
   ```Python
   pip install llama-index-llms-azure-openai
   pip install opentelemetry-sdk
   pip install opentelemetry-exporter-otlp
   pip install openinference-instrumentation-llama_index
   pip install llama-index-workflows
   ```


## 配置环境变量  {#6fd62c28}
在上报 Trace 数据前，你需要正确配置 OpenTelemetry 的环境变量 ，以确保 LlamaIndex 应用能够正常调用 OpenAI 模型，并能正确发送 Trace 数据到指定的扣子罗盘空间中。环境变量配置格式及说明如下： 
```Python
OTEL_EXPORTER_OTLP_HEADERS=cozeloop-workspace-id={CozeLoop空间ID},Authorization=Bearer {个人访问令牌或服务访问令牌}
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://api.coze.cn/v1/loop/opentelemetry/v1/traces
OPENAI_BASE_URL=***
OPENAI_API_KEY=***
OPENAI_MODEL_NAME=***
```

<!-- @cols-width: 322,595 -->
| | | \
|**环境变量** |**说明** |
|---|---|
| | | \
|OTEL_EXPORTER_OTLP_HEADERS  |设置上报数据时所需的扣子罗盘认证信息和工作空间标识。包括如下参数：  |\
| | |\
| |* cozeloop-workspace-id：配置为扣子罗盘工作空间 ID。获取步骤，请参考[获取扣子罗盘工作空间 ID](/cozeloop/get_workspace_id_and_token#01dede13)。 |\
| |* Authorization：配置为扣子罗盘的个人访问令牌或服务访问令牌。获取步骤，请参考[配置个人访问令牌](/cozeloop/authentication-for-sdk#05d27a86)、[配置服务访问令牌](/cozeloop/authentication-for-sdk#83f924a1)。 |
| | | \
|OTEL_EXPORTER_OTLP_TRACES_ENDPOINT  |指定 OpenTelemetry 数据的上报地址，固定为 `https://api.coze.cn/v1/loop/opentelemetry/v1/traces`。  |
| | | \
|OPENAI_BASE_URL |配置 OpenAI 模型的服务地址。 |\
| | |\
| |* 推荐使用方舟模型，其 BASE_URL 固定为 `https://ark.cn-beijing.volces.com/api/v3`。 |\
| |* 使用其他 OpenAI 模型时，配置为其对应的 BASE_URL 即可。 |
| | | \
|OPENAI_API_KEY |配置 OpenAI 模型的 API Key。 |\
| | |\
| |* 推荐使用方舟模型，其 API Key 获取步骤，请参考 [API Key 管理](https://www.volcengine.com/docs/82379/1361424)。 |\
| |* 使用其他 OpenAI 模型时，配置为其对应的 API Key 即可。 |
| | | \
|OPENAI_MODEL_NAME |配置 OpenAI 模型名称，例如 gpt-4o-2024-05-13。 |

## 上报 Trace  {#04902e86}
完成上述配置后，你可以调用 OpenAI 模型开展 AI 对话，并通过 OpenTelemetry Python SDK 上报 Trace 数据到扣子罗盘。以下示例将分别展示自动上报 Trace 数据与上报自定义 Span 节点数据的具体实现方式。
### 自动上报 {#c72a3583}
本示例基于 OpenAI 模型实现了一个异步工作流程序，用于生成和评价笑话，并通过 OpenTelemetry SDK 自动收集和上报 OpenAI 模型执行过程中的各种信息到扣子罗盘，包括 LLM 调用、Agent 执行过程、任务生命周期等，从而实现对 AI 模型调用过程的全面监控和分析。
```Python
import os
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
    BatchSpanProcessor,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

# Preserve original environment variable configuration
os.environ['OPENAI_BASE_URL'] = '***'
os.environ['OPENAI_API_KEY'] = '***'
os.environ['OPENAI_MODEL_NAME'] = '***' # your model name, like gpt-4o-2024-05-13


os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "https://api.coze.cn/v1/loop/opentelemetry/v1/traces"  # 固定
os.environ[
    "OTEL_EXPORTER_OTLP_HEADERS"] = "cozeloop-workspace-id=***,Authorization=Bearer ***"

otlp_exporter = OTLPSpanExporter(
    timeout=10,
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(otlp_exporter)
)
tracer = trace.get_tracer(__name__)

# Import and configure the automatic instrumentor from OpenInference
from openinference.instrumentation.llama_index import LlamaIndexInstrumentor

# Initialize LlamaIndex instrumentation
LlamaIndexInstrumentor().instrument()


from workflows import Workflow, step
from workflows.events import (
    Event,
    StartEvent,
    StopEvent,
)

# `pip install llama-index-llms-azure-openai` if you don't already have it, or you can also install llama-index-llms-openai as OpenAI model
from llama_index.llms.azure_openai import AzureOpenAI


class JokeEvent(Event):
    joke: str


class JokeFlow(Workflow):
    llm = AzureOpenAI(
        model=os.environ["OPENAI_MODEL_NAME"],
        azure_endpoint=os.environ["OPENAI_BASE_URL"],
        deployment_name=os.environ["OPENAI_MODEL_NAME"],
    )

    @step
    async def generate_joke(self, ev: StartEvent) -> JokeEvent:
        topic = ev.topic

        prompt = f"Write your best joke about {topic}."
        response = await self.llm.acomplete(prompt)
        return JokeEvent(joke=str(response))

    @step
    async def critique_joke(self, ev: JokeEvent) -> StopEvent:
        joke = ev.joke

        prompt = f"Give a thorough analysis and critique of the following joke: {joke}"
        response = await self.llm.acomplete(prompt)
        return StopEvent(result=str(response))


async def main():
    # set custom span
    with tracer.start_as_current_span("root_span") as span:
        span.set_attribute("cozeloop.span_type", "custom")

        # start workflow
        w = JokeFlow(timeout=60, verbose=False)
        result = await w.run(topic="pirates")
        print(str(result))


if __name__ == "__main__":
    import asyncio
    asyncio.run(main())
```

### 上报自定义节点 {#af637370}
如果你需要上报自定义 Span 节点，可以使用 OpenTelemetry SDK 手动创建 Span 并上报。OpenTelemetry SDK 手动上报的节点数据支持和自动上报的节点数据串联，形成完整的 Trace 调用树。
自定义的 OpenTelemetry Span，attribute 和 event 规范需遵循 [OpenTelemetry 字段映射](https://loop.coze.cn/open/docs/cozeloop/opentelemetry_field_mapping)。
```Python
# 设置自定义Span节点 root_span
with tracer.start_as_current_span("root_span") as span:
    span.set_attribute("cozeloop.span_type", "custom")

    # 启动 workflow
    w = JokeFlow(timeout=60, verbose=False)
    result = await w.run(topic="pirates")
    print(str(result))
```

## 查看 Trace 数据 {#6aa3aa7c}
上报 Trace 数据后，你可以在[扣子罗盘](https://loop.coze.cn/)的 **Trace** 页面，找到并单击目标 Span，查看上报的 Trace 数据。
![Image=741x404](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dda45c46a6a54e55acde46f03f228d0c~tplv-goo7wpa0wc-image.image)
## 更多示例 {#853a6ce9}
关于上报 LlamaIndex Trace 数据的更多示例，请参考 [LlamaIndex](https://github.com/coze-dev/cozeloop-examples/tree/main/python/integration/framework/llamaindex)。

