更新时间:2026-07-17 gmt 08:00

metric数据上报-j9九游会登录

metric数据用于统计聚合信息,如请求次数、token消耗量、成功率等。

下面以python语言开发的智能体为例,介绍如何将metric数据上报至agentarts观测平台。

第三方智能体上报的metric指标数据将写入您的华为云应用运维管理aom服务。aom会根据指标上报的数量按需计费。在生产环境部署前,请仔细阅读。

安装依赖库

安装opentelemetry python sdk及相关依赖库。要求python 3.9或以上版本。

pip install opentelemetry-distro==0.62b1
pip install opentelemetry-api==1.41.1
pip install opentelemetry-exporter-otlp==1.41.1
pip install traceloop-sdk==0.60.0

获取上报参数

  1. 在agentarts平台左侧导航栏中选择“运营运维 > 观测”,并进入“智能体列表”页面。
  2. 单击“智能体接入”,填写智能体名称,并选择类型。类型按实际选择。
    图1 智能体接入
  3. 填写完成后,单击“创建”等待平台自动创建接入信息,记录接入地址、鉴权信息、智能体id等信息。请妥善保管该信息。
    表1 接入信息说明

    参数

    说明

    agent_id

    智能体id。

    metric_endpoint

    metric数据接入地址。

    metric_token

    metric上报鉴权token。

    project_id

    华为云项目id,报metric数据时使用。在agentarts页面获取。

    promid

    上报metric数据时使用。在agentarts页面获取。

    图2 获取接入地址、鉴权信息、智能体id等信息

上报metric数据

配置参数信息:

在上报metric数据前,需配置环境变量。服务名称(otel_service_name)必须遵循agentarts.{{智能体id}}.{{版本号}} 的格式(版本号默认填写default)。

otel_exporter_otlp_metrics_headers=authorization=bearer {metric_token},projectid={project_id},promid={prom_id},content-type=application/x-protobuf
otel_exporter_otlp_metrics_endpoint={metric_endpoint}
otel_exporter_otlp_metrics_insecure=true

上报metric数据示例代码:

本示例用于首次接入平台时,验证上报网络、鉴权和配置是否正确。此阶段使用手动构造的静态数据。

示例中gen_ai.domain.id、gen_ai.user.id的取值请按实际进行替换,请登录“”页面获取。

图3 获取domain id、user id
import os
import time
from opentelemetry.sdk.metrics.export import periodicexportingmetricreader
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import otlpmetricexporter
from opentelemetry.sdk.metrics import meterprovider
from opentelemetry import metrics
# 1. 替换为您的真实接入凭证
agent_id = "您的智能体id"
metric_endpoint = "您的metric接入地址"
metric_token = "您的metric鉴权token"
project_id = "您的projectid"
prom_id = "您的promid"
# 2. 配置 otel metric 环境变量 (注意 headers 格式与 trace 不同)
os.environ["otel_service_name"] = f"agentarts.{agent_id}.default"
os.environ["otel_exporter_otlp_metrics_headers"] = f"authorization={metric_token},projectid={project_id},promid={prom_id},content-type=application/x-protobuf"
os.environ["otel_exporter_otlp_metrics_endpoint"] = metric_endpoint
os.environ["otel_exporter_otlp_metrics_insecure"] = "true"
# 3. 初始化 metric provider,设置上报周期为 60000 毫秒(60秒)
metric_reader = periodicexportingmetricreader(
    otlpmetricexporter(),
    export_interval_millis=60000
)
meter_provider = meterprovider(metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)
def report_metrics():
    meter = metrics.get_meter(__name__)
    # 定义一个计数器 (counter),用于统计模型请求总数
    request_counter = meter.create_counter(
        name="gen_ai.total.requests",
        unit="1",
        description="number of requests to genai",
    )
    # 定义指标的关联维度 (attributes)
    # 【注意】gen_ai.resource.id 必须与平台生成的智能体 id 严格一致,注意替换gen_ai.domain.id、gen_ai.user.id的值
    attributes = {
        "gen_ai.resource.id": agent_id,
        "gen_ai.resource.type": "agent",
        "gen_ai.model.id": "deepseek-v4-pro",
        "gen_ai.session.id": "session-001",
        "gen_ai.domain.id": "your_domain_id",
        "gen_ai.project.id": project_id,
        "gen_ai.user.id": "your_user_id",
        "gen_ai.call.status": true,
        "gen_ai.space.id": "default"
    }
    # 业务发生时,计数器累加 1
    request_counter.add(1, attributes=attributes)
