@@ -47,41 +47,63 @@ UroboroSQLは既存のイベントサブスクライバー機構を持ってい
47471 . ** 実行回数カウンター** (` 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
54542 . ** 実行時間タイマー** (` 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
62623 . ** 処理行数ゲージ/サマリー** (` 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