Integrasi Sentry dan Koa JS

Feb 28, 2019 09:50 · 351 words · 2 minute read JS KoaJS NodeJS

Why

Jika Anda terbiasa dengan Firebase Crashlytics, yang sekarang sudah merge dengan fabric.io kita akan sangat terbantu sekali dengan adanya tool tersebut. Setiap error yang dihasilkan dari aplikasi production yang sudah dipublish di Playstor misalnya, dapat kita ketahui secara detil setiap error yang dihasilkan bahkan dengan stacktrace nya. Hal yang sama juga dapat dilakukan dengan aplikasi yang dibuat dengan menggunakan platform Node JS, namun bukan dengan Firebase, yaitu dengan Sentry (https://sentry.io). Sebenarnya ada banyak layanan serupa, misalnya seperti layanan New Relic APM. Hanya saja secara pricing, menurut saya sentry lebih banyak pilihannya. Pendaftarannya cukup sederhana, bahkan tanpa perlu memasukan kartu kreditpun, Anda sudah bisa menggunakan layanan sentri.io.

Pada tulisan kali ini saya akan coba bahas integrasinya dengan aplikasi yang dibangun dengan Koa JS, yaitu framework untuk membuat API pada platform Node JS.

Install Sentry

install dependensi sentry.io pada project Anda

$ npm install @sentry/[email protected]

Catat dsn

Pada saat Anda membuat project node di dashboard sentry.io, anda akan mendapatkan dsn atau data source name yang berfungsi sebagai credential layanan sentry.

Inisiasi sentry

Pada top level project koa Anda, inisialisasi sentry. Misalnya jika pada saat pembuatan project memakai koa-generator, maka simpan di app.js.

const Sentry = require('@sentry/node');
Sentry.init({dsn: "your_dsn"});

Kirim setiap error-log

Pada prakteknya, kita dapat menyimpan Sentry.captureException(err); pada setiap error yang kita catch, namun hal tersebut dirasa tidak efektif karena dengan begitu kita melakukan iterasi dimana harus menyimpan potongan code tersebut pada setiap catch dan juga tidak tersentralisasi. Kita dapat membuat sebuah middleware sederhana agar setiap error ditampilkan pada suatu tempat. Berikut contoh middleware sederhana:

export.errorHandler = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = err.message;
    ctx.app.emit('error', err, ctx);
  }
});

Kemudian pada top level project, kita pakai middleware tersebut:

const errorHandler = require('./errorHandler')
app.on('error', (err, ctx) => {
  Sentry.captureException(err);
});

Untuk user standar, ada beberapa limitasi quota. Jika Anda memakai versi standar, Anda dapat kustomisasi di env mana harusnya sentry.io mengirim log. Misal:

if (ctx.status === 500 && (ENV === 'production' || ENV === 'staging'))  
  Sentry.captureException(err);

Jika sudah diintegrasikan, cek apakah sudah dapat dilihat di dashboard error yang dihasilkan.

Sentry Dashboard