Explorar el Código

update docs and labels

Yuki Takei hace 9 meses
padre
commit
b47d2db919

+ 29 - 14
apps/app/src/features/opentelemetry/docs/custom-metrics-architecture.md

@@ -5,38 +5,41 @@
 GROWIのOpenTelemetryカスタムメトリクスは、以下の3つのカテゴリに分類して実装されています:
 GROWIのOpenTelemetryカスタムメトリクスは、以下の3つのカテゴリに分類して実装されています:
 
 
 1. **Resource Attributes** - システム起動時に設定される静的情報
 1. **Resource Attributes** - システム起動時に設定される静的情報
-2. **Info Metrics** - 設定変更により動的に変わる可能性があるメタデータ
+2. **Config Metrics** - 設定変更により動的に変わる可能性があるメタデータ
 3. **Custom Metrics** - 時間と共に変化する業務メトリクス
 3. **Custom Metrics** - 時間と共に変化する業務メトリクス
 
 
 ## アーキテクチャ
 ## アーキテクチャ
 
 
 ### Resource Attributes
 ### Resource Attributes
 
 
-静的なシステム情報をOpenTelemetryのResource Attributesとして設定します。これらの値はアプリケーション起動時に一度だけ設定され、運用中は変更されません。
+静的なシステム情報をOpenTelemetryのResource Attributesとして設定します。Resource Attributesは2段階で設定されます:
+
+1. **起動時設定**: OS情報など、データベースアクセスが不要な静的情報
+2. **データベース初期化後設定**: アプリケーション情報など、データベースアクセスが必要な情報
 
 
 #### 実装場所
 #### 実装場所
 ```
 ```
 src/features/opentelemetry/server/custom-resource-attributes/
 src/features/opentelemetry/server/custom-resource-attributes/
-├── os-resource-attributes.ts        # OS情報
-└── application-resource-attributes.ts  # アプリケーション固定情報・インストール情報
+├── os-resource-attributes.ts        # OS情報 (起動時設定)
+└── application-resource-attributes.ts  # アプリケーション固定情報 (DB初期化後設定)
 ```
 ```
 
 
-#### OS情報 (`os-resource-attributes.ts`)
+#### OS情報 (`os-resource-attributes.ts`) - 起動時設定
 - `os.type` - OS種別 (Linux, Windows等)
 - `os.type` - OS種別 (Linux, Windows等)
 - `os.platform` - プラットフォーム (linux, darwin等)
 - `os.platform` - プラットフォーム (linux, darwin等)
 - `os.arch` - アーキテクチャ (x64, arm64等)
 - `os.arch` - アーキテクチャ (x64, arm64等)
 - `os.totalmem` - 総メモリ量
 - `os.totalmem` - 総メモリ量
 
 
-#### アプリケーション固定情報 (`application-resource-attributes.ts`)
+#### アプリケーション固定情報 (`application-resource-attributes.ts`) - DB初期化後設定
 - `growi.service.type` - サービスタイプ
 - `growi.service.type` - サービスタイプ
 - `growi.deployment.type` - デプロイメントタイプ
 - `growi.deployment.type` - デプロイメントタイプ
 - `growi.attachment.type` - ファイルアップロードタイプ
 - `growi.attachment.type` - ファイルアップロードタイプ
-- `growi.installed.at` - インストール日時
-- `growi.installed.by_oldest_user` - 最古ユーザー作成日時
+- `growi.installedAt` - インストール日時
+- `growi.installedAt.by_oldest_user` - 最古ユーザー作成日時
 
 
-### Info Metrics
+### Config Metrics
 
 
-設定変更により動的に変わる可能性があるメタデータをInfo Metricsパターンで実装します。値は常に1で、情報はラベルに格納されます。
+設定変更により動的に変わる可能性があるメタデータ実装します。値は常に1で、情報はラベルに格納されます。
 
 
 #### 実装場所
 #### 実装場所
 ```
 ```
