Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(installer): Adds support for configuration via environment variables #906

Open
wants to merge 22 commits into
base: feat/env-configuration
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6dbbc72
feat(tests): Adds testing API to capture INI entries
mfulb May 22, 2024
4b1aa4c
feat(install): Adds mapping file for env vars
mfulb May 22, 2024
60b0f93
feat(install): Start of env var inject script
mfulb May 22, 2024
8ac76b1
chore(build): Adds rules for env var injection script
mfulb May 22, 2024
8943480
feat(tests): Adds script to verify ini/envvar mappings
mfulb May 22, 2024
ae77685
chore(install): Adds rules for ini/envvar script
mfulb May 22, 2024
707292e
feat(install,tests): Adds progress for env var injection
mfulb May 24, 2024
ec92c50
fix(install): Fixes usage and message
mfulb May 24, 2024
ddc0144
fix(tests): Fixes call to inject script
mfulb May 24, 2024
4c257e8
fix(install): Handles newrelic.ini creation better
mfulb May 24, 2024
bd2f729
chore: Removes debugging output
mfulb May 24, 2024
bdd9f87
chore: Removes set -x
mfulb May 24, 2024
341b346
chore: Fixes spacing
mfulb May 24, 2024
9263753
chore: Removes trailing space
mfulb May 24, 2024
c1d55c3
fix(agent): Uses macros that works with PHP 7.x as well
mfulb May 28, 2024
e5b1583
chore(testing): Adds env var injection script tests to CI/CD
mfulb May 28, 2024
ae05cd4
chore(testing): Removes unneeded code
mfulb May 29, 2024
89719ba
fix(agent): Adds make target for installer release
mfulb Jun 4, 2024
46a93f5
fix(install): Adds proper path for running inject script
mfulb Jun 5, 2024
ca0238f
chore(installer): Renames mapping file to work with GHA limitations
mfulb Jun 5, 2024
d484f6c
chore(installer): Adds renamed mapping file
mfulb Jun 5, 2024
a10f617
fix(testing): Improves newrelic-install tests
mfulb Jun 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/test-agent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ jobs:
-v "${GITHUB_WORKSPACE}/php-agent":"/usr/local/src/newrelic-php-agent"
-e ENABLE_COVERAGE=${{matrix.codecov}}
$IMAGE_NAME:$IMAGE_TAG-${{matrix.php}}-${{matrix.platform}}-$IMAGE_VERSION make agent-${{ steps.get-check-variant.outputs.AGENT_CHECK_VARIANT }}
- name: Run newrelic-install tests
run: >
docker run --rm --platform linux/${{matrix.arch}}
-v "${GITHUB_WORKSPACE}/php-agent":"/usr/local/src/newrelic-php-agent"
-e ENABLE_COVERAGE=${{matrix.codecov}}
$IMAGE_NAME:$IMAGE_TAG-${{matrix.php}}-${{matrix.platform}}-$IMAGE_VERSION make verify-inject-script
- name: Save newrelic.so for integration tests
uses: actions/upload-artifact@v4
with:
Expand Down
23 changes: 22 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -205,12 +205,20 @@ daemon-clean:
# missing from the $PATH.
#

installer: bin/newrelic-install bin/newrelic-iutil | bin/
installer: bin/newrelic-install bin/newrelic-install-inject-envvars.php bin/newrelic-install-php-cfg-mappings.php bin/newrelic-iutil | bin/

bin/newrelic-install: agent/newrelic-install.sh Makefile VERSION | bin/
sed -e "/nrversion:=/s,UNSET,$(AGENT_VERSION)," $< > $@
chmod 755 $@

bin/newrelic-install-inject-envvars.php: agent/newrelic-install-inject-envvars.php Makefile | bin/
cp $< $@
chmod 755 $@

bin/newrelic-install-php-cfg-mappings.php: agent/newrelic-install-php-cfg-mappings.php Makefile | bin/
cp $< $@
chmod 755 $@

bin/newrelic-iutil: agent/install-util.c Makefile VERSION | bin/
$(CC) -DNR_VERSION="\"$(AGENT_VERSION)\"" $(CPPFLAGS) $(CFLAGS) -o $@ $< $(LDFLAGS)

