|
#put in lib directory |
|
|
|
def mixpanel_client |
|
@mixpanel_client ||= Mixpanel::Client.new(MixPanelConfiguration.config) |
|
end |
|
|
|
# Public: Returns number of occurrences of the event |
|
# of the date range of [T-num_days, T] where T is today's date |
|
# options - The Hash options used to query MixPanel: |
|
# :event_name - The String name of the event. |
|
# :type - The String analysis type you would like to get data for. Available options are "general", "unique", "average" (optional). |
|
# :num_days - The Integer number of days to look back (optional) |
|
# :property - The String if filtering by property, name of the property. Must provide :value (optional) |
|
# :value - The String if filtering by property, value of the property. Must provide :property (optional) |
|
# https://mixpanel.com/docs/api-documentation/data-export-api |
|
# |
|
# Examples |
|
# |
|
# mixpanel_event_number(event_name: "Created Gist", property: "level", value: "private") |
|
# mixpanel_event_number(event_name: "Created Gist") |
|
# mixpanel_event_number(event_name: "Created Gist", type: "unique") |
|
|
|
def mixpanel_event_number(options) |
|
property, value = options[:property], options[:value] |
|
|
|
unless (property && value) || (!property && !value) |
|
raise "Must specify both 'property' and 'value' or none" |
|
end |
|
|
|
if [TrueClass, FalseClass].include?(value.class) |
|
raise "As of Aug 7, 2013, MixPanel has a bug with querying boolean values\nPlease use number_for_event_using_export until that's fixed" |
|
end |
|
|
|
event_name = options[:event_name] |
|
|
|
unless event_name |
|
raise "Event name must be provided" |
|
end |
|
|
|
type = options[:type] || "general" #MixPanel API uses the term 'general' to mean 'total' |
|
|
|
unless ["unique", "general", "average"].include? type |
|
raise "Invalid type #{type}" |
|
end |
|
|
|
num_days = options[:num_days] ||30 |
|
interval = options[:interval] || "day" |
|
|
|
mixpanel_options = { |
|
type: type, |
|
unit: interval, |
|
interval: num_days, |
|
limit: 5, |
|
} |
|
|
|
if property && value |
|
mixpanel_endpoint = "events/properties/" |
|
mixpanel_options.merge!({ |
|
event: event_name, |
|
values: [value], |
|
name: property |
|
}) |
|
else |
|
mixpanel_endpoint = "events/" |
|
mixpanel_options.merge!({ |
|
event: [event_name] |
|
}) |
|
end |
|
|
|
data = mixpanel_client.request(mixpanel_endpoint, mixpanel_options) |
|
|
|
total_for_events(data) |
|
end |
|
|
|
def total_for_events(data) |
|
counts_per_property = data["data"]["values"].collect do |c, values| |
|
values.collect { |k, v| v }.inject(:+) |
|
end |
|
|
|
#now, calculate grand total |
|
counts_per_property.inject(:+) |
|
end |
|
|
|
########################### |
|
|
|
def number_for_event_using_export(event_name, property, value, num_days = 30) |
|
|
|
# TODO: |
|
# MixPanel doesn't understand boolean values for properties |
|
# There is an open ticket, but for now, there is a work around to use export API |
|
# https://mixpanel.com/docs/api-documentation/exporting-raw-data-you-inserted-into-mixpanel |
|
to_date = Date.today |
|
from_date = to_date - num_days |
|
|
|
data = mixpanel_client.request('export', { |
|
event: [event_name], |
|
from_date: from_date.to_s, |
|
to_date: to_date.to_s, |
|
where: "boolean(properties[\"#{property}\"]) == #{value} ", |
|
}) |
|
|
|
data.count |
|
end |