Packages
new_relic_agent
1.6.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/harvest/collector/agent_run.ex
defmodule NewRelic.Harvest.Collector.AgentRun do
use GenServer
# This GenServer is responsible for connecting to the collector
# and holding onto the Agent Run state
@moduledoc false
alias NewRelic.Harvest.Collector
def start_link do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
def init(:ok) do
NewRelic.sample_process()
:ets.new(__MODULE__, [:named_table, :public, :set])
if NewRelic.Config.enabled?() do
case Collector.Protocol.preconnect() do
{:error, _reason} ->
:ignore
%{"redirect_host" => redirect_host} ->
Application.put_env(:new_relic_agent, :collector_instance_host, redirect_host)
send(self(), :connect)
end
end
{:ok, :unknown}
end
def agent_run_id, do: lookup(:agent_run_id)
def trusted_account_key, do: lookup(:trusted_account_key)
def account_id, do: lookup(:account_id)
def primary_application_id, do: lookup(:primary_application_id)
def reconnect, do: send(__MODULE__, :connect)
def handle_info(:connect, _state) do
state =
Collector.Connect.payload()
|> Collector.Protocol.connect()
|> parse_connect
store_agent_run(state)
{:noreply, state}
end
def handle_call(:connected, _from, state) do
{:reply, true, state}
end
defp store_agent_run(%{"agent_run_id" => _} = state) do
store(:agent_run_id, state["agent_run_id"])
store(:trusted_account_key, state["trusted_account_key"])
store(:account_id, state["account_id"])
store(:primary_application_id, state["primary_application_id"])
store(:sampling_target, state["sampling_target"])
store(:sampling_target_period, state["sampling_target_period_in_seconds"] * 1000)
transaction_event = state["data_methods"]["analytic_event_data"]
store(:transaction_event_reservoir_size, transaction_event["max_samples_stored"])
store(:transaction_event_harvest_cycle, transaction_event["report_period_in_seconds"] * 1000)
custom_event = state["data_methods"]["custom_event_data"]
store(:custom_event_reservoir_size, custom_event["max_samples_stored"])
store(:custom_event_harvest_cycle, custom_event["report_period_in_seconds"] * 1000)
error_event = state["data_methods"]["error_event_data"]
store(:error_event_reservoir_size, error_event["max_samples_stored"])
store(:error_event_harvest_cycle, error_event["report_period_in_seconds"] * 1000)
span_event = state["data_methods"]["span_event_data"]
store(:span_event_reservoir_size, span_event["max_samples_stored"])
store(:span_event_harvest_cycle, span_event["report_period_in_seconds"] * 1000)
store(:data_report_period, state["data_report_period"] * 1000)
end
defp store_agent_run(_error), do: :ignore
defp parse_connect(
%{"agent_run_id" => _, "messages" => [%{"message" => message}]} = connect_response
) do
NewRelic.log(:info, message)
connect_response
end
defp parse_connect(%{"error_type" => _, "message" => message}) do
NewRelic.log(:error, message)
:error
end
defp parse_connect({:error, reason}) do
NewRelic.log(:error, "Failed connect #{inspect(reason)}")
:error
end
defp parse_connect(503) do
NewRelic.log(:error, "Collector unavailable")
:error
end
def store(key, value) do
:ets.insert(__MODULE__, {key, value})
end
def lookup(key) do
Application.get_env(:new_relic_agent, key) ||
case :ets.lookup(__MODULE__, key) do
[{^key, value}] -> value
[] -> nil
end
end
end