diff --git a/examples/apps/phx_example/assets/js/app.js b/examples/apps/phx_example/assets/js/app.js
new file mode 100644
index 00000000..993628a2
--- /dev/null
+++ b/examples/apps/phx_example/assets/js/app.js
@@ -0,0 +1,13 @@
+import "phoenix_html";
+import { Socket } from "phoenix";
+import { LiveSocket } from "phoenix_live_view";
+
+let csrfToken = document
+ .querySelector("meta[name='csrf-token']")
+ .getAttribute("content");
+let liveSocket = new LiveSocket("/live", Socket, {
+ params: { _csrf_token: csrfToken },
+});
+
+liveSocket.connect();
+window.liveSocket = liveSocket;
diff --git a/examples/apps/phx_example/config/config.exs b/examples/apps/phx_example/config/config.exs
index 18abff52..d55cab55 100644
--- a/examples/apps/phx_example/config/config.exs
+++ b/examples/apps/phx_example/config/config.exs
@@ -2,8 +2,14 @@ import Config
config :phx_example, PhxExampleWeb.Endpoint,
url: [host: "localhost"],
- render_errors: [view: PhxExampleWeb.ErrorView, accepts: ~w(html json), layout: false],
+ render_errors: [formats: [html: PhxExampleWeb.ErrorHTML], layout: false],
http: [port: 4004],
- server: true
+ server: true,
+ adapter: Phoenix.Endpoint.Cowboy2Adapter,
+ pubsub_server: PhxExample.PubSub,
+ live_view: [signing_salt: "dB7qn7EQ"],
+ secret_key_base: "A+gtEDayUNx4ZyfHvUKETwRC4RjxK0FDlrLjuRhaBnr3Ll3ynfu5RlSSGe5E7zbW"
+
+config :logger, level: :warning
config :phoenix, :json_library, Jason
diff --git a/examples/apps/phx_example/lib/phx_example/application.ex b/examples/apps/phx_example/lib/phx_example/application.ex
index 6af25eca..6cb54e84 100644
--- a/examples/apps/phx_example/lib/phx_example/application.ex
+++ b/examples/apps/phx_example/lib/phx_example/application.ex
@@ -5,6 +5,7 @@ defmodule PhxExample.Application do
def start(_type, _args) do
children = [
+ {Phoenix.PubSub, name: PhxExample.PubSub},
PhxExampleWeb.Endpoint
]
diff --git a/examples/apps/phx_example/lib/phx_example_web.ex b/examples/apps/phx_example/lib/phx_example_web.ex
index 6a67e9d0..e687234b 100644
--- a/examples/apps/phx_example/lib/phx_example_web.ex
+++ b/examples/apps/phx_example/lib/phx_example_web.ex
@@ -1,30 +1,102 @@
defmodule PhxExampleWeb do
- def controller do
+ @moduledoc """
+ The entrypoint for defining your web interface, such
+ as controllers, components, channels, and so on.
+
+ This can be used in your application as:
+
+ use PhxExampleWeb, :controller
+ use PhxExampleWeb, :html
+
+ The definitions below will be executed for every controller,
+ component, etc, so keep them short and clean, focused
+ on imports, uses and aliases.
+
+ Do NOT define functions inside the quoted expressions
+ below. Instead, define additional modules and import
+ those modules here.
+ """
+
+ def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)
+
+ def router do
quote do
- use Phoenix.Controller, namespace: PhxExampleWeb
+ use Phoenix.Router, helpers: false
import Plug.Conn
- alias PhxExampleWeb.Router.Helpers, as: Routes
+ import Phoenix.Controller
+ import Phoenix.LiveView.Router
end
end
- def view do
+ def channel do
quote do
- use Phoenix.View,
- root: "lib/phx_example_web/templates",
- namespace: PhxExampleWeb
+ use Phoenix.Channel
end
end
- def router do
+ def controller do
quote do
- use Phoenix.Router
+ use Phoenix.Controller,
+ formats: [:html, :json],
+ layouts: [html: PhxExampleWeb.Layouts]
import Plug.Conn
- import Phoenix.Controller
+
+ unquote(verified_routes())
+ end
+ end
+
+ def live_view do
+ quote do
+ use Phoenix.LiveView,
+ layout: {PhxExampleWeb.Layouts, :app}
+
+ unquote(html_helpers())
+ end
+ end
+
+ def live_component do
+ quote do
+ use Phoenix.LiveComponent
+
+ unquote(html_helpers())
+ end
+ end
+
+ def html do
+ quote do
+ use Phoenix.Component
+
+ import Phoenix.Controller,
+ only: [get_csrf_token: 0, view_module: 1, view_template: 1]
+
+ unquote(html_helpers())
+ end
+ end
+
+ defp html_helpers do
+ quote do
+ import Phoenix.HTML
+
+ alias Phoenix.LiveView.JS
+
+ unquote(verified_routes())
+ end
+ end
+
+ def verified_routes do
+ quote do
+ use Phoenix.VerifiedRoutes,
+ endpoint: PhxExampleWeb.Endpoint,
+ router: PhxExampleWeb.Router,
+ statics: PhxExampleWeb.static_paths()
end
end
+ @doc """
+ When used, dispatch to the appropriate controller/view/etc.
+ """
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
diff --git a/examples/apps/phx_example/lib/phx_example_web/components/layouts.ex b/examples/apps/phx_example/lib/phx_example_web/components/layouts.ex
new file mode 100644
index 00000000..b6a620f2
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/components/layouts.ex
@@ -0,0 +1,5 @@
+defmodule PhxExampleWeb.Layouts do
+ use PhxExampleWeb, :html
+
+ embed_templates "layouts/*"
+end
diff --git a/examples/apps/phx_example/lib/phx_example_web/components/layouts/app.html.heex b/examples/apps/phx_example/lib/phx_example_web/components/layouts/app.html.heex
new file mode 100644
index 00000000..8f970082
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/components/layouts/app.html.heex
@@ -0,0 +1,5 @@
+
+
+ <%= @inner_content %>
+
+
diff --git a/examples/apps/phx_example/lib/phx_example_web/components/layouts/root.html.heex b/examples/apps/phx_example/lib/phx_example_web/components/layouts/root.html.heex
new file mode 100644
index 00000000..248a58e1
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/components/layouts/root.html.heex
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ <.live_title suffix=" · Phoenix Framework">
+ <%= assigns[:page_title] || "PhxExample" %>
+
+
+
+
+ <%= @inner_content %>
+
+
diff --git a/examples/apps/phx_example/lib/phx_example_web/controllers/error_html.ex b/examples/apps/phx_example/lib/phx_example_web/controllers/error_html.ex
new file mode 100644
index 00000000..d6a4cfba
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/controllers/error_html.ex
@@ -0,0 +1,9 @@
+defmodule PhxExampleWeb.ErrorHTML do
+ use PhxExampleWeb, :html
+
+ embed_templates "error_html/*"
+
+ def render(template, _assigns) do
+ Phoenix.Controller.status_message_from_template(template)
+ end
+end
diff --git a/examples/apps/phx_example/lib/phx_example_web/controllers/error_html/500.html.heex b/examples/apps/phx_example/lib/phx_example_web/controllers/error_html/500.html.heex
new file mode 100644
index 00000000..4c174e6f
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/controllers/error_html/500.html.heex
@@ -0,0 +1 @@
+"Oops, Internal Server Error"
diff --git a/examples/apps/phx_example/lib/phx_example_web/controllers/page_controller.ex b/examples/apps/phx_example/lib/phx_example_web/controllers/page_controller.ex
index 8de0ba78..4af96ed0 100644
--- a/examples/apps/phx_example/lib/phx_example_web/controllers/page_controller.ex
+++ b/examples/apps/phx_example/lib/phx_example_web/controllers/page_controller.ex
@@ -2,7 +2,7 @@ defmodule PhxExampleWeb.PageController do
use PhxExampleWeb, :controller
def index(conn, _params) do
- render(conn, "index.html")
+ render(conn, :index)
end
def error(_, _) do
diff --git a/examples/apps/phx_example/lib/phx_example_web/controllers/page_html.ex b/examples/apps/phx_example/lib/phx_example_web/controllers/page_html.ex
new file mode 100644
index 00000000..89ccd2cd
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/controllers/page_html.ex
@@ -0,0 +1,5 @@
+defmodule PhxExampleWeb.PageHTML do
+ use PhxExampleWeb, :html
+
+ embed_templates "page_html/*"
+end
diff --git a/examples/apps/phx_example/lib/phx_example_web/templates/page/index.html.eex b/examples/apps/phx_example/lib/phx_example_web/controllers/page_html/index.html.heex
similarity index 100%
rename from examples/apps/phx_example/lib/phx_example_web/templates/page/index.html.eex
rename to examples/apps/phx_example/lib/phx_example_web/controllers/page_html/index.html.heex
diff --git a/examples/apps/phx_example/lib/phx_example_web/endpoint.ex b/examples/apps/phx_example/lib/phx_example_web/endpoint.ex
index 9ea51c16..00dc956b 100644
--- a/examples/apps/phx_example/lib/phx_example_web/endpoint.ex
+++ b/examples/apps/phx_example/lib/phx_example_web/endpoint.ex
@@ -1,5 +1,31 @@
defmodule PhxExampleWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :phx_example
+ @session_options [
+ store: :cookie,
+ key: "_phx_example_key",
+ signing_salt: "F6n7gjjvL6I61gUB",
+ same_site: "Lax"
+ ]
+
+ socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]
+
+ plug Plug.Static,
+ at: "/",
+ from: :phx_example,
+ gzip: false,
+ only: PhxExampleWeb.static_paths()
+
+ plug Plug.RequestId
+ plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
+
+ plug Plug.Parsers,
+ parsers: [:urlencoded, :multipart, :json],
+ pass: ["*/*"],
+ json_decoder: Phoenix.json_library()
+
+ plug Plug.MethodOverride
+ plug Plug.Head
+ plug Plug.Session, @session_options
plug PhxExampleWeb.Router
end
diff --git a/examples/apps/phx_example/lib/phx_example_web/live/error_live.ex b/examples/apps/phx_example/lib/phx_example_web/live/error_live.ex
new file mode 100644
index 00000000..d0f3b2f5
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/live/error_live.ex
@@ -0,0 +1,12 @@
+defmodule PhxExampleWeb.ErrorLive do
+ use PhxExampleWeb, :live_view
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+
<%= @some_variable %>
+
+ """
+ end
+end
diff --git a/examples/apps/phx_example/lib/phx_example_web/live/home_live.ex b/examples/apps/phx_example/lib/phx_example_web/live/home_live.ex
new file mode 100644
index 00000000..ef05d880
--- /dev/null
+++ b/examples/apps/phx_example/lib/phx_example_web/live/home_live.ex
@@ -0,0 +1,13 @@
+defmodule PhxExampleWeb.HomeLive do
+ use PhxExampleWeb, :live_view
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ """
+ end
+end
diff --git a/examples/apps/phx_example/lib/phx_example_web/router.ex b/examples/apps/phx_example/lib/phx_example_web/router.ex
index 14896cdd..352d81c8 100644
--- a/examples/apps/phx_example/lib/phx_example_web/router.ex
+++ b/examples/apps/phx_example/lib/phx_example_web/router.ex
@@ -3,11 +3,19 @@ defmodule PhxExampleWeb.Router do
pipeline :browser do
plug :accepts, ["html"]
+ plug :fetch_session
+ plug :fetch_live_flash
+ plug :put_root_layout, html: {PhxExampleWeb.Layouts, :root}
+ plug :protect_from_forgery
+ plug :put_secure_browser_headers
end
scope "/phx", PhxExampleWeb do
pipe_through :browser
+ live "/home", HomeLive, :index
+ live "/live_error", ErrorLive, :index
+
get "/error", PageController, :error
get "/:foo", PageController, :index
end
diff --git a/examples/apps/phx_example/lib/phx_example_web/templates/layout/app.html.eex b/examples/apps/phx_example/lib/phx_example_web/templates/layout/app.html.eex
deleted file mode 100644
index f7309f0c..00000000
--- a/examples/apps/phx_example/lib/phx_example_web/templates/layout/app.html.eex
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- PhxExample · Phoenix Framework
-
-
-
- <%= @inner_content %>
-
-
-
diff --git a/examples/apps/phx_example/lib/phx_example_web/views/error_view.ex b/examples/apps/phx_example/lib/phx_example_web/views/error_view.ex
deleted file mode 100644
index 22bebbd2..00000000
--- a/examples/apps/phx_example/lib/phx_example_web/views/error_view.ex
+++ /dev/null
@@ -1,11 +0,0 @@
-defmodule PhxExampleWeb.ErrorView do
- use PhxExampleWeb, :view
-
- def render("500.html", _assigns) do
- "Opps, Internal Server Error"
- end
-
- def template_not_found(template, _assigns) do
- Phoenix.Controller.status_message_from_template(template)
- end
-end
diff --git a/examples/apps/phx_example/lib/phx_example_web/views/layout_view.ex b/examples/apps/phx_example/lib/phx_example_web/views/layout_view.ex
deleted file mode 100644
index 7ae8471d..00000000
--- a/examples/apps/phx_example/lib/phx_example_web/views/layout_view.ex
+++ /dev/null
@@ -1,3 +0,0 @@
-defmodule PhxExampleWeb.LayoutView do
- use PhxExampleWeb, :view
-end
diff --git a/examples/apps/phx_example/lib/phx_example_web/views/page_view.ex b/examples/apps/phx_example/lib/phx_example_web/views/page_view.ex
deleted file mode 100644
index 5a6ffff8..00000000
--- a/examples/apps/phx_example/lib/phx_example_web/views/page_view.ex
+++ /dev/null
@@ -1,3 +0,0 @@
-defmodule PhxExampleWeb.PageView do
- use PhxExampleWeb, :view
-end
diff --git a/examples/apps/phx_example/mix.exs b/examples/apps/phx_example/mix.exs
index 873acff6..32b73896 100644
--- a/examples/apps/phx_example/mix.exs
+++ b/examples/apps/phx_example/mix.exs
@@ -10,7 +10,6 @@ defmodule PhxExample.MixProject do
deps_path: "../../deps",
lockfile: "../../mix.lock",
elixir: "~> 1.7",
- compilers: [:phoenix] ++ Mix.compilers(),
start_permanent: Mix.env() == :prod,
deps: deps()
]
@@ -28,7 +27,9 @@ defmodule PhxExample.MixProject do
{:new_relic_agent, path: "../../../"},
{:test_support, in_umbrella: true},
{:phoenix, "~> 1.5"},
- {:phoenix_html, "~> 2.11"},
+ {:phoenix_html, "~> 3.3"},
+ {:phoenix_view, "~> 2.0"},
+ {:phoenix_live_view, "~> 0.20"},
{:jason, "~> 1.0"},
{:plug_cowboy, "~> 2.0"}
]
diff --git a/examples/apps/phx_example/test/phx_example_test.exs b/examples/apps/phx_example/test/phx_example_test.exs
index 5e55b073..fb623dcd 100644
--- a/examples/apps/phx_example/test/phx_example_test.exs
+++ b/examples/apps/phx_example/test/phx_example_test.exs
@@ -28,6 +28,29 @@ defmodule PhxExampleTest do
assert event[:status] == 200
end
+ test "Phoenix metrics generated for LiveView" do
+ TestSupport.restart_harvest_cycle(Collector.Metric.HarvestCycle)
+ TestSupport.restart_harvest_cycle(Collector.TransactionEvent.HarvestCycle)
+
+ {:ok, %{body: body}} = request("/phx/home")
+ assert body =~ "Some content"
+
+ metrics = TestSupport.gather_harvest(Collector.Metric.Harvester)
+
+ assert TestSupport.find_metric(
+ metrics,
+ "WebTransaction/Phoenix/PhxExampleWeb.HomeLive/index"
+ )
+
+ [[_, event]] = TestSupport.gather_harvest(Collector.TransactionEvent.Harvester)
+
+ assert event[:"phoenix.endpoint"] == "PhxExampleWeb.Endpoint"
+ assert event[:"phoenix.router"] == "PhxExampleWeb.Router"
+ assert event[:"phoenix.controller"] == "Phoenix.LiveView.Plug"
+ assert event[:"phoenix.action"] == "index"
+ assert event[:status] == 200
+ end
+
@tag :capture_log
test "Phoenix error" do
TestSupport.restart_harvest_cycle(Collector.Metric.HarvestCycle)
@@ -35,7 +58,7 @@ defmodule PhxExampleTest do
{:ok, %{body: body, status_code: 500}} = request("/phx/error")
- assert body =~ "Opps, Internal Server Error"
+ assert body =~ "Oops, Internal Server Error"
metrics = TestSupport.gather_harvest(Collector.Metric.Harvester)
@@ -54,6 +77,32 @@ defmodule PhxExampleTest do
assert event[:error]
end
+ @tag :capture_log
+ test "Phoenix LiveView error" do
+ TestSupport.restart_harvest_cycle(Collector.Metric.HarvestCycle)
+ TestSupport.restart_harvest_cycle(Collector.TransactionEvent.HarvestCycle)
+
+ {:ok, %{body: body, status_code: 500}} = request("/phx/live_error")
+
+ assert body =~ "Oops, Internal Server Error"
+
+ metrics = TestSupport.gather_harvest(Collector.Metric.Harvester)
+
+ assert TestSupport.find_metric(
+ metrics,
+ "WebTransaction/Phoenix/PhxExampleWeb.ErrorLive/index"
+ )
+
+ [[_, event]] = TestSupport.gather_harvest(Collector.TransactionEvent.Harvester)
+
+ assert event[:status] == 500
+ assert event[:"phoenix.endpoint"] == "PhxExampleWeb.Endpoint"
+ assert event[:"phoenix.router"] == "PhxExampleWeb.Router"
+ assert event[:"phoenix.controller"] == "Phoenix.LiveView.Plug"
+ assert event[:"phoenix.action"] == "index"
+ assert event[:error]
+ end
+
test "Phoenix route not found" do
TestSupport.restart_harvest_cycle(Collector.Metric.HarvestCycle)
TestSupport.restart_harvest_cycle(Collector.TransactionEvent.HarvestCycle)
diff --git a/examples/mix.lock b/examples/mix.lock
index 0d0ebe18..bb88866c 100644
--- a/examples/mix.lock
+++ b/examples/mix.lock
@@ -2,10 +2,9 @@
"castore": {:hex, :castore, "0.1.9", "eb08a94c12ebff92a92d844c6ccd90728dc7662aab9bdc8b3b785ba653c499d5", [:mix], [], "hexpm", "99c3a38ad9c0bab03fee1418c98390da1a31f3b85e317db5840d51a1443d26c8"},
"cc_precompiler": {:hex, :cc_precompiler, "0.1.9", "e8d3364f310da6ce6463c3dd20cf90ae7bbecbf6c5203b98bf9b48035592649b", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "9dcab3d0f3038621f1601f13539e7a9ee99843862e66ad62827b0c42b2f58a54"},
"certifi": {:hex, :certifi, "2.5.3", "70bdd7e7188c804f3a30ee0e7c99655bc35d8ac41c23e12325f36ab449b70651", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "ed516acb3929b101208a9d700062d520f3953da3b6b918d866106ffa980e1c10"},
- "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
- "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"},
+ "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"},
- "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"},
+ "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"},
@@ -18,20 +17,25 @@
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
- "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"},
+ "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
"myxql": {:hex, :myxql, "0.6.4", "1502ea37ee23c31b79725b95d4cc3553693c2bda7421b1febc50722fd988c918", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:geo, "~> 3.4", [hex: :geo, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a3307f4671f3009d3708283649adf205bfe280f7e036fc8ef7f16dbf821ab8e9"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
- "phoenix": {:hex, :phoenix, "1.5.8", "71cfa7a9bb9a37af4df98939790642f210e35f696b935ca6d9d9c55a884621a4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "35ded0a32f4836168c7ab6c33b88822eccd201bcd9492125a9bea4c54332d955"},
- "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"},
- "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},
- "plug": {:hex, :plug, "1.11.1", "f2992bac66fdae679453c9e86134a4201f6f43a687d8ff1cd1b2862d53c80259", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "23524e4fefbb587c11f0833b3910bfb414bf2e2534d61928e920f54e3a1b881f"},
- "plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"},
- "plug_crypto": {:hex, :plug_crypto, "1.2.1", "5c854427528bf61d159855cedddffc0625e2228b5f30eff76d5a4de42d896ef4", [:mix], [], "hexpm", "6961c0e17febd9d0bfa89632d391d2545d2e0eb73768f5f50305a23961d8782c"},
+ "phoenix": {:hex, :phoenix, "1.7.10", "02189140a61b2ce85bb633a9b6fd02dff705a5f1596869547aeb2b2b95edd729", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "cf784932e010fd736d656d7fead6a584a4498efefe5b8227e9f383bf15bb79d0"},
+ "phoenix_html": {:hex, :phoenix_html, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.3", "8b6406bc0a451f295407d7acff7f234a6314be5bbe0b3f90ed82b07f50049878", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a8e4385e05618b424779f894ed2df97d3c7518b7285fcd11979077ae6226466b"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
+ "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
+ "phoenix_view": {:hex, :phoenix_view, "2.0.3", "4d32c4817fce933693741deeb99ef1392619f942633dde834a5163124813aad3", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64"},
+ "plug": {:hex, :plug, "1.15.2", "94cf1fa375526f30ff8770837cb804798e0045fd97185f0bb9e5fcd858c792a3", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "02731fa0c2dcb03d8d21a1d941bdbbe99c2946c0db098eee31008e04c6283615"},
+ "plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
+ "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"},
"postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"},
- "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"},
+ "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"redix": {:hex, :redix, "1.0.0", "4f310341744ffceab3031394450a4e603d4d1001a697c3f18ae57ae776cbd3fb", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8c8d9b33b5491737adcd5bb9e0f43b85212a384ac0042f64c156113518266ecb"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
"telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
+ "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
+ "websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"},
}
diff --git a/lib/new_relic/telemetry/phoenix.ex b/lib/new_relic/telemetry/phoenix.ex
index e96667ad..d8192a7a 100644
--- a/lib/new_relic/telemetry/phoenix.ex
+++ b/lib/new_relic/telemetry/phoenix.ex
@@ -84,6 +84,10 @@ defmodule NewRelic.Telemetry.Phoenix do
:ignore
end
+ defp phoenix_name(%{phoenix_live_view: {module, action, _, _}}) when is_atom(action) do
+ "/Phoenix/#{inspect(module)}/#{action}"
+ end
+
defp phoenix_name(%{plug: controller, plug_opts: action}) when is_atom(action) do
"/Phoenix/#{inspect(controller)}/#{action}"
end