Skip to content

Commit 220ca3f

Browse files
authored
Add spans for phoenix controller view rendering (#531)
1 parent 013a9e6 commit 220ca3f

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

examples/apps/phx_example/test/phx_example_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,11 @@ defmodule PhxExampleTest do
9090
tx_span = TestHelper.find_event(span_events, "/Phoenix/PhxExampleWeb.HomeLive/index")
9191
process_span = TestHelper.find_event(span_events, "Transaction Root Process")
9292
mount_span = TestHelper.find_event(span_events, "PhxExampleWeb.HomeLive:index.mount")
93+
render_span = TestHelper.find_event(span_events, "PhxExampleWeb.Layouts.show")
9394

9495
assert process_span[:parentId] == tx_span[:guid]
9596
assert mount_span[:"live_view.params"]
97+
assert render_span[:"phoenix.view"]
9698
end
9799

98100
@endpoint PhxExampleWeb.Endpoint

lib/new_relic/telemetry/phoenix.ex

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule NewRelic.Telemetry.Phoenix do
22
use GenServer
33

4+
alias NewRelic.Tracer
5+
46
@moduledoc """
57
Provides `Phoenix` instrumentation via `telemetry`.
68
@@ -20,10 +22,14 @@ defmodule NewRelic.Telemetry.Phoenix do
2022
end
2123

2224
@phoenix_router_start [:phoenix, :router_dispatch, :start]
25+
@phoenix_controller_render_start [:phoenix, :controller, :render, :start]
26+
@phoenix_controller_render_stop [:phoenix, :controller, :render, :stop]
2327
@phoenix_error [:phoenix, :error_rendered]
2428

2529
@phoenix_events [
2630
@phoenix_router_start,
31+
@phoenix_controller_render_start,
32+
@phoenix_controller_render_stop,
2733
@phoenix_error
2834
]
2935

@@ -83,6 +89,33 @@ defmodule NewRelic.Telemetry.Phoenix do
8389
|> NewRelic.add_attributes()
8490
end
8591

92+
def handle_event(
93+
@phoenix_controller_render_start,
94+
meas,
95+
%{view: view, template: template, format: format} = meta,
96+
_config
97+
) do
98+
Tracer.Direct.start_span(
99+
meta.telemetry_span_context,
100+
"#{inspect(view)}.show",
101+
system_time: meas.system_time,
102+
attributes: [
103+
"phoenix.view": inspect(view),
104+
"phoenix.template": template,
105+
"phoenix.format": format
106+
]
107+
)
108+
end
109+
110+
def handle_event(
111+
@phoenix_controller_render_stop,
112+
meas,
113+
meta,
114+
_config
115+
) do
116+
Tracer.Direct.stop_span(meta.telemetry_span_context, duration: meas.duration)
117+
end
118+
86119
def handle_event(_event, _measurements, _meta, _config) do
87120
:ignore
88121
end

0 commit comments

Comments
 (0)