Page MenuHomePhorge

No OneTemporary

Size
4 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/tesla/middleware/telemetry.ex b/lib/tesla/middleware/telemetry.ex
index f217c34..e439e41 100644
--- a/lib/tesla/middleware/telemetry.ex
+++ b/lib/tesla/middleware/telemetry.ex
@@ -1,111 +1,113 @@
if Code.ensure_loaded?(:telemetry) do
defmodule Tesla.Middleware.Telemetry do
@moduledoc """
Emits events using the `:telemetry` library to expose instrumentation.
## Example usage
```
defmodule MyClient do
use Tesla
plug Tesla.Middleware.Telemetry
end
:telemetry.attach("my-tesla-telemetry", [:tesla, :request, :stop], fn event, measurements, meta, config ->
# Do something with the event
end)
```
## Telemetry Events
* `[:tesla, :request, :start]` - emitted at the beginning of the request.
* Measurement: `%{time: System.monotonic_time}`
* Metadata: `%{env: Tesla.Env.t()}`
* `[:tesla, :request, :stop]` - emitted at the end of the request.
* Measurement: `%{duration: native_time}`
* Metadata: `%{env: Tesla.Env.t()} | %{env: Tesla.Env.t, error: term}`
* `[:tesla, :request, :fail]` - emitted when there is an error.
* Measurement: `%{value: 1}`
* Metadata: `%{env: Tesla.Env.t(), kind: Exception.kind | nil, reason: term, stacktrace: Exception.stacktrace}`
## Legacy Telemetry Events
* `[:tesla, :request]` - This event is emitted for backwards compatibility only and should be considered deprecated.
This event can be disabled by setting `config :tesla, Tesla.Middleware.Telemetry, disable_legacy_event: true` in your config. Be sure to run `mix deps.compile --force tesla` after changing this setting to ensure the change is picked up.
Please check the [telemetry](https://hexdocs.pm/telemetry/) for the further usage.
"""
@disable_legacy_event Application.get_env(:tesla, Tesla.Middleware.Telemetry,
disable_legacy_event: false
)[:disable_legacy_event]
@behaviour Tesla.Middleware
@impl Tesla.Middleware
def call(env, next, _opts) do
start_time = System.monotonic_time()
emit_start(start_time, %{env: env})
try do
Tesla.run(env, next)
catch
kind, reason ->
stacktrace = System.stacktrace()
- metadata = %{env: env, kind: kind, reason: reason, stacktrace: stacktrace}
- emit_fail(metadata)
+ emit_fail(%{env: env, kind: kind, reason: reason, stacktrace: stacktrace})
:erlang.raise(kind, reason, stacktrace)
else
{:ok, env} = result ->
- emit_stop(start_time, %{env: env})
- emit_legacy_event(start_time, result)
+ duration = System.monotonic_time() - start_time
+
+ emit_stop(duration, %{env: env})
+ emit_legacy_event(duration, result)
result
{:error, reason} = result ->
- emit_stop(start_time, %{env: env, error: reason})
- emit_legacy_event(start_time, result)
+ duration = System.monotonic_time() - start_time
+
+ emit_stop(duration, %{env: env, error: reason})
+ emit_legacy_event(duration, result)
result
end
end
- defp emit_start(start_time, metadata) do
- :telemetry.execute([:tesla, :request, :start], %{time: start_time}, metadata)
+ defp emit_start(time, metadata) do
+ :telemetry.execute([:tesla, :request, :start], %{time: time}, metadata)
end
- defp emit_stop(start_time, metadata) do
- duration = System.monotonic_time() - start_time
-
+ defp emit_stop(duration, metadata) do
:telemetry.execute(
[:tesla, :request, :stop],
%{duration: duration},
metadata
)
end
- defp emit_legacy_event(start_time, result) do
+ defp emit_legacy_event(duration, result) do
if !@disable_legacy_event do
- duration = System.monotonic_time() - start_time
-
- # retained for backwards compatibility - remove in 2.0
- :telemetry.execute([:tesla, :request], %{request_time: duration}, %{result: result})
+ :telemetry.execute(
+ [:tesla, :request],
+ %{request_time: duration},
+ %{result: result}
+ )
end
end
defp emit_fail(metadata) do
:telemetry.execute(
[:tesla, :request, :fail],
%{value: 1},
metadata
)
end
end
end

File Metadata

Mime Type
text/x-diff
Expires
Mon, Nov 25, 7:50 PM (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40040
Default Alt Text
(4 KB)

Event Timeline