100 lines
2.4 KiB
Elixir
100 lines
2.4 KiB
Elixir
defmodule OpentelemetryDataloader do
|
|
@moduledoc """
|
|
Module for automatic instrumentation of Dataloader.
|
|
|
|
It works by listening to `[:dataloader, :source, :run/:batch, :start/:stop]` telemetry events.
|
|
"""
|
|
|
|
@tracer_id __MODULE__
|
|
|
|
@run_start [:dataloader, :source, :run, :start]
|
|
@run_stop [:dataloader, :source, :run, :stop]
|
|
|
|
@batch_start [:dataloader, :source, :batch, :run, :start]
|
|
@batch_stop [:dataloader, :source, :batch, :run, :stop]
|
|
|
|
@doc """
|
|
Initializes and configures the telemetry handlers.
|
|
"""
|
|
def setup(_opts \\ []) do
|
|
config = %{
|
|
tracer_id: @tracer_id
|
|
}
|
|
|
|
:telemetry.attach_many(
|
|
{__MODULE__, :run},
|
|
[
|
|
@run_start,
|
|
@run_stop
|
|
],
|
|
&__MODULE__.handle_event/4,
|
|
config
|
|
)
|
|
|
|
:telemetry.attach_many(
|
|
{__MODULE__, :batch},
|
|
[
|
|
@batch_start,
|
|
@batch_stop
|
|
],
|
|
&__MODULE__.handle_event/4,
|
|
config
|
|
)
|
|
end
|
|
|
|
def handle_event(event, measurements, metadata, config)
|
|
|
|
def handle_event(@run_start, _measurements, metadata, config) do
|
|
parent_ctx = OpentelemetryProcessPropagator.fetch_parent_ctx(4, :"$callers")
|
|
|
|
if parent_ctx != :undefined do
|
|
OpenTelemetry.Ctx.attach(parent_ctx)
|
|
end
|
|
|
|
OpentelemetryTelemetry.start_telemetry_span(
|
|
config.tracer_id,
|
|
"dataloader.run",
|
|
metadata,
|
|
%{
|
|
kind: :client
|
|
}
|
|
)
|
|
end
|
|
|
|
def handle_event(@run_stop, _measurements, metadata, config) do
|
|
OpentelemetryTelemetry.set_current_telemetry_span(config.tracer_id, metadata)
|
|
|
|
OpentelemetryTelemetry.end_telemetry_span(config.tracer_id, metadata)
|
|
end
|
|
|
|
def handle_event(@batch_start, _measurements, metadata, config) do
|
|
parent_ctx = OpentelemetryProcessPropagator.fetch_parent_ctx(4, :"$callers")
|
|
|
|
if parent_ctx != :undefined do
|
|
OpenTelemetry.Ctx.attach(parent_ctx)
|
|
end
|
|
|
|
{batch_name, _batch_args} = metadata.batch
|
|
|
|
attributes = %{
|
|
"dataloader.batch_key" => inspect(batch_name)
|
|
}
|
|
|
|
OpentelemetryTelemetry.start_telemetry_span(
|
|
config.tracer_id,
|
|
"dataloader.batch",
|
|
metadata,
|
|
%{
|
|
kind: :client,
|
|
attributes: attributes
|
|
}
|
|
)
|
|
end
|
|
|
|
def handle_event(@batch_stop, _measurements, metadata, config) do
|
|
OpentelemetryTelemetry.set_current_telemetry_span(config.tracer_id, metadata)
|
|
|
|
OpentelemetryTelemetry.end_telemetry_span(config.tracer_id, metadata)
|
|
end
|
|
end
|