Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@

## Unreleased

### Features

- Support collections and arrays in log attribute type inference ([#5124](https://github.com/getsentry/sentry-java/pull/5124))
- Add scope-level attributes API ([#5118](https://github.com/getsentry/sentry-java/pull/5118))
- Automatically include scope attributes in logs and metrics ([#5120](https://github.com/getsentry/sentry-java/pull/5120))

### Fixes

- Fix attribute type detection for `Long`, `Short`, `Byte`, `BigInteger`, `AtomicInteger`, and `AtomicLong` being incorrectly inferred as `double` instead of `integer` ([#5122](https://github.com/getsentry/sentry-java/pull/5122))
- Fix crash when unregistering `SystemEventsBroadcastReceiver` with try-catch block. ([#5106](https://github.com/getsentry/sentry-java/pull/5106))

## 8.33.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public class MetricController {

@GetMapping("count")
String count() {
Sentry.setAttribute("user.type", "admin");
Sentry.setAttribute("feature.version", 2);
Sentry.metrics().count("countMetric");
return "count metric increased";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ Person person(@PathVariable Long id) {
ISpan currentSpan = Sentry.getSpan();
ISpan sentrySpan = currentSpan.startChild("spanCreatedThroughSentryApi");
try {
Sentry.setAttribute("user.type", "admin");
Sentry.setAttribute("feature.version", 2);
Sentry.setAttribute("debug.enabled", true);

Sentry.logger().warn("warn Sentry logging");
Sentry.logger().error("error Sentry logging");
Sentry.logger().info("hello %s %s", "there", "world!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ class MetricsSystemTest {
assertEquals(200, restClient.lastKnownStatusCode)

testHelper.ensureMetricsReceived { event, header ->
testHelper.doesContainMetric(event, "countMetric", "counter", 1.0)
testHelper.doesContainMetric(event, "countMetric", "counter", 1.0) &&
testHelper.doesMetricHaveAttribute(event, "countMetric", "user.type", "admin") &&
testHelper.doesMetricHaveAttribute(event, "countMetric", "feature.version", 2)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,20 @@ class PersonSystemTest {
testHelper.ensureLogsReceived { logs, envelopeHeader ->
testHelper.doesContainLogWithBody(logs, "warn Sentry logging") &&
testHelper.doesContainLogWithBody(logs, "error Sentry logging") &&
testHelper.doesContainLogWithBody(logs, "hello there world!")
testHelper.doesContainLogWithBody(logs, "hello there world!") &&
testHelper.doesLogWithBodyHaveAttribute(
logs,
"warn Sentry logging",
"user.type",
"admin",
) &&
testHelper.doesLogWithBodyHaveAttribute(
logs,
"warn Sentry logging",
"feature.version",
2,
) &&
testHelper.doesLogWithBodyHaveAttribute(logs, "warn Sentry logging", "debug.enabled", true)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,8 @@ public final class io/sentry/systemtest/util/TestHelper {
public static synthetic fun doesContainMetric$default (Lio/sentry/systemtest/util/TestHelper;Lio/sentry/SentryMetricsEvents;Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;ILjava/lang/Object;)Z
public final fun doesEventHaveExceptionMessage (Lio/sentry/SentryEvent;Ljava/lang/String;)Z
public final fun doesEventHaveFlag (Lio/sentry/SentryEvent;Ljava/lang/String;Z)Z
public final fun doesLogWithBodyHaveAttribute (Lio/sentry/SentryLogEvents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Z
public final fun doesMetricHaveAttribute (Lio/sentry/SentryMetricsEvents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Z
public final fun doesTransactionContainSpanWithDescription (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z
public final fun doesTransactionContainSpanWithOp (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z
public final fun doesTransactionContainSpanWithOpAndDescription (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Ljava/lang/String;)Z
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,68 @@ class TestHelper(backendUrl: String) {
return true
}

fun doesLogWithBodyHaveAttribute(
logs: SentryLogEvents,
body: String,
attributeKey: String,
attributeValue: Any?,
): Boolean {
val logItem = logs.items.firstOrNull { logItem -> logItem.body == body }
if (logItem == null) {
println("Unable to find log item with body $body in logs:")
logObject(logs)
return false
}

val attr = logItem.attributes?.get(attributeKey)
if (attr == null) {
println("Unable to find attribute $attributeKey on log with body $body:")
logObject(logItem)
return false
}

if (attr.value != attributeValue) {
println(
"Attribute $attributeKey has value ${attr.value} but expected $attributeValue on log with body $body:"
)
logObject(logItem)
return false
}

return true
}

fun doesMetricHaveAttribute(
metrics: SentryMetricsEvents,
metricName: String,
attributeKey: String,
attributeValue: Any?,
): Boolean {
val metricItem = metrics.items.firstOrNull { it.name == metricName }
if (metricItem == null) {
println("Unable to find metric with name $metricName in metrics:")
logObject(metrics)
return false
}

val attr = metricItem.attributes?.get(attributeKey)
if (attr == null) {
println("Unable to find attribute $attributeKey on metric $metricName:")
logObject(metricItem)
return false
}

if (attr.value != attributeValue) {
println(
"Attribute $attributeKey has value ${attr.value} but expected $attributeValue on metric $metricName:"
)
logObject(metricItem)
return false
}

return true
}

private fun checkIfTransactionMatches(
envelopeString: String,
callback: ((SentryTransaction, SentryEnvelopeHeader) -> Boolean),
Expand Down
56 changes: 56 additions & 0 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ public final class io/sentry/CombinedScopeView : io/sentry/IScope {
public synthetic fun clone ()Ljava/lang/Object;
public fun endSession ()Lio/sentry/Session;
public fun getAttachments ()Ljava/util/List;
public fun getAttributes ()Ljava/util/Map;
public fun getBreadcrumbs ()Ljava/util/Queue;
public fun getClient ()Lio/sentry/ISentryClient;
public fun getContexts ()Lio/sentry/protocol/Contexts;
Expand All @@ -298,11 +299,15 @@ public final class io/sentry/CombinedScopeView : io/sentry/IScope {
public fun getTransaction ()Lio/sentry/ITransaction;
public fun getTransactionName ()Ljava/lang/String;
public fun getUser ()Lio/sentry/protocol/User;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeContexts (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun replaceOptions (Lio/sentry/SentryOptions;)V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
Expand Down Expand Up @@ -670,10 +675,14 @@ public final class io/sentry/HubAdapter : io/sentry/IHub {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -742,10 +751,14 @@ public final class io/sentry/HubScopesWrapper : io/sentry/IHub {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -865,6 +878,7 @@ public abstract interface class io/sentry/IScope {
public abstract fun clone ()Lio/sentry/IScope;
public abstract fun endSession ()Lio/sentry/Session;
public abstract fun getAttachments ()Ljava/util/List;
public abstract fun getAttributes ()Ljava/util/Map;
public abstract fun getBreadcrumbs ()Ljava/util/Queue;
public abstract fun getClient ()Lio/sentry/ISentryClient;
public abstract fun getContexts ()Lio/sentry/protocol/Contexts;
Expand All @@ -887,11 +901,15 @@ public abstract interface class io/sentry/IScope {
public abstract fun getTransaction ()Lio/sentry/ITransaction;
public abstract fun getTransactionName ()Ljava/lang/String;
public abstract fun getUser ()Lio/sentry/protocol/User;
public abstract fun removeAttribute (Ljava/lang/String;)V
public abstract fun removeContexts (Ljava/lang/String;)V
public abstract fun removeExtra (Ljava/lang/String;)V
public abstract fun removeTag (Ljava/lang/String;)V
public abstract fun replaceOptions (Lio/sentry/SentryOptions;)V
public abstract fun setActiveSpan (Lio/sentry/ISpan;)V
public abstract fun setAttribute (Lio/sentry/SentryAttribute;)V
public abstract fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public abstract fun setAttributes (Lio/sentry/SentryAttributes;)V
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
public abstract fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
Expand Down Expand Up @@ -1003,10 +1021,14 @@ public abstract interface class io/sentry/IScopes {
public abstract fun popScope ()V
public abstract fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public abstract fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public abstract fun removeAttribute (Ljava/lang/String;)V
public abstract fun removeExtra (Ljava/lang/String;)V
public abstract fun removeTag (Ljava/lang/String;)V
public abstract fun reportFullyDisplayed ()V
public abstract fun setActiveSpan (Lio/sentry/ISpan;)V
public abstract fun setAttribute (Lio/sentry/SentryAttribute;)V
public abstract fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public abstract fun setAttributes (Lio/sentry/SentryAttributes;)V
public abstract fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public abstract fun setFingerprint (Ljava/util/List;)V
public abstract fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -1579,10 +1601,14 @@ public final class io/sentry/NoOpHub : io/sentry/IHub {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -1649,6 +1675,7 @@ public final class io/sentry/NoOpScope : io/sentry/IScope {
public synthetic fun clone ()Ljava/lang/Object;
public fun endSession ()Lio/sentry/Session;
public fun getAttachments ()Ljava/util/List;
public fun getAttributes ()Ljava/util/Map;
public fun getBreadcrumbs ()Ljava/util/Queue;
public fun getClient ()Lio/sentry/ISentryClient;
public fun getContexts ()Lio/sentry/protocol/Contexts;
Expand All @@ -1672,11 +1699,15 @@ public final class io/sentry/NoOpScope : io/sentry/IScope {
public fun getTransaction ()Lio/sentry/ITransaction;
public fun getTransactionName ()Ljava/lang/String;
public fun getUser ()Lio/sentry/protocol/User;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeContexts (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun replaceOptions (Lio/sentry/SentryOptions;)V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
Expand Down Expand Up @@ -1756,10 +1787,14 @@ public final class io/sentry/NoOpScopes : io/sentry/IScopes {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -2325,6 +2360,7 @@ public final class io/sentry/Scope : io/sentry/IScope {
public synthetic fun clone ()Ljava/lang/Object;
public fun endSession ()Lio/sentry/Session;
public fun getAttachments ()Ljava/util/List;
public fun getAttributes ()Ljava/util/Map;
public fun getBreadcrumbs ()Ljava/util/Queue;
public fun getClient ()Lio/sentry/ISentryClient;
public fun getContexts ()Lio/sentry/protocol/Contexts;
Expand All @@ -2347,11 +2383,15 @@ public final class io/sentry/Scope : io/sentry/IScope {
public fun getTransaction ()Lio/sentry/ITransaction;
public fun getTransactionName ()Ljava/lang/String;
public fun getUser ()Lio/sentry/protocol/User;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeContexts (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun replaceOptions (Lio/sentry/SentryOptions;)V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Character;)V
public fun setContexts (Ljava/lang/String;Ljava/lang/Number;)V
Expand Down Expand Up @@ -2482,10 +2522,14 @@ public final class io/sentry/Scopes : io/sentry/IScopes {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -2555,10 +2599,14 @@ public final class io/sentry/ScopesAdapter : io/sentry/IScopes {
public fun popScope ()V
public fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public fun removeAttribute (Ljava/lang/String;)V
public fun removeExtra (Ljava/lang/String;)V
public fun removeTag (Ljava/lang/String;)V
public fun reportFullyDisplayed ()V
public fun setActiveSpan (Lio/sentry/ISpan;)V
public fun setAttribute (Lio/sentry/SentryAttribute;)V
public fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public fun setAttributes (Lio/sentry/SentryAttributes;)V
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
public fun setFingerprint (Ljava/util/List;)V
public fun setLevel (Lio/sentry/SentryLevel;)V
Expand Down Expand Up @@ -2676,10 +2724,14 @@ public final class io/sentry/Sentry {
public static fun popScope ()V
public static fun pushIsolationScope ()Lio/sentry/ISentryLifecycleToken;
public static fun pushScope ()Lio/sentry/ISentryLifecycleToken;
public static fun removeAttribute (Ljava/lang/String;)V
public static fun removeExtra (Ljava/lang/String;)V
public static fun removeTag (Ljava/lang/String;)V
public static fun replay ()Lio/sentry/IReplayApi;
public static fun reportFullyDisplayed ()V
public static fun setAttribute (Lio/sentry/SentryAttribute;)V
public static fun setAttribute (Ljava/lang/String;Ljava/lang/Object;)V
public static fun setAttributes (Lio/sentry/SentryAttributes;)V
public static fun setCurrentHub (Lio/sentry/IHub;)Lio/sentry/ISentryLifecycleToken;
public static fun setCurrentScopes (Lio/sentry/IScopes;)Lio/sentry/ISentryLifecycleToken;
public static fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
Expand Down Expand Up @@ -2761,6 +2813,7 @@ public final class io/sentry/SentryAppStartProfilingOptions$JsonKeys {
}

public final class io/sentry/SentryAttribute {
public static fun arrayAttribute (Ljava/lang/String;Ljava/util/Collection;)Lio/sentry/SentryAttribute;
public static fun booleanAttribute (Ljava/lang/String;Ljava/lang/Boolean;)Lio/sentry/SentryAttribute;
public static fun doubleAttribute (Ljava/lang/String;Ljava/lang/Double;)Lio/sentry/SentryAttribute;
public fun getName ()Ljava/lang/String;
Expand All @@ -2772,11 +2825,13 @@ public final class io/sentry/SentryAttribute {
}

public final class io/sentry/SentryAttributeType : java/lang/Enum {
public static final field ARRAY Lio/sentry/SentryAttributeType;
public static final field BOOLEAN Lio/sentry/SentryAttributeType;
public static final field DOUBLE Lio/sentry/SentryAttributeType;
public static final field INTEGER Lio/sentry/SentryAttributeType;
public static final field STRING Lio/sentry/SentryAttributeType;
public fun apiName ()Ljava/lang/String;
public static fun inferFrom (Ljava/lang/Object;)Lio/sentry/SentryAttributeType;
public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryAttributeType;
public static fun values ()[Lio/sentry/SentryAttributeType;
}
Expand Down Expand Up @@ -3286,6 +3341,7 @@ public final class io/sentry/SentryLogEvent$JsonKeys {
public final class io/sentry/SentryLogEventAttributeValue : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
public fun <init> (Lio/sentry/SentryAttributeType;Ljava/lang/Object;)V
public fun <init> (Ljava/lang/String;Ljava/lang/Object;)V
public static fun fromAttribute (Lio/sentry/SentryAttribute;)Lio/sentry/SentryLogEventAttributeValue;
public fun getType ()Ljava/lang/String;
public fun getUnknown ()Ljava/util/Map;
public fun getValue ()Ljava/lang/Object;
Expand Down
Loading
Loading