@@ -61,7 +64,7 @@ growi_info{service_instance_id="abc123",site_url="https://wiki.example.com",wiki
 #### 実装場所
 #### 実装場所
 ```
 ```
 src/features/opentelemetry/server/custom-metrics/
 src/features/opentelemetry/server/custom-metrics/
-├── application-metrics.ts  # Info Metrics (既存)
+├── application-metrics.ts  # Config Metrics (既存)
 └── user-counts-metrics.ts  # ユーザー数メトリクス (新規作成)
 └── user-counts-metrics.ts  # ユーザー数メトリクス (新規作成)
 ```
 ```
 
 
@@ -69,12 +72,24 @@ src/features/opentelemetry/server/custom-metrics/
 - `growi.users.total` - 総ユーザー数
 - `growi.users.total` - 総ユーザー数
 - `growi.users.active` - アクティブユーザー数
 - `growi.users.active` - アクティブユーザー数
 
 
-## 収集間隔
+## 収集間隔・設定タイミング
+
+### Resource Attributes
+- **OS情報**: アプリケーション起動時に1回のみ設定
+- **アプリケーション情報**: データベース初期化後に1回のみ設定
 
 
-- **Resource Attributes**: アプリケーション起動時に1回のみ設定
-- **Info Metrics**: 60秒間隔で収集 (デフォルト)
+### Metrics
+- **Config Metrics**: 60秒間隔で収集 (デフォルト)
 - **Custom Metrics**: 60秒間隔で収集 (デフォルト)
 - **Custom Metrics**: 60秒間隔で収集 (デフォルト)
 
 
+### 2段階設定の理由
+
+Resource Attributesが2段階で設定される理由:
+
+1. **循環依存の回避**: アプリケーション情報の取得にはgrowiInfoServiceが必要だが、OpenTelemetry初期化時点では利用できない
+2. **データベース依存**: インストール日時やサービス設定などはデータベースから取得する必要がある
+3. **起動時間の最適化**: データベース接続を待たずにOpenTelemetryの基本機能を開始できる
+
 ## 設定の変更
 ## 設定の変更
 
 
 メトリクス収集間隔は `PeriodicExportingMetricReader` の `exportIntervalMillis` で変更可能です:
 メトリクス収集間隔は `PeriodicExportingMetricReader` の `exportIntervalMillis` で変更可能です:

+ 32 - 24
apps/app/src/features/opentelemetry/docs/implementation-guide.md

@@ -7,12 +7,14 @@
 #### 1. Resource Attributes
 #### 1. Resource Attributes
 - **OS情報**: `src/features/opentelemetry/server/custom-resource-attributes/os-resource-attributes.ts`
 - **OS情報**: `src/features/opentelemetry/server/custom-resource-attributes/os-resource-attributes.ts`
   - OS種別、プラットフォーム、アーキテクチャ、総メモリ量
   - OS種別、プラットフォーム、アーキテクチャ、総メモリ量
+  - 起動時に設定
 - **アプリケーション固定情報**: `src/features/opentelemetry/server/custom-resource-attributes/application-resource-attributes.ts`
 - **アプリケーション固定情報**: `src/features/opentelemetry/server/custom-resource-attributes/application-resource-attributes.ts`
   - サービス・デプロイメントタイプ、添付ファイルタイプ、インストール情報
   - サービス・デプロイメントタイプ、添付ファイルタイプ、インストール情報
+  - データベース初期化後に設定
 
 
-#### 2. Info Metrics
+#### 2. Config Metrics
 - **実装場所**: `src/features/opentelemetry/server/custom-metrics/application-metrics.ts`
 - **実装場所**: `src/features/opentelemetry/server/custom-metrics/application-metrics.ts`
-- **メトリクス**: `growi.info` (値は常に1、情報はラベルに格納)
+- **メトリクス**: `growi.configs` (値は常に1、情報はラベルに格納)
 - **収集情報**: サービスインスタンスID、サイトURL、Wiki種別、外部認証タイプ
 - **収集情報**: サービスインスタンスID、サイトURL、Wiki種別、外部認証タイプ
 
 
 #### 3. Custom Metrics
 #### 3. Custom Metrics
@@ -21,36 +23,40 @@
   - `growi.users.total` - 総ユーザー数
   - `growi.users.total` - 総ユーザー数
   - `growi.users.active` - アクティブユーザー数
   - `growi.users.active` - アクティブユーザー数
 
 
-### 📋 次のステップ
+#### 4. 統合作業
+- **node-sdk-configuration.ts**: OS情報のResource Attributes統合済み
+- **node-sdk.ts**: データベース初期化後のアプリケーション情報設定統合済み
+- **メトリクス初期化**: Config MetricsとCustom Metricsの初期化統合済み
 
 
-#### Resource Attributesの統合
-1. `node-sdk-configuration.ts` でResource Attributesを統合する
-2. 既存のResource設定に新しいAttributesを追加する
+### 📋 実装済みの統合
 
 
-```typescript
-// 統合例
-import { getOsResourceAttributes, getApplicationResourceAttributes } from './custom-resource-attributes';
+#### Resource Attributesの2段階設定
 
 
+**1段階目 (起動時)**: `generateNodeSDKConfiguration`
+```typescript
+// OS情報のみでResourceを作成
 const osAttributes = getOsResourceAttributes();
 const osAttributes = getOsResourceAttributes();
-const appAttributes = await getApplicationResourceAttributes();
-
 resource = resourceFromAttributes({
 resource = resourceFromAttributes({
   [ATTR_SERVICE_NAME]: 'growi',
   [ATTR_SERVICE_NAME]: 'growi',
   [ATTR_SERVICE_VERSION]: version,
   [ATTR_SERVICE_VERSION]: version,
   ...osAttributes,
   ...osAttributes,
-  ...appAttributes,
 });
 });
 ```
 ```
 
 
-#### メトリクス収集の統合
-1. 既存のメトリクス初期化処理にユーザー数メトリクスを追加する
-
+**2段階目 (DB初期化後)**: `setupAdditionalResourceAttributes`
 ```typescript
 ```typescript
-// 統合例
-import { addApplicationMetrics } from './custom-metrics/application-metrics';
-import { addUserCountsMetrics } from './custom-metrics/user-counts-metrics';
+// アプリケーション情報とサービスインスタンスIDを追加
+const appAttributes = await getApplicationResourceAttributes();
+if (serviceInstanceId != null) {
+  appAttributes[ATTR_SERVICE_INSTANCE_ID] = serviceInstanceId;
+}
+const updatedResource = await generateAdditionalResourceAttributes(appAttributes);
+setResource(sdkInstance, updatedResource);
+```
 
 
-// メトリクス初期化時に両方を呼び出す
+#### メトリクス収集の統合
+```typescript
+// generateNodeSDKConfiguration内で初期化
 addApplicationMetrics();
 addApplicationMetrics();
 addUserCountsMetrics();
 addUserCountsMetrics();
 ```
 ```
@@ -64,7 +70,7 @@ src/features/opentelemetry/server/
 │   ├── os-resource-attributes.ts          # OS情報
 │   ├── os-resource-attributes.ts          # OS情報
 │   └── application-resource-attributes.ts # アプリケーション情報
 │   └── application-resource-attributes.ts # アプリケーション情報
 ├── custom-metrics/
 ├── custom-metrics/
-│   ├── application-metrics.ts             # Info Metrics (更新済み)
+│   ├── application-metrics.ts             # Config Metrics (更新済み)
 │   └── user-counts-metrics.ts             # ユーザー数メトリクス (新規)
 │   └── user-counts-metrics.ts             # ユーザー数メトリクス (新規)
 └── docs/
 └── docs/
     ├── custom-metrics-architecture.md     # アーキテクチャ文書
     ├── custom-metrics-architecture.md     # アーキテクチャ文書
@@ -73,7 +79,9 @@ src/features/opentelemetry/server/
 
 
 ## 設計のポイント
 ## 設計のポイント
 
 
-1. **循環依存の回避**: 動的importを使用してgrowiInfoServiceを読み込み
-2. **エラーハンドリング**: 各メトリクス収集でtry-catchを実装
-3. **型安全性**: Optional chainingを使用してundefinedを適切に処理
-4. **ログ出力**: デバッグ用のログを各段階で出力
+1. **2段階Resource設定**: データベース依存の情報は初期化後に設定して循環依存を回避
+2. **循環依存の回避**: 動的importを使用してgrowiInfoServiceを読み込み
+3. **エラーハンドリング**: 各メトリクス収集でtry-catchを実装
+4. **型安全性**: Optional chainingを使用してundefinedを適切に処理
+5. **ログ出力**: デバッグ用のログを各段階で出力
+6. **起動時間の最適化**: データベース接続を待たずにOpenTelemetryの基本機能を開始

+ 7 - 8
apps/app/src/features/opentelemetry/server/custom-metrics/application-metrics.ts

@@ -7,17 +7,17 @@ const loggerDiag = diag.createComponentLogger({ namespace: 'growi:custom-metrics
 
 
 
 
 export function addApplicationMetrics(): void {
 export function addApplicationMetrics(): void {
-  logger.info('Starting application info metrics collection');
+  logger.info('Starting application config metrics collection');
 
 
   const meter = metrics.getMeter('growi-application-metrics', '1.0.0');
   const meter = metrics.getMeter('growi-application-metrics', '1.0.0');
 
 
-  // Info metrics: GROWI instance information (Prometheus info pattern)
-  const growiInfoGauge = meter.createObservableGauge('growi.info', {
+  // Config metrics: GROWI instance information (Prometheus info pattern)
+  const growiInfoGauge = meter.createObservableGauge('growi.configs', {
     description: 'GROWI instance information (always 1)',
     description: 'GROWI instance information (always 1)',
     unit: '1',
     unit: '1',
   });
   });
 
 
-  // Info metrics collection callback
+  // Config metrics collection callback
   meter.addBatchObservableCallback(
   meter.addBatchObservableCallback(
     async(result) => {
     async(result) => {
       try {
       try {
@@ -26,21 +26,20 @@ export function addApplicationMetrics(): void {
 
 
         const growiInfo = await growiInfoService.getGrowiInfo(true);
         const growiInfo = await growiInfoService.getGrowiInfo(true);
 
 
-        // Info metrics always have value 1, with information stored in labels
+        // Config metrics always have value 1, with information stored in labels
         result.observe(growiInfoGauge, 1, {
         result.observe(growiInfoGauge, 1, {
           // Dynamic information that can change through configuration
           // Dynamic information that can change through configuration
-          service_instance_id: growiInfo.serviceInstanceId || '',
           site_url: growiInfo.appSiteUrl,
           site_url: growiInfo.appSiteUrl,
           wiki_type: growiInfo.wikiType,
           wiki_type: growiInfo.wikiType,
           external_auth_types: growiInfo.additionalInfo?.activeExternalAccountTypes?.join(',') || '',
           external_auth_types: growiInfo.additionalInfo?.activeExternalAccountTypes?.join(',') || '',
         });
         });
       }
       }
       catch (error) {
       catch (error) {
-        loggerDiag.error('Failed to collect application info metrics', { error });
+        loggerDiag.error('Failed to collect application config metrics', { error });
       }
       }
     },
     },
     [growiInfoGauge],
     [growiInfoGauge],
   );
   );
 
 
-  logger.info('Application info metrics collection started successfully');
+  logger.info('Application config metrics collection started successfully');
 }
 }