if __name__ == "__main__":
    print(f"==================================================")
    print(f" 智能体持续指标上报测试已启动!")
    print(f" 我们将持续运行 3 分钟,每 10 秒模拟一次调用。")
    print(f" 请保持此窗口运行,2分钟后刷新 agentarts 观测控制台。")
    print(f"==================================================")
    # 模拟持续运行 3 分钟 (180 秒),每 10 秒调用一次
    total_duration = 180
    interval = 10
    elapsed = 0
    while elapsed < total_duration:
        print(f"[{time.strftime('%h:%m:%s')}] 正在模拟第 {int(elapsed/interval)   1} 次智能体业务调用...")
        report_metrics()
        time.sleep(interval)
        elapsed  = interval
    # 测试结束,优雅关闭并强刷最后一批数据
    meter_provider.shutdown()
    print("==================================================")
    print(" 持续测试结束,指标数据已成功全部推送")
    print("==================================================")

为了保证您上报的metric指标能够被agentarts看板正确识别。您在代码中创建meter时,指标名及关联的维度属性(attributes)必须与平台标准严格对齐。关于所有可设置的attribute字段及含义,请参考opentelemetry字段映射

表2 核心指标说明

指标名称

类型

说明

gen_ai.total.requests

counter

用于统计智能体/大模型的累计调用总次数(每次成功/失败自增 1)。

gen_ai.usage.input_tokens

counter

用于累计输入token的总消耗,支撑平台“token分析”中的input消耗趋势图。

gen_ai.usage.output_tokens

counter

用于累计输出token的总生成量,支撑平台“token分析”中的output消耗趋势图。

表3 attribute说明

attribute

是非必填

说明

gen_ai.resource.id

智能体id(agent_id)。直接作为字符串写入。

gen_ai.resource.type

资源类型标识,默认写入 "agent"。

gen_ai.model.id

调用的模型名称(如 "deepseek-v4-pro")。

gen_ai.project.id

华为云的项目id(project_id),直接填入变量。

gen_ai.call.status

标识单次调用成功与否(true / false)。平台以此自动计算响应成功率趋势。

查看上报数据

上述示例代码中,定义了gen_ai.total.requests用于统计模型的请求总数。运行脚本后将触发模拟调用,调用完成后。在“运营运维 > 观测 > 智能体列表”页面,单击对应的智能体名称。可看到与模拟调用量相同的模型调用次数。

示例:真实对话中的metric(指标)数据上报

本示例中的脚本创建了一个常驻的智能体服务。在对话的过程中,每次调用完大模型后,代码会自动把真实的token数量累加到计数器中,并且保持后台进程运行,每隔60秒自动把指标打包上报到agentarts服务中。

本地环境准备与依赖安装:

请在你的电脑终端(windows的cmd或macos/linux的terminal)中执行以下命令,安装所需的python依赖库:

pip install opentelemetry-api==1.41.1
pip install opentelemetry-sdk==1.41.1
pip install opentelemetry-exporter-otlp==1.41.1
pip install openai==1.14.0
pip install python-dotenv==1.0.0

配置环境变量:

安装完成后,在您的代码文件夹下创建一个名为.env的文本文件。填写华为云maas服务的模型api key和agentarts平台上获取的真实凭证:

# ==========================================
# 1. 智能体大模型的 api 凭证(以接入 maas 的 openai 兼容接口为例)
# ==========================================
model_name=deepseek-v4-pro
model_url=https://api.modelarts-maas.com/openai/v1
model_api_key=换成你在maas上申请的模型api_key
# ==========================================
# 2. 华为云 agentarts 观测接入凭证
# ==========================================
agent_id=换成智能体id
domain_id=换成华为云账号id(在控制台右上角“我的凭证”中复制,不要填假数据,否则会被平台隔离过滤)
user_id=换成华为云iam用户id(在控制台右上角“我的凭证”中复制,不要填假数据,否则会被平台隔离过滤)
# metric 上报通道配置
metric_endpoint=换成metric数据接入地址(格式如 aom-access.cn-southwest-2.myhuaweicloud.com)
metric_token=metric上报鉴权token
project_id=换成华为云项目id
prom_id=换成promid
表4 环境变量说明

