Skip to content

Commit 8aa7c5d

Browse files
committed
Added the ability to automatically get settings after 5 minutes of being idle
1 parent 409136e commit 8aa7c5d

File tree

5 files changed

+60
-1
lines changed

5 files changed

+60
-1
lines changed

Source/Shared/Configuration/SettingsManager.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
namespace Exceptionless.Configuration {
99
public static class SettingsManager {
1010
public static void ApplySavedServerSettings(ExceptionlessConfiguration config) {
11+
if (config == null)
12+
return;
13+
1114
if (String.IsNullOrEmpty(config.ApiKey) || String.Equals(config.ApiKey, "API_KEY_HERE", StringComparison.OrdinalIgnoreCase)) {
1215
config.Resolver.GetLog().Error(typeof(SettingsManager), "Unable to apply saved server settings: ApiKey is not set.");
1316
return;
@@ -18,6 +21,9 @@ public static void ApplySavedServerSettings(ExceptionlessConfiguration config) {
1821
}
1922

2023
private static SettingsDictionary GetSavedServerSettings(ExceptionlessConfiguration config) {
24+
if (config == null)
25+
return new SettingsDictionary();
26+
2127
string configPath = GetConfigPath(config);
2228
if (String.IsNullOrEmpty(configPath))
2329
return new SettingsDictionary();
@@ -36,6 +42,9 @@ private static SettingsDictionary GetSavedServerSettings(ExceptionlessConfigurat
3642
}
3743

3844
public static void CheckVersion(int version, ExceptionlessConfiguration config) {
45+
if (config == null)
46+
return;
47+
3948
if (String.IsNullOrEmpty(config.ApiKey) || String.Equals(config.ApiKey, "API_KEY_HERE", StringComparison.OrdinalIgnoreCase)) {
4049
config.Resolver.GetLog().Error(typeof(SettingsManager), "Unable to check version: ApiKey is not set.");
4150
return;
@@ -49,6 +58,9 @@ public static void CheckVersion(int version, ExceptionlessConfiguration config)
4958
}
5059

5160
public static void UpdateSettings(ExceptionlessConfiguration config) {
61+
if (config == null)
62+
return;
63+
5264
if (String.IsNullOrEmpty(config.ApiKey) || String.Equals(config.ApiKey, "API_KEY_HERE", StringComparison.OrdinalIgnoreCase)) {
5365
config.Resolver.GetLog().Error(typeof(SettingsManager), "Unable to update settings: ApiKey is not set.");
5466
return;
@@ -79,7 +91,7 @@ public static void UpdateSettings(ExceptionlessConfiguration config) {
7991
}
8092

8193
private static string GetConfigPath(ExceptionlessConfiguration config) {
82-
return config.GetQueueName() + "\\server-settings.json";
94+
return (config != null ? config.GetQueueName() : String.Empty) + "\\server-settings.json";
8395
}
8496
}
8597
}

Source/Shared/Exceptionless.Portable.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<Compile Include="Plugins\Default\050_EnvironmentInfoPlugin.cs" />
7777
<Compile Include="Plugins\Default\005_HandleAggregateExceptionsPlugin.cs" />
7878
<Compile Include="Plugins\Default\010_EventExclusionPlugin.cs" />
79+
<Compile Include="Plugins\Default\1020_UpdateConfigurationSettingsWhileIdlePlugin.cs" />
7980
<Compile Include="Plugins\PriortyAttribute.cs" />
8081
<Compile Include="EventBuilder.cs" />
8182
<Compile Include="Events\ConfigurationUpdatedEventArgs.cs" />
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Threading;
3+
using Exceptionless.Configuration;
4+
using Exceptionless.Dependency;
5+
using Exceptionless.Logging;
6+
7+
namespace Exceptionless.Plugins.Default {
8+
[Priority(1020)]
9+
public class UpdateConfigurationSettingsWhileIdlePlugin : IEventPlugin, IDisposable {
10+
private readonly Timer _timer;
11+
private readonly TimeSpan _interval;
12+
private readonly ExceptionlessConfiguration _configuration;
13+
14+
/// <summary>
15+
/// Automatically sync the configuration settings when the client hasn't sent any events for a period of time.
16+
/// </summary>
17+
/// <param name="configuration">The configuration.</param>
18+
/// <param name="interval">The interval at which the client will automatically ensure the configuration settings are up-to-date when idle.</param>
19+
public UpdateConfigurationSettingsWhileIdlePlugin(ExceptionlessConfiguration configuration, TimeSpan? interval = null) {
20+
_configuration = configuration;
21+
22+
var startupInterval = interval ?? TimeSpan.FromSeconds(5);
23+
_interval = interval.HasValue && interval.Value.Ticks > 0 ? interval.Value : TimeSpan.FromMinutes(5);
24+
_timer = new Timer(UpdateConfiguration, null, startupInterval, _interval);
25+
}
26+
27+
public void Run(EventPluginContext context) {
28+
_timer.Change(_interval, _interval);
29+
}
30+
31+
private void UpdateConfiguration(object state) {
32+
try {
33+
SettingsManager.UpdateSettings(_configuration);
34+
} catch (Exception ex) {
35+
var log = _configuration.Resolver.GetLog();
36+
log.Error(ex, "Error while updating configuration settings.");
37+
}
38+
}
39+
40+
public void Dispose() {
41+
_timer.Dispose();
42+
}
43+
}
44+
}

Source/Shared/Plugins/EventPluginManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public static void AddDefaultPlugins(ExceptionlessConfiguration config) {
3232
config.AddPlugin<EnvironmentInfoPlugin>();
3333
config.AddPlugin<SubmissionMethodPlugin>();
3434
config.AddPlugin<CancelSessionsWithNoUserPlugin>();
35+
config.AddPlugin<UpdateConfigurationSettingsWhileIdlePlugin>(new UpdateConfigurationSettingsWhileIdlePlugin(config));
3536
}
3637
}
3738
}

Source/Tests/Plugins/PluginTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public void EventExclusionPlugin_EventExclusions() {
150150
[InlineData("Test", "Info", SettingsDictionary.KnownKeys.LogLevelPrefix + "Test", "Debug", false)]
151151
[InlineData("Test", "Trace", SettingsDictionary.KnownKeys.LogLevelPrefix + "*", "Debug", true)]
152152
[InlineData("Test", "Warn", SettingsDictionary.KnownKeys.LogLevelPrefix + "*", "Debug", false)]
153+
[InlineData("Test", "Warn", SettingsDictionary.KnownKeys.LogLevelPrefix + "*", "Off", true)]
153154
public void EventExclusionPlugin_LogLevels(string source, string level, string settingKey, string settingValue, bool cancelled) {
154155
var client = CreateClient();
155156
if (settingKey != null)

0 commit comments

Comments
 (0)