Class: FastlaneCore::AnalyticsIngesterClient

Inherits:
Object
  • Object
show all
Defined in:
fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb

Instance Method Summary collapse

Constructor Details

#initialize(ga_tracking) ⇒ AnalyticsIngesterClient

Returns a new instance of AnalyticsIngesterClient.



13
14
15
# File 'fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb', line 13

def initialize(ga_tracking)
  @ga_tracking = ga_tracking
end

Instance Method Details

#post_event(event) ⇒ Object



17
18
19
20
21
22
23
24
25
26
# File 'fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb', line 17

def post_event(event)
  # If our users want to opt out of usage metrics, don't post the events.
  # Learn more at https://docs.fastlane.tools/#metrics
  if Helper.test? || FastlaneCore::Env.truthy?("FASTLANE_OPT_OUT_USAGE")
    return nil
  end
  return Thread.new do
    send_request(event)
  end
end

#post_request(event) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb', line 35

def post_request(event)
  connection = Faraday.new(GA_URL) do |conn|
    # This request runs while fastlane is shutting down,
    # so keep the timeouts short to not delay the user
    conn.options.open_timeout = 5
    conn.options.timeout = 5
    conn.adapter(Faraday.default_adapter)
  end
  connection.headers[:user_agent] = 'fastlane/' + Fastlane::VERSION

  # GA4 protocol, event parameters are sent as `ep.<name>` query parameters
  params = {
    v: "2",                        # Protocol version (GA4)
    tid: @ga_tracking,             # GA4 measurement ID
    cid: event[:client_id],        # Client ID
    sid: event[:session_id],       # Session ID
    _ss: "1",                      # Session start
    seg: "1",                      # Session engaged
    # Engagement time in ms, required for events to count towards active users
    _et: (event[:engagement_time_msec] || 100).to_s,
    en: event[:name].to_s          # Event name
  }
  (event[:params] || {}).each do |key, value|
    params["ep.#{key}"] = value.to_s
  end

  connection.post("/g/collect") do |request|
    request.params = params
  end
end

#send_request(event, retries: 2) ⇒ Object



28
29
30
31
32
33
# File 'fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb', line 28

def send_request(event, retries: 2)
  post_request(event)
rescue
  retries -= 1
  retry if retries >= 0
end