監査ログサービス
12のマイクロサービスから発行されるプラットフォーム全体の監査証跡
概要
プラットフォーム上のすべての管理系書き込みは監査イベントを発行する。イベント契約とそれが依存する gRPC メタデータを設計し、共有パブリッシャーを書き直し、差分ユーティリティを作成し、コンシューマー側のサービスとその検索 API を構築した。
主な技術ポイント
オペレーター、IP、リクエストパス、モジュール/アクション、トレース ID、変更前後のスナップショットを運ぶ Kafka イベント契約
共有パブリッシャーは現在12のマイクロサービスから呼び出されている。JSON 差分ユーティリティは変更されたフィールドのみを読みやすいラベル付きで保存
コンシューマーが並列 gRPC 呼び出しで、各イベントにオペレーターと対象の詳細情報を付加
テナント単位の検索 API。プラットフォーム管理者の操作はテナントから見えないようにする
pprof で本番環境のメモリリークを発見:値コピーされた RPC クライアントがメッセージごとに新しい gRPC 接続を開いていた
コア実装
プラットフォーム契約としての監査
全サービスが同じ方法で使うトピック、メッセージスキーマ、gRPC メタデータキー。これにより、監査イベントは常に「誰が、どこから、どのトレースのもとで、何をしたか」を示せる。
Why: 監査証跡は全チームが一貫して記録して初めて役に立つ。共有の契約とパブリッシャーによって、それがデフォルトになる。
Result: 12サービスから発行。
メモリリーク調査
負荷下でメモリが増え続けていた。pprof を公開してヒーププロファイルを読み、RPC クライアントのラッパーが値渡しされていたため、遅延生成された接続がキャッシュされていないことを突き止めた。修正はポインタレシーバーへの変更、クライアントの事前初期化、ホットパスからの大きなスナップショットフィールドの除去。
Why: 一時的な定期 GC は症状を隠していただけで、原因を見つけたのはプロファイリングだった。