Expand Down Expand Up @@ -362,6 +370,19 @@ integration-events-limits: bin/integration_runner
echo "# PHP=$${PHP}"; \
done;

#
# Verify env var injection script mapping has all INI values
# Requires test APIs to be enabled in agent
#
.PHONY: verify-inject-script
verify-inject-script: agent
(cd tests/newrelic-installer; \
php -d extension=../../agent/.libs/newrelic.so \
verify_inject_envvars_script_mapping.php)
(cd tests/newrelic-installer; \
php -d extension=../../agent/.libs/newrelic.so \
verify_inject_envvars_script_injection.php)

#
# Code profiling
#
Expand Down
118 changes: 118 additions & 0 deletions agent/newrelic-install-inject-envvars.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?PHP
/*
* Copyright 2024 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

/* Purpose: Read a fresh newrelic.ini file and inject any values
* from environment variables.
*
* Not designed to work on a modified newrelic.ini and script
* is not able to detect this scenario.
*
* The mapping from INI directive name to corresponding
* environment variable name must be injected before using
* in place of the comment below containing INI_ENVVAR_MAP
*
*/
function failure(string $msg) {
die(__FILE__ . " : ERROR : " . $msg . "\n");
}

function generate_regex(string $ini_name) {
$ini_name_esc = str_replace(".", "\.", $ini_name);
return "/^\s*;*\s*" . $ini_name_esc . "\s*=.*/im";
}

/* requires PHP 7+ */
if (version_compare(PHP_VERSION, '7.0', '<')) {
failure("requires PHP >= 7.0\n");
exit(1);
}

/* Mapping from INI name to environment variable name
* Expected form:
* define('INI_ENVVAR_MAP', array(....));
*/
require "newrelic-install-php-cfg-mappings.php";

/* Verify that ini/envvar mapping was injected and is defined */
if (!defined('INI_ENVVAR_MAP')) {
failure("INI/ENVVAR mapping was not detected - cannot proceed!");
exit(1);
}

/* Verify input INI file exists */
if (3 != $argc) {
failure(" missing required arguments\n" .
"Usage: newrelic-install-inject-envvars.php <input INI> <output INI>\n" .
" <input INI> Existing INI file\n" .
" <output INI> Output INI file with injected env var values\n\n");
exit(1);
}

$ini_filename = $argv[1];
if (!file_exists($ini_filename)) {
failure("Input INI file \"$ini_filename\" does not exist!");
exit(1);
}

$out_ini_filename = $argv[2];
if (file_exists($out_ini_filename)) {
failure("Output INI file \"$out_ini_filename\" exists - will not overwrite!");
exit(1);
}

$data = file_get_contents(($ini_filename));
if (!$data) {
failure("Could not read INI file \"$ini_filename\"!");
exit(1);
}

$pattern = array();
$replace = array();
$modified = array();

/* Go through all INI keys and see if the environment variable is defined */
foreach (INI_ENVVAR_MAP as $ini_name => $env_name) {
$env_value = getenv($env_name);
if (false != $env_value) {
array_push($pattern, generate_regex($ini_name));
array_push($replace, "$ini_name=$env_value");
array_push($modified, $env_name);
}
}

