All Downloads are FREE. Search and download functionalities are using the official Maven repository.

main.lavalink.server.config.SentryConfiguration.kt Maven / Gradle / Ivy

package lavalink.server.config

import ch.qos.logback.classic.Level
import ch.qos.logback.classic.LoggerContext
import ch.qos.logback.classic.filter.ThresholdFilter
import io.sentry.Sentry
import io.sentry.logback.SentryAppender
import lavalink.server.Launcher
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Configuration
import java.io.IOException
import java.util.*

/**
 * Created by napster on 25.04.18.
 */
@Configuration
class SentryConfiguration(sentryConfig: SentryConfigProperties) {
    init {
        if (sentryConfig.dsn.isNotEmpty()) {
            turnOn(sentryConfig.dsn, sentryConfig.tags, sentryConfig.environment)
        } else {
            turnOff()
        }
    }

    private final fun turnOn(dsn: String, tags: Map, environment: String) {
        log.info("Turning on sentry")

        // set the git commit hash this was build on as the release
        val gitProps = Properties()
        try {
            gitProps.load(Launcher::class.java.classLoader.getResourceAsStream("git.properties"))
        } catch (e: NullPointerException) {
            log.error("Failed to load git repo information", e)
        } catch (e: IOException) {
            log.error("Failed to load git repo information", e)
        }
        val commitHash = gitProps.getProperty("git.commit.id")

        Sentry.init {options ->
            options.dsn = dsn
            if (environment.isNotBlank()) options.environment = environment
            tags.forEach { (name, value) -> options.tags[name] = value }

            if (commitHash != null && commitHash.isNotEmpty()) {
                log.info("Setting sentry release to commit hash $commitHash")
                options.release = commitHash
            } else {
                log.warn("No git commit hash found to set up sentry release")
            }
        }

        sentryLogbackAppender.start()
    }

    private final fun turnOff() {
        log.warn("Turning off sentry")
        Sentry.close()
        sentryLogbackAppender.stop()
    }

    companion object {
        private val log = LoggerFactory.getLogger(SentryConfiguration::class.java)
        private const val SENTRY_APPENDER_NAME = "SENTRY"

        @get:Synchronized
        private val sentryLogbackAppender: SentryAppender
            // programmatically creates a sentry appender
            get() {
                val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
                val root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME)

                var sentryAppender = root.getAppender(SENTRY_APPENDER_NAME) as? SentryAppender
                if (sentryAppender == null) {
                    sentryAppender = SentryAppender()
                    sentryAppender.name = SENTRY_APPENDER_NAME
                    val warningsOrAboveFilter = ThresholdFilter()
                    warningsOrAboveFilter.setLevel(Level.WARN.levelStr)
                    warningsOrAboveFilter.start()
                    sentryAppender.addFilter(warningsOrAboveFilter)
                    sentryAppender.context = loggerContext
                    root.addAppender(sentryAppender)
                }

                return sentryAppender
            }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy