ユーザー定義計測
whatap-go-instの基本計測で処理されない場合、ユーザー定義計測ルールを追加できます。
5つの計測方法
| 方法 | 説明 | 主な使用事例 |
|---|---|---|
| add | 新しいファイル/関数を作成 | ヘルパー関数を追加 |
| inject | 関数内部にコードを挿入 | すべての関数にtraceを追加 |
| replace | 関数呼び出しを置換 | sql.Open → whatapsql.Open |
| hook | 関数呼び出しの前後にコード | レガシーコード計測 |
| transform | パターン変換 (高度) | 複雑な変換 |
実行順序: add → inject → replace → hook → transform
基本設定構造
# .whatap/config.yaml
custom:
add: [] # 新しいファイル/関数を作成
inject: [] # 関数定義内部にコードを挿入
replace: [] # 関数呼び出しを置換
hook: [] # 関数呼び出しの前後にコードを挿入
transform: [] # コードパターン -> テンプレート変換
いつ使用しますか?
次のような場合、ユーザー定義計測が必要です。
- 社内共通ライブラリにモニタリングを追加
- サポートしていないフレームワークを計測
- レガシーコードに直接修正せずにモニタリングを追加
- 特定の関数のみを選択的に計測
add - 新しいファイル/関数を作成
ヘルパー関数やラッパーファイルを作成します。後でreplaceで使用できます。
基本使用
custom:
add:
- package: "myapp/helper" # 対象パッケージ
file: "whatap_helper.go" # 作成するファイル
content: |
package helper
import "github.com/whatap/go-api/trace"
func WrapQuery(ctx context.Context, query string) string {
ctx = trace.StartMethod(ctx, "WrapQuery")
defer trace.EndMethod(ctx, nil)
return query
}
変換結果
// 生成されたファイル: myapp/helper/whatap_helper.go
package helper
import "github.com/whatap/go-api/trace"
func WrapQuery(ctx context.Context, query string) string {
ctx = trace.StartMethod(ctx, "WrapQuery")
defer trace.EndMethod(ctx, nil)
return query
}
その他の例
テンプレートファイルの使用
custom:
add:
- package: "myapp/db"
file: "whatap_db.go"
content_file: "templates/db-helper.go.tmpl" # 外部テンプレートファイル
既存ファイルに関数を追加
custom:
add:
- package: "myapp/service"
file: "service.go" # 既存ファイル
append: true # ファイル末尾に追加
content: |
func traceMethod(ctx context.Context, name string) (context.Context, func()) {
return trace.StartMethod(ctx, name), func() { trace.EndMethod(ctx, nil) }
}
add + replace組み合わせ
custom:
# Step 1: ヘルパー関数を作成
add:
- package: "myapp/db"
file: "whatap_wrapper.go"
content: |
package db
func TracedQuery(ctx context.Context, sql string) (*Result, error) {
ctx = trace.StartMethod(ctx, "db.query")
defer trace.EndMethod(ctx, nil)
return OriginalQuery(sql)
}
# Step 2: 元の関数呼び出しをヘルパーに置換
replace:
- package: "myapp/db"
function: "Query"
with: "TracedQuery"
inject - 関数定義内部にコードを挿入
関数本文の開始/終了にコードを挿入します。
制限事項
- 現在のモジュールのユーザー定義関数のみを対象に指定できます
- Go標準ライブラリや外部パッケージの関数は対象に指定できません
基本使用
custom:
inject:
- package: "myapp/service" # Go importパス
function: "*" # 関数名 (* = 全体)
start: |
ctx = trace.StartMethod(ctx)
defer trace.EndMethod(ctx, err)
imports:
- "github.com/whatap/go-api/trace"
変換結果
// 変更前
func ProcessOrder(ctx context.Context) error {
// ビジネスロジック
}
// 変更後
func ProcessOrder(ctx context.Context) error {
ctx = trace.StartMethod(ctx) // <- start挿入
defer trace.EndMethod(ctx, err) // <- start挿入
// ビジネスロジック
}
deferパターン推奨
関数の途中にreturnがある場合、endの代わりにstartでdeferパターンを使用してください。
その他の例
特定の関数のみを対象
custom:
inject:
- package: "myapp/service"
function: "ProcessOrder" # 特定の関数名
start: |
ctx = trace.StartMethod(ctx, "ProcessOrder")
defer trace.EndMethod(ctx, nil)
imports:
- "github.com/whatap/go-api/trace"