Skip to content

Commit 02a5f39

Browse files
solnicclaude
andauthored
feat(tests): support async tests with Telemetry Processor (#1055)
* feat(tests): introduce a common wait_until helper * feat(test): make TelemetryProcessor handling work with async tests - Use `NimbleOwnership` to simplify ownership handling - Handle per-test telemetry processors correctly Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 01846b9 commit 02a5f39

10 files changed

Lines changed: 766 additions & 191 deletions

File tree

lib/sentry/application.ex

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ defmodule Sentry.Application do
3636
if Config.test_mode?() do
3737
if Code.ensure_loaded?(NimbleOwnership) do
3838
[
39-
Sentry.Test.Registry,
40-
{NimbleOwnership, name: Sentry.Test.OwnershipServer}
39+
{NimbleOwnership, name: Sentry.Test.OwnershipServer},
40+
Sentry.Test.Registry
4141
]
4242
else
4343
[Sentry.Test.Registry]
@@ -53,15 +53,15 @@ defmodule Sentry.Application do
5353
[]
5454
end
5555

56-
telemetry_processor =
56+
telemetry_processor_opts =
5757
[
58-
{Sentry.TelemetryProcessor,
59-
[
60-
buffer_capacities: Config.telemetry_buffer_capacities(),
61-
scheduler_weights: Config.telemetry_scheduler_weights(),
62-
transport_capacity: Config.transport_capacity()
63-
]}
58+
buffer_capacities: Config.telemetry_buffer_capacities(),
59+
scheduler_weights: Config.telemetry_scheduler_weights(),
60+
transport_capacity: Config.transport_capacity()
6461
]
62+
|> maybe_put_test_processor_resolver()
63+
64+
telemetry_processor = [{Sentry.TelemetryProcessor, telemetry_processor_opts}]
6565

6666
children =
6767
maybe_test_registry ++
@@ -162,4 +162,12 @@ defmodule Sentry.Application do
162162
else
163163
defp maybe_rate_limiter, do: [Sentry.Transport.RateLimiter]
164164
end
165+
166+
defp maybe_put_test_processor_resolver(opts) do
167+
if Config.test_mode?() do
168+
Keyword.put(opts, :processor_resolver, &Sentry.Test.Registry.lookup_processor_for/1)
169+
else
170+
opts
171+
end
172+
end
165173
end

lib/sentry/telemetry_processor.ex

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ defmodule Sentry.TelemetryProcessor do
5454
| {:scheduler_weights, %{Category.priority() => pos_integer()}}
5555
| {:on_envelope, (Sentry.Envelope.t() -> any())}
5656
| {:transport_capacity, pos_integer()}
57+
| {:processor_resolver, (pid() -> atom() | nil) | nil}
58+
59+
@resolver_key {__MODULE__, :resolver}
5760

5861
## Public API
5962

@@ -74,6 +77,11 @@ defmodule Sentry.TelemetryProcessor do
7477
* `:scheduler_weights` - Map of priority to weight override (optional)
7578
* `:on_envelope` - Callback function invoked when envelopes are ready to send (optional)
7679
* `:transport_capacity` - Maximum number of items the transport queue can hold (default: 1000). For log envelopes, each log event counts as one item.
80+
* `:processor_resolver` - Optional `(pid() -> atom() | nil)` function used by `add/1` to discover
81+
the per-pid processor name when no value is set in the process dictionary. The resolver is
82+
stored in `:persistent_term` and shared across all processor instances; passing the same
83+
function from every `start_link/1` call is safe and idempotent. Defaults to `nil`, in which
84+
case `add/1` falls back to the default processor name.
7785
7886
## Examples
7987
@@ -294,6 +302,11 @@ defmodule Sentry.TelemetryProcessor do
294302
on_envelope = Keyword.get(opts, :on_envelope)
295303
transport_capacity = Keyword.get(opts, :transport_capacity, 1000)
296304

305+
case Keyword.get(opts, :processor_resolver) do
306+
nil -> :ok
307+
resolver when is_function(resolver, 1) -> :persistent_term.put(@resolver_key, resolver)
308+
end
309+
297310
buffer_names =
298311
for category <- Category.all(), into: %{} do
299312
{category, buffer_name(processor_name, category)}
@@ -374,7 +387,20 @@ defmodule Sentry.TelemetryProcessor do
374387
end
375388

376389
defp processor_name do
377-
Process.get(:sentry_telemetry_processor, @default_name)
390+
case Process.get(:sentry_telemetry_processor) do
391+
name when is_atom(name) and not is_nil(name) ->
392+
name
393+
394+
_ ->
395+
resolve_processor_name() || @default_name
396+
end
397+
end
398+
399+
defp resolve_processor_name do
400+
case :persistent_term.get(@resolver_key, nil) do
401+
nil -> nil
402+
resolver when is_function(resolver, 1) -> resolver.(self())
403+
end
378404
end
379405

380406
defp maybe_add_opt(opts, _key, nil), do: opts

0 commit comments

Comments
 (0)