
Gemini Enterprise のユーザー毎の利用状況を計測してみた
こんにちは、すらぼです。
Gemini Enterprise の活用をする中で、ユーザーごとの使用量を計測したくなりました。
というのも、Gemini Enterprise のクォータは、ライセンスプール全体で使用料を共有する仕組みになっています。このとき、突出した使用量のユーザーがいる場合に分析を行えるよう、ユーザーごとに使用量を計測する仕組みを作ってみようと思います。
今回やること
「ユーザーごとのツール毎のリクエスト回数」を Observability Analytics を使用して計測していきます。
補足: リクエスト回数を取得する理由
今回は「トークン」ではなく、「回数」を計測しています。これには2つの理由があるため、先に説明しておきます。
まず、Gemini Enterprise のクォータは、各ツールの「使用回数」に対して設定されています。チャットのやり取りをした回数、画像生成・動画生成の回数、などがそれぞれ回数ベースでカウントされていきます。
そのため、トークンではなく回数が計測できれば十分というのが1つ目の理由です。
次に、そもそも Gemini Enterprise ではトークンを取得する手段がありません。これが2つ目の理由です。
取得できない理由としては、前述のように使用回数ベースでのクォータであるという仕様によるものと考えられます。
以上2つの理由より、今回は「使用回数」について計測していきます。
やったこと
では、実際にログから使用回数を集計していきます。
準備1: _Default ログバケットのアップグレード
今回は Observability Analytics を利用するため、アップグレードされたログバケットが必要になります。今回は、 _Default バケットのアップグレードを行います。
「ログストレージ」の画面から、「オブザーバビリティ分析が使用可能」のカラムから「Upgrade」を選択します。
アップグレードが完了すると、以下の画像のような表示になります。

アップグレード済みの画像
準備2: ログの有効化設定
次に、ログを有効化します。アプリケーションの「構成 > オブザーバビリティ」から、以下の2つの設定を有効化します。
- OpenTelemetry のトレースおよびログ計測の有効化
- プロンプト入力と回答出力のロギングの有効化

ログ出力の有効化
なお、今回のケースではプロンプトログもオンにする必要があります。プロンプトログがオフの状態だと userIamPrincipal がメールアドレスではなく <elided> として出力され、ユーザー単位の集計ができません。
ログの確認
有効化すると、ログが出力されるようになります。
実際に Gemini Enterprise の画面からチャットを送信し、ログが出力されていることを確認します。
まず、ログを有効化した後、適当なチャットを送ってみます。

次に、ログエクスプローラから以下のクエリを実行します。
resource.type="consumed_api" AND log_id("discoveryengine.googleapis.com/gemini_enterprise_user_activity") AND resource.labels.method="StreamAssist"
見つかったログを展開すると、先ほど行ったチャット画面でのやり取りがログとして出力されていることが確認できます。

Gemini Enterprise で行ったチャットのログ
また、同時にメールアドレスとして userIamPrincipal も記録されています。
この情報から、チャットの利用状況をカウントします。
Observability Analytics でカウント
ログが確認できたら、Observability Analytics を使ってクエリとダッシュボードの作成をしていきます。
以下のクエリを Observability Analitics の SQL クエリに入力します。(PROJECT_ID は自分のプロジェクトのものに修正してください)
SELECT
CAST(JSON_VALUE(activity.json_payload.userIamPrincipal) AS STRING) AS user_principal,
COALESCE(
CAST(JSON_VALUE(choice.json_payload.content.parts[0].function_call.args.agent_name) AS STRING),
'chat'
) AS request_type,
COUNT(*) AS request_count
FROM
`PROJECT_ID.global._Default._AllLogs` AS activity
LEFT JOIN
`PROJECT_ID.global._Default._AllLogs` AS choice
ON activity.trace = choice.trace
AND choice.log_id = "discoveryengine.googleapis.com/gen_ai.choice"
AND JSON_VALUE(choice.json_payload.content.parts[0].function_call.name) = "transfer_to_agent"
WHERE
activity.log_id = "discoveryengine.googleapis.com/gemini_enterprise_user_activity"
AND JSON_VALUE(activity.resource.labels.method) = "StreamAssist"
GROUP BY
user_principal, request_type
ORDER BY
user_principal, request_count DESC
クエリを実行すると、以下のようにユーザーごとに利用したツールや回数が確認できます。

ユーザーごとの利用状況
ダッシュボードに追加
カウントができたら、クエリ結果をダッシュボードに追加します。
「ダッシュボードに保存」をクリックし、以下のようにダッシュボードを作成します。

ダッシュボードを作成し、テーブルを保存
完了すると、以下のようにダッシュボードが作成され、テーブルが確認できるようになります。
試しに画像生成や動画生成を行ってみましたが、きちんと利用状況としてカウントできるようになっています。

これで、ユーザー毎に利用状況を確認できるようになりました。
終わりに
Observability Analytics を使って、Gemini Enterprise の利用状況をダッシュボードで表示させてみました。シンプルなダッシュボードですが、当初の「突出した利用者の把握」という側面では簡単に把握できるようになったかと思います。
当初はログベースのメトリクスを使用して検証していましたが、ログベースのメトリクスではユーザーとのやり取りが全て StreamAssist として出力されてしまい、通常のチャットが画像・動画生成など他のリクエストと区別がつかないという課題がありました。Trace ID を結合することで解決できることがわかり、ログに対するクエリを行う手段として Observability Analytics を採用しました。
Observability Analytics 自体も初めて触れる機会でしたが、ログに対して BigQuery 無しで SQL を使った分析ができるという点で非常に便利でした。
以上、この記事がどなたかの助けになれば幸いです。以上、すらぼでした。
参考リンク









