From 09de046be19ef75329e11980c209e45f19bed00d Mon Sep 17 00:00:00 2001 From: daoge <3523206925@qq.com> Date: Wed, 1 Jan 2025 20:34:14 +0800 Subject: [PATCH] feat: introduce sentry (#536) --- CHANGELOG.md | 2 ++ gradle/libs.versions.toml | 3 +++ server/build.gradle.kts | 4 ++-- server/src/main/java/org/allaymc/server/Allay.java | 6 +++++- .../allaymc/server/command/defaults/GameTestCommand.java | 7 ++++++- server/src/main/resources/log4j2.xml | 9 +++++++-- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4e5360da..bb0d3a79c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ Unless otherwise specified, any version comparison below is the comparison of se ### Added - Implemented trapdoor except redstone feature (Redstone feature requires the implementation of redstone system). +- Introduced [sentry](https://www.sentry.io) to capture exception and upload them to sentry server automatically, which + helps us to track and fix bug more efficiently. Sentry is only enabled in non-dev version. ### Changed diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e03cec231d..61ab3c408e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -82,6 +82,8 @@ lombok = { group = "org.projectlombok", name = "lombok", version = "1.18.36" } # Random generator rng-simple = { module = "org.apache.commons:commons-rng-simple", version.ref = "commons-rng" } rng-sampling = { module = "org.apache.commons:commons-rng-sampling", version.ref = "commons-rng" } +# Sentry +sentry = { group = "io.sentry", name = "sentry-log4j2", version = "7.19.1" } [bundles] logging = ["log4j-slf4j2-impl", "log4j-core"] @@ -94,6 +96,7 @@ fastutil = [ "fastutil-short-sets", "fastutil-short-object-maps", "fastutil-byte-object-maps", "fastutil-io" ] leveldb = ["leveldb", "leveldb-api"] +rng = ["rng-simple", "rng-sampling"] [plugins] shadow = { id = "com.gradleup.shadow", version = "8.3.5" } diff --git a/server/build.gradle.kts b/server/build.gradle.kts index adccf0b2a3..6fa8c116ae 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -42,8 +42,8 @@ dependencies { implementation(libs.oshi) implementation(libs.flatlaf) implementation(libs.formsrt) - implementation(libs.rng.simple) - implementation(libs.rng.sampling) + implementation(libs.bundles.rng) + implementation(libs.sentry) testImplementation(libs.bundles.junit) testAnnotationProcessor(libs.lombok) diff --git a/server/src/main/java/org/allaymc/server/Allay.java b/server/src/main/java/org/allaymc/server/Allay.java index 712136f685..3c7af5075a 100644 --- a/server/src/main/java/org/allaymc/server/Allay.java +++ b/server/src/main/java/org/allaymc/server/Allay.java @@ -1,6 +1,7 @@ package org.allaymc.server; import io.netty.util.ResourceLeakDetector; +import io.sentry.Sentry; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.extern.slf4j.Slf4j; import org.allaymc.api.AllayAPI; @@ -65,6 +66,10 @@ public final class Allay { public static void main(String[] args) { long initialTime = System.currentTimeMillis(); + if (GitProperties.isDevBuild()) { + // Enable sentry only in non-dev build + Sentry.close(); + } ResourceLeakDetector.setLevel(Server.SETTINGS.networkSettings().resourceLeakDetectorLevel()); // Disable scientific notation in joml System.setProperty("joml.format", "false"); @@ -120,7 +125,6 @@ private static boolean isHeadless() { return true; } - /** * NOTICE: The i18n implementation must be registered before initializing allay, * which means that you should call initI18n() before call initAllay()! diff --git a/server/src/main/java/org/allaymc/server/command/defaults/GameTestCommand.java b/server/src/main/java/org/allaymc/server/command/defaults/GameTestCommand.java index 19a8247831..b5107a348d 100644 --- a/server/src/main/java/org/allaymc/server/command/defaults/GameTestCommand.java +++ b/server/src/main/java/org/allaymc/server/command/defaults/GameTestCommand.java @@ -295,6 +295,11 @@ public void prepareCommandTree(CommandTree tree) { player.sendText("InternalSkyLight: " + lightService.getInternalSkyLight(x, y, z)); player.sendText("QueuedUpdateCount: " + lightService.getQueuedUpdateCount()); return context.success(); - }, SenderType.PLAYER); + }, SenderType.PLAYER) + .root() + .key("triggerexception") + .exec(context -> { + throw new RuntimeException("Triggered exception"); + }); } } diff --git a/server/src/main/resources/log4j2.xml b/server/src/main/resources/log4j2.xml index c77acbba6f..18b4619060 100644 --- a/server/src/main/resources/log4j2.xml +++ b/server/src/main/resources/log4j2.xml @@ -2,20 +2,25 @@ - + - + + + \ No newline at end of file