Skip to content

Flushing doesn't work with asynchronous transport  #2000

@sheerun

Description

@sheerun
  • @sentry/node (5.0.5)

Sentry.flush() doesn't wait for events to be delivered by transport. This can result in dropped events in serverless environment like AWS lambda.

Reproduction:

const Sentry = require('@sentry/node')

function sleep(delay) {
  return new Promise(resolve => setTimeout(resolve, delay))
}

class FakeTransport extends Sentry.Transports.HTTPTransport {
  async sendEvent(event) {
    console.log('Started sending ' + event.event_id)
    await sleep(500)
    console.log('Finished sending ' + event.event_id)
    return { status: 200 }
  }
}

Sentry.init({
  dsn: 'https://fake@sentry.io/1234',
  transport: FakeTransport,
  beforeSend: (event) => {
    console.log('Before send ' + event.event_id)
    return event
  }
})

async function main() {
  Sentry.captureException(new Error('test 3'))
  console.log('Before')
  await Sentry.flush(2000)
  console.log('After')
  await sleep(3000)
}

main()
Before
Before send 3879a904216343bcb7999f116e336797
Started sending 3879a904216343bcb7999f116e336797
After
Finished sending 3879a904216343bcb7999f116e336797

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions