Class: Shipeasy::SDK::Telemetry

Inherits:
Object
  • Object
show all
Defined in:
lib/shipeasy/sdk/telemetry.rb

Overview

Per-evaluation usage telemetry. Fires one fire-and-forget HTTP beacon per evaluation so usage is counted by Cloudflare’s native per-path analytics. Mirrors the contract in the TypeScript reference SDK and experiment-platform/15-usage-metering.md. The path carries sha256(api_key) – never the raw key – plus side/env, then feature/resource. A long-lived Ruby process emits reliably; the 2s dedup window bounds volume under loops.

Constant Summary collapse

DEFAULT_TELEMETRY_URL =
"https://t.shipeasy.ai"

Instance Method Summary collapse

Constructor Details

#initialize(endpoint:, sdk_key:, side: "server", env: "prod", disabled: false, dedupe_ms: 2000) ⇒ Telemetry

Returns a new instance of Telemetry.



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/shipeasy/sdk/telemetry.rb', line 18

def initialize(endpoint:, sdk_key:, side: "server", env: "prod", disabled: false, dedupe_ms: 2000)
  endpoint = (endpoint || "").chomp("/")
  @disabled  = disabled || sdk_key.nil? || sdk_key.empty? || endpoint.empty?
  @dedupe_ms = dedupe_ms
  @last      = {}
  @mutex     = Mutex.new
  unless @disabled
    key_hash = Digest::SHA256.hexdigest(sdk_key)
    @prefix = "#{endpoint}/t/#{key_hash}/#{side}/#{enc(env)}"
  end
end

Instance Method Details

#emit(feature, resource) ⇒ Object

Best-effort usage beacon for one evaluation. Never blocks the caller (the thread owns the request) and never raises into evaluation.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/shipeasy/sdk/telemetry.rb', line 32

def emit(feature, resource)
  return if @disabled

  if @dedupe_ms > 0
    dedupe_key = "#{feature}/#{resource}"
    now = Process.clock_gettime(Process::CLOCK_MONOTONIC) * 1000.0
    duplicate = @mutex.synchronize do
      last = @last[dedupe_key]
      if last && (now - last) < @dedupe_ms
        true
      else
        @last[dedupe_key] = now
        false
      end
    end
    return if duplicate
  end

  dispatch("#{@prefix}/#{feature}/#{enc(resource)}")
end