GROWI は監視・可観測性のために OpenTelemetry を採用しており、apps/app/src/features/opentelemetry/ 配下に NodeSDK 初期化・Resource Attribute・Custom Metrics・Anonymization の各レイヤを実装している。本 spec は features/opentelemetry/ の 大局的なメンテナンスリファレンス として、将来の追加・変更(メトリクス追加、新規 anonymization handler、SDK バージョンアップ)が踏むべき境界線と設計意図を提供する。
^24(cgroup 系 API・V8 統計が利用可能)。@opentelemetry/api ^1.9.0@opentelemetry/sdk-node ^0.217.0@opentelemetry/auto-instrumentations-node ^0.75.0@opentelemetry/exporter-trace-otlp-grpc, @opentelemetry/exporter-metrics-otlp-grpc ^0.202.0@opentelemetry/sdk-metrics ^2.0.1, @opentelemetry/resources ^2.0.1, @opentelemetry/sdk-trace-node ^2.0.1@opentelemetry/semantic-conventions ^1.34.0apps/app/src/features/opentelemetry/server/):
node-sdk.ts — SDK ライフサイクル管理(initInstrumentation / setupAdditionalResourceAttributes / startOpenTelemetry)。node-sdk-configuration.ts — NodeSDKConfiguration 構築と Resource 構築(2 段階初期化)。node-sdk-resource.ts — NodeSDK._resource への低レベルアクセサ(リフレクション)。logger.ts — DiagLogger を pino logger にアダプトする実装。semconv.ts — incubating semantic conventions のコピー(service.instance.id, http.target)。custom-resource-attributes/ — os-resource-attributes / application-resource-attributes。identity 専用。custom-metrics/ — application-metrics / user-counts-metrics / page-counts-metrics / system-metrics + setupCustomMetrics() 合成。anonymization/ — httpInstrumentationConfig と 4 個の handler(search / page-listing / page / page-access)。config-definition.ts):
otel:enabled (OPENTELEMETRY_ENABLED, default true)otel:isAppSiteUrlHashed (OPENTELEMETRY_IS_APP_SITE_URL_HASHED, default false)otel:anonymizeInBestEffort (OPENTELEMETRY_ANONYMIZE_IN_BEST_EFFORT, default false)otel:serviceInstanceId (OPENTELEMETRY_SERVICE_INSTANCE_ID, default undefined)OTEL_EXPORTER_OTLP_ENDPOINT 等)で制御。PeriodicExportingMetricReader の exportIntervalMillis: 300000(5 分)。features/opentelemetry/ のすべての公開モジュールが本 spec の Boundary Commitments / Out of Boundary で明示的に分類されており、新規メトリクス追加・新規 anonymization handler 追加・SDK バージョンアップが「どこを触ればよいか / どこを触ってはいけないか」を本 spec 1 か所で参照できる。growi.configs info-gauge ラベルへ、観測値は growi.* または system.* / process.* メトリクスへ、というレイヤ責務が明文化されている。apps/app/src/features/opentelemetry/docs/ 配下の散在ドキュメントは破棄され、本 spec が単一の真実ソースになる。新規実装ではなくドキュメント統合。 既に動作している features/opentelemetry/ の構造を本 spec に固定化する。
growi.configs info-gauge ラベル、観測値(メモリ・ヒープ等)は system.* / process.* メトリクスへ、というレイヤ責務を Design Decisions として固定する。features/opentelemetry/server/ 配下のすべての公開モジュール(SDK / Resource / Metric / Anonymization / Logger / semconv)の責務と境界の明文化。handlers/index.ts への module 追加 + canHandle / handle インターフェース実装)。http.target 以外)。@opentelemetry/host-metrics 等)への置き換え。node-sdk.ts, node-sdk-configuration.ts, node-sdk-resource.ts, logger.ts) — SDK 初期化・enable/disable 制御・Resource 2 段階注入。custom-resource-attributes/) — identity 専用属性の供給。custom-metrics/) — growi.* / system.* / process.* メトリクスの emit と合成。anonymization/) — http.target の匿名化と handler の選択ロジック。semconv.ts) — 不安定 semconv の固定化。これら 5 つはそれぞれ独立に拡張・置換可能で、相互の dependency は明確に下流方向に限定されている。
~/server/service/growi-info(growiInfoService) — 上流。本 spec は consumer。~/server/service/config-manager(configManager) — 上流。本 spec は consumer。~/utils/growi-version / ~/utils/logger — utility。本 spec は consumer。@growi/core/dist/utils/page-path-utils の各 helper(isPermalink, isUserPage, getUsernameByPath 等) — @growi/core の責務。~/server/service/config-manager — otel:* config 4 種。~/server/service/growi-info — growiInfoService.getGrowiInfo(opts)。Metric / Resource 双方が consumer。~/utils/growi-version — service.version Resource Attribute の供給元。growi-logger spec はアプリケーションロガーの spec で、logger.ts の DiagLogger アダプタが pino を経由する点で接点があるが、両者の責務は独立。^24(cgroup memory API、V8 統計のため)。@opentelemetry/* パッケージで完結させる)。追加が必要な場合は apps/app/.next/node_modules/ 残留有無を確認し dependencies 分類が必要かを判定する(参照: .claude/rules/package-dependencies.md)。semconv.ts にローカルコピーする(incubating entry-point は import しない)。詳細は semconv.ts のコメント参照。setResource() は NodeSDK._resource への private アクセスを行う(type cast 必須)。OpenTelemetry SDK が public な resource 上書き API を提供したら撤去する。http.target(incubating)。OTLP semconv で対応 stable attribute が決定したら移行する。