Packages
new_relic_agent
1.25.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(%{
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
# Escape chars
# Postgrex: "
# MyXQL: `
# Tds: [
# Exqlite: none
@esc ~s(["`\[]?)
@select ~r/FROM #{@esc}(?<table>\w+)#{@esc}/
@insert ~r/INSERT INTO #{@esc}(?<table>\w+)#{@esc}/
@update ~r/UPDATE #{@esc}(?<table>\w+)#{@esc}/
@delete ~r/FROM #{@esc}(?<table>\w+)#{@esc}/
@create ~r/CREATE TABLE( IF NOT EXISTS)? #{@esc}(?<table>\w+)#{@esc}/
defp parse_query(query) do
{operation, table} =
case query do
"SELECT" <> _ -> {"select", capture(@select, query, "table")}
"INSERT" <> _ -> {"insert", capture(@insert, query, "table")}
"UPDATE" <> _ -> {"update", capture(@update, query, "table")}
"DELETE" <> _ -> {"delete", capture(@delete, query, "table")}
"CREATE TABLE" <> _ -> {"create", capture(@create, query, "table")}
"begin" -> {"begin", "other"}
"commit" -> {"commit", "other"}
"rollback" -> {"rollback", "other"}
_ -> {"other", "other"}
end
{table, operation}
end
defp capture(regex, query, match) do
Regex.named_captures(regex, query)[match]
end
end