Skip to content

Commit 1c7e8e6

Browse files
authored
Merge pull request #5943 from getsentry/feat/logs-opt-in-timber
feat(android): [Logs and Metrics Enable Flags 4] Add Timber Logs opt-in
2 parents 46a0ae4 + f0d4297 commit 1c7e8e6

13 files changed

Lines changed: 171 additions & 11 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Features
66

7+
- Add an explicit Logs opt-in to the Android Timber integration ([#5943](https://github.com/getsentry/sentry-java/pull/5943))
78
- Add an explicit Logs opt-in to the JUL handler ([#5942](https://github.com/getsentry/sentry-java/pull/5942))
89
- Add an explicit Logs opt-in to the Log4j2 appender ([#5941](https://github.com/getsentry/sentry-java/pull/5941))
910
- Add an explicit Logs opt-in to the Logback appender ([#5940](https://github.com/getsentry/sentry-java/pull/5940))

‎sentry-android-core/api/sentry-android-core.api‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr
462462
public fun isEnableStandaloneAppStartTracing ()Z
463463
public fun isEnableSystemEventBreadcrumbs ()Z
464464
public fun isEnableSystemEventBreadcrumbsExtras ()Z
465+
public fun isEnableTimberLogs ()Z
465466
public fun isMemoryLimiterEnabled ()Z
466467
public fun isReportHistoricalAnrs ()Z
467468
public fun isReportHistoricalMemoryLimiterExits ()Z
@@ -497,6 +498,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr
497498
public fun setEnableStandaloneAppStartTracing (Z)V
498499
public fun setEnableSystemEventBreadcrumbs (Z)V
499500
public fun setEnableSystemEventBreadcrumbsExtras (Z)V
501+
public fun setEnableTimberLogs (Z)V
500502
public fun setFrameMetricsCollector (Lio/sentry/android/core/internal/util/SentryFrameMetricsCollector;)V
501503
public fun setMemoryLimiterEnabled (Z)V
502504
public fun setNativeHandlerStrategy (Lio/sentry/android/core/NdkHandlerStrategy;)V

‎sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ static void installDefaultIntegrations(
479479
}
480480

481481
if (isTimberAvailable) {
482-
options.addIntegration(new SentryTimberIntegration());
482+
options.addIntegration(new SentryTimberIntegration(options.isEnableTimberLogs()));
483483
}
484484
options.addIntegration(new AppComponentsBreadcrumbsIntegration(context));
485485
options.addIntegration(new SystemEventsBreadcrumbsIntegration(context));

‎sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ final class ManifestMetadataReader {
194194

195195
static final String ENABLE_LOGS = "io.sentry.logs.enabled";
196196

197+
static final String ENABLE_TIMBER_LOGS = "io.sentry.timber.logs.enabled";
198+
197199
static final String ENABLE_METRICS = "io.sentry.metrics.enabled";
198200

199201
static final String ENABLE_AUTO_TRACE_ID_GENERATION =
@@ -754,6 +756,9 @@ static void applyMetadata(
754756
.getLogs()
755757
.setEnabled(readBool(metadata, logger, ENABLE_LOGS, options.getLogs().isEnabled()));
756758

759+
options.setEnableTimberLogs(
760+
readBool(metadata, logger, ENABLE_TIMBER_LOGS, options.isEnableTimberLogs()));
761+
757762
options
758763
.getMetrics()
759764
.setEnabled(

‎sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ public final class SentryAndroidOptions extends SentryOptions {
7575
/** Enable or disable automatic breadcrumbs for Network Events Using NetworkCallback */
7676
private boolean enableNetworkEventBreadcrumbs = true;
7777

78+
/** Enable or disable automatic Sentry Logs capture from Timber. Default is disabled. */
79+
private boolean enableTimberLogs = false;
80+
7881
/**
7982
* Enables the Auto instrumentation for Activity lifecycle tracing.
8083
*
@@ -505,6 +508,14 @@ public void setEnableNetworkEventBreadcrumbs(boolean enableNetworkEventBreadcrum
505508
this.enableNetworkEventBreadcrumbs = enableNetworkEventBreadcrumbs;
506509
}
507510

511+
public boolean isEnableTimberLogs() {
512+
return enableTimberLogs;
513+
}
514+
515+
public void setEnableTimberLogs(boolean enableTimberLogs) {
516+
this.enableTimberLogs = enableTimberLogs;
517+
}
518+
508519
/**
509520
* Enable or disable all the automatic breadcrumbs
510521
*

‎sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -706,8 +706,21 @@ class AndroidOptionsInitializerTest {
706706
fun `SentryTimberIntegration added to the integration list if available on classpath`() {
707707
fixture.initSutWithClassLoader(isTimberAvailable = true)
708708

709-
val actual = fixture.sentryOptions.integrations.firstOrNull { it is SentryTimberIntegration }
710-
assertNotNull(actual)
709+
val actual =
710+
fixture.sentryOptions.integrations.firstOrNull { it is SentryTimberIntegration }
711+
as SentryTimberIntegration
712+
assertFalse(actual.enableLogs)
713+
}
714+
715+
@Test
716+
fun `SentryTimberIntegration receives Timber logs option`() {
717+
fixture.sentryOptions.isEnableTimberLogs = true
718+
fixture.initSutWithClassLoader(isTimberAvailable = true)
719+
720+
val actual =
721+
fixture.sentryOptions.integrations.firstOrNull { it is SentryTimberIntegration }
722+
as SentryTimberIntegration
723+
assertTrue(actual.enableLogs)
711724
}
712725

713726
@Test

‎sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,6 +2200,25 @@ class ManifestMetadataReaderTest {
22002200
assertTrue(fixture.options.logs.isEnabled)
22012201
}
22022202

2203+
@Test
2204+
fun `applyMetadata keeps Timber logs disabled if not found`() {
2205+
val context = fixture.getContext()
2206+
2207+
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
2208+
2209+
assertFalse(fixture.options.isEnableTimberLogs)
2210+
}
2211+
2212+
@Test
2213+
fun `applyMetadata reads Timber logs enabled to options`() {
2214+
val bundle = bundleOf(ManifestMetadataReader.ENABLE_TIMBER_LOGS to true)
2215+
val context = fixture.getContext(metaData = bundle)
2216+
2217+
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
2218+
2219+
assertTrue(fixture.options.isEnableTimberLogs)
2220+
}
2221+
22032222
@Test
22042223
fun `applyMetadata reads metrics enabled and keep default value if not found`() {
22052224
// Arrange

‎sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,21 @@ class SentryAndroidOptionsTest {
9393
assertTrue(sentryOptions.isEnableScopeSync)
9494
}
9595

96+
@Test
97+
fun `Timber logs are disabled by default`() {
98+
val sentryOptions = SentryAndroidOptions()
99+
100+
assertFalse(sentryOptions.isEnableTimberLogs)
101+
}
102+
103+
@Test
104+
fun `Timber logs can be enabled`() {
105+
val sentryOptions = SentryAndroidOptions()
106+
sentryOptions.isEnableTimberLogs = true
107+
108+
assertTrue(sentryOptions.isEnableTimberLogs)
109+
}
110+
96111
@Test
97112
fun `attach screenshots disabled by default for Android`() {
98113
val sentryOptions = SentryAndroidOptions()

‎sentry-android-timber/api/sentry-android-timber.api‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ public final class io/sentry/android/timber/SentryTimberIntegration : io/sentry/
1111
public fun <init> ()V
1212
public fun <init> (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;)V
1313
public synthetic fun <init> (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
14+
public fun <init> (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;Z)V
15+
public fun <init> (Z)V
1416
public fun close ()V
17+
public final fun getEnableLogs ()Z
1518
public final fun getMinBreadcrumbLevel ()Lio/sentry/SentryLevel;
1619
public final fun getMinEventLevel ()Lio/sentry/SentryLevel;
1720
public final fun getMinLogsLevel ()Lio/sentry/SentryLogLevel;
@@ -21,6 +24,7 @@ public final class io/sentry/android/timber/SentryTimberIntegration : io/sentry/
2124
public final class io/sentry/android/timber/SentryTimberTree : timber/log/Timber$Tree {
2225
public fun <init> (Lio/sentry/IScopes;Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;)V
2326
public synthetic fun <init> (Lio/sentry/IScopes;Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
27+
public fun <init> (Lio/sentry/IScopes;Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;Z)V
2428
public fun d (Ljava/lang/String;[Ljava/lang/Object;)V
2529
public fun d (Ljava/lang/Throwable;)V
2630
public fun d (Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V

‎sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ public class SentryTimberIntegration(
1818
public val minBreadcrumbLevel: SentryLevel = SentryLevel.INFO,
1919
public val minLogsLevel: SentryLogLevel = SentryLogLevel.INFO,
2020
) : Integration, Closeable {
21+
public var enableLogs: Boolean = false
22+
private set
23+
24+
public constructor(enableLogs: Boolean) : this() {
25+
this.enableLogs = enableLogs
26+
}
27+
28+
public constructor(
29+
minEventLevel: SentryLevel,
30+
minBreadcrumbLevel: SentryLevel,
31+
minLogsLevel: SentryLogLevel,
32+
enableLogs: Boolean,
33+
) : this(minEventLevel, minBreadcrumbLevel, minLogsLevel) {
34+
this.enableLogs = enableLogs
35+
}
36+
2137
private lateinit var tree: SentryTimberTree
2238
private lateinit var logger: ILogger
2339

@@ -31,7 +47,7 @@ public class SentryTimberIntegration(
3147
override fun register(scopes: IScopes, options: SentryOptions) {
3248
logger = options.logger
3349

34-
tree = SentryTimberTree(scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel)
50+
tree = SentryTimberTree(scopes, minEventLevel, minBreadcrumbLevel, minLogsLevel, enableLogs)
3551
Timber.plant(tree)
3652

3753
logger.log(SentryLevel.DEBUG, "SentryTimberIntegration installed.")

0 commit comments

Comments
 (0)