Skip to content

Commit 4d40066

Browse files
committed
#73 Added plugin to ignore events that match a user agent bot filter
1 parent ec14cb7 commit 4d40066

File tree

7 files changed

+55
-7
lines changed

7 files changed

+55
-7
lines changed

Source/Platforms/Mvc/ExceptionlessModule.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Web;
44
using System.Web.Mvc;
55
using Exceptionless.Dependency;
6+
using Exceptionless.Plugins;
67
using Exceptionless.Web;
78
using Exceptionless.Web.Extensions;
89

@@ -14,6 +15,7 @@ public virtual void Init(HttpApplication app) {
1415
ExceptionlessClient.Default.Startup();
1516
ExceptionlessClient.Default.RegisterHttpApplicationErrorHandler(app);
1617
ExceptionlessClient.Default.Configuration.AddPlugin<ExceptionlessWebPlugin>();
18+
ExceptionlessClient.Default.Configuration.AddPlugin<IgnoreUserAgentPlugin>();
1719
ExceptionlessClient.Default.Configuration.Resolver.Register<ILastReferenceIdManager, WebLastReferenceIdManager>();
1820

1921
_app = app;

Source/Platforms/Nancy/ExceptionlessNancyExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public static class ExceptionlessNancyExtensions {
2020
public static void RegisterNancy(this ExceptionlessClient client, IPipelines pipelines) {
2121
client.Startup();
2222
client.Configuration.AddPlugin<ExceptionlessNancyPlugin>();
23+
client.Configuration.AddPlugin<IgnoreUserAgentPlugin>();
2324

2425
pipelines.OnError += OnError;
2526
pipelines.AfterRequest += AfterRequest;

Source/Platforms/Web/ExceptionlessModule.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Web;
33
using Exceptionless.Dependency;
4+
using Exceptionless.Plugins;
45
using Exceptionless.Web.Extensions;
56

67
namespace Exceptionless.Web {
@@ -11,6 +12,7 @@ public virtual void Init(HttpApplication app) {
1112
ExceptionlessClient.Default.Startup();
1213
ExceptionlessClient.Default.RegisterHttpApplicationErrorHandler(app);
1314
ExceptionlessClient.Default.Configuration.AddPlugin<ExceptionlessWebPlugin>();
15+
ExceptionlessClient.Default.Configuration.AddPlugin<IgnoreUserAgentPlugin>();
1416
ExceptionlessClient.Default.Configuration.Resolver.Register<ILastReferenceIdManager, WebLastReferenceIdManager>();
1517

1618
_app = app;

Source/Platforms/WebApi/ExceptionlessWebApiExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Exceptionless.ExtendedData;
88
using Exceptionless.Models;
99
using Exceptionless.Models.Data;
10+
using Exceptionless.Plugins;
1011
using Exceptionless.WebApi;
1112

1213
namespace Exceptionless {
@@ -19,6 +20,7 @@ public static class ExceptionlessWebApiExtensions {
1920
public static void RegisterWebApi(this ExceptionlessClient client, HttpConfiguration config) {
2021
client.Startup();
2122
client.Configuration.AddPlugin<ExceptionlessWebApiPlugin>();
23+
client.Configuration.AddPlugin<IgnoreUserAgentPlugin>();
2224

2325
#if WEBAPI21
2426
config.Services.Add(typeof(IExceptionLogger), new ExceptionlessExceptionLogger());

Source/Shared/Configuration/ExceptionlessConfiguration.cs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ public class ExceptionlessConfiguration {
2020
private string _serverUrl;
2121
private int _submissionBatchSize;
2222
private ValidationResult _validationResult;
23-
private readonly List<string> _exclusions = new List<string>();
23+
private readonly List<string> _exclusions = new List<string>();
24+
private readonly List<string> _userAgentBotPatterns = new List<string>();
2425

2526
public ExceptionlessConfiguration(IDependencyResolver resolver) {
2627
if (resolver == null)
@@ -159,12 +160,7 @@ public int SubmissionBatchSize {
159160
/// parameters from the report.
160161
/// </summary>
161162
public IEnumerable<string> DataExclusions {
162-
get {
163-
if (Settings.ContainsKey(SettingsDictionary.KnownKeys.DataExclusions))
164-
return _exclusions.Union(Settings.GetStringCollection(SettingsDictionary.KnownKeys.DataExclusions));
165-
166-
return _exclusions.ToArray();
167-
}
163+
get { return _exclusions.Union(Settings.GetStringCollection(SettingsDictionary.KnownKeys.DataExclusions)); }
168164
}
169165

170166
/// <summary>
@@ -187,6 +183,32 @@ public void AddDataExclusions(IEnumerable<string> exclusions) {
187183
_exclusions.AddRange(exclusions);
188184
}
189185

186+
/// <summary>
187+
/// A list of user agent patterns that will cause any event with a matching user agent to not be submitted.
188+
/// For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.
189+
/// </summary>
190+
public IEnumerable<string> UserAgentBotPatterns {
191+
get { return _userAgentBotPatterns.Union(Settings.GetStringCollection(SettingsDictionary.KnownKeys.UserAgentBotPatterns)); }
192+
}
193+
194+
/// <summary>
195+
/// Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.
196+
/// For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.
197+
/// </summary>
198+
/// <param name="userAgentBotPatterns">The list of user agent bot patterns to add.</param>
199+
public void AddUserAgentBotPatterns(params string[] userAgentBotPatterns) {
200+
_userAgentBotPatterns.AddRange(userAgentBotPatterns);
201+
}
202+
203+
/// <summary>
204+
/// Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.
205+
/// For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.
206+
/// </summary>
207+
/// <param name="userAgentBotPatterns">The list of user agent bot patterns to add.</param>
208+
public void AddUserAgentBotPatterns(IEnumerable<string> userAgentBotPatterns) {
209+
_userAgentBotPatterns.AddRange(userAgentBotPatterns);
210+
}
211+
190212
/// <summary>
191213
/// The dependency resolver to use for this configuration.
192214
/// </summary>

Source/Shared/Exceptionless.Portable.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<Compile Include="Plugins\ContextData.cs" />
6565
<Compile Include="Plugins\Default\1000_CancelSessionsWithNoUserPlugin.cs" />
6666
<Compile Include="Plugins\Default\100_HeartbeatPlugin.cs" />
67+
<Compile Include="Plugins\Default\110_IgnoreUserAgentPlugin.cs" />
6768
<Compile Include="Plugins\Default\ActionPlugin.cs" />
6869
<Compile Include="Plugins\Default\010_ConfigurationDefaultsPlugin.cs" />
6970
<Compile Include="Plugins\Default\090_SubmissionMethodPlugin.cs" />
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using Exceptionless.Extensions;
3+
4+
namespace Exceptionless.Plugins {
5+
[Priority(100)]
6+
public class IgnoreUserAgentPlugin : IEventPlugin {
7+
public void Run(EventPluginContext context) {
8+
var request = context.Event.GetRequestInfo();
9+
if (request == null)
10+
return;
11+
12+
if (request.UserAgent.AnyWildcardMatches(context.Client.Configuration.UserAgentBotPatterns, true)) {
13+
context.Log.Info(String.Concat("Cancelling event as the request infos user agent matches a known bot pattern: ", request.UserAgent), typeof(IgnoreUserAgentPlugin).Name);
14+
context.Cancel = true;
15+
}
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)