参数

说明

model_name

华为云maas服务的模型名称。取值为openai兼容接口中的model参数。

图4 模型名称

model_url

华为云maas服务的模型url,采用openai兼容接口。取值为:https://api.modelarts-maas.com/openai/v1。

model_api_key

华为云maas服务的模型api key,请获取。

图5 模型api key

agent_id

metric_endpoint

metric_token

project_id

prom_id

智能体id、metric数据接入地址、metric上报鉴权token、华为云项目id、promid,从“运营运维 > 观测”,在“智能体列表”页签中的接入指南中获取。

图6 获取接入地址、鉴权信息、智能体id等信息

domain_id

user_id

华为云账号id、华为云iam用户id,

请登录“”页面获取。

图7 获取domain id、user id

编写智能体调用及数据上报脚本:

创建一个名为agent_metric.py的代码文件,并填写如下内容:

import os
import time
import uuid
from openai import openai
from dotenv import load_dotenv
from opentelemetry.sdk.metrics.export import periodicexportingmetricreader
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import otlpmetricexporter
from opentelemetry.sdk.metrics import meterprovider
from opentelemetry import metrics
# 自动加载同目录下的 .env 文件
load_dotenv()
# 读取配置参数
agent_id = os.getenv("agent_id")
metric_endpoint = os.getenv("metric_endpoint")
metric_token = os.getenv("metric_token")
project_id = os.getenv("project_id")
prom_id = os.getenv("prom_id")
domain_id = os.getenv("domain_id")
user_id = os.getenv("user_id")
# 配置标准 otel metric 环境变量 (headers 中注意 projectid 和 promid 区分大小写)
os.environ["otel_service_name"] = f"agentarts.{agent_id}.default"
os.environ["otel_exporter_otlp_metrics_headers"] = f"authorization={metric_token},projectid={project_id},promid={prom_id},content-type=application/x-protobuf"
os.environ["otel_exporter_otlp_metrics_endpoint"] = metric_endpoint
os.environ["otel_exporter_otlp_metrics_insecure"] = "true"
# 初始化 otel metric 基础服务
metric_reader = periodicexportingmetricreader(otlpmetricexporter(), export_interval_millis=60000)
meter_provider = meterprovider(metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)
meter = metrics.get_meter(__name__)
# ==============================================================================
# 注册标准业务指标项(需要是全局唯一单例,禁止在循环调用中重复注册!)
# ==============================================================================
request_counter = meter.create_counter(
    name="gen_ai.total.requests", unit="1", description="大模型调用次数统计"
)
input_tokens_counter = meter.create_counter(
    name="gen_ai.usage.input_tokens", unit="1", description="输入token消耗统计"
)
output_tokens_counter = meter.create_counter(
    name="gen_ai.usage.output_tokens", unit="1", description="输出token消耗统计"
)
def call_llm_and_report_metrics(user_query: str, session_id: str):
    client = openai(
        api_key=os.getenv("model_api_key"),
        base_url=os.getenv("model_url")
    )
    # 动态装配指标维度属性(attributes)
    # 【注意】gen_ai.resource.id 必须与平台生成的智能体 id 严格一致
    attributes = {
        "gen_ai.resource.id": agent_id,
        "gen_ai.resource.type": "agent",
        "gen_ai.model.id": os.getenv("model_name"),
        "gen_ai.session.id": session_id,
        "gen_ai.domain.id": domain_id,
        "gen_ai.user.id": user_id,
        "gen_ai.project.id": project_id,
        "gen_ai.call.status": true,
        "gen_ai.space.id": "default"
    }
    try:
        # 发起真实的对话调用并计时
        start_time = time.time()
        completion = client.chat.completions.create(
            model=os.getenv("model_name"),
            messages=[{"role": "user", "content": user_query}]
        )
        duration = time.time() - start_time
        # 动态捕捉响应体中的真实 token 消耗
        usage = completion.usage
        response_content = completion.choices[0].message.content
        # ======================================================================
        # 动态数据累加上报
        # ======================================================================
        # 作用说明:调用成功,大模型累计调用次数自增 1
        request_counter.add(1, attributes=attributes)
        # 作用说明:将本次对话真实消耗的输入 token 数量累加到计数器中
        input_tokens_counter.add(usage.prompt_tokens, attributes=attributes)
        # 作用说明:将本次对话真实消耗的输出 token 数量累加到计数器中
        output_tokens_counter.add(usage.completion_tokens, attributes=attributes)
        print(f"[{time.strftime('%h:%m:%s')}] metrics calculated. duration: {duration:.2f}s, input token: {usage.prompt_tokens}, output token: {usage.completion_tokens}")
        return response_content
    except exception as e:
        # 调用发生异常,状态置为 false 并上报 1 次请求,以便看板统计成功率趋势
        error_attributes = attributes.copy()
        error_attributes["gen_ai.call.status"] = false
        request_counter.add(1, attributes=error_attributes)
        raise e
if __name__ == "__main__":
    current_session_id = f"sess-{uuid.uuid4().hex[:12]}"
    print(f"==================================================")
    print(f" metrics monitor agent started! session id: {current_session_id}")
    print(f" notice: metrics will be batch-sent every 60s in the background.")
    print(f" please chat for 3  minutes to generate solid graph curves.")
    print(f"==================================================")
    while true:
        user_input = input("\nuser: ")
        if user_input.strip().lower() in ["exit", "quit", "q"]:
            print("forcing immediate metrics upload and exiting...")
            break
        try:
            reply = call_llm_and_report_metrics(user_input, current_session_id)
            print(f"agent: {reply}")
        except exception as err:
            print(f"error occurred: {err}")
    # 将最后一批残留数据推送至平台
    meter_provider.shutdown()
    print("metrics report completed!")

执行测试,验证上报数据:

在您的代码文件夹下,打开终端并运行:

python agent_metric.py

运行后,可与智能体进行会话,可通过ctrl c命令退出会话。退出后,登录,在“运营运维 > 观测 > 智能体列表”页面,单击对应的智能体名称。在“概览”中可以看到模型调用数据。

图8 运行示例

常见问题

运行上报脚本时,出现failed to export metrics... error code: statuscode.unauthenticated鉴权失败报错

检查脚本的请求参数是否填写正确,检查metric_token、project_id、prom_id、content-type=application/x-protobuf的值是否有拼写错误。尤其检查authorization的值中是否填写了重复的bearer前缀。

脚本执行成功没有报错,但在agentarts中却看不到任何数据和折线图

  • 原因一:

    原因分析:在您的指标属性中,“gen_ai.domain.id”如果填了“your_domain_id”这样的静态假数据,看板在采用您当前华为云真实账号进行查询时,会因为安全机制直接将非本租户的“数据”过滤掉。

    j9九游会登录的解决方案:gen_ai.domain.id、gen_ai.user.id需要按照您的真实信息填写。

  • 原因二:

    原因分析:

    原因分析:aom底层计算qps或请求量趋势图时,使用的是速率函数。这些函数在数学上必须在时间轴上至少有2个以上不同时间点的数据才能计算出斜率。如果您只执行了一次脚本并立即shutdown(),时序库里只有一个孤立的点,无法形成折线,在图表上就会显示空数据。

    j9九游会登录的解决方案:将代码改造成循环上报模式(例如在本地每10秒自动add 1次,持续运行3分钟以上),让数据形成连续的时序流。

  • 原因三:

    原因分析:您在代码中上报的指标与在agentarts中看的页面不是同一个。例如代码中上报的是gen_ai.total.requests,该指标对应的是“大模型调用次数”,如果找错了看板位置,则看不到数据。

    j9九游会登录的解决方案:根据上报的具体指标查看平台看板。

相关文档

网站地图