lib/opentelemetry_heroku.ex

defmodule OpentelemetryHeroku do
  @moduledoc """
  Implements an `OpenTelemetry` resource detector for Heroku.

  Exposes Heroku environment variables as an `OpenTelemetry` resource, using the
  semantic conventions defined in the `OpenTelemetry`
  [spec](https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/cloud_provider/heroku/).

  ## Usage:

  Add this module to the config:

  ```elixir
  config :opentelemetry, resource_detectors: [OpentelemetryHeroku]
  ```
  """
  require OpenTelemetry.SemanticConventions.Resource
  alias OpenTelemetry.SemanticConventions.Resource

  @behaviour :otel_resource_detector
  def get_resource(_) do
    [
      {Resource.cloud_provider(), "heroku"},
      {Resource.service_name(), System.get_env("HEROKU_APP_NAME")},
      {Resource.service_instance_id(), System.get_env("HEROKU_DYNO_ID")},
      {Resource.service_version(), System.get_env("HEROKU_RELEASE_VERSION")},
      {:"heroku.app.id", System.get_env("HEROKU_APP_ID")},
      {:"heroku.release.creation_timestamp", System.get_env("HEROKU_RELEASE_CREATED_AT")},
      {:"heroku.release.commit", System.get_env("HEROKU_SLUG_COMMIT")}
    ]
    |> :otel_resource.create()
  end
end