Tink emits :telemetry events for HTTP requests, rate limiting, and cache operations. Attach handlers to integrate with your observability stack (StatsD, Prometheus, Datadog, etc.).

HTTP Request Events

EventMeasurementsMetadata
[:tink, :request, :start]%{system_time: t}%{method:, url:, attempt:}
[:tink, :request, :stop]%{duration: ms}%{method:, url:, status:, attempt:}
[:tink, :request, :exception]%{duration: ms}%{method:, url:, kind:, reason:}

Rate Limit Events

EventMeasurementsMetadata
[:tink, :rate_limit, :checked]%{}%{key:, limit:, period_ms:}
[:tink, :rate_limit, :exceeded]%{}%{key:, limit:, period_ms:}

Cache Events

EventMeasurementsMetadata
[:tink, :cache, :hit]%{}%{key:}
[:tink, :cache, :miss]%{}%{key:}
[:tink, :cache, :put]%{}%{key:, ttl_ms:}

Attaching a Handler

defmodule MyApp.TinkTelemetry do
  require Logger

  def attach do
    :telemetry.attach_many(
      "my-app-tink-ex",
      [
        [:tink, :request, :stop],
        [:tink, :request, :exception],
        [:tink, :rate_limit, :exceeded],
        [:tink, :cache, :miss]
      ],
      &handle_event/4,
      nil
    )
  end

  def handle_event([:tink, :request, :stop], %{duration: duration}, meta, _cfg) do
    Logger.info("[Tink] #{meta.method} #{meta.url}#{meta.status} in #{duration}ms")
    MyApp.Metrics.histogram("tink.request.duration", duration,
      tags: ["status:#{meta.status}"])
  end

  def handle_event([:tink, :request, :exception], %{duration: duration}, meta, _cfg) do
    Logger.error("[Tink] Request exception: #{meta.kind} #{inspect(meta.reason)}")
    MyApp.Metrics.increment("tink.request.exception")
  end

  def handle_event([:tink, :rate_limit, :exceeded], _measurements, %{key: key}, _cfg) do
    Logger.warning("[Tink] Rate limit exceeded for #{key}")
    MyApp.Metrics.increment("tink.rate_limit.exceeded", tags: ["key:#{key}"])
  end

  def handle_event([:tink, :cache, :miss], _measurements, %{key: key}, _cfg) do
    MyApp.Metrics.increment("tink.cache.miss")
  end
end

Attach at application start:

# In your Application.start/2
MyApp.TinkTelemetry.attach()

Prometheus via TelemetryMetrics

# In your Telemetry supervisor
def metrics do
  [
    Telemetry.Metrics.distribution("tink.request.duration",
      event_name: [:tink, :request, :stop],
      measurement:  :duration,
      tags:         [:status]
    ),
    Telemetry.Metrics.counter("tink.rate_limit.exceeded.count",
      event_name: [:tink, :rate_limit, :exceeded]
    ),
    Telemetry.Metrics.counter("tink.cache.miss.count",
      event_name: [:tink, :cache, :miss]
    )
  ]
end