Skip to content

Commit c65dcb1

Browse files
committed
feat: enable Logs for Google-Cloud-Functions
1 parent bc86bb7 commit c65dcb1

File tree

4 files changed

+84
-5
lines changed

4 files changed

+84
-5
lines changed

samples/Sentry.Samples.Google.Cloud.Functions/Function.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class Function : IHttpFunction
1616

1717
public Task HandleAsync(HttpContext context)
1818
{
19+
_logger.LogTrace("LogLevel.Trace is not configured to be sent as structured log");
1920
_logger.LogInformation("Useful info that is added to the breadcrumb list.");
2021
throw new Exception("Bad function");
2122
}
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
{
2+
"Logging": {
3+
"LogLevel": {
4+
"Default": "Debug"
5+
},
6+
"Sentry": {
7+
"LogLevel": {
8+
"Default": "Information"
9+
}
10+
}
11+
},
212
"Sentry": {
313
//"Dsn": "TODO: Configure your DSN here and uncomment this line",
414
"MaxRequestBodySize": "Always",
515
"SendDefaultPii": true,
6-
"EnableTracing": true
16+
"EnableTracing": true,
17+
"EnableLogs" : true
718
}
819
}

src/Sentry.Google.Cloud.Functions/SentryStartup.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,17 @@ public override void ConfigureLogging(WebHostBuilderContext context, ILoggingBui
5757

5858
logging.Services.AddSingleton<IConfigureOptions<SentryAspNetCoreOptions>, SentryAspNetCoreOptionsSetup>();
5959
logging.Services.AddSingleton<ILoggerProvider, SentryAspNetCoreLoggerProvider>();
60+
logging.Services.AddSingleton<ILoggerProvider, SentryAspNetCoreStructuredLoggerProvider>();
6061

61-
logging.AddFilter<SentryAspNetCoreLoggerProvider>(
62-
"Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware",
63-
LogLevel.None);
62+
// Add a delegate rule in order to ignore Configuration like "appsettings.json" and "appsettings.{HostEnvironment}.json"
63+
logging.AddFilter<SentryAspNetCoreLoggerProvider>(static (string? categoryName, LogLevel logLevel) =>
64+
{
65+
return categoryName is null
66+
|| categoryName != "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware";
67+
});
68+
// Add non-delegate rules in order to respect Configuration like "appsettings.json" and "appsettings.{HostEnvironment}.json"
69+
logging.AddFilter<SentryAspNetCoreStructuredLoggerProvider>("Sentry.ISentryClient", LogLevel.None);
70+
logging.AddFilter<SentryAspNetCoreStructuredLoggerProvider>("Sentry.AspNetCore.SentryMiddleware", LogLevel.None);
6471

6572
logging.Services.AddSentry();
6673
}

test/Sentry.Google.Cloud.Functions.Tests/SentryStartupTests.cs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void ConfigureLogging_SentryAspNetCoreOptions_FlushOnCompletedRequestTrue
9696
}
9797

9898
[Theory, MemberData(nameof(ExpectedServices))]
99-
public void UseSentry_Parameterless_ServicesRegistered(Action<IServiceCollection> assert)
99+
public void ConfigureLogging_Parameterless_ServicesRegistered(Action<IServiceCollection> assert)
100100
{
101101
var sut = new SentryStartup();
102102
sut.ConfigureLogging(WebHostBuilderContext, LoggingBuilder);
@@ -121,4 +121,64 @@ public static IEnumerable<object[]> ExpectedServices()
121121
new Action<IServiceCollection>(c =>
122122
Assert.Single(c, d => d.ImplementationType == typeof(AspNetCoreEventProcessor)))};
123123
}
124+
125+
[Fact]
126+
public void ConfigureLogging_Logging_AddLoggerProviders()
127+
{
128+
LoggingBuilder.Services.Configure<SentryAspNetCoreOptions>(options =>
129+
{
130+
options.EnableLogs = true;
131+
options.InitializeSdk = false;
132+
});
133+
134+
var sut = new SentryStartup();
135+
sut.ConfigureLogging(WebHostBuilderContext, LoggingBuilder);
136+
137+
using var serviceProvider = LoggingBuilder.Services.BuildServiceProvider();
138+
var providers = serviceProvider.GetRequiredService<IEnumerable<ILoggerProvider>>().ToArray();
139+
140+
providers.Should().HaveCount(2);
141+
providers[0].Should().BeOfType<SentryAspNetCoreLoggerProvider>();
142+
providers[1].Should().BeOfType<SentryAspNetCoreStructuredLoggerProvider>();
143+
}
144+
145+
[Fact]
146+
public void ConfigureLogging_Logging_AddLoggerFilterRules()
147+
{
148+
LoggingBuilder.Services.Configure<SentryAspNetCoreOptions>(options =>
149+
{
150+
options.EnableLogs = true;
151+
options.InitializeSdk = false;
152+
});
153+
154+
var sut = new SentryStartup();
155+
sut.ConfigureLogging(WebHostBuilderContext, LoggingBuilder);
156+
157+
using var serviceProvider = LoggingBuilder.Services.BuildServiceProvider();
158+
var loggerFilterOptions = serviceProvider.GetRequiredService<IOptions<LoggerFilterOptions>>().Value;
159+
160+
loggerFilterOptions.Rules.Should().HaveCount(3);
161+
var one = loggerFilterOptions.Rules[0];
162+
var two = loggerFilterOptions.Rules[1];
163+
var three = loggerFilterOptions.Rules[2];
164+
165+
one.ProviderName.Should().Be(typeof(SentryAspNetCoreLoggerProvider).FullName);
166+
one.CategoryName.Should().BeNull();
167+
one.LogLevel.Should().BeNull();
168+
one.Filter.Should().NotBeNull();
169+
one.Filter!.Invoke(null, null, LogLevel.None).Should().BeTrue();
170+
one.Filter.Invoke("", "", LogLevel.None).Should().BeTrue();
171+
one.Filter.Invoke("type", "category", LogLevel.None).Should().BeTrue();
172+
one.Filter.Invoke(null, typeof(Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware).FullName, LogLevel.None).Should().BeFalse();
173+
174+
two.ProviderName.Should().Be(typeof(SentryAspNetCoreStructuredLoggerProvider).FullName);
175+
two.CategoryName.Should().Be(typeof(ISentryClient).FullName);
176+
two.LogLevel.Should().Be(LogLevel.None);
177+
two.Filter.Should().BeNull();
178+
179+
three.ProviderName.Should().Be(typeof(SentryAspNetCoreStructuredLoggerProvider).FullName);
180+
three.CategoryName.Should().Be(typeof(SentryMiddleware).FullName);
181+
three.LogLevel.Should().Be(LogLevel.None);
182+
three.Filter.Should().BeNull();
183+
}
124184
}

0 commit comments

Comments
 (0)