Packages
new_relic_agent
1.24.0-rc.7
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/config.ex
defmodule NewRelic.Config do
@moduledoc """
New Relic Agent Configuration
All configuration items can be set via Environment variables _or_ via `Application` config
"""
@doc """
**Required**
Configure your application name. May contain up to 3 names seperated by `;`
Application name can be configured in two ways:
* Environment variable: `NEW_RELIC_APP_NAME=MyApp`
* Application config: `config :new_relic_agent, app_name: "MyApp"`
"""
def app_name,
do: get(:app_name)
@doc """
**Required**
Configure your New Relic License Key.
License Key can be configured in two ways, though using Environment Variables is strongly
recommended to keep secrets out of source code:
* Environment variables: `NEW_RELIC_LICENSE_KEY=abc123`
* Application config: `config :new_relic_agent, license_key: "abc123"`
"""
def license_key,
do: get(:license_key)
@doc false
def host,
do: get(:host)
@doc """
Configure the Agent logging mechanism.
This controls how the Agent logs it's own behavior, and doesn't impact your
applications own logging at all.
Defaults to the File `"tmp/new_relic.log"`.
Options:
- `"stdout"` Write directly to Standard Out
- `"Logger"` Send Agent logs to Elixir's Logger
- `"file_name.log"` Write to a chosen file
Agent logging can be configured in two ways:
* Environment variable: `NEW_RELIC_LOG=stdout`
* Application config: `config :new_relic_agent, log: "stdout"`
"""
def logger,
do: get(:log)
@doc """
An optional list of key/value pairs that will be automatic custom attributes
on all event types reported (Transactions, etc). Values are determined at Agent
start.
Options:
- `{:system, "ENV_NAME"}` Read a System ENV variable
- `{module, function, args}` Call a function.
- `"foo"` A direct value
This feature is only configurable with `Application` config.
Example:
```
config :new_relic_agent,
automatic_attributes: [
environment: {:system, "APP_ENV"},
node_name: {Node, :self, []},
team_name: "Afterlife"
]
```
"""
def automatic_attributes,
do: get(:automatic_attributes)
@doc """
An optional list of labels that will be applied to the application.
Configured with a single string containing a list of key-value pairs:
`key1:value1;key2:value2`
The delimiting characters `;` and `:` are not allowed in the `key` or `value`
Labels can be configured in two ways:
* Environment variables: `NEW_RELIC_LABELS=region:west;env:prod`
* Application config: `config :new_relic_agent, labels: "region:west;env:prod"`
"""
def labels,
do: get(:labels)
@doc """
Some Agent features can be toggled via configuration.
### Security
* `:error_collector_enabled` (default `true`)
* Toggles collection of any Error traces or metrics
* `:db_query_collection_enabled` (default `true`)
* Toggles collection of Database query strings
* `function_argument_collection_enabled` (default `true`)
* Toggles collection of traced function arguments
### Instrumentation
Opting out of Instrumentation means that `:telemetry` handlers
will not be attached, reducing the performance impact to zero.
* `:plug_instrumentation_enabled` (default `true`)
* Controls all Plug instrumentation
* `:ecto_instrumentation_enabled` (default `true`)
* Controls all Ecto instrumentation
* `:redix_instrumentation_enabled` (default `true`)
* Controls all Redix instrumentation
* `:request_queuing_metrics_enabled`
* Controls collection of request queuing metrics
### Configuration
Each of these features can be configured in two ways, for example:
* Environment variables: `NEW_RELIC_ERROR_COLLECTOR_ENABLED=false`
* Application config: `config :new_relic_agent, error_collector_enabled: false`
"""
def feature?(toggleable_agent_feature)
def feature?(:error_collector) do
get(:features, :error_collector)
end
def feature?(:db_query_collection) do
get(:features, :db_query_collection)
end
def feature?(:plug_instrumentation) do
get(:features, :plug_instrumentation)
end
def feature?(:phoenix_instrumentation) do
get(:features, :phoenix_instrumentation)
end
def feature?(:ecto_instrumentation) do
get(:features, :ecto_instrumentation)
end
def feature?(:redix_instrumentation) do
get(:features, :redix_instrumentation)
end
def feature?(:function_argument_collection) do
get(:features, :function_argument_collection)
end
def feature?(:request_queuing_metrics) do
get(:features, :request_queuing_metrics)
end
@doc """
Some Agent features can be controlled via configuration.
### Logs In Context
This feature can be run in multiple "modes":
* `forwarder` The recommended mode which formats outgoing logs as JSON objects
ready to be picked up by a [Log Forwarder](https://docs.newrelic.com/docs/logs/enable-log-management-new-relic/enable-log-monitoring-new-relic/enable-log-management-new-relic)
* `direct` Logs are buffered in the agent and shipped directly to New Relic. Your logs
will continue being output to their normal destination.
* `disabled` (default)
Logs In Context can be configured in two ways:
* Environment variable `NEW_RELIC_LOGS_IN_CONTEXT=forwarder`
* Application config `config :new_relic_agent, logs_in_context: :forwarder`
### Infinite Tracing
[Infinite Tracing](https://docs.newrelic.com/docs/understand-dependencies/distributed-tracing/infinite-tracing/introduction-infinite-tracing)
gives you more control of sampling by collecting 100% of Spans and sending them
to a Trace Observer for processing.
You can configure your Trace Observer in two ways:
* Environment variable `NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST=trace-observer.host`
* Application config `config :new_relic_agent, infinite_tracing_trace_observer_host: "trace-observer.host"`
"""
def feature(configurable_agent_feature)
def feature(:logs_in_context) do
case System.get_env("NEW_RELIC_LOGS_IN_CONTEXT") do
nil -> Application.get_env(:new_relic_agent, :logs_in_context, :disabled)
"forwarder" -> :forwarder
"direct" -> :direct
other -> other
end
end
def feature(:infinite_tracing) do
get(:trace_mode)
end
@doc false
def enabled?,
do: (harvest_enabled?() && app_name() && license_key() && true) || false
@doc false
def region_prefix,
do: get(:region_prefix)
@doc false
def event_harvest_config() do
%{
harvest_limits: %{
analytic_event_data:
Application.get_env(:new_relic_agent, :analytic_event_per_minute, 1000),
custom_event_data: Application.get_env(:new_relic_agent, :custom_event_per_minute, 1000),
error_event_data: Application.get_env(:new_relic_agent, :error_event_per_minute, 100),
span_event_data: Application.get_env(:new_relic_agent, :span_event_per_minute, 1000)
}
}
end
defp harvest_enabled?, do: get(:harvest_enabled)
@doc false
def get(key), do: :persistent_term.get(:nr_config)[key]
@doc false
def get(:features, key), do: :persistent_term.get(:nr_features)[key]
@doc false
def put(items), do: :persistent_term.put(:nr_config, items)
@doc false
def put(:features, items), do: :persistent_term.put(:nr_features, items)
@external_resource "VERSION"
@agent_version "VERSION" |> File.read!() |> String.trim()
@doc false
def agent_version, do: @agent_version
end