Skip to content

Commit

Permalink
feat(Event): open event add thread and breadCrumb
Browse files Browse the repository at this point in the history
  • Loading branch information
YYChen01988 committed Jul 18, 2024
1 parent 8478524 commit 391a72c
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 44 deletions.
8 changes: 8 additions & 0 deletions bugsnag-android-core/api/bugsnag-android-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,8 @@ public final class com/bugsnag/android/EndpointConfiguration {
}

public class com/bugsnag/android/Error : com/bugsnag/android/JsonStream$Streamable {
public fun addStackframe (Ljava/lang/StackTraceElement;)Lcom/bugsnag/android/Stackframe;
public fun addStackframe (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Number;)Lcom/bugsnag/android/Stackframe;
public fun getErrorClass ()Ljava/lang/String;
public fun getErrorMessage ()Ljava/lang/String;
public fun getStacktrace ()Ljava/util/List;
Expand Down Expand Up @@ -350,11 +352,15 @@ public final class com/bugsnag/android/ErrorTypes {
}

public class com/bugsnag/android/Event : com/bugsnag/android/FeatureFlagAware, com/bugsnag/android/JsonStream$Streamable, com/bugsnag/android/MetadataAware, com/bugsnag/android/UserAware {
public fun addError (Ljava/lang/String;Ljava/lang/String;)Lcom/bugsnag/android/Error;
public fun addError (Ljava/lang/String;Ljava/lang/String;Lcom/bugsnag/android/ErrorType;)Lcom/bugsnag/android/Error;
public fun addError (Ljava/lang/Throwable;)Lcom/bugsnag/android/Error;
public fun addFeatureFlag (Ljava/lang/String;)V
public fun addFeatureFlag (Ljava/lang/String;Ljava/lang/String;)V
public fun addFeatureFlags (Ljava/lang/Iterable;)V
public fun addMetadata (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V
public fun addMetadata (Ljava/lang/String;Ljava/util/Map;)V
public fun addThread (Ljava/lang/String;Ljava/lang/String;)Lcom/bugsnag/android/Thread;
public fun clearFeatureFlag (Ljava/lang/String;)V
public fun clearFeatureFlags ()V
public fun clearMetadata (Ljava/lang/String;)V
Expand All @@ -374,6 +380,8 @@ public class com/bugsnag/android/Event : com/bugsnag/android/FeatureFlagAware, c
public fun getThreads ()Ljava/util/List;
public fun getUser ()Lcom/bugsnag/android/User;
public fun isUnhandled ()Z
public fun leaveBreadcrumb (Ljava/lang/String;)Lcom/bugsnag/android/Breadcrumb;
public fun leaveBreadcrumb (Ljava/lang/String;Lcom/bugsnag/android/BreadcrumbType;Ljava/util/Map;)Lcom/bugsnag/android/Breadcrumb;
public fun setApiKey (Ljava/lang/String;)V
public fun setContext (Ljava/lang/String;)V
public fun setGroupingHash (Ljava/lang/String;)V
Expand Down
13 changes: 10 additions & 3 deletions bugsnag-android-core/src/main/java/com/bugsnag/android/Error.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,15 @@ static List<Error> createError(@NonNull Throwable exc,
return ErrorInternal.Companion.createError(exc, projectPackages, logger);
}

@Nullable
public Stackframe addStackframe(@NonNull StackTraceElement element) {
return impl.addStackframe(element, logger);
}

public void addStackframe(@NonNull List<StackTraceElement> element) {
impl.addStackTrace(element);
@Nullable
public Stackframe addStackframe(@NonNull String method,
@NonNull String file,
@NonNull Number lineNumber) {
return impl.addStackframe(method, file, lineNumber);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ internal class ErrorInternal @JvmOverloads internal constructor(
var type: ErrorType = ErrorType.ANDROID
) : JsonStream.Streamable {

val stacktrace: List<Stackframe> = stacktrace.trace
val stacktrace: MutableList<Stackframe> = stacktrace.trace

internal companion object {
fun createError(
Expand Down Expand Up @@ -37,10 +37,18 @@ internal class ErrorInternal @JvmOverloads internal constructor(
writer.endObject()
}

fun addStackTrace(element: List<StackTraceElement>) {
val stackFrame = element.flatMap {
listOf(Stackframe(it.methodName, it.fileName, it.lineNumber, null))
fun addStackframe(element: StackTraceElement, logger: Logger): Stackframe? {
val frame = Stacktrace.serializeStackframe(element, emptyList(), logger)
if (frame != null) {
stacktrace.add(frame)
return frame
}
stacktrace.toMutableList().addAll(stackFrame)
return null
}

fun addStackframe(method: String, file: String, lineNumber: Number): Stackframe {
val frame = Stackframe(method, file, lineNumber, null)
stacktrace.add(frame)
return frame
}
}
33 changes: 27 additions & 6 deletions bugsnag-android-core/src/main/java/com/bugsnag/android/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
Expand Down Expand Up @@ -443,25 +444,45 @@ void setInternalMetrics(InternalMetrics metrics) {
impl.setInternalMetrics(metrics);
}

public Error addError(Throwable error) {
/**
* Open API for adding errors, threads and breadcrumbs to the event.
*/

@Nullable
public Error addError(@NonNull Throwable error) {
if (error == null) {
return null;
}
return impl.addError(error);
}

public Error addError(String errorClass, String errorMessage) {
@Nullable
public Error addError(@NonNull String errorClass, @NonNull String errorMessage) {
return impl.addError(errorClass, errorMessage, ErrorType.ANDROID);
}


public Error addError(String errorClass, String errorMessage, ErrorType errorType) {
@Nullable
public Error addError(@NonNull String errorClass,
@NonNull String errorMessage,
@NonNull ErrorType errorType) {
return impl.addError(errorClass, errorMessage, errorType);
}

public Thread addThread(Thread thread) {
return impl.addThread(thread);
@Nullable
public Thread addThread(@NonNull String id,
@NonNull String name) {
return impl.addThread(id, name, ErrorType.ANDROID, true, "RUNABLE");
}

@Nullable
public Breadcrumb leaveBreadcrumb(@NonNull String message,
@NonNull BreadcrumbType type,
@NonNull Map<String, Object> metadata) {
return impl.leaveBreadcrumb(message, type, metadata, new Date());
}

@Nullable
public Breadcrumb leaveBreadcrumb(@NonNull String message) {
return impl.leaveBreadcrumb(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.bugsnag.android.internal.InternalMetricsNoop
import com.bugsnag.android.internal.JsonHelper
import com.bugsnag.android.internal.TrimMetrics
import java.io.IOException
import java.util.Date
import java.util.regex.Pattern

internal class EventInternal : FeatureFlagAware, JsonStream.Streamable, MetadataAware, UserAware {
Expand Down Expand Up @@ -340,8 +341,44 @@ internal class EventInternal : FeatureFlagAware, JsonStream.Streamable, Metadata
return error
}

fun addThread(thread: Thread): Thread {
fun addThread(
id: String,
name: String,
errorType: ErrorType,
isErrorReportingThread: Boolean,
state: String
): Thread {
val thread = Thread(
ThreadInternal(
id,
name,
errorType,
isErrorReportingThread,
state,
Stacktrace(ArrayList())
),
logger
)
threads.add(thread)
return thread
}

fun leaveBreadcrumb(
message: String,
type: BreadcrumbType,
metadata: MutableMap<String, Any>,
timestamp: Date
): Breadcrumb {
val breadcrumb = Breadcrumb(message, type, metadata, timestamp, logger)
breadcrumbs.add(breadcrumb)
return breadcrumb
}

fun leaveBreadcrumb(
message: String
): Breadcrumb {
val breadcrumb = Breadcrumb(message, logger)
breadcrumbs.add(breadcrumb)
return breadcrumb
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,33 @@ internal class Stacktrace : JsonStream.Streamable {
else -> null
}
}

public fun serializeStackframe(
el: StackTraceElement,
projectPackages: Collection<String>,
logger: Logger
): Stackframe? {
try {
val className = el.className
val methodName = when {
className.isNotEmpty() -> className + "." + el.methodName
else -> el.methodName
}

return Stackframe(
methodName,
el.fileName ?: "Unknown",
el.lineNumber,
inProject(className, projectPackages)
)
} catch (lineEx: Exception) {
logger.w("Failed to serialize stacktrace", lineEx)
return null
}
}
}

val trace: List<Stackframe>
val trace: MutableList<Stackframe>

constructor(frames: List<Stackframe>) {
trace = limitTraceLength(frames)
Expand All @@ -39,7 +63,7 @@ internal class Stacktrace : JsonStream.Streamable {
logger: Logger
) {
val frames = limitTraceLength(stacktrace)
trace = frames.mapNotNull { serializeStackframe(it, projectPackages, logger) }
trace = frames.mapNotNullTo(ArrayList()) { Companion.serializeStackframe(it, projectPackages, logger) }
}

private fun limitTraceLength(frames: Array<StackTraceElement>): Array<StackTraceElement> {
Expand All @@ -49,34 +73,10 @@ internal class Stacktrace : JsonStream.Streamable {
}
}

private fun limitTraceLength(frames: List<Stackframe>): List<Stackframe> {
private fun limitTraceLength(frames: List<Stackframe>): MutableList<Stackframe> {
return when {
frames.size >= STACKTRACE_TRIM_LENGTH -> frames.subList(0, STACKTRACE_TRIM_LENGTH)
else -> frames
}
}

private fun serializeStackframe(
el: StackTraceElement,
projectPackages: Collection<String>,
logger: Logger
): Stackframe? {
try {
val className = el.className
val methodName = when {
className.isNotEmpty() -> className + "." + el.methodName
else -> el.methodName
}

return Stackframe(
methodName,
el.fileName ?: "Unknown",
el.lineNumber,
inProject(className, projectPackages)
)
} catch (lineEx: Exception) {
logger.w("Failed to serialize stacktrace", lineEx)
return null
frames.size >= STACKTRACE_TRIM_LENGTH -> frames.subList(0, STACKTRACE_TRIM_LENGTH).toMutableList()
else -> frames.toMutableList()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
import com.bugsnag.android.BreadcrumbType
import com.bugsnag.android.Bugsnag
import com.bugsnag.android.Configuration
import com.bugsnag.android.ErrorType
import com.bugsnag.android.Severity
import com.example.foo.CrashyClass
import com.google.android.material.snackbar.Snackbar
Expand Down

0 comments on commit 391a72c

Please sign in to comment.