Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions docs/project_docs/T-20260225-009-reverify-metrics/plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# T-20260225-009: OpenClaw メトリクス再検証結果

## 概要

PR #7123(`boxp/arch`: OTel 依存追加)反映後に `openclaw_*` メトリクスの取得状況を再検証した。

## 検証結果サマリ

| 項目 | 前回 (2026-02-21) | 今回 (2026-02-25) | 変化 |
|------|------------------|------------------|------|
| `@opentelemetry/api` エラー | 発生 | **消失** | 改善 |
| プラグインロード失敗ログ | 発生 | **消失** | 変化 |
| `openclaw_*` メトリクス | 0/18 | **0/18** | 変化なし |
| `target_info` (OTel自動生成) | なし | なし | 変化なし |

**結論: PR #7123 により `@opentelemetry/api` のモジュール解決エラーは解消されたが、メトリクスは依然として Prometheus に到達していない(0/18)。**

## 新たな根本原因仮説

1. **SDK 内部初期化失敗(最有力)**: OTel パッケージが `/opt/otel-deps/node_modules` にインストールされ `NODE_PATH` で参照可能になったが、SDK 初期化時にバージョン競合や内部エラーで静かに失敗
2. **OTLP エクスポーター送信失敗**: OTel SDK のデフォルト動作で export エラーが swallow されている
3. **OpenClaw v2026.2.22 でのプラグインシステム変更**: `[plugins]` ログが一切なく、プラグインロード方式が変更された可能性

## 推奨アクション

1. **即時**: ConfigMap に `OTEL_LOG_LEVEL=debug` を追加して OTel 内部エラーを特定
2. **短期**: OpenClaw v2026.2.23 へアップデート(changelog 確認後)
3. **代替**: `/app/node_modules` 直接インストール方式への変更を検討

## 詳細

検証の完全な結果は以下を参照:
- `docs/project_docs/openclaw-app-metrics-dashboard/metrics-verification.md`
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,264 @@ Pod `openclaw-7df8795bd7-gdskr` (2026-02-20T23:53:53Z 起動) が現行稼働中

## 次のステップ

- [ ] `boxp/arch` リポジトリで OTel 依存追加の PR を作成(Issue #6989 のワークアラウンド)
- [x] `boxp/arch` リポジトリで OTel 依存追加の PR を作成(Issue #6989 のワークアラウンド) → **PR #7123 でマージ済み (2026-02-21)**
- [ ] upstream `openclaw/openclaw` Issue #6989 にコメントで本環境の再現情報を追記
- [ ] 新イメージビルド → ArgoCD Image Updater による自動デプロイ
- [x] 新イメージビルド → ArgoCD Image Updater による自動デプロイ → **`202602240649` で反映済み**
- [ ] メトリクス出現確認 (`count({__name__=~"openclaw_.*"})`)
- [ ] ダッシュボードでデータ表示を確認

---

## 再検証 (T-20260225-009): PR #7123 反映後の確認

### 検証日時

2026-02-25 16:00 UTC

### 背景

`boxp/arch` PR #7123 (`feat: install opentelemetry deps in openclaw image`) が 2026-02-21 にマージされ、
ArgoCD Image Updater により `ghcr.io/boxp/arch/openclaw:202602240649` としてデプロイ済み。
このPRで以下の OTel パッケージが追加された:

- `@opentelemetry/api`
- `@opentelemetry/sdk-node`
- `@opentelemetry/sdk-metrics`
- `@opentelemetry/exporter-metrics-otlp-proto`

インストール先は `/opt/otel-deps/node_modules`、`ENV NODE_PATH="/opt/otel-deps/node_modules"` で参照可能にしている。

### 環境情報

| 項目 | 値 |
|------|-----|
| OpenClaw バージョン | v2026.2.22-2 |
| Docker イメージ | `ghcr.io/boxp/arch/openclaw:202602240649` |
| 現行 Pod | `openclaw-54446c6df9-mqw64` |
| Pod 起動時刻 | 2026-02-24T07:00:27 UTC |
| Prometheus バージョン | 3.5.0 |

### Prometheus メトリクス確認

```
list_prometheus_metric_names(regex="openclaw_.*") → [] (0件)
list_prometheus_label_values(service_name) → ["external-secrets-webhook", "longhorn-admission-webhook"]
→ "openclaw" なし
target_info → 存在しない(OTel SDK 未初期化の証拠)
```

**全 18 ベースメトリクスが依然として Prometheus に存在しない(0/18)。**

### Loki ログ確認(変化あり)

#### 改善点: `@opentelemetry/api` エラー消失

```
LogQL: {container="openclaw"} |~ "(?i)(otel|telemetry|Cannot find module|opentelemetry)"
期間: 2026-02-24T00:00:00Z 〜 2026-02-25T23:59:59Z
結果: 0件
```

**PR #7123 の効果で `Cannot find module '@opentelemetry/api'` エラーが完全に消失した。**

前回検証 (2026-02-21) では全 Pod 世代で発生していたこのエラーが、
新イメージ反映後は一切発生していない。

#### 未改善点: プラグインロード成功ログも不在

```
LogQL: {container="openclaw"} |~ "(?i)(diagnostics-otel|plugin.*load|plugin.*fail)"
期間: 2026-02-24T00:00:00Z 〜 2026-02-25T23:59:59Z
結果: 0件
```

以前は `[gateway] [plugins] diagnostics-otel failed to load` というエラーが明確に出ていたが、
現在はプラグインに関するログが**成功も失敗も一切存在しない**。

#### 未改善点: OTLP export 関連ログ不在

```
LogQL: {container="openclaw"} |~ "(?i)(otlp|prometheus|metrics|export)"
期間: 2026-02-24T00:00:00Z 〜 2026-02-25T23:59:59Z
結果: 0件(exec コマンドログのみ、OTLP 関連はなし)
```

OTel SDK や Exporter の初期化・送信に関するログが一切存在しない。

#### 起動シーケンス分析 (2026-02-24T07:00:27)

| 時刻 (UTC) | タグ | メッセージ |
|------------|------|----------|
| 07:00:27.609 | `[canvas]` | host mounted |
| 07:00:27.863 | `[heartbeat]` | started |
| 07:00:27.870 | `[health-monitor]` | started (interval: 300s) |
| 07:00:27.878 | `[gateway]` | agent model: openai-codex/gpt-5.3-codex |
| 07:00:27.881 | `[gateway]` | listening on ws://0.0.0.0:18789 |
| 07:00:27.887 | `[gateway]` | log file path |
| 07:00:27.891 | `[gateway]` | security warning |
| 07:00:27.926 | `[browser/service]` | ready |
| 07:00:28.252 | `[gateway]` | update available v2026.2.23 |
| 07:00:28.703 | `[delivery-recovery]` | recovery |
| 07:00:28.716 | `[discord]` | starting provider |
| 07:00:31.258 | `[telegram]` | starting provider |

**注目: `[plugins]` タグのログが起動シーケンスに一切存在しない。**

以前のバージョンでは:
```
[gateway] [plugins] diagnostics-otel failed to load from /app/extensions/diagnostics-otel/index.ts
```
というログが起動時に出ていたが、現在のバージョン (v2026.2.22-2) ではプラグインシステムの
ログ出力自体が変更された可能性がある。

### 診断モジュールの動作確認

`[diagnostic]` タグのログは正常に出力されている:

```
[diagnostic] stuck session: sessionId=main state=processing age=154s queueDepth=0
[diagnostic] lane wait exceeded: lane=session:agent:main:main waitedMs=5833 queueAhead=0
```

これは診断(diagnostic)モジュール自体は動作しているが、
OTel メトリクスのエクスポート部分が機能していないことを示す。

### 根本原因分析

#### 状態変化のまとめ

| 項目 | 前回 (2026-02-21) | 今回 (2026-02-25) | 変化 |
|------|------------------|------------------|------|
| `@opentelemetry/api` エラー | 発生 | **消失** | 改善 |
| プラグインロード失敗ログ | 発生 | **消失** | 変化 |
| プラグインロード成功ログ | なし | なし | 変化なし |
| OTLP export ログ | なし | なし | 変化なし |
| `target_info` (OTel自動生成) | なし | なし | 変化なし |
| `openclaw_*` メトリクス | 0/18 | **0/18** | 変化なし |

#### 新たな根本原因仮説

PR #7123 により `@opentelemetry/api` のモジュール解決は成功するようになったが、
メトリクスが依然として Prometheus に到達していない。以下の仮説を提示する:

##### 仮説 1: diagnostics-otel プラグインの内部初期化失敗(最有力)

PR #7123 は OTel パッケージを `/opt/otel-deps/node_modules` にインストールし
`NODE_PATH` で参照可能にした。`@opentelemetry/api` の import は成功するが:

- プラグイン内部の `@opentelemetry/sdk-node` 初期化時に、
`/app/node_modules` 内の既存パッケージとバージョン競合が発生している可能性
- OTel SDK の NodeSDK 初期化は try-catch でラップされており、
失敗時にエラーログを出さず静かに失敗する実装が多い
- `target_info` すら存在しないことから、SDK 初期化自体が完了していないと推定

根拠:
- `@opentelemetry/api` import 成功 → エラー消失
- `target_info` 不在 → SDK 初期化未完了
- `[plugins]` ログ不在 → プラグインシステムの動作が不明

##### 仮説 2: OTLP エクスポーターの送信失敗(サイレント)

OTel SDK は初期化に成功したが、OTLP エクスポーターが Prometheus への
HTTP POST に失敗している。OTel JS SDK のデフォルト動作では export エラーは
内部の diag handler に送られ、stderr には出力されない。

根拠:
- Prometheus 3.5.0 での OTLP endpoint パスが変更されている可能性
- NetworkPolicy は設定済みだが、実際の接続テスト未実施

##### 仮説 3: OpenClaw v2026.2.22 でのプラグインシステム変更

v2026.2.22 でプラグインのロード方式が変更され、
`/app/extensions/diagnostics-otel/` からの動的ロードが行われなくなった可能性。

根拠:
- `[plugins]` タグのログが一切出力されなくなった
- 起動シーケンスにプラグイン関連のフェーズが見当たらない

#### 推定因果関係(更新版)

```
PR #7123 により OTel パッケージを /opt/otel-deps に追加
→ @opentelemetry/api の import エラーは解消
→ しかし、以下のいずれかが発生:
(A) SDK 初期化時にバージョン競合/内部エラーで静かに失敗
(B) Exporter が Prometheus OTLP endpoint へのプッシュに失敗(サイレント)
(C) v2026.2.22 でプラグインシステムが変更され、拡張が読み込まれない
→ いずれの場合も OTel メトリクスがエクスポートされない
→ Prometheus に openclaw_* が存在しない (0/18)
```

### 設定面の再検証

| 項目 | 設定 | 状態 |
|------|------|------|
| `diagnostics.otel.enabled` | `true` | OK |
| `diagnostics.otel.metrics` | `true` | OK |
| `diagnostics.otel.endpoint` | `http://prometheus-k8s.monitoring.svc:9090/api/v1/otlp` | OK |
| `diagnostics.otel.protocol` | `http/protobuf` | OK |
| `diagnostics.otel.serviceName` | `openclaw` | OK |
| `diagnostics.otel.flushIntervalMs` | `30000` | OK |
| `plugins.entries.diagnostics-otel.enabled` | `true` | OK |
| Prometheus `otlp-write-receiver` | `enableFeatures: ["otlp-write-receiver"]` | OK |
| Prometheus バージョン | 3.5.0 | OK (OTLP はデフォルト有効) |
| NetworkPolicy (openclaw → prometheus:9090) | egress 許可 | OK |
| NetworkPolicy (prometheus ← openclaw) | ingress 許可 | OK |

**設定面には問題なし。**

### 対応案(更新版)

#### 短期: OTel デバッグログの有効化

OpenClaw の設定に OTel diagnostics の詳細ログを有効化して原因を特定する:

```json
{
"diagnostics": {
"otel": {
"debug": true
}
}
}
```

または環境変数でOTel SDK のデバッグログを有効化:

```yaml
env:
- name: OTEL_LOG_LEVEL
value: "debug"
- name: OTEL_TRACES_EXPORTER
value: "none"
- name: OTEL_METRICS_EXPORTER
value: "otlp"
```

#### 短期: OpenClaw v2026.2.23 へのアップデート

起動ログで `update available (latest): v2026.2.23 (current v2026.2.22-2)` と表示されている。
v2026.2.23 で OTel プラグインの修正が含まれている可能性がある。

#### 中期: boxp/arch Dockerfile での OTel パッケージインストール方法の見直し

PR #7123 の `/opt/otel-deps` + `NODE_PATH` 方式が動作しない場合、
`/app/node_modules` 内に直接インストールする方式に変更:

```dockerfile
USER root
RUN cd /app && npm install --no-save \
@opentelemetry/api \
@opentelemetry/sdk-node \
@opentelemetry/sdk-metrics \
@opentelemetry/exporter-metrics-otlp-proto
USER node
```

### 次のステップ

- [ ] ConfigMap に `OTEL_LOG_LEVEL=debug` 環境変数を追加して再デプロイし、OTel 内部エラーを特定

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge OTEL_LOG_LEVEL の適用手順を正しい配置先に修正する

OTEL_LOG_LEVEL を「ConfigMap に追加」するだけでは反映されません。argoproj/openclaw/deployment-openclaw.yaml では openclaw コンテナの環境変数は env で個別定義されており(104-181行)、openclaw-config は 395-397行で openclaw.json をボリュームとして渡しているだけで envFrom/configMapKeyRef がないため、ここにキーを増やしても Pod の環境変数は変化しません。この手順のままだと再デプロイ後も OTel デバッグログが有効化されず、原因調査が空振りになります。

Useful? React with 👍 / 👎.

- [ ] OpenClaw v2026.2.23 で diagnostics-otel の挙動変更がないか changelog を確認
- [ ] v2026.2.23 へのアップデートを検討
- [ ] 改善しない場合、OTel パッケージを `/app/node_modules` に直接インストールする方式に変更
- [ ] upstream `openclaw/openclaw` Issue #6989 の進捗を確認