defmodule Plausible.OpenTelemetry do @moduledoc false alias OpenTelemetry.Tracer def current_trace_id do case Tracer.current_span_ctx() do :undefined -> nil span_ctx -> span_ctx |> OpenTelemetry.Span.trace_id() |> Integer.to_string(16) |> String.downcase() end end def add_site_attributes(site) do case site do %Plausible.Site{} = site -> Tracer.set_attributes([ {"plausible.site.id", site.id}, {"plausible.site.domain", site.domain}, {"plausible.site.team_id", site.team_id} ]) id when is_integer(id) -> Tracer.set_attributes([{"plausible.site.id", id}]) _any -> :ignore end end def add_user_attributes(user) do case user do %Plausible.Auth.User{} = user -> Tracer.set_attributes([ {"plausible.user.id", user.id}, {"plausible.user.name", user.name}, {"plausible.user.email", user.email} ]) id when is_integer(id) -> Tracer.set_attributes([{"plausible.user.id", id}]) _any -> :ignore end end # https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service def resource_attributes(runtime_metadata) do [ {"service.name", "analytics"}, {"service.namespace", "plausible"}, {"service.instance.app_host", runtime_metadata[:app_host]}, {"service.instance.id", runtime_metadata[:host]}, {"service.version", runtime_metadata[:version]} ] end end