Humaans.Telemetry (Humaans v0.5.1)

Copy Markdown View Source

Telemetry integration for the Humaans client.

This library emits :telemetry events for every API request made through Humaans.Client. Attach handlers to observe latency, status codes, and errors without modifying library code.

Events

[:humaans, :request, :start]

Emitted immediately before the HTTP request is sent.

Measurements:

KeyTypeDescription
:system_timeintegerCurrent system time (native time units)
:monotonic_timeintegerMonotonic time at request start

Metadata:

KeyTypeDescription
:methodatomHTTP method (:get, :post, etc.)
:pathstringAPI path (e.g. "/people")
:urlstringFull request URL

[:humaans, :request, :stop]

Emitted after a response is received (including error responses).

Measurements:

KeyTypeDescription
:durationintegerRequest duration in native time units
:monotonic_timeintegerMonotonic time at request completion

Metadata:

KeyTypeDescription
:methodatomHTTP method
:pathstringAPI path
:urlstringFull request URL
:statusintegerHTTP status code (present on successful HTTP)
:errorbooleantrue if the HTTP client returned an error

[:humaans, :request, :exception]

Emitted if an exception is raised during the request.

Measurements:

KeyTypeDescription
:durationintegerTime elapsed before exception (native time units)
:monotonic_timeintegerMonotonic time at exception

Metadata:

KeyTypeDescription
:methodatomHTTP method
:pathstringAPI path
:urlstringFull request URL
:kindatomException kind (:error, :exit, etc.)
:reasonanyThe exception or reason
:stacktracelistException stacktrace

Usage

Attach handlers using :telemetry.attach/4 or :telemetry.attach_many/4:

# Log all completed API requests
:telemetry.attach(
  "humaans-logger",
  [:humaans, :request, :stop],
  fn _event, measurements, metadata, _config ->
    duration_ms =
      System.convert_time_unit(measurements.duration, :native, :millisecond)

    Logger.info(
      "Humaans API #{metadata.method} #{metadata.path} " <>
        "-> #{metadata[:status]} (#{duration_ms}ms)"
    )
  end,
  nil
)

# Track API errors in your monitoring system
:telemetry.attach(
  "humaans-error-tracker",
  [:humaans, :request, :stop],
  fn _event, _measurements, %{error: true} = metadata, _config ->
    MyMonitoring.increment("humaans.api.error",
      tags: ["path:#{metadata.path}"]
    )
  end,
  nil
)