Sentry-javascript: Sentry.captureException отправляет событие в Sentry только один раз (AWS Lambda)

Созданный на 26 февр. 2019  ·  3Комментарии  ·  Источник: getsentry/sentry-javascript

Пакет + Версия

@sentry/node

Версия:

4.6.3

Описание

Я пытаюсь интегрировать новый часовой SDK в нашу бессерверную архитектуру, у нас есть общий метод try-catch для каждого обработчика, который вызывает captureException. Вкратце, так выглядит наш код (я не учел нашу бизнес-логику и множество служебных методов).

Sentry.init({
  dsn: process.env.sentryUrl,
  environment: process.env.NODE_ENV,
  // debugging issue where we only get an event once
  beforeSend: (event, _) => { console.log(event.exception); return event }
});

async function wrapper(...) {
   try {
     handler(...)
   } catch(error) {
      Sentry.configureScope(scope => {
        scope.setTag("test", "Hello, world")
      })

      const eventId = Sentry.captureException(error)
      // debugging, log event id to see if captureException works
      console.log(eventId)

      const flushResult = await Sentry.flush(1000)
      console.log(flushResult) // see if flush succeeded
   }
}

Я сделал так, чтобы обработчик всегда выдавал ошибку. Когда я делаю первый запрос, все заканчивается в Sentry. По второму запросу ничего не происходит. Когда я смотрю в CloudWatch, я нахожу вот что. Я добавил комментарии для удобства.

Первый запрос:

/// the eventId from captureException
2019-02-26T13:47:22.584Z: 8cf83e38081a4672841a6f795ce8105a 
/// the middleware defined in Sentry.init
2019-02-26T13:47:23.153Z: { values: [ { stacktrace: [Object], type: 'Error', value: 'This is an error' } ] } 
/// result of Sentry.flush
2019-02-26T13:47:23.294Z: true 

Второй запрос:

/// the eventId from captureException
2019-02-26T13:47:24.761Z fbc2c8b2a4d5447380a0f92dd87896f6
/// result of Sentry.flush
2019-02-26T13:47:24.963Z: true 

Как видите, он никогда не попадает в промежуточное ПО beforeSend при втором запросе, поэтому я предполагаю, что он вообще никогда не отправляется в Sentry.

Я должен отметить, что когда я выполняю Sentry.getCurrentHub().getClient().captureException(error) , он каждый раз отправляет исключение в Sentry, но область, настроенная в Sentry.configureScope , никогда не применяется к событию.

Я пробовал воспроизвести это локально, но это происходит только при развертывании на AWS Lambda.

Самый полезный комментарий

Есть шанс, что это будет дедупликация.
Вы можете использовать debug: true в вызове init чтобы увидеть, что происходит.

Если это действительно происходит, вы можете удалить эту интеграцию, используя:

Sentry.init({
  integrations: integrations => {
    return integrations.filter(integration => integration.name !== 'Dedupe');
  }
});

https://docs.sentry.io/platforms/node/default-integrations/

Все 3 Комментарий

Есть шанс, что это будет дедупликация.
Вы можете использовать debug: true в вызове init чтобы увидеть, что происходит.

Если это действительно происходит, вы можете удалить эту интеграцию, используя:

Sentry.init({
  integrations: integrations => {
    return integrations.filter(integration => integration.name !== 'Dedupe');
  }
});

https://docs.sentry.io/platforms/node/default-integrations/

Интересно. Нашел это в поисках аналогичной проблемы. Удаление дедупликации исправило это для меня.

Закрытие, так как это не ошибка.
Кроме того, следующая основная версия делает Dedupe необязательным, что означает отсутствие дедупликации по умолчанию.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги