Ruby on Railsでmixpanelを動かしてみる
これまで、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
というイベントを渡したかったので以下のように書きました。
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