本文へスキップ
mcpd
デーモンなし
ソース

転送

mcpd は OTLP を両方向に話します。ここに届いたものが、ここに閉じ込められることはありません。

11 個のエクスポーターではなく、出口は 1 つのプロトコル

mcpd は OTLP を受け取り、OTLP を送出できます。この 1 つの性質が、ベンダー ごとのエクスポーターの集まりがすることの大半を肩代わりします。Langfuse、 Datadog、Honeycomb、Grafana をはじめ、名前を挙げる価値のある送信先はどれも HTTP 上の OTLP を受け付けます。したがって転送は 11 個ではなく 1 つの実装で 済み、あるベンダーの SDK のリリースに遅れることもありません。

これは、mcpd の採用が取り消せるということでもあります。これまで使っていた ものに向けて転送し、2 週間ほど両方を動かし、取り消せない移行に賭けるので はなく、目の前のデータを見て決めてください。

有効にする

ローカルに保存し、先へ複製する

mcpd serve --forward-endpoint https://otlp.example.com

パスは自動で付け足されるので、/v1/traces ではなくベースの URL を渡してください。資格情報が必要な送信先には、ヘッダーを足します。

認証ヘッダー付きで

mcpd serve \ --forward-endpoint https://otlp.example.com \ --forward-header 'Authorization: Bearer $TOKEN'

同じ設定は、設定ファイルの forward の下にもあります。そこでは batch_size と enabled も使えます。フラグはファイル より優先されるので、共有の ConfigMap を編集せずに、1 つのインスタンスだけ 別の宛先へ向けられます。

{
  "forward": {
    "endpoint": "https://otlp.example.com",
    "headers": [["Authorization", "Bearer sk-..."]],
    "batch_size": 256,
    "enabled": true
  }
}
Ingest pipeline
  1. Decode

    OTLP or native, gzip or plain

  2. Sample

    Decided once, at the root

  3. Redact

    Before anything is written

  4. Price

    From the configured price book

  5. Store

    One transaction per batch

Redaction is stage three, not a cleanup job. A value that a rule matches never reaches storage at all.

ローカルへの保存が先に起きます

スパンは、何かが転送されるより先に mcpd 自身のストアへ書かれ、転送はその 後、独立したタスクで走ります。ここから 2 つの帰結が出てきます。どちらも意図 したものです。

遅い送信先が、そのスパンを生んだリクエストに自分のレイテンシを足すことは ありません。あなたのエージェントが、他人のコレクターを待つことはありません。

落ちている送信先が、取り込みの拒否に化けることもありません。mcpd は動き 続け、転送は独立したタスクで再試行されます。もう一方のやり方、つまり 他社の障害であなたのテレメトリーがまったく残らなくなるやり方こそ、この設計 が避けるためにある失敗です。

各バッチには 3 回の試行があります。429、5xx、または接続の失敗は 250 ms 後に 再試行され、待ち時間は試行のたびに倍になります。秒で指定された Retry-After は、30 秒を上限としてこの待ち時間の代わりに使われ ます。それ以外の 4xx は最初の応答で確定します。そのバッチは、その送信先に とって不正な形のままだからです。デーモンが停止する途中なら、残りの試行を すぐに行います。最終的に拒否されたバッチや、最後の試行の後も未配送の バッチはログに記録され、そのスパンは mcpd_forward_dropped_spans_total に加算されます。これで、 コピーのどれだけが欠けているかがわかります。

接続を受け付けたまま決して応答しない送信先も、デーモンのメモリを奪うことはできません。 送信先を同時に待てるのは、取り込みリクエスト 64 件分のコピーまでです。それだけ待っている間は、 新しいコピーはその場で破棄されて mcpd_forward_dropped_spans_total に数えられ、 ローカルへの書き込みには影響しません。

永続的な送信キューはありません。バッチは再試行の間メモリ上で待ち、転送 キューが満杯のときは新しいバッチが捨てられ、そのスパンは同じメトリクスに 数えられます。永続的なキューは別の製品であり、黙ったまま何時間も遅れる キューは、目に見える欠落より悪いものです。配送の保証が必要なら、mcpd と 送信先の間に本物のコレクターを置き、それが作られた目的の仕事をさせて ください。

秘匿化は、出ていくものにも適用されます

転送は取り込みパイプラインの後で起きます。そのパイプラインは、何かが書かれる 前にその場で秘匿化します。mcpd が隠すよう指示されたものは、次の区間にも 届きません。ストレージは守るのに出口は守らないルールは、プライバシーの制御 とは呼べません。

何が転送されるか

スパンです。ログ、メトリクス、スコア、フィードバック、観点ノートは mcpd に残ります。人が転送する先はトレーシングのバックエンドであり、それ以外は 捨てるか、属性に押し込んで壊してしまうからです。

スパンはサービスごとにまとめられて resourceSpans になります。 受け取り側が期待する形です。スパンごとに 1 つのリソースを置く形も規格上は 正しいのですが、下流のすべてにまとめ直させることになります。

mcpd から mcpd への転送

両端が同じプロトコルを話すので、ローカルの mcpd から共有の mcpd へ転送でき ます。開発者は自分のマシンに、ペイロードを丸ごと持つ速いストアを持ち、チーム のインスタンスは同じ実行を受け取って、到着時に自分の保持期間と自分の秘匿化 ルールを適用します。

次に

  • 既存の OpenTelemetry の構成を mcpd に向ける: OpenTelemetry。
  • スパンが保存され、送られる前に取り除かれるもの: 秘匿化と保持期間。
  • すべてのフラグとファイル設定: 設定。