Packages
absinthe
1.7.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase/telemetry.ex
defmodule Absinthe.Phase.Telemetry do
@moduledoc """
Gather and report telemetry about an operation.
"""
@operation_start [:absinthe, :execute, :operation, :start]
@operation_stop [:absinthe, :execute, :operation, :stop]
@subscription_start [:absinthe, :subscription, :publish, :start]
@subscription_stop [:absinthe, :subscription, :publish, :stop]
use Absinthe.Phase
def run(blueprint, options) do
event = Keyword.fetch!(options, :event)
do_run(blueprint, event, options)
end
defp do_run(blueprint, [:execute, :operation, :start], options) do
id = :erlang.unique_integer()
system_time = System.system_time()
start_time_mono = System.monotonic_time()
:telemetry.execute(
@operation_start,
%{system_time: system_time},
%{id: id, telemetry_span_context: id, blueprint: blueprint, options: options}
)
{:ok,
%{
blueprint
| source: blueprint.input,
telemetry: %{id: id, start_time_mono: start_time_mono}
}}
end
defp do_run(blueprint, [:subscription, :publish, :start], options) do
id = :erlang.unique_integer()
system_time = System.system_time()
start_time_mono = System.monotonic_time()
:telemetry.execute(
@subscription_start,
%{system_time: system_time},
%{id: id, telemetry_span_context: id, blueprint: blueprint, options: options}
)
{:ok,
%{
blueprint
| telemetry: %{id: id, start_time_mono: start_time_mono}
}}
end
defp do_run(blueprint, [:subscription, :publish, :stop], options) do
end_time_mono = System.monotonic_time()
with %{id: id, start_time_mono: start_time_mono} <- blueprint.telemetry do
:telemetry.execute(
@subscription_stop,
%{duration: end_time_mono - start_time_mono},
%{id: id, telemetry_span_context: id, blueprint: blueprint, options: options}
)
end
{:ok, blueprint}
end
defp do_run(blueprint, [:execute, :operation, :stop], options) do
end_time_mono = System.monotonic_time()
with %{id: id, start_time_mono: start_time_mono} <- blueprint.telemetry do
:telemetry.execute(
@operation_stop,
%{duration: end_time_mono - start_time_mono},
%{id: id, telemetry_span_context: id, blueprint: blueprint, options: options}
)
end
{:ok, blueprint}
end
end