Skip to content

Commit 1624938

Browse files
authored
fix: Cache the AgentEnabled setting value. (#1723)
1 parent 269023c commit 1624938

File tree

2 files changed

+50
-7
lines changed

2 files changed

+50
-7
lines changed

src/Agent/NewRelic/Agent/Core/Configuration/DefaultConfiguration.cs

+18-6
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,28 @@ private int TryGetAppSettingAsIntWithDefault(string key, int defaultValue)
183183

184184
public object AgentRunId { get { return _serverConfiguration.AgentRunId; } }
185185

186+
// protected to allow unit test wrapper to manipulate
187+
protected static bool? _agentEnabledAppSettingParsed;
188+
protected static bool _appSettingAgentEnabled;
189+
private static readonly object _lockObj = new object();
190+
191+
186192
public virtual bool AgentEnabled
187193
{
188194
get
189195
{
190-
var agentEnabledAsString = _configurationManagerStatic.GetAppSetting("NewRelic.AgentEnabled");
191-
192-
bool agentEnabled;
193-
if (!bool.TryParse(agentEnabledAsString, out agentEnabled))
194-
return _localConfiguration.agentEnabled;
196+
// read from app setting one time only and cache the result
197+
if (!_agentEnabledAppSettingParsed.HasValue)
198+
{
199+
lock (_lockObj)
200+
{
201+
_agentEnabledAppSettingParsed ??= bool.TryParse(_configurationManagerStatic.GetAppSetting("NewRelic.AgentEnabled"),
202+
out _appSettingAgentEnabled);
203+
}
204+
}
195205

196-
return agentEnabled;
206+
// read from local config if we couldn't parse from app settings
207+
return _agentEnabledAppSettingParsed.Value ? _appSettingAgentEnabled : _localConfiguration.agentEnabled;
197208
}
198209
}
199210

@@ -2681,6 +2692,7 @@ private void LogDisabledPropertyUse(string disabledPropertyName, string newPrope
26812692
TryGetAppSettingAsIntWithDefault("SqlStatementCacheCapacity", DefaultSqlStatementCacheCapacity)).Value;
26822693

26832694
private bool? _codeLevelMetricsEnabled;
2695+
26842696
public bool CodeLevelMetricsEnabled
26852697
{
26862698
get

tests/Agent/UnitTests/Core.UnitTest/Configuration/DefaultConfigurationTests.cs

+32-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ internal class TestableDefaultConfiguration : DefaultConfiguration
2020
{
2121
public TestableDefaultConfiguration(IEnvironment environment, configuration localConfig, ServerConfiguration serverConfig, RunTimeConfiguration runTimeConfiguration, SecurityPoliciesConfiguration securityPoliciesConfiguration, IProcessStatic processStatic, IHttpRuntimeStatic httpRuntimeStatic, IConfigurationManagerStatic configurationManagerStatic, IDnsStatic dnsStatic)
2222
: base(environment, localConfig, serverConfig, runTimeConfiguration, securityPoliciesConfiguration, processStatic, httpRuntimeStatic, configurationManagerStatic, dnsStatic) { }
23+
24+
public static void ResetStatics()
25+
{
26+
_agentEnabledAppSettingParsed = null;
27+
_appSettingAgentEnabled = false;
28+
}
2329
}
2430

2531
[TestFixture, Category("Configuration")]
@@ -50,15 +56,40 @@ public void SetUp()
5056
_dnsStatic = Mock.Create<IDnsStatic>();
5157

5258
_defaultConfig = new TestableDefaultConfiguration(_environment, _localConfig, _serverConfig, _runTimeConfig, _securityPoliciesConfiguration, _processStatic, _httpRuntimeStatic, _configurationManagerStatic, _dnsStatic);
59+
60+
TestableDefaultConfiguration.ResetStatics();
5361
}
5462

5563
[Test]
5664
public void AgentEnabledShouldPassThroughToLocalConfig()
5765
{
5866
Assert.IsTrue(_defaultConfig.AgentEnabled);
67+
68+
_localConfig.agentEnabled = false;
69+
Assert.IsFalse(_defaultConfig.AgentEnabled);
70+
5971
_localConfig.agentEnabled = true;
6072
Assert.IsTrue(_defaultConfig.AgentEnabled);
61-
_localConfig.agentEnabled = false;
73+
}
74+
75+
[Test]
76+
public void AgentEnabledShouldUseCachedAppSetting()
77+
{
78+
Mock.Arrange(() => _configurationManagerStatic.GetAppSetting("NewRelic.AgentEnabled")).Returns("false");
79+
80+
Assert.IsFalse(_defaultConfig.AgentEnabled);
81+
Assert.IsFalse(_defaultConfig.AgentEnabled);
82+
83+
Mock.Assert(() => _configurationManagerStatic.GetAppSetting("NewRelic.AgentEnabled"), Occurs.Once());
84+
}
85+
86+
[Test]
87+
public void AgentEnabledShouldPreferAppSettingOverLocalConfig()
88+
{
89+
Mock.Arrange(() => _configurationManagerStatic.GetAppSetting("NewRelic.AgentEnabled")).Returns("false");
90+
91+
_localConfig.agentEnabled = true;
92+
6293
Assert.IsFalse(_defaultConfig.AgentEnabled);
6394
}
6495

0 commit comments

Comments
 (0)