Sentry не фиксирует исключения из задания Spark

#java #apache-spark #kotlin #sentry

#java #apache-spark #kotlin #sentry

Вопрос:

Моя проблема в том, что приведенный ниже код генерирует исключение, и я фиксирую его с помощью Sentry, но когда я захожу в пользовательский интерфейс Sentry, исключение вообще не появляется. Я хочу найти способ, с помощью которого я мог бы использовать Sentry для драйвера spark и исполнителей. Есть идеи?

Кроме того, я не уверен, какая дополнительная информация требуется, поэтому не стесняйтесь, дайте мне знать, и я ее предоставлю.

Версии:

  • Spark: 2.12-3.0.0
  • Sentry: 3.1.1
 import io.sentry.Sentry
import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.sql.SparkSession

fun main(args: Array<String>) {
    SparkSession.builder()
        .appName("myApp")
        .config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", "2")
        .config("spark.hadoop.fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
        .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
        .getOrCreate()
        .use { sparkSession ->
            JavaSparkContext.fromSparkContext(sparkSession.sparkContext()).let { sc ->
                Sentry.init { options ->
                    options.dsn = "********"
                }

                try {
                    throw Exception("exception before executors start working")
                } catch(e: Exception) {
                    Sentry.captureException(e)
                }

                // starting some executors and see if Sentry receives exceptions from them:
                sc.parallelize((0..100).toList(), 10).map { i ->                
                    try {
                        throw Exception("exception $i from worker")
                    } catch (e: Exception) {                        
                        Sentry.captureException(e)
                    }
                }
            }
        }
}
  

Я также пытался выполнить внутреннее HubAdapter из Sentry и использовать его в качестве Broadcast переменной, но безуспешно.

ОБНОВЛЕНИЕ # 1

Добавлена опция отладки для инициализации Sentry и попытка запуска и закрытия сеанса:

 import io.sentry.Sentry
import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.sql.SparkSession

fun main(args: Array<String>) {
    SparkSession.builder()
        .appName("myApp")
        .config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", "2")
        .config("spark.hadoop.fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
        .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
        .getOrCreate()
        .use { sparkSession ->
            JavaSparkContext.fromSparkContext(sparkSession.sparkContext()).let { sc ->
                Sentry.init { options ->
                    options.dsn = "********"
                    options.isDebug = true
                }

                Sentry.startSession()

                try {
                    throw Exception("exception before executors start working")
                } catch(e: Exception) {
                    Sentry.captureException(e)
                }

                // starting some executors and see if Sentry receives exceptions from them:
                sc.parallelize((0..100).toList(), 10).map { i ->                
                    try {
                        throw Exception("exception $i from worker")
                    } catch (e: Exception) {                        
                        Sentry.captureException(e)
                    }
                }

                Sentry.endSession()
                Sentry.close()
            }
        }
}
  

Вот что я вижу в журналах:

 INFO: Initializing SDK with DSN: '**********'
INFO: No outbox dir path is defined in options.
INFO: GlobalHubMode: 'false'
20/11/03 18:42:01 INFO BlockManagerMasterEndpoint: Registering block manager 10.36.62.15:42123 with 4.6 GiB RAM, BlockManagerId(1, 10.36.62.15, 42123, None)
DEBUG: UncaughtExceptionHandlerIntegration enabled: true
DEBUG: UncaughtExceptionHandlerIntegration installed.
WARNING: Sessions can't be captured without setting a release.
DEBUG: Capturing event: 9b17170bdaf841cbb764969f653f99b5
ERROR: Request failed, API returned 400
ERROR: {"detail":"invalid event envelope","causes":["invalid item header","EOF while parsing an object at line 1 column 49"]}
WARNING: Sessions can't be captured without setting a release.
INFO: Closing SentryClient.
DEBUG: Shutting down
  

ОБНОВЛЕНИЕ # 2:

Создана проблема в GitHub для лучшей видимости

Комментарии:

1. Завершается ли процесс сразу после вызова Sentry.captureException? События отправляются в фоновом режиме, поэтому вам нужно вызвать Sentry.close() перед выходом, чтобы убедиться, что события сбрасываются перед выходом

2. даже если я Sentry.close() завершу, в Sentry ничего не отображается.

3. Добавьте, пожалуйста options.debug=true , чтобы увидеть сообщения журнала. Возможно, там есть что-то ценное.

4. Я добавил обновление с записями журнала, которые я вижу после настройки options.debug = true