Google Analytics 4 のイベントをサーバー側から送信する方法を調べてみた

## はじめに

Google Analytics 4 のページビューやイベントを仕込む際は、クライアント側(View)に仕込むのが多いとは思いますが、サーバー側からイベントを送る必要が出てきたため、その方法についてまとめています。

※「Ruby on Rails」の環境で調査していたので、言語はRubyにて試しています。


## プロパティおよびデータストリームを準備する

こちらに関しましては、細かく説明してしまうと長くなってしまうので、公式のドキュメントへの参照のみとします。
(検索で色々とわかりやすい記事が出てくると思います)

- プロパティ設定
    - https://support.google.com/analytics/answer/9304153?hl=ja&ref_topic=9303319
        - データストリームに関しては、今回はウェブで進めていきます。

## 測定IDを確認する

先ほど作成したデータストリームから測定IDが確認できるので、そちらを保存しておきます。

- テータストリーム画面から作成した項目を押下します
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/29c33cfe-ca26-d081-4d86-c6cb595f2b32.png">

- 測定IDをコピーして、保存しておきます
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/2875c44a-0a8c-33c3-686d-0f48d49b4c16.png">

クライアント側にイベントを仕込む場合は、この測定IDだけで問題ないのですが、サーバー側からイベントを作成する場合には、後述するAPI シークレットの値が必要となります。


## Measurement Protocol について

HTTP リクエストを通して Google アナリティクス サーバーに直接イベントを送信には、[Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/ga4?hl=ja) を使用する必要があります。

送信には、`URLパラメータ` と `JSON 本文` が必要になります。

-  URLパラメータ
    -  [必須] api_secret
        -  **後述作成します。**
    -  [必須] measurement_id
        -  データストリームの測定ID

- JSON 本文
    -  [必須] client_id
        - クライアントの一意の識別子
    -  [省略可] user_id
        - ユーザーの一意の識別子
        - こちらを設定することで、クライアント側とサーバー側でユーザーの紐付けなどが可能
    - [必須] events
        - イベント項目の配列

## Measurement Protocol API シークレットの作成

測定IDをコピーしたウェブストリームの詳細画面から各種操作を行います。

- Measurement Protocol API secret の項目を押下します
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/8dc872de-c46b-6f9e-482d-37c76c0a9ae4.png">

- 作成ボタンを押下し、APIシークレットを発行します
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/19944178-1716-3603-0093-33b381b8a1d2.png">


## 実際に送信処理を作ってみます。

`測定ID`と`APIシークレット` の下準備が出来たので、あとは送信処理を作ります。
今回は、[Faraday](https://lostisland.github.io/faraday/usage/)というライブラリを使用して、下記のサンプルクラスを作成しました。

```ruby
class GoogleAnalytics4
  class << self
    TIMEOUT = 5

    def send_event(user_id:, event_name:, params:)

      faraday_connection = ::Faraday::Connection.new(
        request: {
          open_timeout: TIMEOUT,
          timeout: TIMEOUT,
        },
        ) do |connection|
        connection.request :json
        connection.response :logger, logger
        connection.adapter :net_http
      end

      measurement_id = "G-12345678" # 測定ID
      api_secret = "xxxxxxxxxx" # APIシークレット

      faraday_connection.post(
        "https://www.google-analytics.com/mp/collect?measurement_id=#{measurement_id}&api_secret=#{api_secret}",
        {
          client_id: '12345678',
          user_id: user_id,
          events: [
            {
              name: event_name,
              params: params.merge(engagement_time_msec: 100, session_id: 123), # リアルタイムの項目に反映させるため
            }
          ]
        }
      )
    rescue StandardError => e
      logger.error(e)
    end

    private

    def logger
      Rails.logger
    end
  end
end
```

- Controller 等で呼び出していただければ、無事に送信されると思います。
```ruby
::GoogleAnalytics4.send_event(
  user: 1000001,
  event_name: 'test_event',
  params: {
    param1: 1234,
  },
)
```

※Google Analytics のレポート画面のリアルタイムの項目で確認する場合には、`engagement_time_msec:` ・ `session_id` のパラメーターが必要となりますので、テストの際には設定する事をおすすめします。
(無くてもレポートには反映されますが、時間がかかります)


## 最後に
Google Analytics 4 の Measurement Protocol を試している人(参考記事)が少なく、調査に時間がかかりましたが、簡単な実装でサーバー側からイベントが送信できることがわかりました！
少しでも参考になれば幸いです。