Skip to content

Commit 304647c

Browse files
Update plan to use SqlKind enum and leverage existing startTime tracking
Co-authored-by: HidekiSugimoto189 <[email protected]>
1 parent e3ebcb4 commit 304647c

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

MICROMETER_INTEGRATION_PLAN.md

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,41 +47,63 @@ UroboroSQLは既存のイベントサブスクライバー機構を持ってい
4747
1. **実行回数カウンター** (`Counter`)
4848
- メトリクス名: `uroborosql.sql.executions`
4949
- タグ:
50-
- `sql.type`: SQL種別(query, update, batch, procedure
50+
- `sql.kind`: SQL種別(`ExecutionContext.getSqlKind()`で取得した`SqlKind` Enumの値を使用
5151
- `sql.name`: SQL名(オプション、設定可能)
5252
- `sql.id`: SQL-ID(オプション、設定可能)
5353

5454
2. **実行時間タイマー** (`Timer`)
5555
- メトリクス名: `uroborosql.sql.duration`
5656
- タグ:
57-
- `sql.type`: SQL種別(query, update, batch, procedure
57+
- `sql.kind`: SQL種別(`ExecutionContext.getSqlKind()`で取得した`SqlKind` Enumの値を使用
5858
- `sql.name`: SQL名(オプション、設定可能)
5959
- `sql.id`: SQL-ID(オプション、設定可能)
6060
- 統計情報: 合計時間、カウント、最大値、パーセンタイル等
6161

6262
3. **処理行数ゲージ/サマリー** (`DistributionSummary`)
6363
- メトリクス名: `uroborosql.sql.rows`
6464
- タグ:
65-
- `sql.type`: SQL種別(query, update, batch, procedure
65+
- `sql.kind`: SQL種別(`ExecutionContext.getSqlKind()`で取得した`SqlKind` Enumの値を使用
6666
- `sql.name`: SQL名(オプション、設定可能)
6767
- `sql.id`: SQL-ID(オプション、設定可能)
6868

6969
#### 2.3 実行時間の計測
7070

71-
既存のイベント機構では実行時間が直接提供されていないため、以下の対応が必要:
71+
**採用方針**: ExecutionContextに実行時間を記録(オプション1を採用)
7272

73-
**オプション1: ExecutionContextに実行時間を記録**
74-
- `ExecutionContext`に開始時刻と終了時刻を記録するフィールドを追加
75-
- SQL実行前後で時刻を記録
76-
- イベントから`ExecutionContext`経由で実行時間を取得
73+
既存の`SqlAgentImpl`の実装では、パフォーマンスログ用に実行時間の計測を行っている:
7774

78-
**オプション2: イベントに実行時間を追加**
79-
- `AfterSqlQueryEvent`等のイベントクラスに実行時間フィールドを追加
80-
- イベント発行時に実行時間を設定
75+
```java
76+
// SqlAgentImpl#query等のメソッド内
77+
var startTime = PERFORMANCE_LOG.isDebugEnabled() ? Instant.now(getSqlConfig().getClock()) : null;
78+
try {
79+
// SQL実行
80+
} finally {
81+
debugWith(PERFORMANCE_LOG)
82+
.addArgument(() -> formatElapsedTime(startTime, Instant.now(getSqlConfig().getClock())))
83+
.log();
84+
}
85+
```
86+
87+
この既存の仕組みを活用し、以下の対応を実施:
88+
89+
1. **ExecutionContextの拡張**
90+
- `ExecutionContext``startTime`フィールドと`endTime`フィールドを追加
91+
- `getExecutionTime()`メソッドを追加(Duration型を返す)
92+
- `setStartTime(Instant)`/`setEndTime(Instant)`メソッドを追加
93+
94+
2. **SqlAgentImpl内での時刻設定**
95+
- 既存のパフォーマンスログ用の`startTime`取得時に、同時に`ExecutionContext`にも設定
96+
- finally句での処理時に`endTime`を設定
97+
- この変更により、`PERFORMANCE_LOG.isDebugEnabled()`に関係なく、常に実行時間を取得可能にする
98+
99+
3. **Micrometer統合での利用**
100+
- イベントリスナー内で`ExecutionContext.getExecutionTime()`を呼び出して実行時間を取得
101+
- Timerメトリクスに記録
81102

82-
**推奨**: オプション1(既存のExecutionContextを拡張)
83-
- 既存のイベントクラスの変更を最小限に抑える
103+
**メリット**:
104+
- 既存のイベントクラスの変更が不要
84105
- ExecutionContextは既に各種情報を保持する設計になっている
106+
- 既存のパフォーマンスログの仕組みを活用できる
85107

86108
#### 2.4 設定オプション
87109

@@ -148,16 +170,16 @@ try (SqlAgent agent = config.agent()) {
148170
}
149171

150172
// メトリクスの確認
151-
// registry.counter("uroborosql.sql.executions", "sql.type", "query").count()
152-
// registry.timer("uroborosql.sql.duration", "sql.type", "query").mean()
173+
// registry.counter("uroborosql.sql.executions", "sql.kind", "SELECT").count()
174+
// registry.timer("uroborosql.sql.duration", "sql.kind", "SELECT").mean()
153175
```
154176

155177
## セキュリティ・パフォーマンス考慮事項
156178

157179
### カーディナリティ問題
158180
- デフォルトではSQL名やSQL-IDをタグに含めない
159181
- これらのタグは動的に増加する可能性があるため、明示的に有効化が必要
160-
- 代わりに`sql.type`という限定的なタグのみをデフォルトで使用
182+
- 代わりに`sql.kind``SqlKind` Enumの値)という限定的なタグのみをデフォルトで使用
161183

162184
### パフォーマンス影響
163185
- メトリクス記録は非同期または軽量な操作のみ

0 commit comments

Comments
 (0)