Packages
new_relic_agent
1.27.8
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/init.ex
defmodule NewRelic.Init do
@moduledoc false
alias NewRelic.Harvest.Collector
alias NewRelic.Harvest.TelemetrySdk
def run() do
verify_erlang_otp_version()
init_config()
init_features()
end
@erlang_version_requirement ">= 21.2.0"
def verify_erlang_otp_version() do
cond do
Code.ensure_loaded?(:persistent_term) -> :ok
Version.match?(System.otp_release() <> ".0.0", @erlang_version_requirement) -> :ok
true -> raise "Erlang/OTP 21.2 required to run the New Relic agent"
end
end
def init_config() do
host = determine_config(:host)
license_key = determine_config(:license_key)
region_prefix = determine_region(license_key)
collector_host = Collector.Protocol.determine_host(host, region_prefix)
telemetry_hosts = TelemetrySdk.Config.determine_hosts(host, region_prefix)
NewRelic.Config.put(%{
log: determine_config(:log),
host: host,
port: determine_config(:port, 443) |> parse_port,
scheme: determine_config(:scheme, "https"),
app_name: determine_config(:app_name) |> parse_app_names,
license_key: license_key,
harvest_enabled: determine_config(:harvest_enabled, true) |> parse_bool,
collector_host: collector_host,
region_prefix: region_prefix,
automatic_attributes: determine_automatic_attributes(),
labels: determine_config(:labels) |> parse_labels(),
telemetry_hosts: telemetry_hosts,
trace_mode: determine_trace_mode()
})
end
@region_matcher ~r/^(?<prefix>.+?)x/
def determine_region(nil), do: nil
def determine_region(license_key) do
case Regex.named_captures(@region_matcher, license_key) do
%{"prefix" => prefix} -> String.trim_trailing(prefix, "x")
_ -> nil
end
end
def init_features() do
NewRelic.Config.put(:features, %{
error_collector:
determine_feature(
"NEW_RELIC_ERROR_COLLECTOR_ENABLED",
:error_collector_enabled
),
db_query_collection:
determine_feature(
"NEW_RELIC_SQL_COLLECTION_ENABLED",
:sql_collection_enabled,
false
) ||
determine_feature(
"NEW_RELIC_DB_QUERY_COLLECTION_ENABLED",
:db_query_collection_enabled
),
ecto_instrumentation:
determine_feature(
"NEW_RELIC_ECTO_INSTRUMENTATION_ENABLED",
:ecto_instrumentation_enabled
),
redix_instrumentation:
determine_feature(
"NEW_RELIC_REDIX_INSTRUMENTATION_ENABLED",
:redix_instrumentation_enabled
),
plug_instrumentation:
determine_feature(
"NEW_RELIC_PLUG_INSTRUMENTATION_ENABLED",
:plug_instrumentation_enabled
),
phoenix_instrumentation:
determine_feature(
"NEW_RELIC_PHOENIX_INSTRUMENTATION_ENABLED",
:phoenix_instrumentation_enabled
),
function_argument_collection:
determine_feature(
"NEW_RELIC_FUNCTION_ARGUMENT_COLLECTION_ENABLED",
:function_argument_collection_enabled
),
request_queuing_metrics:
determine_feature(
"NEW_RELIC_REQUEST_QUEUING_METRICS_ENABLED",
:request_queuing_metrics_enabled
)
})
end
def determine_config(key, default \\ nil) when is_atom(key) do
env = key |> to_string() |> String.upcase()
System.get_env("NEW_RELIC_#{env}") ||
Application.get_env(:new_relic_agent, key, default)
end
defp determine_feature(env, config, default \\ true) do
case System.get_env(env) do
"true" -> true
"false" -> false
_ -> Application.get_env(:new_relic_agent, config, default)
end
end
defp determine_trace_mode() do
(determine_config(:infinite_tracing_trace_observer_host) && :infinite) || :sampling
end
def determine_automatic_attributes() do
Application.get_env(:new_relic_agent, :automatic_attributes, [])
|> Enum.into(%{}, fn
{name, {:system, env_var}} -> {name, System.get_env(env_var)}
{name, {m, f, a}} -> {name, apply(m, f, a)}
{name, value} -> {name, value}
end)
end
defp parse_bool(bool) when is_boolean(bool), do: bool
defp parse_bool("true"), do: true
defp parse_bool("false"), do: false
def parse_port(port) when is_integer(port), do: port
def parse_port(port) when is_binary(port), do: String.to_integer(port)
def parse_app_names(nil), do: nil
def parse_app_names(name_string) do
name_string
|> String.split(";")
|> Enum.map(&String.trim/1)
end
def parse_labels(nil), do: []
@label_splitter ~r/;|:/
def parse_labels(label_string) do
label_string
|> String.split(@label_splitter, trim: true)
|> Enum.map(&String.trim/1)
|> Enum.chunk_every(2, 2, :discard)
end
end