Skip to content

Commit 3b67a07

Browse files
committed
feat(telemetry): include producer metadata in per-message events
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
1 parent 370f180 commit 3b67a07

3 files changed

Lines changed: 105 additions & 5 deletions

File tree

lib/broadway.ex

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,8 @@ defmodule Broadway do
714714
name: atom,
715715
index: non_neg_integer,
716716
message: Broadway.Message.t,
717-
telemetry_span_context: reference
717+
telemetry_span_context: reference,
718+
producer: {atom, list}
718719
}
719720
```
720721
@@ -732,7 +733,8 @@ defmodule Broadway do
732733
name: atom,
733734
index: non_neg_integer,
734735
message: Broadway.Message.t,
735-
telemetry_span_context: reference
736+
telemetry_span_context: reference,
737+
producer: {atom, list}
736738
}
737739
```
738740
@@ -753,7 +755,8 @@ defmodule Broadway do
753755
kind: kind,
754756
reason: reason,
755757
stacktrace: stacktrace,
756-
telemetry_span_context: reference
758+
telemetry_span_context: reference,
759+
producer: {atom, list}
757760
}
758761
```
759762

lib/broadway/topology/processor_stage.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ defmodule Broadway.Topology.ProcessorStage do
164164
index: state.partition,
165165
name: state.name,
166166
message: message,
167-
context: state.context
167+
context: state.context,
168+
producer: state.producer
168169
},
169170
fn ->
170171
updated_message =
@@ -179,7 +180,8 @@ defmodule Broadway.Topology.ProcessorStage do
179180
index: state.partition,
180181
name: state.name,
181182
message: updated_message,
182-
context: state.context
183+
context: state.context,
184+
producer: state.producer
183185
}}
184186
end
185187
)

test/broadway/telemetry_test.exs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
defmodule Broadway.TelemetryTest do
2+
use ExUnit.Case
3+
4+
defmodule MessageServer do
5+
use Broadway
6+
7+
def start_link(opts) do
8+
Broadway.start_link(__MODULE__,
9+
name: opts[:name],
10+
producer: [
11+
module: {Broadway.DummyProducer, opts[:producer_options]}
12+
],
13+
processors: [
14+
default: []
15+
],
16+
context: opts[:context]
17+
)
18+
end
19+
20+
@impl true
21+
def handle_message(_, message, %{test_pid: test_pid}) do
22+
send(test_pid, {:message_handled, message})
23+
message
24+
end
25+
end
26+
27+
test "[:broadway, :processor, :message, :start] and :stop events include producer metadata" do
28+
test_pid = self()
29+
producer_options = [queue_url: "https://sqs.amazonaws.com/123456789/my-queue"]
30+
31+
:telemetry.attach_many(
32+
"test-producer-metadata",
33+
[
34+
[:broadway, :processor, :message, :start],
35+
[:broadway, :processor, :message, :stop]
36+
],
37+
fn event_name, _measurements, metadata, _config ->
38+
send(test_pid, {:telemetry_event, event_name, metadata})
39+
end,
40+
%{}
41+
)
42+
43+
{:ok, _pid} =
44+
start_supervised(
45+
{MessageServer,
46+
name: :test_broadway_producer_metadata,
47+
producer_options: producer_options,
48+
context: %{test_pid: test_pid}}
49+
)
50+
51+
ref = Broadway.test_message(:test_broadway_producer_metadata, "test_data")
52+
53+
assert_receive {:telemetry_event, [:broadway, :processor, :message, :start], metadata}
54+
assert {Broadway.DummyProducer, ^producer_options} = metadata.producer
55+
56+
assert_receive {:telemetry_event, [:broadway, :processor, :message, :stop], metadata}
57+
assert {Broadway.DummyProducer, ^producer_options} = metadata.producer
58+
59+
assert_receive {:message_handled, _message}
60+
assert_receive {:ack, ^ref, _successful, _failed}
61+
62+
:telemetry.detach("test-producer-metadata")
63+
end
64+
65+
test "producer metadata in telemetry events can be used to extract adapter options" do
66+
test_pid = self()
67+
queue_url = "https://sqs.amazonaws.com/123456789/my-special-queue"
68+
producer_options = [queue_url: queue_url, some_other_option: "value"]
69+
70+
:telemetry.attach(
71+
"test-extract-queue-name",
72+
[:broadway, :processor, :message, :start],
73+
fn _event_name, _measurements, metadata, _config ->
74+
{_module, adapter_options} = metadata.producer
75+
queue_name = adapter_options |> Keyword.fetch!(:queue_url) |> String.split("/") |> List.last()
76+
send(test_pid, {:queue_name, queue_name})
77+
end,
78+
%{}
79+
)
80+
81+
{:ok, _pid} =
82+
start_supervised(
83+
{MessageServer,
84+
name: :test_broadway_queue_extraction,
85+
producer_options: producer_options,
86+
context: %{test_pid: test_pid}}
87+
)
88+
89+
Broadway.test_message(:test_broadway_queue_extraction, "test_data")
90+
91+
assert_receive {:queue_name, "my-special-queue"}
92+
93+
:telemetry.detach("test-extract-queue-name")
94+
end
95+
end

0 commit comments

Comments
 (0)