💡

Ruby on Railsでmixpanelを動かしてみる

2022/10/12に公開

これまで、mixpanelはクライアント側でしか設置したことがなかったのですが、今回バックエンド側で設定が必要だったので、Ruby on Railsでmixpanelを動かしてみました。

基本はmixpanel-rubyの公式ドキュメントを読みながら設置していきます。

導入する

gem install mixpanel-ruby

ドキュメントのサンプルコードによるとイベントのトラッキングは以下で行えます。

require 'mixpanel-ruby'

tracker = Mixpanel::Tracker.new(PROJECT_TOKEN)
tracker.track(user_id, 'Plan Upgraded', {
    'Old Plan' => 'Business',
    'New Plan' => 'Premium'
})

要は、tracker.track(distinct_id, event_name, properties)の形でイベントと送ることができます。(propertiesはなくてもOK)
ただ、distinct_idが設定できる場合はこのドキュメントの通り書くだけで良いのですが、私のケースだとユーザーがログインしていない場合にも発火する可能性があり、その際にdistinct_idをどのように設定すれば良いのか少し悩みました。

distinct_idがない場合に関して

そもそも、これまでjsで書く場合はmixpanel-browserを使って設置していましたが、distinct_idに関しては今までつけたことがなかったので、調べてみました。

https://help.mixpanel.com/hc/en-us/articles/115004509406-Distinct-IDs- を読むと、以下のように書いてありました。

Mixpanel’s distinct_id is a unique identifier that is connected to every event as an event property.

A distinct_id is assigned to every user that is tracked, and it connects all of the events performed by an individual user.  

Mixpanel’s client-side tracking libraries automatically assign a distinct_id to a user when they first visit a website or an application that has Mixpanel installed. Distinct_id should not contain any special characters such as forward slashes, as it will break the URL.

Distinct_ids can and often should be sent in server-side implementations as well.

要は、distinct_idはイベントに結び付けられる識別子であり、個々のユーザーによって実行されるすべてのイベントを結びつけるらしい。
クライアントサイドでは自動で付与されるらしいが、サーバーサイドでは自前で実装する必要があるそうな。

そこで再度ドキュメントに戻ると、distinct_idに関してはoptionalと書いてあったので、ユーザーが不明の場合はnilを入れれば良いのではないかと思い、以下のように書きました。

tracker.track(user&.id, 'SearchFinishedWithoutHit', {
  'query' => query
})

userが存在する場合はuserのidをdistinct_idに設定して、ない場合はnilになる。
これでuserがない場合で発火させました。

無事userがない場合も発火されてました🎉
もちろんuserがある場合も問題ありませんでした。

最後に

書いたコードの全体像を最後に紹介しておきます。

今回は検索機能のためのコントローラーがあり、検索結果がない場合にSearchFinishedWithoutHitというイベントを渡したかったので以下のように書きました。

search_controller
require 'mixpanel-ruby'

class Api::V1::SearchController < Api::V1::ApiControllerBase
  def index
    search_word = params[:q]

    # 検索に関する諸々の処理
    if result.blank?
      tracker = Mixpanel::Tracker.new(ENV['MIXPANEL_PROJECT_TOKEN'])
      tracker.track(user&.id, 'SearchFinishedWithoutHit', {
        'query' => search_word,
	'words' => search_word.split
      })
      render status: :not_found, json: { errors: 'Not found' }
      return
    end
    render status: :ok, json: { data: result }
  end
end

初めてRailsでmixpanelを導入してみましたが、公式ドキュメントが丁寧だったので特に詰まることなくできました。今後もmixpanelを有効活用してどんどんデータ分析して行きます💪

Discussion