#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