Packages
new_relic_agent
1.25.1
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(%{
query: query,
result: {_ok_or_error, %{__struct__: struct}}
})
when struct in [Postgrex.Result, Postgrex.Error] do
{"Postgres", parse_query(query)}
end
def parse(%{result: {:ok, %{__struct__: MyXQL.Cursor}}}), do: :ignore
def parse(%{
query: query,
result: {_ok_or_error, %{__struct__: struct}}
})
when struct in [MyXQL.Result, MyXQL.Error] do
{"MySQL", parse_query(query)}
end
def parse(%{
query: query,
repo: repo,
result: {_ok_or_error, %{__struct__: _result_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
defp parse_query(query) do
{operation, table} =
case query do
"SELECT" <> _ -> {"select", table_name(:select, query)}
"INSERT" <> _ -> {"insert", table_name(:insert, query)}
"UPDATE" <> _ -> {"update", table_name(:update, query)}
"DELETE" <> _ -> {"delete", table_name(:delete, query)}
"CREATE TABLE" <> _ -> {"create", table_name(:create, query)}
"begin" -> {"begin", "other"}
"commit" -> {"commit", "other"}
"rollback" -> {"rollback", "other"}
_ -> {"other", "other"}
end
{table, operation}
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+)/
}
defp table_name(query_type, query) do
Regex.named_captures(@capture[query_type], query)["table"]
|> String.replace(@esc, "")
end
end