Skip to main content

examples/basic_usage.exs

defmodule ExampleApp.Metrics do
  use OtelBridge.Spec

  @impl OtelBridge.Spec
  def metrics(meta) do
    [
      summary("example.http.duration",
        event_name: [:example_app, :http, :stop],
        measurement: :duration,
        unit: {:native, :millisecond},
        tags: [:route, :status_code],
        tag_values: fn metadata ->
          metadata
          |> Map.put(:route, metadata[:route] || "unknown")
          |> Map.put(:status_code, metadata[:status_code] || 500)
          |> Map.put(:service, Keyword.fetch!(meta, :service))
        end
      ),
      counter("example.http.requests",
        event_name: [:example_app, :http, :stop],
        tags: [:route, :status_code],
        tag_values: fn metadata ->
          metadata
          |> Map.put(:route, metadata[:route] || "unknown")
          |> Map.put(:status_code, metadata[:status_code] || 500)
        end
      ),
      last_value("example.queue.depth",
        event_name: [:example_app, :queue, :stats],
        measurement: :depth,
        tags: [:queue],
        reporter_options: [
          otel: [
            last_value: [
              ttl_ms: 300_000,
              max_series: 100,
              on_overflow: :drop_new
            ]
          ]
        ]
      )
    ]
  end
end

defmodule ExampleApp.Measurements do
  def dispatch_queue_depth do
    :telemetry.execute(
      [:example_app, :queue, :stats],
      %{depth: 42},
      %{queue: "default"}
    )
  end
end

children = [
  {OtelBridge,
   specs: [ExampleApp.Metrics],
   measurements: [{ExampleApp.Measurements, :dispatch_queue_depth, []}],
   meta: [service: "example_app"],
   poller: [period: 5_000]}
]