くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Firestoreの読み込み回数をCloud Loggingから計測する

Firestoreの読み込み回数が予想よりも多かったので、
どこでそんなに呼ばれてるのかな?といろいろ調べてみたときの備忘録。

呼び出し箇所は、以下の3種類

  • Webブラウザのクライアントライブラリ
  • サーバのFirebase Admin SDK
  • Cloud Functions内のAdmin SDK

Firebaseの監査ログ

Firebase自体にデータの読み取り/書き込みの監査ログを記録する機能があるため、それを活用。

監査ログを有効にする

データアクセス監査ログはデフォルトではOFFのため、有効にする必要がある。

監査ログの画面に移動したら、

  • Firestoreなどでフィルタ
  • Firestore/Datastore APIを選択
  • 「データ読み取り」にチェックを入れる
  • 「保存」ボタンをクリック

でOK。有効にしたらロギングされるようになる。

監査ログを参照する

監査ログはCloud Loggingのページから確認できる。

各ログの中身は、こんな感じ。

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "firebase-adminsdk-xxxx@<project-id>.iam.gserviceaccount.com",
    },
    "serviceName": "firestore.googleapis.com",
    "methodName": "google.firestore.v1.Firestore.RunQuery",
    "resourceName": "projects/<PROJECT_ID>/databases/(default)",
    "numResponseItems": "1",
    "request": {
      "structuredQuery": { <クエリの条件> },
      "parent": "projects/<PROJECT_ID>/databases/(default)/documents/<COLLECTION_PATH>"
    },
  },
  "timestamp": "2022-05-24T07:10:23.198531Z",
}

authenticationInfo.principalEmail

リクエスト元を特定する情報。

上記の例の場合は、Admin SDKからの呼び出し。
Firebaseコンソールの「プロジェクト設定 > サービスアカウント」に記載されているものと同じ。

それぞれ以下の通り

  • Webブラウザのクライアントライブラリ
    • service-<PROJECT-NUMBER>@firebase-rules.iam.gserviceaccount.com
    • authenticationInfo.thirdPartyPrincipalにログインユーザの情報がある
  • サーバのFirebase Admin SDK
    • firebase-adminsdk-xxxx@<project-id>.iam.gserviceaccount.com
    • Firebaseコンソールの「プロジェクト設定 > サービスアカウント」のアカウント
  • Cloud Functions内のAdmin SDK
    • <PROJECT-ID>@appspot.gserviceaccount.com
    • authenticationInfo.serviceAccountDelegationInfo内に
      service-<PROJECT-NUMBER>@gcf-admin-robot.iam.gserviceaccount.com

各サービスアカウントについては、以下にまとまっている。
Firebase サービス アカウントの概要  |  Firebase Documentation

methodName

どんな種類の操作をしたかの情報。
読み込みだと、以下の操作など。

  • GetDocument
  • ListDocuments
  • BatchGetDocuments
  • RunQuery
  • PartitionQuery
  • ListCollectionIds
  • Listen

すべての操作については、以下のドキュメントに。
監査対象のオペレーション | Firestore の監査ロギング情報

request

どんな操作をしたかの具体的な情報。
こんな感じの内容になっている。

{
  "protoPayload": {
    "request": {
      "structuredQuery": {
        "from": [
          { "collectionId": "XXXXX" }
        ],
        "limit": 1,
        "orderBy": [
          {
            "direction": "DESCENDING",
            "field": { "fieldPath": "YYYYYY" }
          }
        ]
      },
      "@type": "type.googleapis.com/google.firestore.v1.RunQueryRequest",
      "parent": "projects/<PROJECT_ID>/databases/(default)/documents/<COLLECTION_PATH>"
    },
    "metadata": {
      "@type": "type.googleapis.com/google.cloud.audit.DatastoreServiceData",
      "processingDuration": "0.004008944s"
    }
  }
}

あとは、CSVJSONでダウンロードしたり、BigQueryに転送したりして、
リクエスト元や操作の種類ごとで計測すればOK。

ただ、データ監査ログは課金対象なので、容量には注意が必要。
Cloud Logging | 料金

以上!! ざっくりした計測であれば、いい感じ(´ω`)

参考にしたサイトさま