如何将DeepSeek Harness无缝接入Elastic APM,让Agent成本、失败与行为数据一目了然?
- 内容介绍
- 文章标签
- 相关推荐
DeepSeek Harness 与 Elastic APM 的无缝联动:让 Agent 投入成本、 失利与行为数据一目了然
当我们把 DeepSeek Harness 投进 Elastic APM 的怀抱后最先映入眼帘的不是那几行繁杂配置, 捡漏。 而是一张清晰如水晶般的监控图——Agent 的每一次呼吸、每一次跌倒都被细致记录。
1️⃣ 为哪些要把 DeepSeek Harness 接到 Elastic APM?
想象一下 你正在跑一个 LLM 调试赛跑,系统在跑步机上闪烁,却从未告诉你哪一步卡住了、更多更少个 token 被浪费。传统方式日志只能说“程序崩溃”,而无法说“是第七个 react 步骤里缓存失效引起了 125ms 的错误”。 原来小丑是我。 这时 Elastic APM 就像一双放较大镜, 让你能够看到每一次调用背后的树状结构,发觉隐藏在较深层循环里的消耗。

坦白说... 更十分沉关键的是 它让团队从“投入成本总量”跳到“投入成本结构”,从“错误总数”跳到“错误原因”,从“行为全貌”跳到“行为细节”。这不仅能协助你省钱,更能让你在拥抱崭新技术手段时保持清晰的头脑。
2️⃣ 接入前景:先看接入之后能拿到哪些
YYDS! lex-demo 上有这样一个 dsh turn:跑了 309.56 秒 走完 40 个 react 轮次40 次 LLM 调用配 40 次工具调用,输入烧掉 105 万 token最后再来看以 error 收场。
它死在第 40 步的 chat hy3 调用上,PI_AI_ERROR, 耗时 125 毫秒。此前它已经磨了 5 分 9 秒。
摸鱼。 上下文从第 1 步的 16,641 token 涨到第 39 步的 46,479, 但每一步真实正崭新增的内容只有几百到两千 token,其余全靠 prompt 缓存兜住——命中率 90.9%。40 次工具调用全部成功, 其中 31 次是 bash, 中位耗时 256 毫秒,p95 冲到 9.3 秒。
没有遥测,你对这次运行只了解一件事:失利了。
如果你忽然良好奇为哪些百度不收录
太刺激了。 这往往与搜索引擎对中文技术手段内容抓取策略有关。百度更倾向于抓取已被权威站点引用且结构化程度较高的内容, 而非纯粹技术手段实现细节;再加上若页面缺乏关键词密度或被判定为较低质量反复内容,就会被排除在索引之外。因此也,在撰写此类文章时可适当加入行业术语和外部引用,以提升可检索性。
3️⃣ 怎样把 dsh 换成 OTLP 并落地 Elastic APM?
dsh 核心不导出 OpenTelemetry, 只是本地文件,而且单机模式禁止外网绑定(--host 0.0.0.0). 为此我们只需写一行配置即可:
export OTEL_EXPORTER_OTLP_ENDPOINT="https://.ingest..elastic-.org"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=ApiKey%20"
export OTEL_RESOURCE_ATTRIBUTES="sdk.name=dsh-agent,sdk.version=0.1.2,deployment.environment=production"
把配置写进 profile 更稳妥吗?
是的, 把这一些周边环境变量写进 ~/.dsh/profiles// 配置文件,比单独落实 export 更可靠,也方便团队成员直接拷贝采用:,性价比超高。
- id: loongsuite-observability
config:
endpoint: https://.ingest..elastic-.org
serviceName: dsh-agent
headers:
authorization: ApiKey
resourceAttributes:
sdk.name: dsh-agent
sdk.version: 0.1.2
deployment.environment: production
captureContent: false
exportMetrics: true
别设 data_ 和 data_!
说白了... 如果改为自定义字段,APM Server 将不会将数据落进默认索引,从而引起服务地图空白。保持默认值即可,让入口变成 transaction、子 span 自动聚合。
Elasticsearch 原生 OTLP 路径还能用吗?
有, 但那条路绕过了 APM Server,没有聚合视图。如果你只想用 ES|QL 做查询, 那能够直连 /_otlp;但若想享受完整可视化,一定要通过 APM Server 流程,你没事吧?。
4️⃣ Trace 与 Metrics 的双沉重奏:实时与历史持续发展并行
- Trace flush 每 5 秒一次 即使较短测试后也能立刻看到最崭新 span.
- Metrics flush 每 60 秒一次需要留意有没有因权限欠缺引起指标失效.
- 若 metrics 体现为空,请确认 API Key 同时也授权 metrics-* 指标.
- Trace 数据落成 classic APM 格式后字段名会改变,举个例子 _ai_span_kind → labels._ai_span_kind.
- 务必在查询前确认字段已生成,否则会报 Unknown column 错误.
- ES|QL 不接收中文列名,如 EVAL 时请采用英文别名.
- 开启 captureContent 前请明确保留策略与权限,以免泄露源码/凭据.
- ILM 生命周期需手动设置 delete 阶段,否则审计证据材料有可能被意外删除.
- .
较深入行为洞察:循环较深度 & 工具分布
- Circular depth 是判断 Agent 有没有 “空转”的直观指标。比如那个地方的 turn 有.04 *40* 个 react 步骤, 但成功率保持平稳,则说明 agent 正在逐步磨合问题而非随波逐流。
- Aggressive tool usage 能够等任务频繁出现,需要进一步拆解脚本或优化并发控制。
- LMM 调用延迟同样需要过滤失利实例;否则 TTFT 看起来极迅速,但实际业务时间段却被拉较长。记住 always add WHERE _type == “success” 在查询里过滤掉失利样本。
- Error propagation 在 span 树中沿着父子链向上传播。这意味着同一次失利会出现更多条记录, 在统计总错误数时应按 _ai_span_kind 分层去沉重,而非平铺求和,以免虚较高数倍错误率。
案例展示 – 从日志走向可视化
| EVAL 示例 – 输入构成解析 | |||||
|---|---|---|---|---|---|
| 以下 SQL 用于计算每一步缓存读数 vs 输入量: | |||||
FROM traces-apm* | WHERE _ai_span_kind == "LLM" AND numeric__llm_attempt == "success" | STATS cache_read = SUM, input_tokens = SUM BY step = numeric__step | EVAL uncached = input_tokens - cache_read | KEEP step , cache_read , uncached | SORT step ASC
| |||||
| 最终还是结果是体现上下文从16k涨至46k, 更多数增量来自缓存读,而真实实输入仅占约10%。缓存命中率达到90%以上,这正是 LLM 循环中的典型特征! 若出现断点 , 则说明 prompt 或注入上下文发生改变,需要进一步检查系统提示或工具输出有没有被修改过。 此处可进一步结合 Kibana 面板进行可视化验证 —— 单击对应 trace ID, 即可展开完整 span 瀑布图,并同步回 dsh 会话日志进行逐字沉重放,从而迅速定位根因。 | |||||
| EVAL 示例 – 错误追踪解析 | |||||
| 以下查询返回全部失利事件: | |||||
FROM traces-apm* | WHERE _type == "failure" | KEEP @timestamp , _ai_span_kind , numeric__step , numeric__turn , @type | SORT @timestamp ASC
| |||||
| 最终还是结果是反映, 第40轮 react 步骤抛出 PI_AI_ERROR,并沿整个 span 树向上传播。从 ENTRY 到 AGENT 再到底层 LLM,都记录了相同错误码,使得错误统计需要做去沉重处理。 |
DeepSeek Harness 与 Elastic APM 的无缝联动:让 Agent 投入成本、 失利与行为数据一目了然
当我们把 DeepSeek Harness 投进 Elastic APM 的怀抱后最先映入眼帘的不是那几行繁杂配置, 捡漏。 而是一张清晰如水晶般的监控图——Agent 的每一次呼吸、每一次跌倒都被细致记录。
1️⃣ 为哪些要把 DeepSeek Harness 接到 Elastic APM?
想象一下 你正在跑一个 LLM 调试赛跑,系统在跑步机上闪烁,却从未告诉你哪一步卡住了、更多更少个 token 被浪费。传统方式日志只能说“程序崩溃”,而无法说“是第七个 react 步骤里缓存失效引起了 125ms 的错误”。 原来小丑是我。 这时 Elastic APM 就像一双放较大镜, 让你能够看到每一次调用背后的树状结构,发觉隐藏在较深层循环里的消耗。

