RomainLanz / sentry

A wrapper around the Sentry SDK to make it easier to use in a AdonisJS application
MIT License
29 stars 1 forks source link
adonisjs sentry sentry-sdk
@rlanz/sentry
[![typescript-image]][typescript-url] [![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] [![npm-download-image]][npm-download-url] [![license-image]][license-url]

@rlanz/sentry is a simple wrapper around the Sentry SDK to make it easier to use in a AdonisJS application.

Installation

node ace add @rlanz/sentry

Usage

The package will automatically register a middleware, configure the Sentry SDK and add an instance of the SDK to the IoC Container and the HttpContext.

import type { HttpContext } from '@adonisjs/core/http'

export default class HelloController {
  greet({ params, sentry, response}: HttpContext) {
    sentry.captureMessage(`Hello, ${params.name}!`)

    return response.ok({ message: `Hello, ${params.name}!` })
  }
}

Since the SDK is also added to the IoC Container, you can also use it in your services. If you are inside a request context, the SDK injected will be scoped to it.

import { inject } from '@adonisjs/core'
import { Sentry } from '@rlanz/sentry'

@inject()
export class GreetingService {
  constructor(private sentry: Sentry) {}

  greet(name: string) {
    this.sentry.captureMessage(`Hello, ${name}!`)

    return `Hello, ${name}!`
  }
}

Capturing Errors

You can capture errors by calling the captureException method on the SDK instance inside your exception handler.

export default class HttpExceptionHandler extends ExceptionHandler {
  // ...

  async report(error: unknown, ctx: HttpContext) {
    if (this.shouldReport(error as any)) {
      ctx.sentry.captureException(error)
    }

    return super.report(error, ctx)
  }
}

Assigning User Context

You can assign user context to the Sentry SDK by calling the setUser method on the SDK instance once you are logged in.

export default class SilentAuthMiddleware {
  async handle(ctx: HttpContext, next: NextFn) {
    // We are authenticating the user
    await ctx.auth.check()

    // If the user is authenticated, we assign the user context to Sentry
    if (ctx.auth.isAuthenticated) {
      const user = ctx.auth.getUserOrFail()

      ctx.sentry.setUser({
        id: user.id, 
        email: user.email, 
        username: user.username,
      });
    }

    return await next();
  }
}

Adding Integrations

Sentry provides multiple integrations to enhance the data captured by the SDK. You can add integrations by changing the integrations array inside the configuration config/sentry.ts.

For example, if you want to add profiling to your application, you can add the Profiler integration.

npm install @sentry/profiling-node@7
// config/sentry.ts

import { nodeProfilingIntegration } from '@sentry/profiling-node';

export default defineConfig({
  // ...
  integrations: [nodeProfilingIntegration()],
  profilesSampleRate: 0.2,
})