Packages
new_relic_agent
1.33.0
1.40.3
1.40.2
1.40.1
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.1
1.31.0
1.30.0
1.29.0
1.28.0
1.27.8
1.27.7
1.27.6
1.27.5
1.27.4
1.27.3
1.27.2
1.27.1
1.27.0
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.5
1.24.4
1.24.3
1.24.2
1.24.1
1.24.0
1.24.0-rc.10
1.24.0-rc.9
1.24.0-rc.8
1.24.0-rc.7
1.23.6
1.23.5
1.23.4
1.23.3
1.23.2
1.23.1
1.23.0
1.23.0-rc.6
1.23.0-rc.5
1.23.0-rc.4
1.23.0-rc.3
1.23.0-rc.2
1.23.0-rc.1
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.2
1.21.1
1.21.0
1.21.0-rc.3
1.21.0-rc.1
1.20.0
1.20.0-rc.1
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.18.0-rc.5
1.18.0-rc.4
1.18.0-rc.2
1.18.0-rc.1
1.17.1
1.17.0
1.17.0-rc.4
1.17.0-rc.3
1.17.0-rc.2
1.17.0-rc.1
1.17.0-rc.0
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.16.0-rc.2
1.16.0-rc.1
1.16.0-rc.0
1.15.0
1.15.0-rc.3
1.15.0-rc.2
1.15.0-rc.1
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.12
1.9.11
1.9.10
1.9.9
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.0
1.6.2
1.6.1
1.6.0
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
New Relic's Open-Source Elixir Agent
Current section
Files
Jump to
Current section
Files
lib/new_relic/telemetry/ecto/metadata.ex
defmodule NewRelic.Telemetry.Ecto.Metadata do
@moduledoc false
def parse(%{result: {:ok, %{__struct__: Postgrex.Cursor}}}), do: :ignore
def parse(%{result: {:ok, %{__struct__: MyXQL.Cursor}}}), do: :ignore
def parse(%{query: query, result: {_ok_err, %{__struct__: struct}}})
when struct in [Postgrex.Result, Postgrex.Error] do
{"Postgres", parse_query(query)}
end
def parse(%{query: query, result: {_ok_err, %{__struct__: struct}}})
when struct in [MyXQL.Result, MyXQL.Error] do
{"MySQL", parse_query(query)}
end
def parse(%{query: query, repo: repo, result: {_ok_err, %{__struct__: _struct}}}) do
[adaapter | _] = repo.__adapter__() |> Module.split() |> Enum.reverse()
{adaapter, parse_query(query)}
end
def parse(%{result: {:ok, _}}), do: :ignore
def parse(%{result: {:error, _}}), do: :ignore
def parse_query(query) do
case query do
"SELECT" <> _ -> parse_query(:select, query)
"INSERT" <> _ -> parse_query(:insert, query)
"UPDATE" <> _ -> parse_query(:update, query)
"DELETE" <> _ -> parse_query(:delete, query)
"CREATE TABLE" <> _ -> parse_query(:create, query)
"begin" -> {:begin, :other}
"commit" -> {:commit, :other}
"rollback" -> {:rollback, :other}
_ -> {:other, :other}
end
end
# Table name escaping
# Postgrex: "table"
# MyXQL: `table`
# Tds: [table]
# Exqlite: table
@esc ~w(" ` [ ])
@capture %{
select: ~r/FROM (?<table>\S+)/,
insert: ~r/INSERT INTO (?<table>\S+)/,
update: ~r/UPDATE (?<table>\S+)/,
delete: ~r/FROM (?<table>\S+)/,
create: ~r/CREATE TABLE( IF NOT EXISTS)? (?<table>\S+)/
}
def parse_query(operation, query) do
case Regex.named_captures(@capture[operation], query) do
%{"table" => table} -> {operation, String.replace(table, @esc, "")}
_ -> {operation, :other}
end
end
end