Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API to retrieve Android scope data #2814

Merged
merged 10 commits into from
Jul 18, 2023
183 changes: 129 additions & 54 deletions sentry/api/sentry.api

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/Breadcrumb.java
Original file line number Diff line number Diff line change
Expand Up @@ -561,8 +561,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
writer.name(JsonKeys.TIMESTAMP).value(logger, timestamp);
if (message != null) {
Expand Down
10 changes: 5 additions & 5 deletions sentry/src/main/java/io/sentry/JsonObjectSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public JsonObjectSerializer(int maxDepth) {
}

public void serialize(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @Nullable Object object)
@NotNull ObjectWriter writer, @NotNull ILogger logger, @Nullable Object object)
throws IOException {
if (object == null) {
writer.nullValue();
Expand Down Expand Up @@ -89,7 +89,7 @@ public void serialize(
// Helper

private void serializeDate(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Date date)
@NotNull ObjectWriter writer, @NotNull ILogger logger, @NotNull Date date)
throws IOException {
try {
writer.value(DateUtils.getTimestamp(date));
Expand All @@ -100,7 +100,7 @@ private void serializeDate(
}

private void serializeTimeZone(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull TimeZone timeZone)
@NotNull ObjectWriter writer, @NotNull ILogger logger, @NotNull TimeZone timeZone)
throws IOException {
try {
writer.value(timeZone.getID());
Expand All @@ -111,7 +111,7 @@ private void serializeTimeZone(
}

private void serializeCollection(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Collection<?> collection)
@NotNull ObjectWriter writer, @NotNull ILogger logger, @NotNull Collection<?> collection)
throws IOException {
writer.beginArray();
for (Object object : collection) {
Expand All @@ -121,7 +121,7 @@ private void serializeCollection(
}

private void serializeMap(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Map<?, ?> map)
@NotNull ObjectWriter writer, @NotNull ILogger logger, @NotNull Map<?, ?> map)
throws IOException {
writer.beginObject();
for (Object key : map.keySet()) {
Expand Down
78 changes: 75 additions & 3 deletions sentry/src/main/java/io/sentry/JsonObjectWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,85 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public final class JsonObjectWriter extends JsonWriter {
public final class JsonObjectWriter implements ObjectWriter {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This class is public and not annotated as internal, technically a breaking change, was that intentional?
What's the motivation for the renaming?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a required change in order to serialize protocol classes to either Json or Map<>. IMHO it's an oversight that this class is not marked as apistatus.internal. If we consider this a breaking change we should talk to Karl/Krystof as this PR is blocking the RN profiling feature.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree its an oversight, but the class/interface was used in pretty much every class of the protocol.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


private final JsonWriter jsonWriter;
private final JsonObjectSerializer jsonObjectSerializer;

public JsonObjectWriter(Writer out, int maxDepth) {
super(out);
jsonWriter = new JsonWriter(out);
jsonObjectSerializer = new JsonObjectSerializer(maxDepth);
}

@Override
public JsonObjectWriter beginArray() throws IOException {
jsonWriter.beginArray();
return this;
}

@Override
public JsonObjectWriter endArray() throws IOException {
jsonWriter.endArray();
return this;
}

@Override
public JsonObjectWriter beginObject() throws IOException {
jsonWriter.beginObject();
return this;
}

@Override
public JsonObjectWriter endObject() throws IOException {
jsonWriter.endObject();
return this;
}

@Override
public JsonObjectWriter name(String name) throws IOException {
super.name(name);
jsonWriter.name(name);
return this;
}

@Override
public JsonObjectWriter value(String value) throws IOException {
jsonWriter.value(value);
return this;
}

@Override
public JsonObjectWriter nullValue() throws IOException {
jsonWriter.nullValue();
return this;
}

@Override
public JsonObjectWriter value(boolean value) throws IOException {
jsonWriter.value(value);
return this;
}

@Override
public JsonObjectWriter value(Boolean value) throws IOException {
jsonWriter.value(value);
return this;
}

@Override
public JsonObjectWriter value(double value) throws IOException {
jsonWriter.value(value);
return this;
}

@Override
public JsonObjectWriter value(long value) throws IOException {
jsonWriter.value(value);
return this;
}

@Override
public JsonObjectWriter value(Number value) throws IOException {
jsonWriter.value(value);
return this;
}

Expand All @@ -29,9 +96,14 @@ public JsonObjectWriter name(String name) throws IOException {
* @param object Object to encode. May be null.
* @return this writer.
*/
@Override
public JsonObjectWriter value(@NotNull ILogger logger, @Nullable Object object)
throws IOException {
jsonObjectSerializer.serialize(this, logger, object);
return this;
}

public void setIndent(@NotNull final String indent) {
jsonWriter.setIndent(indent);
}
}
2 changes: 1 addition & 1 deletion sentry/src/main/java/io/sentry/JsonSerializable.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
import org.jetbrains.annotations.NotNull;

public interface JsonSerializable {
void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger) throws IOException;
void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException;
}
33 changes: 33 additions & 0 deletions sentry/src/main/java/io/sentry/ObjectWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.sentry;

import java.io.IOException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public interface ObjectWriter {
ObjectWriter beginArray() throws IOException;

ObjectWriter endArray() throws IOException;

ObjectWriter beginObject() throws IOException;

ObjectWriter endObject() throws IOException;

ObjectWriter name(String name) throws IOException;
markushi marked this conversation as resolved.
Show resolved Hide resolved

ObjectWriter value(String value) throws IOException;

ObjectWriter nullValue() throws IOException;

ObjectWriter value(boolean value) throws IOException;

ObjectWriter value(Boolean value) throws IOException;

ObjectWriter value(double value) throws IOException;

ObjectWriter value(long value) throws IOException;

ObjectWriter value(Number value) throws IOException;

ObjectWriter value(@NotNull ILogger logger, @Nullable Object object) throws IOException;
}
2 changes: 1 addition & 1 deletion sentry/src/main/java/io/sentry/ProfilingTraceData.java
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(final @NotNull JsonObjectWriter writer, final @NotNull ILogger logger)
public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger logger)
throws IOException {
writer.beginObject();
writer.name(JsonKeys.ANDROID_API_LEVEL).value(logger, androidApiLevel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
writer.name(JsonKeys.ID).value(logger, id);
writer.name(JsonKeys.TRACE_ID).value(logger, traceId);
Expand Down
5 changes: 5 additions & 0 deletions sentry/src/main/java/io/sentry/Scope.java
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,11 @@ public void withTransaction(final @NotNull IWithTransaction callback) {
}
}

@NotNull
SentryOptions getOptions() {
return options;
}

@ApiStatus.Internal
public @Nullable Session getSession() {
return session;
Expand Down
48 changes: 48 additions & 0 deletions sentry/src/main/java/io/sentry/ScopeUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.sentry;

import io.sentry.util.MapObjectWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

@ApiStatus.Internal
public final class ScopeUtil {

@NotNull
public static Map<String, Object> serialize(@Nullable Scope scope) {
final @NotNull Map<String, Object> data = new HashMap<>();
if (scope == null) {
return data;
}

final @NotNull SentryOptions options = scope.getOptions();
final @NotNull ObjectWriter writer = new MapObjectWriter(data);

try {
serialize(writer, options, "user", scope.getUser());
serialize(writer, options, "contexts", scope.getContexts());
serialize(writer, options, "tags", scope.getTags());
serialize(writer, options, "extras", scope.getExtras());
serialize(writer, options, "fingerprint", scope.getFingerprint());
serialize(writer, options, "level", scope.getLevel());
serialize(writer, options, "breadcrumbs", scope.getBreadcrumbs());
} catch (Exception e) {
options.getLogger().log(SentryLevel.ERROR, "Could not serialize scope");
markushi marked this conversation as resolved.
Show resolved Hide resolved
}

return data;
}

private static void serialize(
@NotNull ObjectWriter writer,
@NotNull SentryOptions options,
@NotNull String name,
@Nullable Object data)
throws IOException {
writer.name(name);
writer.value(options.getLogger(), data);
}
}
4 changes: 1 addition & 3 deletions sentry/src/main/java/io/sentry/SentryBaseEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -345,9 +345,7 @@ public static final class JsonKeys {

public static final class Serializer {
public void serialize(
@NotNull SentryBaseEvent baseEvent,
@NotNull JsonObjectWriter writer,
@NotNull ILogger logger)
@NotNull SentryBaseEvent baseEvent, @NotNull ObjectWriter writer, @NotNull ILogger logger)
throws IOException {
if (baseEvent.eventId != null) {
writer.name(JsonKeys.EVENT_ID).value(logger, baseEvent.eventId);
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SentryEnvelopeHeader.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
if (eventId != null) {
writer.name(JsonKeys.EVENT_ID).value(logger, eventId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
if (contentType != null) {
writer.name(JsonKeys.CONTENT_TYPE).value(contentType);
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SentryEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
writer.name(JsonKeys.TIMESTAMP).value(logger, timestamp);
if (message != null) {
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SentryItemType.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ public String getItemType() {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.value(itemType);
}

Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SentryLevel.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ public enum SentryLevel implements JsonSerializable {
FATAL;

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.value(name().toLowerCase(Locale.ROOT));
}

Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SentryLockReason.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
writer.name(JsonKeys.TYPE).value(type);
if (address != null) {
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/Session.java
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
if (sessionId != null) {
writer.name(JsonKeys.SID).value(sessionId.toString());
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SpanContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,7 @@ public static final class JsonKeys {
}

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.beginObject();
writer.name(JsonKeys.TRACE_ID);
traceId.serialize(writer, logger);
Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SpanId.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ public String toString() {
// JsonElementSerializer

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.value(value);
}

Expand Down
3 changes: 1 addition & 2 deletions sentry/src/main/java/io/sentry/SpanStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,7 @@ private boolean matches(int httpStatusCode) {
// JsonSerializable

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
public void serialize(@NotNull ObjectWriter writer, @NotNull ILogger logger) throws IOException {
writer.value(name().toLowerCase(Locale.ROOT));
}

Expand Down