跳至內容

遙測通道

遙測通道是代理主機向 AHP 用戶端發送 OpenTelemetry (OTel) 資料(日誌、追蹤和指標)的方式。這是一個精簡的傳遞:線路上的有效負載是逐字的 OTLP/JSON 值。 AHP 僅新增路由信封。

此頁面是規範的。 OTel 資料模型本身由 opentelemetry-proto 定義; AHP 不重新宣告它。

URI 方案

遙測通道使用 ahp-otlp: 方案。 URI 的權限和路徑部分是實作定義的。主機也可以通告 RFC 6570 URI 範本;用戶端使用此規格中的值擴充範本(目前日誌通道上只有 {level}),並使用產生的特定 URI 進行訂閱。

除了擴展此處定義的眾所周知的模板變數之外,用戶端必須將 URI 視為不透明,並使用主機在 InitializeResult.telemetry 上通告的值(擴展後)進行訂閱。

三個訊號的 URI 不要求共用公共路徑、主機或任何其他結構。每個人都是獨立的。

發現

代理主機在 InitializeResult.telemetry 上通告其發出的 OTel 訊號以及在哪個通道 URI 上:

jsonc
// Server → Client (initialize response, excerpt)
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "0.3.0",
    "serverSeq": 0,
    "snapshots": [],
    "telemetry": {
      "logs":    "ahp-otlp://logs{?level}",
      "traces":  "ahp-otlp://traces",
      "metrics": "ahp-otlp://metrics"
    }
  }
}

每個欄位都是可選的。不發出指標的主機會簡單地忽略 metrics。根本不發出遙測資料的主機完全忽略 telemetry。用戶端應該只訂閱它們可以處理的訊號。

訂閱

遙測通道是無狀態的*,訂閱回傳空的 SubscribeResult。訂閱成功後,用戶端會收到訂閱期間主機發出的批次的 otlp/export* 通知。

jsonc
// Client → Server
{ "jsonrpc": "2.0", "id": 2, "method": "subscribe",
  "params": { "channel": "ahp-otlp://logs" } }

// Server → Client
{ "jsonrpc": "2.0", "id": 2, "result": {} }

重新連線時不會重播遙測資料。 reconnect 之後,用戶端重新訂閱並從即時邊緣恢復。

線路格式

每個 OTel 訊號只有一種伺服器 → 用戶端通知方法:

方法通道有效負載
otlp/exportLogsTelemetryCapabilities.logsOTLP/JSON ExportLogsServiceRequest
otlp/exportTracesTelemetryCapabilities.tracesOTLP/JSON ExportTraceServiceRequest
otlp/exportMetricsTelemetryCapabilities.metricsOTLP/JSON ExportMetricsServiceRequest

每個通知的參數具有以下形狀:

jsonc
{
  "channel": "<the ahp-otlp: URI from InitializeResult.telemetry>",
  "payload": { /* OTLP/JSON ExportXxxServiceRequest, verbatim */ }
}

channel 欄位遵循通用 AHP 規則:每個通知的參數都攜帶其作用範圍的通道 URI。用戶端依 channel 路由批次,然後將 payload 解析為 OTLP/JSON。

範例 — 日誌

jsonc
{
  "jsonrpc": "2.0",
  "method": "otlp/exportLogs",
  "params": {
    "channel": "ahp-otlp://logs",
    "payload": {
      "resourceLogs": [
        {
          "resource": {
            "attributes": [
              { "key": "service.name",     "value": { "stringValue": "ahp-agent-host" } },
              { "key": "ahp.session.id",   "value": { "stringValue": "f1e3...e0" } }
            ]
          },
          "scopeLogs": [
            {
              "scope": { "name": "agent-host.tools" },
              "logRecords": [
                {
                  "timeUnixNano": "1736870400000000000",
                  "severityNumber": 9,
                  "severityText": "INFO",
                  "body": { "stringValue": "tool call started" },
                  "attributes": [
                    { "key": "tool.name", "value": { "stringValue": "read_file" } }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  }
}

範例 — 軌跡和指標

追蹤和指標通知具有相同的信封;僅 payload 內的頂級欄位名稱不同(resourceSpans 表示跟蹤,resourceMetrics 表示指標)。請參閱 opentelemetry-proto 以了解完整的資料形狀。

過濾

日誌通道透過 RFC 6570 URI 範本支援可選的訂閱者端嚴重性過濾。支援過濾的主機會通告包含 {level} 變數的模板,例如"ahp-otlp://logs{?level}";不支援過濾的主機會通告文字 URI。

模板中的變數意義
(無)所有日誌記錄均已傳送。
{level}以短名稱(不區分大小寫)形式提供的最低 OTLP SeverityNumbertracedebuginfowarnerrorfatal。伺服器傳送 severityNumber 位於對應範圍或以上的記錄(例如 infoseverityNumber >= 9,涵蓋 INFO/WARN/ERROR/FATAL)。
jsonc
// Host advertises:                  "ahp-otlp://logs{?level}"
// Client expands {level=info} and subscribes to:
{ "jsonrpc": "2.0", "id": 7, "method": "subscribe",
  "params": { "channel": "ahp-otlp://logs?level=info" } }

從伺服器的角度來看,每個不同的擴充都是自己的訂閱 URI,因此在不同層級訂閱的兩個用戶端會接收獨立的預過濾流。通告文字 URI(無 {level})的主機提供所有嚴重性。

目前沒有為追蹤或指標定義過濾器變數。

相關性

主機應該使用標準 OpenTelemetry 資源和記錄屬性將遙測與 AHP 實體關聯起來 - 例如:

  • service.name(資源):標識主機。
  • ahp.session.id(資源或 LogRecord/Span 屬性):工作階段 URI 的 UUID。
  • ahp.turn.idahp.tool_call.id(LogRecord/Span 屬性):記錄所屬的回合或工具呼叫。

這些是約定,而不是協定欄位;用戶端想要按工作階段/回合分割遙測資料,透過接收端的屬性過濾來實作。

以 MIT 授權發布。