Skip to content

Commit bb4b16f

Browse files
committed
abstraction over pubsub to include OpenTelemetry context
1 parent 8f26d96 commit bb4b16f

3 files changed

Lines changed: 33 additions & 19 deletions

File tree

lib/acme/orders.ex

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ defmodule Acme.Orders do
33
The Orders context.
44
"""
55

6-
require OpenTelemetry.Tracer
7-
86
import Ecto.Query, warn: false
97
alias Acme.Repo
108

@@ -70,15 +68,12 @@ defmodule Acme.Orders do
7068
7169
"""
7270
def update_order(%Order{} = order, attrs) do
73-
OpenTelemetry.Tracer.with_span "orders:update_order" do
74-
order_changeset = Order.changeset(order, attrs)
71+
order_changeset = Order.changeset(order, attrs)
7572

76-
with {:ok, order} <- Repo.update(order_changeset) do
77-
ctx = OpenTelemetry.Tracer.current_span_ctx()
78-
Phoenix.PubSub.broadcast(Acme.PubSub, "orders:#{order.id}", {:order_updated, order, ctx})
73+
with {:ok, order} <- Repo.update(order_changeset) do
74+
Acme.PubSub.broadcast("orders:#{order.id}", {:order_updated, order})
7975

80-
{:ok, order}
81-
end
76+
{:ok, order}
8277
end
8378
end
8479

lib/acme/pub_sub.ex

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule Acme.PubSub do
2+
defmodule Event do
3+
defstruct [:message, :span_ctx]
4+
end
5+
6+
defmacro __using__(_opts) do
7+
quote do
8+
def handle_info(%Acme.PubSub.Event{} = event, socket) do
9+
OpenTelemetry.Tracer.set_current_span(event.span_ctx)
10+
handle_info(event.message, socket)
11+
end
12+
end
13+
end
14+
15+
def broadcast(topic, message) do
16+
require OpenTelemetry.Tracer
17+
18+
OpenTelemetry.Tracer.with_span "acme.pubsub:broadcast" do
19+
event = %Event{message: message, span_ctx: OpenTelemetry.Tracer.current_span_ctx()}
20+
Phoenix.PubSub.broadcast(__MODULE__, topic, event)
21+
end
22+
end
23+
end

lib/acme_web/live/order_live/show.ex

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
defmodule AcmeWeb.OrderLive.Show do
22
use AcmeWeb, :live_view
3+
use Acme.PubSub
34

45
require OpenTelemetry.Tracer
56

@@ -21,17 +22,12 @@ defmodule AcmeWeb.OrderLive.Show do
2122
end
2223

2324
@impl true
24-
def handle_info({:order_updated, order, ctx}, socket) do
25-
OpenTelemetry.Tracer.set_current_span(ctx)
25+
def handle_info({:order_updated, order}, socket) do
26+
# expensive operation like DB call, service call.. etc.
27+
# for the example we'll do a function call that results in DB query
28+
order = Orders.get_order!(order.id)
2629

27-
opts = %{attributes: %{user: inspect(self())}}
28-
29-
OpenTelemetry.Tracer.with_span "order_live.show:order_updated", opts do
30-
# expensive operation like DB call, service call.. etc.
31-
Process.sleep(70)
32-
33-
{:noreply, assign(socket, :order, order)}
34-
end
30+
{:noreply, assign(socket, :order, order)}
3531
end
3632

3733
defp page_title(:show), do: "Show Order"

0 commit comments

Comments
 (0)