Class: Shipeasy::SDK::Telemetry
- Inherits:
-
Object
- Object
- Shipeasy::SDK::Telemetry
- 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
-
#emit(feature, resource) ⇒ Object
Best-effort usage beacon for one evaluation.
-
#initialize(endpoint:, sdk_key:, side: "server", env: "prod", disabled: false, dedupe_ms: 2000) ⇒ Telemetry
constructor
A new instance of Telemetry.
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 |