Sentry-javascript: рдХреНрдпрд╛ рдпрд╣ рдЕрдм рд╕рдВрднрд╡ рд╣реИ? @ рд╕рдВрддрд░реА/рдиреЛрдб рдПрдХреАрдХрд░рдг рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрдирд┐рдпрди рд▓реЙрдЧ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП SO рд▓рд┐рдВрдХ: https://stackoverflow.com/questions/53310580/sentry-node-integration-to-wrap-bunyan-log-calls-as-breadcrumbs

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдирд╡ре░ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: getsentry/sentry-javascript

рдореИрдВ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрдирд┐рдпрди рд▓реЙрдЧ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП @ рд╕рдВрддрд░реА/рдиреЛрдб рдПрдХреАрдХрд░рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдкреИрдХреЗрдЬ

@sentry/node 4.3.0

рд╡рд┐рд╡рд░рдг

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрддрд░реА рдореЗрдВ рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

рд▓рд┐рдВрдХ: рдЖрдпрд╛рдд рдирд╛рдо: рд╕рдВрддрд░реАред рдПрдХреАрдХрд░рдгред рдХрдВрд╕реЛрд▓Con

рд╣рдо рдЗрд╕реЗ рдмрдирдпрди рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд▓рд┐рдП рднреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

const koa = require('koa');
const app = new koa();
const bunyan = require('bunyan');
const log = bunyan.createLogger({
    name: 'app',
    ..... other settings go here ....
});
const Sentry = require('@sentry/node');
Sentry.init({
    dsn: MY_DSN_HERE,
    integrations: integrations => {
        // should anything be handled here & how?
        return [...integrations];
    },
    release: 'xxxx-xx-xx'
});

app.on('error', (err) => {
    Sentry.captureException(err);
});

// I am trying all to be part of sentry breadcrumbs 
// but only console.log('foo'); is working
console.log('foo');
log.info('bar');
log.warn('baz');
log.debug('any');
log.error('many');  

throw new Error('help!');

рдкреАрдПрд╕ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрдирд┐рдпрди-рд╕реЗрдВрдЯреНрд░реА-рд╕реНрдЯреНрд░реАрдо рдХреА рдХреЛрд╢рд┐рд╢ рдХреА @ рд╕рдВрддрд░реА/рдиреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реА

рддреЛ рд▓рд┐рдВрдХ: https://stackoverflow.com/questions/53310580/sentry-node-integration-to-wrap-bunyan-log-calls-as-breadcrumbs

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

https://docs.sentry.io/enriching-error-data/breadcrumbs/?platform=browser + рдЬреИрд╕рд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╣реА SO рдкрд░ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ:

var log = bunyan.createLogger({
  name: 'myapp',
  streams: [{
  level: 'debug',
  stream: {
    write: function(record) {
      Sentry.addBreadcrumb({
        message: record.msg,
        level: record.level
      });
    }
  }]
});

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

https://docs.sentry.io/enriching-error-data/breadcrumbs/?platform=browser + рдЬреИрд╕рд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╣реА SO рдкрд░ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ:

var log = bunyan.createLogger({
  name: 'myapp',
  streams: [{
  level: 'debug',
  stream: {
    write: function(record) {
      Sentry.addBreadcrumb({
        message: record.msg,
        level: record.level
      });
    }
  }]
});

рдореВрд▓ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЕрдзрд┐рдХ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд░рд╛рдЗрдЯреЗрдмрд▓рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд░рд╛рдЗрдЯреЗрдмрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд:

  • рдмрдирд┐рдпрди рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╕реНрддрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд╕рдВрддреА рдЧрдВрднреАрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ level: Sentry.Severity.fromString(nameFromLevel[chunk.level]) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  • рдореИрдВ рдореМрдЬреВрджрд╛ рдмрдирд┐рдпрди рд╕реНрдЯреНрд░реАрдо рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП BunyanOptions рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдРрдбрд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
// if you want some stronger typing around the bunyan log entry
interface BunyanChunk {
  pid?: number;
  level: number;
  msg: string
  // ...   hostname?: string;
  [custom: string]: unknown;
}

const appLogger = Bunyan.createLogger();

appLogger.addStream({
  level: 'debug',
  // use the Writable constructor and pass a write function
  stream: new Writable({
    write(c: string, encoding, next) {
      const chunk: BunyanChunk = JSON.parse(c);
      Sentry.addBreadcrumb({
        message: chunk.msg,
        // convert from a Bunyan level to a Sentry Severity
        level: Sentry.Severity.fromString(Bunyan.nameFromLevel[chunk.level]),
      });
      next();
    },
  }),
});
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

adepue picture adepue  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Nickforall picture Nickforall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

grigored picture grigored  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

THPubs picture THPubs  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

scorpio13love picture scorpio13love  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