Просмотр исходного кода

refactor(otel): update spec and implementation plan for attributes cleanup

Yuki Takei 13 часов назад
Родитель
Сommit
cf0c4b8a52

+ 6 - 6
.kiro/specs/otel-attributes-cleanup/spec.json

@@ -1,9 +1,9 @@
 {
   "feature_name": "otel-attributes-cleanup",
   "created_at": "2026-05-21T00:00:00.000Z",
-  "updated_at": "2026-05-21T02:00:00.000Z",
+  "updated_at": "2026-05-21T03:30:00.000Z",
   "language": "ja",
-  "phase": "design-generated",
+  "phase": "tasks-generated",
   "approvals": {
     "requirements": {
       "generated": true,
@@ -11,12 +11,12 @@
     },
     "design": {
       "generated": true,
-      "approved": false
+      "approved": true
     },
     "tasks": {
-      "generated": false,
-      "approved": false
+      "generated": true,
+      "approved": true
     }
   },
-  "ready_for_implementation": false
+  "ready_for_implementation": true
 }

+ 57 - 0
.kiro/specs/otel-attributes-cleanup/tasks.md

@@ -0,0 +1,57 @@
+# Implementation Plan
+
+- [ ] 1. Resource Attribute cleanup
+- [ ] 1.1 (P) Remove os.totalmem from OS resource attributes
+  - `os-resource-attributes.ts` の `osInfo` オブジェクトおよび返り値 attributes から `totalmem` 関連の行を削除する。`os.type` / `os.platform` / `os.arch` は維持する。
+  - `os-resource-attributes.spec.ts` の `vi.mock('node:os')` のスタブから `totalmem: vi.fn()` を除去し、3 つの既存テストケースから `os.totalmem` 関連の期待値および `mockOs.totalmem` 呼び出し検証を削除する。
+  - 完了状態: `pnpm vitest run os-resource-attributes.spec` がパスし、`getOsResourceAttributes()` の戻り値が `os.type` / `os.platform` / `os.arch` の 3 キーのみとなる。
+  - _Requirements: 1.1, 1.3_
+  - _Boundary: OsResourceAttributes_
+
+- [ ] 1.2 (P) Remove growi.attachment.type from application resource attributes
+  - `application-resource-attributes.ts` の返り値 attributes から `'growi.attachment.type'` 行を削除する。
+  - 同ファイル内の `growiInfoService.getGrowiInfo({ includeAttachmentInfo: true })` 呼び出しから `includeAttachmentInfo: true` を除去する(このモジュールからは `attachmentType` を参照しなくなるため)。
+  - `application-resource-attributes.spec.ts` から `growi.attachment.type` 関連の期待値・スタブを削除する。
+  - 完了状態: `pnpm vitest run application-resource-attributes.spec` がパスし、`getApplicationResourceAttributes()` の戻り値が `growi.service.type` / `growi.deployment.type` のみとなる。
+  - _Requirements: 1.2, 1.3_
+  - _Boundary: ApplicationResourceAttributes_
+
+- [ ] 2. (P) Add attachment_type label to growi.configs info gauge
+  - `application-metrics.ts` の `result.observe(growiInfoGauge, 1, { ... })` のラベルオブジェクトに `attachment_type: growiInfo.additionalInfo?.attachmentType ?? ''` を追加する。既存の `getGrowiInfo({ includeAttachmentInfo: true })` 呼び出しはそのまま維持する。
+  - `application-metrics.spec.ts` に attachment_type ラベル付与の検証を追加する: 通常ケース(例: `attachmentType: 'aws'`)と未取得フォールバックケース(`additionalInfo: undefined` で `attachment_type: ''`)の 2 系統。
+  - 既存テストケース(site_url / site_url_hashed / wiki_type / external_auth_types)の期待ラベルオブジェクトに `attachment_type` を追加し、5 ラベル並存を明示的に検証する。
+  - 完了状態: `pnpm vitest run application-metrics.spec` がパスし、`growi.configs` gauge の observe 第 3 引数が 5 キー(既存 4 + `attachment_type`)を持つことが確認される。
+  - _Requirements: 2.1, 2.2, 2.3_
+  - _Boundary: ApplicationMetrics_
+
+- [ ] 3. (P) Implement and test SystemMetrics module
+  - `apps/app/src/features/opentelemetry/server/custom-metrics/system-metrics.ts` を新規作成し、`addSystemMetrics(): void` を export する。`loggerFactory('growi:opentelemetry:custom-metrics:system')` と `diag.createComponentLogger({ namespace: 'growi:custom-metrics:system' })` を既存 `application-metrics.ts` と同様のパターンで初期化する。
+  - 単一 Meter `growi-system-metrics`(version `'1.0.0'`)を `metrics.getMeter` で取得し、`createObservableGauge` で 6 つの gauge を作成する: `system.memory.limit`, `system.host.memory.total`, `process.memory.usage`, `process.runtime.v8.heap.used`, `process.runtime.v8.heap.total`, `process.runtime.v8.heap.external`。すべて unit は `By`。
+  - 1 つの `addBatchObservableCallback` 内で `process.constrainedMemory()` / `os.totalmem()` / `process.memoryUsage()` / `v8.getHeapStatistics()` を 1 回ずつ呼び、戻り値をローカル変数に保持してから各 gauge を `result.observe(...)` で観測する。`process.constrainedMemory()` の戻り値が 0 もしくは falsy のときは `system.memory.limit` のみスキップし、他 5 メトリクスは常に観測する。
+  - コールバック全体を try/catch で囲む。例外時は `loggerDiag.error('Failed to collect system metrics', { error })` を呼び、`result.observe` を一切呼ばずに return する。
+  - `system-metrics.spec.ts` を新規作成し、以下を網羅する: (a) Meter 名 `growi-system-metrics` と version `'1.0.0'` での `metrics.getMeter` 呼び出し検証、(b) 6 つの `createObservableGauge` の name + unit `By` の検証、(c) `process.constrainedMemory()` が正値時に `system.memory.limit` を当該値で観測、(d) 戻り値 `0` 時に `system.memory.limit` のみスキップしつつ他 5 メトリクスは観測、(e) `process.memoryUsage().rss` / `.external` および `v8.getHeapStatistics().used_heap_size` / `.total_heap_size` が対応 gauge へ正しくマップされる、(f) コールバック内例外時に `loggerDiag.error` が呼ばれ `observe` が 1 度も呼ばれない。`vi.mock('node:os')` / `vi.mock('node:v8')` および `vi.spyOn(process, 'constrainedMemory')` / `vi.spyOn(process, 'memoryUsage')` を使用する。
+  - 完了状態: `pnpm vitest run system-metrics.spec` がパスし、新規モジュール `system-metrics.ts` が上記 6 メトリクスと cgroup 分岐・エラーハンドリングを正しく実装している。
+  - _Requirements: 3.1, 3.2, 3.3, 4.1, 4.2, 4.3, 4.4, 5.2_
+  - _Boundary: SystemMetrics_
+
+- [ ] 4. Wire addSystemMetrics into setupCustomMetrics
+  - `custom-metrics/index.ts` のトップに `export { addSystemMetrics } from './system-metrics';` を追加する。
+  - `setupCustomMetrics()` 内で既存 3 関数(`addApplicationMetrics`, `addUserCountsMetrics`, `addPageCountsMetrics`)と同じ dynamic import パターンで `system-metrics` をロードし、`addSystemMetrics()` を呼ぶ。
+  - 完了状態: サーバー起動時のログに `growi:opentelemetry:custom-metrics:system` namespace の "Starting system metrics collection" / "...started successfully" が出力される。`pnpm vitest run` で既存の opentelemetry 関連テスト(特に node-sdk.spec)がパスする。
+  - _Depends: 3_
+  - _Requirements: 5.1_
+  - _Boundary: CustomMetricsIndex_
+
+- [ ] 5. Project-wide verification and operator handoff
+- [ ] 5.1 Verify lint, typecheck, tests, and build pass
+  - `turbo run lint --filter @growi/app` を実行し、Biome / TypeScript エラーがないことを確認する。
+  - `turbo run test --filter @growi/app` を実行し、変更対象の 4 spec(os-resource-attributes / application-resource-attributes / application-metrics / system-metrics)および既存全テストがパスすることを確認する。
+  - `turbo run build --filter @growi/app` を実行し、Turbopack による本番ビルドがエラーなく完了することを確認する。
+  - 完了状態: 上記 3 コマンドすべてが exit code 0 で終了する。
+  - _Requirements: 6.1_
+
+- [ ] 5.2 Author operator migration mapping in PR description
+  - PR 本文に「削除 Resource Attribute → 代替メトリクス/ラベル」の対応表を記載する。具体的には `os.totalmem` → `system.host.memory.total` および `system.memory.limit`(cgroup 設定時)の 2 メトリクス、`growi.attachment.type` → `growi.configs` の `attachment_type` ラベル、の 2 行。
+  - 新規追加された 6 メトリクスの一覧(名前と単位 `By`)を併記する。
+  - 完了状態: otel-infra 管理者が PR 本文 1 ページ内で「何が消え、どこに移ったか」「新たに何が出るようになったか」をワンビューで把握できる状態となる。
+  - _Requirements: 6.2_