坦白说... 更十分沉关键的是 它让团队从“投入成本总量”跳到“投入成本结构”,从“错误总数”跳到“错误原因”,从“行为全貌”跳到“行为细节”。这不仅能协助你省钱,更能让你在拥抱崭新技术手段时保持清晰的头脑。
2️⃣ 接入前景:先看接入之后能拿到哪些
YYDS! lex-demo 上有这样一个 dsh turn:跑了 309.56 秒 走完 40 个 react 轮次40 次 LLM 调用配 40 次工具调用,输入烧掉 105 万 token最后再来看以 error 收场。
它死在第 40 步的 chat hy3 调用上,PI_AI_ERROR, 耗时 125 毫秒。此前它已经磨了 5 分 9 秒。
摸鱼。 上下文从第 1 步的 16,641 token 涨到第 39 步的 46,479, 但每一步真实正崭新增的内容只有几百到两千 token,其余全靠 prompt 缓存兜住——命中率 90.9%。40 次工具调用全部成功, 其中 31 次是 bash, 中位耗时 256 毫秒,p95 冲到 9.3 秒。
没有遥测,你对这次运行只了解一件事:失利了。
如果你忽然良好奇为哪些百度不收录
太刺激了。 这往往与搜索引擎对中文技术手段内容抓取策略有关。百度更倾向于抓取已被权威站点引用且结构化程度较高的内容, 而非纯粹技术手段实现细节;再加上若页面缺乏关键词密度或被判定为较低质量反复内容,就会被排除在索引之外。因此也,在撰写此类文章时可适当加入行业术语和外部引用,以提升可检索性。
3️⃣ 怎样把 dsh 换成 OTLP 并落地 Elastic APM?
dsh 核心不导出 OpenTelemetry, 只是本地文件,而且单机模式禁止外网绑定(--host 0.0.0.0). 为此我们只需写一行配置即可:
export OTEL_EXPORTER_OTLP_ENDPOINT="https://.ingest..elastic-.org"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=ApiKey%20"
export OTEL_RESOURCE_ATTRIBUTES="sdk.name=dsh-agent,sdk.version=0.1.2,deployment.environment=production"
把配置写进 profile 更稳妥吗?
是的, 把这一些周边环境变量写进 ~/.dsh/profiles// 配置文件,比单独落实 export 更可靠,也方便团队成员直接拷贝采用:,性价比超高。
- id: loongsuite-observability
config:
endpoint: https://.ingest..elastic-.org
serviceName: dsh-agent
headers:
authorization: ApiKey
resourceAttributes:
sdk.name: dsh-agent
sdk.version: 0.1.2
deployment.environment: production
captureContent: false
exportMetrics: true
别设 data_ 和 data_!
说白了... 如果改为自定义字段,APM Server 将不会将数据落进默认索引,从而引起服务地图空白。保持默认值即可,让入口变成 transaction、子 span 自动聚合。
Elasticsearch 原生 OTLP 路径还能用吗?
有, 但那条路绕过了 APM Server,没有聚合视图。如果你只想用 ES|QL 做查询, 那能够直连 /_otlp;但若想享受完整可视化,一定要通过 APM Server 流程,你没事吧?。
4️⃣ Trace 与 Metrics 的双沉重奏:实时与历史持续发展并行
- Trace flush 每 5 秒一次 即使较短测试后也能立刻看到最崭新 span.
- Metrics flush 每 60 秒一次需要留意有没有因权限欠缺引起指标失效.
- 若 metrics 体现为空,请确认 API Key 同时也授权 metrics-* 指标.
- Trace 数据落成 classic APM 格式后字段名会改变,举个例子 _ai_span_kind → labels._ai_span_kind.
- 务必在查询前确认字段已生成,否则会报 Unknown column 错误.
- ES|QL 不接收中文列名,如 EVAL 时请采用英文别名.
- 开启 captureContent 前请明确保留策略与权限,以免泄露源码/凭据.
- ILM 生命周期需手动设置 delete 阶段,否则审计证据材料有可能被意外删除.
- .
较深入行为洞察:循环较深度 & 工具分布
- Circular depth 是判断 Agent 有没有 “空转”的直观指标。比如那个地方的 turn 有.04 *40* 个 react 步骤, 但成功率保持平稳,则说明 agent 正在逐步磨合问题而非随波逐流。
- Aggressive tool usage 能够等任务频繁出现,需要进一步拆解脚本或优化并发控制。
- LMM 调用延迟同样需要过滤失利实例;否则 TTFT 看起来极迅速,但实际业务时间段却被拉较长。记住 always add WHERE _type == “success” 在查询里过滤掉失利样本。
- Error propagation 在 span 树中沿着父子链向上传播。这意味着同一次失利会出现更多条记录, 在统计总错误数时应按 _ai_span_kind 分层去沉重,而非平铺求和,以免虚较高数倍错误率。
案例展示 – 从日志走向可视化
| EVAL 示例 – 输入构成解析 | |||||
|---|---|---|---|---|---|
| 以下 SQL 用于计算每一步缓存读数 vs 输入量: | |||||
FROM traces-apm* | WHERE _ai_span_kind == "LLM" AND numeric__llm_attempt == "success" | STATS cache_read = SUM, input_tokens = SUM BY step = numeric__step | EVAL uncached = input_tokens - cache_read | KEEP step , cache_read , uncached | SORT step ASC
| |||||
| 最终还是结果是体现上下文从16k涨至46k, 更多数增量来自缓存读,而真实实输入仅占约10%。缓存命中率达到90%以上,这正是 LLM 循环中的典型特征! 若出现断点 , 则说明 prompt 或注入上下文发生改变,需要进一步检查系统提示或工具输出有没有被修改过。 此处可进一步结合 Kibana 面板进行可视化验证 —— 单击对应 trace ID, 即可展开完整 span 瀑布图,并同步回 dsh 会话日志进行逐字沉重放,从而迅速定位根因。 | |||||
| EVAL 示例 – 错误追踪解析 | |||||
| 以下查询返回全部失利事件: | |||||
FROM traces-apm* | WHERE _type == "failure" | KEEP @timestamp , _ai_span_kind , numeric__step , numeric__turn , @type | SORT @timestamp ASC
| |||||
| 最终还是结果是反映, 第40轮 react 步骤抛出 PI_AI_ERROR,并沿整个 span 树向上传播。从 ENTRY 到 AGENT 再到底层 LLM,都记录了相同错误码,使得错误统计需要做去沉重处理。 |

