lib/stripe/telemetry.ex

defmodule Stripe.Telemetry do
  @moduledoc """
  Telemetry integration.

  Unless specified, all times are in `:native` units.

  Stripe executes the following events:

  ### Request Start
  `[:stripe, :request, :start]` - Executed before an api call is made

  #### Measurements
    * `:system_time` - The system time.

  #### Metadata
    * `:attempt` - The number of attempts for this request
    * `:method` - The http method used
    * `:url` - The url used

  ### Request Stop
  `[:stripe, :request, :stop]` - Executed after an api call ended.

  #### Measurements
    * `:duration` - Time taken from the request start event.

  #### Metadata
    * `:attempt` - The number of attempts for this request
    * `:error` - The Stripe error if any
    * `:status` - The http status code
    * `:request_id` - Request ID returned by Stripe
    * `:result` -> `:ok` for succesful requests, `:error` otherwise
    * `:method` - The http method used
    * `:url` - The url used

  ### Request Exception
  `[:stripe, :request, :exception]` - Executed when an exception occurs while executing
    an api call.
  #### Measurements
    * `:duration` - The time it took since the start before raising the exception.

  #### Metadata

    * `:attempt` - The number of attempts for this request
    * `:method` - The http method used
    * `:url` - The url used
    * `:kind` - The type of exception.
    * `:reason` - Error description or error data.
    * `:stacktrace` - The stacktrace.



  """
  @doc false
  # Used to easily create :start, :stop, :exception events.
  def span(event, start_metadata, fun) do
    :telemetry.span(
      [:stripe, event],
      start_metadata,
      fun
    )
  end
end