Packages
new_relic_agent
1.22.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/init.ex
defmodule NewRelic.Init do
@moduledoc false
def run() do
verify_erlang_otp_version()
init_config()
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)
{collector_host, region_prefix} = determine_collector_host(host, license_key)
telemetry_hosts = determine_telemetry_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),
collector_host: collector_host,
region_prefix: region_prefix,
automatic_attributes: determine_automatic_attributes(),
labels: determine_config(:labels) |> parse_labels(),
telemetry_hosts: telemetry_hosts
})
end
defp determine_config(key, default) do
determine_config(key) || default
end
defp determine_config(key) when is_atom(key) do
env = key |> to_string() |> String.upcase()
System.get_env("NEW_RELIC_#{env}") ||
Application.get_env(:new_relic_agent, key)
end
@env_matcher ~r/^(?<env>.+)-collector/
def determine_telemetry_hosts(host, region) do
env = host && Regex.named_captures(@env_matcher, host)["env"]
env = env && env <> "-"
region = region && region <> "."
%{
log: "https://#{env}log-api.#{region}newrelic.com/log/v1"
}
end
def determine_collector_host(host, license_key) do
cond do
manual_config_host = host ->
{manual_config_host, nil}
region_prefix = determine_region(license_key) ->
{"collector.#{region_prefix}.nr-data.net", region_prefix}
true ->
{"collector.newrelic.com", nil}
end
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
@region_matcher ~r/^(?<prefix>.+?)x/
def determine_region(nil), do: false
def determine_region(key) do
case Regex.named_captures(@region_matcher, key) do
%{"prefix" => prefix} -> String.trim_trailing(prefix, "x")
_ -> false
end
end
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