if (0 < count($pattern)) {
/* replace all values which exist in existing INI file */
$data = preg_replace($pattern, $replace, $data);

/* append values which will did not already exist in file */
$missing = "";
foreach(INI_ENVVAR_MAP as $ini_name => $env_name) {
$env_value = getenv($env_name);
if (false != $env_value) {
if (!preg_match(generate_regex($ini_name), $data)) {
$missing .= "/* Value injected from env var $env_name*/\n";
$missing .= "$ini_name=$env_value\n";
}
}
}
$data .= $missing;

echo "opening $out_ini_filename\n";
$fh = fopen($out_ini_filename, "w");
if (!$fh) {
failure("Unable to write out modified INI file $out_ini_filename");
exit(1);
}
fwrite($fh, $data);
fclose($fh);

echo "$out_ini_filename created with values from the following environment variables:\n";
foreach ($modified as $value) {
echo " $value\n";
}
} else {
echo "$out_ini_filename contains no modified values as no relevant environment variables detected";
}
138 changes: 138 additions & 0 deletions agent/newrelic-install-php-cfg-mappings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?PHP
/*
* Copyright 2024 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

/* defines mappings of all INI directive names to env var names */
/* must be updated whenever newrelic.ini.template is updated */
define('INI_ENVVAR_MAP', array(
"newrelic.logfile"=>"NEW_RELIC_LOGFILE",
"newrelic.loglevel"=>"NEW_RELIC_LOGLEVEL",
"newrelic.high_security"=>"NEW_RELIC_HIGH_SECURITY",
"newrelic.feature_flag"=>"NEW_RELIC_FEATURE_FLAG",
"newrelic.preload_framework_library_detection"=>"NEW_RELIC_PRELOAD_FRAMEWORK_LIBRARY_DETECTION",
"newrelic.daemon.auditlog"=>"NEW_RELIC_DAEMON_AUDITLOG",
"newrelic.daemon.logfile"=>"NEW_RELIC_DAEMON_LOGFILE",
"newrelic.daemon.loglevel"=>"NEW_RELIC_DAEMON_LOGLEVEL",
"newrelic.daemon.port"=>"NEW_RELIC_DAEMON_PORT",
"newrelic.daemon.address"=>"NEW_RELIC_DAEMON_ADDRESS",
"newrelic.daemon.ssl_ca_bundle"=>"NEW_RELIC_DAEMON_SSL_CA_BUNDLE",
"newrelic.daemon.ssl_ca_path"=>"NEW_RELIC_DAEMON_SSL_CA_PATH",
"newrelic.daemon.collector_host"=>"NEW_RELIC_DAEMON_COLLECTOR_HOST",
"newrelic.daemon.proxy"=>"NEW_RELIC_DAEMON_PROXY",
"newrelic.daemon.location"=>"NEW_RELIC_DAEMON_LOCATION",
"newrelic.daemon.pidfile"=>"NEW_RELIC_DAEMON_PIDFILE",
"newrelic.daemon.dont_launch"=>"NEW_RELIC_DAEMON_DONT_LAUNCH",
"newrelic.daemon.app_timeout"=>"NEW_RELIC_DAEMON_APP_TIMEOUT",
"newrelic.daemon.app_connect_timeout"=>"NEW_RELIC_DAEMON_APP_CONNECT_TIMEOUT",
"newrelic.daemon.start_timeout"=>"NEW_RELIC_DAEMON_START_TIMEOUT",
"newrelic.daemon.utilization.detect_aws"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_AWS",
"newrelic.daemon.utilization.detect_azure"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_AZURE",
"newrelic.daemon.utilization.detect_gcp"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_GCP",
"newrelic.daemon.utilization.detect_pcf"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_PCF",
"newrelic.daemon.utilization.detect_docker"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_DOCKER",
"newrelic.daemon.utilization.detect_kubernetes"=>"NEW_RELIC_DAEMON_UTILIZATION_DETECT_KUBERNETES",
"newrelic.daemon.special.integration"=>"NEW_RELIC_DAEMON_SPECIAL_INTEGRATION",
"newrelic.special"=>"NEW_RELIC_SPECIAL",
"newrelic.special.appinfo_timeout"=>"NEW_RELIC_SPECIAL_APPINFO_TIMEOUT",
"newrelic.special.disable_instrumentation"=>"NEW_RELIC_SPECIAL_DISABLE_INSTRUMENTATION",
"newrelic.special.expensive_node_min"=>"NEW_RELIC_SPECIAL_EXPENSIVE_NODE_MIN",
"newrelic.special.enable_extension_instrumentation"=>"NEW_RELIC_SPECIAL_ENABLE_EXTENSION_INSTRUMENTATION",
"newrelic.daemon.special.curl_verbose"=>"NEW_RELIC_DAEMON_SPECIAL_CURL_VERBOSE",
"newrelic.enabled"=>"NEW_RELIC_ENABLED",
"newrelic.license"=>"NEW_RELIC_LICENSE",
"newrelic.appname"=>"NEW_RELIC_APPNAME",
"newrelic.webtransaction.name.remove_trailing_path"=>"NEW_RELIC_WEBTRANSACTION_NAME_REMOVE_TRAILING_PATH",
"newrelic.framework.drupal.modules"=>"NEW_RELIC_FRAMEWORK_DRUPAL_MODULES",
"newrelic.framework.wordpress.hooks"=>"NEW_RELIC_FRAMEWORK_WORDPRESS_HOOKS",
"newrelic.framework.wordpress.hooks.options"=>"NEW_RELIC_FRAMEWORK_WORDPRESS_HOOKS_OPTIONS",
"newrelic.framework.wordpress.hooks.threshold"=>"NEW_RELIC_FRAMEWORK_WORDPRESS_HOOKS_THRESHOLD",
"newrelic.framework.wordpress.hooks_skip_filename"=>"NEW_RELIC_FRAMEWORK_WORDPRESS_HOOKS_SKIP_FILENAME",
"newrelic.framework"=>"NEW_RELIC_FRAMEWORK",
"newrelic.cross_application_tracer.enabled"=>"NEW_RELIC_CROSS_APPLICATION_TRACER_ENABLED",
"newrelic.special.max_nesting_level"=>"NEW_RELIC_SPECIAL_MAX_NESTING_LEVEL",
"newrelic.labels"=>"NEW_RELIC_LABELS",
"newrelic.process_host.display_name"=>"NEW_RELIC_PROCESS_HOST_DISPLAY_NAME",
"newrelic.webtransaction.name.files"=>"NEW_RELIC_WEBTRANSACTION_NAME_FILES",
"newrelic.guzzle.enabled"=>"NEW_RELIC_GUZZLE_ENABLED",
"newrelic.attributes.enabled"=>"NEW_RELIC_ATTRIBUTES_ENABLED",
"newrelic.attributes.include"=>"NEW_RELIC_ATTRIBUTES_INCLUDE",
"newrelic.attributes.exclude"=>"NEW_RELIC_ATTRIBUTES_EXCLUDE",
"newrelic.capture_params"=>"NEW_RELIC_CAPTURE_PARAMS",
"newrelic.ignored_params"=>"NEW_RELIC_IGNORED_PARAMS",
"newrelic.transaction_tracer.capture_attributes"=>"NEW_RELIC_TRANSACTION_TRACER_CAPTURE_ATTRIBUTES",
"newrelic.transaction_tracer.attributes.enabled"=>"NEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_ENABLED",
"newrelic.transaction_tracer.attributes.include"=>"NEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_INCLUDE",
"newrelic.transaction_tracer.attributes.exclude"=>"NEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_EXCLUDE",
"newrelic.transaction_tracer.enabled"=>"NEW_RELIC_TRANSACTION_TRACER_ENABLED",
"newrelic.transaction_tracer.explain_enabled"=>"NEW_RELIC_TRANSACTION_TRACER_EXPLAIN_ENABLED",
"newrelic.transaction_tracer.detail"=>"NEW_RELIC_TRANSACTION_TRACER_DETAIL",
"newrelic.transaction_tracer.max_segments_cli"=>"NEW_RELIC_TRANSACTION_TRACER_MAX_SEGMENTS_CLI",
"newrelic.transaction_tracer.max_segments_web"=>"NEW_RELIC_TRANSACTION_TRACER_MAX_SEGMENTS_WEB",
"newrelic.transaction_tracer.slow_sql"=>"NEW_RELIC_TRANSACTION_TRACER_SLOW_SQL",
"newrelic.transaction_tracer.threshold"=>"NEW_RELIC_TRANSACTION_TRACER_THRESHOLD",
"newrelic.transaction_tracer.explain_threshold"=>"NEW_RELIC_TRANSACTION_TRACER_EXPLAIN_THRESHOLD",
"newrelic.transaction_tracer.stack_trace_threshold"=>"NEW_RELIC_TRANSACTION_TRACER_STACK_TRACE_THRESHOLD",
"newrelic.transaction_tracer.record_sql"=>"NEW_RELIC_TRANSACTION_TRACER_RECORD_SQL",
"newrelic.transaction_tracer.gather_input_queries"=>"NEW_RELIC_TRANSACTION_TRACER_GATHER_INPUT_QUERIES",
"newrelic.transaction_tracer.internal_functions_enabled"=>"NEW_RELIC_TRANSACTION_TRACER_INTERNAL_FUNCTIONS_ENABLED",
"newrelic.error_collector.enabled"=>"NEW_RELIC_ERROR_COLLECTOR_ENABLED",
"newrelic.error_collector.ignore_user_exception_handler"=>"NEW_RELIC_ERROR_COLLECTOR_IGNORE_USER_EXCEPTION_HANDLER",
"newrelic.error_collector.ignore_errors"=>"NEW_RELIC_ERROR_COLLECTOR_IGNORE_ERRORS",
"newrelic.error_collector.ignore_exceptions"=>"NEW_RELIC_ERROR_COLLECTOR_IGNORE_EXCEPTIONS",
"newrelic.error_collector.record_database_errors"=>"NEW_RELIC_ERROR_COLLECTOR_RECORD_DATABASE_ERRORS",
"newrelic.error_collector.prioritize_api_errors"=>"NEW_RELIC_ERROR_COLLECTOR_PRIORITIZE_API_ERRORS",
"newrelic.error_collector.capture_attributes"=>"NEW_RELIC_ERROR_COLLECTOR_CAPTURE_ATTRIBUTES",
"newrelic.error_collector.attributes.enabled"=>"NEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_ENABLED",
"newrelic.error_collector.attributes.include"=>"NEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_INCLUDE",
"newrelic.error_collector.attributes.exclude"=>"NEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_EXCLUDE",
"newrelic.analytics_events.enabled"=>"NEW_RELIC_ANALYTICS_EVENTS_ENABLED",
"newrelic.analytics_events.capture_attributes"=>"NEW_RELIC_ANALYTICS_EVENTS_CAPTURE_ATTRIBUTES",
"newrelic.transaction_events.enabled"=>"NEW_RELIC_TRANSACTION_EVENTS_ENABLED",
"newrelic.error_collector.capture_events"=>"NEW_RELIC_ERROR_COLLECTOR_CAPTURE_EVENTS",
"newrelic.transaction_events.attributes.enabled"=>"NEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_ENABLED",
"newrelic.transaction_events.attributes.include"=>"NEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_INCLUDE",
"newrelic.transaction_events.attributes.exclude"=>"NEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_EXCLUDE",
"newrelic.custom_insights_events.enabled"=>"NEW_RELIC_CUSTOM_INSIGHTS_EVENTS_ENABLED",
"newrelic.custom_events.max_samples_stored"=>"NEW_RELIC_CUSTOM_EVENTS_MAX_SAMPLES_STORED",
"newrelic.synthetics.enabled"=>"NEW_RELIC_SYNTHETICS_ENABLED",
"newrelic.datastore_tracer.instance_reporting.enabled"=>"NEW_RELIC_DATASTORE_TRACER_INSTANCE_REPORTING_ENABLED",
"newrelic.datastore_tracer.database_name_reporting.enabled"=>"NEW_RELIC_DATASTORE_TRACER_DATABASE_NAME_REPORTING_ENABLED",
"newrelic.phpunit_events.enabled"=>"NEW_RELIC_PHPUNIT_EVENTS_ENABLED",
"newrelic.browser_monitoring.auto_instrument"=>"NEW_RELIC_BROWSER_MONITORING_AUTO_INSTRUMENT",
"newrelic.browser_monitoring.debug"=>"NEW_RELIC_BROWSER_MONITORING_DEBUG",
"newrelic.browser_monitoring.loader"=>"NEW_RELIC_BROWSER_MONITORING_LOADER",
"newrelic.browser_monitoring.capture_attributes"=>"NEW_RELIC_BROWSER_MONITORING_CAPTURE_ATTRIBUTES",
"newrelic.browser_monitoring.attributes.enabled"=>"NEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_ENABLED",
"newrelic.browser_monitoring.attributes.include"=>"NEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_INCLUDE",
"newrelic.browser_monitoring.attributes.exclude"=>"NEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_EXCLUDE",
"newrelic.webtransaction.name.functions"=>"NEW_RELIC_WEBTRANSACTION_NAME_FUNCTIONS",
"newrelic.transaction_tracer.custom"=>"NEW_RELIC_TRANSACTION_TRACER_CUSTOM",
"newrelic.security_policies_token"=>"NEW_RELIC_SECURITY_POLICIES_TOKEN",
"newrelic.allow_raw_exception_messages"=>"NEW_RELIC_ALLOW_RAW_EXCEPTION_MESSAGES",
"newrelic.custom_parameters_enabled"=>"NEW_RELIC_CUSTOM_PARAMETERS_ENABLED",
"newrelic.distributed_tracing_enabled"=>"NEW_RELIC_DISTRIBUTED_TRACING_ENABLED",
"newrelic.distributed_tracing_exclude_newrelic_header"=>"NEW_RELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER",
"newrelic.span_events_enabled"=>"NEW_RELIC_SPAN_EVENTS_ENABLED",
"newrelic.span_events.max_samples_stored"=>"NEW_RELIC_SPAN_EVENTS_MAX_SAMPLES_STORED",
"newrelic.span_events.attributes.enabled"=>"NEW_RELIC_SPAN_EVENTS_ATTRIBUTES_ENABLED",
"newrelic.span_events.attributes.include"=>"NEW_RELIC_SPAN_EVENTS_ATTRIBUTES_INCLUDE",
"newrelic.span_events.attributes.exclude"=>"NEW_RELIC_SPAN_EVENTS_ATTRIBUTES_EXCLUDE",
"newrelic.infinite_tracing.trace_observer.host"=>"NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST",
"newrelic.infinite_tracing.trace_observer.port"=>"NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_PORT",
"newrelic.infinite_tracing.span_events.queue_size"=>"NEW_RELIC_INFINITE_TRACING_SPAN_EVENTS_QUEUE_SIZE",
"newrelic.infinite_tracing.span_events.agent_queue.size"=>"NEW_RELIC_INFINITE_TRACING_SPAN_EVENTS_AGENT_QUEUE_SIZE",
"newrelic.infinite_tracing.span_events.agent_queue.timeout"=>"NEW_RELIC_INFINITE_TRACING_SPAN_EVENTS_AGENT_QUEUE_TIMEOUT",
"newrelic.code_level_metrics.enabled"=>"NEW_RELIC_CODE_LEVEL_METRICS_ENABLED",
"newrelic.application_logging.enabled"=>"NEW_RELIC_APPLICATION_LOGGING_ENABLED",
"newrelic.application_logging.local_decorating.enabled"=>"NEW_RELIC_APPLICATION_LOGGING_LOCAL_DECORATING_ENABLED",
"newrelic.application_logging.forwarding.enabled"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED",
"newrelic.application_logging.forwarding.max_samples_stored"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_MAX_SAMPLES_STORED",
"newrelic.application_logging.forwarding.log_level"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_LOG_LEVEL",
"newrelic.application_logging.metrics.enabled"=>"NEW_RELIC_APPLICATION_LOGGING_METRICS_ENABLED",
"newrelic.application_logging.forwarding.context_data.enabled"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_CONTEXT_DATA_ENABLED",
"newrelic.application_logging.forwarding.context_data.include"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_CONTEXT_DATA_INCLUDE",
"newrelic.application_logging.forwarding.context_data.exclude"=>"NEW_RELIC_APPLICATION_LOGGING_FORWARDING_CONTEXT_DATA_EXCLUDE",
"newrelic.vulnerability_management.package_detection.enabled"=>"NEW_RELIC_VULNERABILITY_MANAGEMENT_PACKAGE_DETECTION_ENABLED",
));
Loading