Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจ…เฉฑเจœ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฐเฉ€เจเจ•เจŸ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจฐเฉ€เจ…เจฒ-เจŸเจพเจˆเจฎ เจเจฐเจฐ เจŸเฉเจฐเฉˆเจ•เจฟเฉฐเจ— เจฌเจพเจฐเฉ‡ เจฆเฉฑเจธเจพเจ‚เจ—เจพเฅค เจ‡เฉฑเจ• เจซเจฐเฉฐเจŸ-เจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ—เจฒเจคเฉ€ เจŸเจฐเฉˆเจ•เจฟเฉฐเจ— เจฒเจˆ เจจเจนเฉ€เจ‚ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ•เฉเจ เจ•เฉฐเจชเจจเฉ€เจ†เจ‚ เจ…เจ•เจธเจฐ เจฌเฉฑเจ— เจŸเจฐเฉˆเจ•เจฟเฉฐเจ— เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚, เจŸเฉˆเจธเจŸเจพเจ‚, เจ†เจฆเจฟ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เจธ 'เจคเฉ‡ เจตเจพเจชเจธ เจ†เจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ‰เจคเจชเจพเจฆ เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจฒเจˆ เจฌเจฆเจฒ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจฌเฉฑเจธ เจ‡เจน เจ•เจฐเฉ‹!

1. เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉฐเจคเจฐเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจ•เจฟเจ‰เจ‚ เจนเฉˆ?

เจฎเฉˆเจ‚ เจฎเฉฐเจจเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‰เจคเจชเจพเจฆเจจ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจฌเฉฑเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹

เจ•เฉ€ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ?

เจ เฉ€เจ• เจนเฉˆ, เจ†เจ“ เจตเฉ‡เจฐเจตเฉ‡ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ.

เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจฒเจˆ เจธเฉฐเจคเจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจชเฉเจฐเจฎเฉเฉฑเจ– เจ•เจพเจฐเจจ:

  • เจ—เจฒเจคเฉ€เจ†เจ‚ เจตเจพเจฒเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจœเฉ‹เจ–เจฎเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ
  • เจ•เฉ‹เจก เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจตเจฟเฉฑเจš QA เจฆเฉ€ เจฎเจฆเจฆ เจ•เจฐเฉ‹
  • เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจคเฉเจฐเฉฐเจค เจธเฉ‚เจšเจจเจพเจตเจพเจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹
  • เจ—เจฒเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจœเจฒเจฆเฉ€ เจ เฉ€เจ• เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ
  • เจเจกเจฎเจฟเจจ เจชเฉˆเจจเจฒ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ
  • เจ‰เจชเจญเฉ‹เจ—เจคเจพ/เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจนเจฟเฉฑเจธเฉ‡ เจฆเฉเจ†เจฐเจพ เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ›เจพเจ‚เจŸเฉ‹

เจธเฉ€เจˆเจ“/เจฒเฉ€เจก เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจฎเฉเฉฑเจ– เจ•เจพเจฐเจจ

  • เจชเฉˆเจธเฉ‡ เจฌเจšเจพเจ“ (เจธเฉˆเจ‚เจŸเจฐเฉ€ เจคเฉเจนเจพเจกเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ 'เจคเฉ‡ เจธเจฅเจพเจชเจค เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ)
  • เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจซเฉ€เจกเจฌเฉˆเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ
  • เจ…เจธเจฒ เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจ•เฉ€ เจ—เจฒเจค เจนเฉˆ เจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ
  • เจคเฉเจนเจพเจกเฉ€ เจเจช เจจเจพเจฒ เจฒเฉ‹เจ•เจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ
  • เจ‰เจนเจจเจพเจ‚ เจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเฉ‹ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจตเจฟเจ•เจพเจธเจ•เจพเจฐเจพเจ‚ เจจเฉ‡ เจ—เจฒเจคเฉ€เจ†เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจนเจจ

เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฒเฉˆเจฃเจ—เฉ‡. เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจฎเจพเจฒเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจคเจฐเฉ€ เจจเฉ‚เฉฐ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจฎเจจเจพเจ‰เจฃ เจฒเจˆ เจ•เจพเจฐเจจเจพเจ‚ เจฆเฉ€ เจ‡เจธ เจธเฉ‚เจšเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจตเฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ•เจพเจฐเฉ‹เจฌเจพเจฐเฉ€ เจธเฉ‚เจšเฉ€ 'เจคเฉ‡ เจ†เจ–เจฐเฉ€ เจ†เจˆเจŸเจฎ เจจเจพเจฒ เจธเจพเจตเจงเจพเจจ เจฐเจนเฉ‹เฅค

เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹?

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจธเฉฐเจคเจฐเฉ€ เจ•เฉ€ เจนเฉˆ?

Sentry เจ‡เฉฑเจ• เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจฌเฉฑเจ— เจŸเจฐเฉˆเจ•เจฟเฉฐเจ— เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจนเฉˆ เจœเฉ‹ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉ€เจ…เจฒ เจŸเจพเจˆเจฎ เจตเจฟเฉฑเจš เจ•เฉเจฐเฉˆเจธเจผเจพเจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจ เจ…เจคเฉ‡ เจ เฉ€เจ• เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจจเจพ เจญเฉเฉฑเจฒเฉ‹ เจ•เจฟ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจธเจผเจฒเจคเจพ เจตเจงเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ…เจจเฉเจญเจต เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค Sentry JavaScript, Node, Python, PHP, Ruby, Java เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

2. เจฒเฉŒเจ—เจ‡เจจ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ“

  • เจ†เจชเจฃเจพ เจธเฉฐเจคเจฐเฉ€ เจ–เจพเจคเจพ เจ–เฉ‹เจฒเฉเจนเฉ‹เฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเจพเจ—เจ‡เจจ เจ•เจฐเจจเจพ เจชเฉˆ เจธเจ•เจฆเจพ เจนเฉˆเฅค (เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจธเฉฐเจคเจฐเฉ€ เจคเฉเจนเจพเจกเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ)
  • เจ…เจ—เจฒเจพ เจ•เจฆเจฎ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃเจพ เจนเฉˆ
  • เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ†เจชเจฃเฉ€ เจญเจพเจธเจผเจพ เจšเฉเจฃเฉ‹เฅค (เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจ เจœเจพ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค "เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ“" 'เจคเฉ‡ เจ•เจฒเจฟเฉฑเจ• เจ•เจฐเฉ‹)

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจ†เจชเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เจฐเฉ‹เฅค เจ‡เฉฑเจ• เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš เจธเฉฐเจคเจฐเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ เจฆเฉ€ เจ‡เฉฑเจ• เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจนเฉ‡เจ เจพเจ‚ เจตเฉ‡เจ–เฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ:

import * as Sentry from '@sentry/browser';
// Sentry.init({
//  dsn: "<https://[email protected]/1432138>"
// });
// should have been called before using it here
// ideally before even rendering your react app 

class ExampleBoundary extends Component {
    constructor(props) {
        super(props);
        this.state = { error: null };
    }

    componentDidCatch(error, errorInfo) {
      this.setState({ error });
      Sentry.withScope(scope => {
        Object.keys(errorInfo).forEach(key => {
          scope.setExtra(key, errorInfo[key]);
        });
        Sentry.captureException(error);
      });
    }

    render() {
        if (this.state.error) {
            //render fallback UI
            return (
              <a onClick={() => Sentry.showReportDialog()}>Report feedback</a>
            );
        } else {
            //when there's not an error, render children untouched
            return this.props.children;
        }
    }
}

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจ•เฉ€ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ‡เจน เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเจจ เจฒเจˆ เจธเฉฐเจคเจฐเฉ€ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจฎเจฆเจฆเจ—เจพเจฐ เจธเจนเจพเจ‡เจ• เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ‡เจนเจจเจพเจ‚ เจ•เจฆเจฎเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจคเฉเจนเจพเจกเจพ เจชเจนเจฟเจฒเจพ เจเจฐเจฐ เจนเฉˆเจ‚เจกเจฒเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡เฅค เจฌเจนเฉเจค เจตเจงเฉ€เจ†, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ! เจ†เจ“ เจ…เจ—เจฒเฉ‡ เจชเฉœเจพเจ… 'เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ

3. เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจ…เจคเฉ‡ เจธเฉฐเจคเจฐเฉ€ เจเจ•เฉ€เจ•เจฐเจฃ

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš npm เจชเฉˆเจ•เฉ‡เจœ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

npm i @sentry/browser

เจ†เจชเจฃเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš เจธเฉฐเจคเจฐเฉ€ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹:

Sentry.init({
 // dsn: #dsnUrl,
});

DSN เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจธ -> เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ -> เจ•เจฒเจพเจ‡เฉฐเจŸ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจธเจฅเจฟเจค เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ–เฉ‹เจœ เจชเฉฑเจŸเฉ€ เจตเจฟเฉฑเจš เจ•เจฒเจพเจ‡เฉฐเจŸ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

componentDidCatch(error, errorInfo) {
  Sentry.withScope(scope => {
    Object.keys(errorInfo).forEach(key => {
      scope.setExtra(key, errorInfo[key]);
    });
    Sentry.captureException(error);
 });
}

4. เจชเจนเจฟเจฒเฉ€ เจ—เจฒเจคเฉ€ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฎเฉˆเจ‚ เจกเฉ€เจœเจผเจฐ API เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจธเฉฐเจ—เฉ€เจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€. เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ‡เฉฑเจฅเฉ‡. เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ. เจ‡เฉฑเจ• เจคเจฐเฉ€เจ•เจพ เจนเฉˆ "เจ…เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค" เจธเฉฐเจชเจคเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจเจพ

เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเจŸเจจ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเฉ‹ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ console.log ั user.email. เจ‡เจธ เจ•เจพเจฐเจตเจพเจˆ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจธเฉเจจเฉ‡เจนเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ: Uncaught TypeError (เจ…เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจคเฉ‹เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจฟเจ† เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ email) เจ—เฉเฉฐเจฎ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจตเจธเจคเฉ‚ เจฆเฉ‡ เจ•เจพเจฐเจจ. เจคเฉเจธเฉ€เจ‚ เจตเฉ€ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹ Javascript เจ…เจชเจตเจพเจฆ.

<button type="button" onClick={() => console.log(user.email)}>   
  Test Error button 
</button>

เจชเฉ‚เจฐเจพ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

import React, { Component } from "react";
import { connect } from "react-redux";
import { Input, List, Skeleton, Avatar } from "antd";
import * as Sentry from "@sentry/browser";
import getList from "../store/actions/getList";

const Search = Input.Search;

const mapState = state => ({
  list: state.root.list,
  loading: state.root.loading
});

const mapDispatch = {
  getList
};

class Container extends Component {
  constructor(props) {
    super(props);

    Sentry.init({
      dsn: "https://[email protected]/1417586",
    });
  }

  componentDidCatch(error, errorInfo) {
    Sentry.withScope(scope => {
      Object.keys(errorInfo).forEach(key => {
        scope.setExtra(key, errorInfo[key]);
      });
      Sentry.captureException(error);
    });
  }
  render() {
    const { list, loading, getList } = this.props;
    const user = undefined;
    return (
      <div className="App">
        <button
          type="button"
          onClick={() => console.log(user.email)}
        >
          test error1
        </button>
        <div onClick={() => Sentry.showReportDialog()}>Report feedback1</div>
        <h1>Music Finder</h1>
        <br />
        <Search onSearch={value => getList(value)} enterButton />
        {loading && <Skeleton avatar title={false} loading={true} active />}
        {!loading && (
          <List
            itemLayout="horizontal"
            dataSource={list}
            locale={{ emptyText: <div /> }}
            renderItem={item => (
              <List.Item>
                <List.Item.Meta
                  avatar={<Avatar src={item.artist.picture} />}
                  title={item.title}
                  description={item.artist.name}
                />
              </List.Item>
            )}
          />
        )}
      </div>
    );
  }
}

export default connect(
  mapState,
  mapDispatch
)(Container);

เจ‡เจธ เจฌเจŸเจจ เจจเฉ‚เฉฐ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจธเจพเจกเฉ€ เจชเจนเจฟเจฒเฉ€ เจ—เจฒเจคเฉ€ เจนเฉˆ

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจนเฉ‚-เจนเฉ‚!

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ€ เจ—เจฒเจคเฉ€ 'เจคเฉ‡ เจ•เจฒเจฟเฉฑเจ• เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจŸเฉˆเจ• เจŸเจฐเฉ‡เจธ เจตเฉ‡เจ–เฉ‹เจ—เฉ‡เฅค

Sentry เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจเจพ

เจธเฉเจจเฉ‡เจนเฉ‡ เจฌเฉเจฐเฉ‡ เจฒเฉฑเจ—เจฆเฉ‡ เจนเจจเฅค เจฌเฉ‡เจธเจผเฉฑเจ• เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจก เจ•เจฟเฉฑเจฅเฉ‡ เจนเฉˆ เจ‡เจน เจธเจฎเจเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ—เจฒเจคเฉ€ เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ‡เจ–เฉ‡ เจนเจจเฅค เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ ReactJS เจตเจฟเฉฑเจš เจธเจฐเฉ‹เจค เจจเจ•เจธเจผเฉ‡ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค

เจฎเฉˆเจ‚ เจธเจฐเฉ‹เจค เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจตเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ, เจชเจฐ เจ‡เจน เจ‡เจธ เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจฎเฉ‡เจฐเฉ‡ เจ‡เจฐเจพเจฆเฉ‡ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจฒเฉฐเจฌเจพ เจฌเจฃเจพ เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค

เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจตเจฟเจธเจผเฉ‡ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ‡เฉฑเจฅเฉ‡. เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹, เจฆเจฟเจฎเจฟเจคเจฐเฉ€ เจจเฉ‹เจœเจผเฉ‡เจจเจ•เฉ‹ เจธเจฐเฉ‹เจค เจจเจ•เจธเจผเจพ เจเจ•เฉ€เจ•เจฐเจฃ เจฌเจพเจฐเฉ‡ เจฆเฉ‚เจœเจพ เจญเจพเจ— เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเฉ‡เจ—เจพเฅค เจ‡เจธ เจฒเจˆ, เจนเฉ‹เจฐ เจชเจธเฉฐเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจนเจฟเฉฑเจŸ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจธเจฌเจธเจ•เฉเจฐเจพเจˆเจฌ เจ•เจฐเฉ‹ เจฆเจฟเจฎเจฟเจคเจฐเฉ€ เจจเฉ‹เจœเจผเฉ‡เจจเจ•เฉ‹เจคเจพเจ‚ เจ•เจฟ เจฆเฉ‚เจœเจพ เจญเจพเจ— เจจเจพ เจ–เฉเฉฐเจ เจœเจพเจตเฉ‡เฅค

5. เจตเจฐเจคเฉ‹เจ‚ เจธเฉฐเจคเจฐเฉ€ เจ…เฉฐเจค เจฌเจฟเฉฐเจฆเฉ‚ เจฆเฉ‡ เจจเจพเจฒ API

เจ เฉ€เจ• เจนเฉˆ. เจ…เจธเฉ€เจ‚ เจชเจฟเจ›เจฒเฉ‡ เจชเฉˆเจฐเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจœเจพเจตเจพเจธเจ•เฉเจฐเจฟเจชเจŸ เจ…เจชเจตเจพเจฆ เจจเฉ‚เฉฐ เจ•เจตเจฐ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ…เจธเฉ€เจ‚ XHR เจ—เจฒเจคเฉ€เจ†เจ‚ เจฌเจพเจฐเฉ‡ เจ•เฉ€ เจ•เจฐเจพเจ‚เจ—เฉ‡?

เจธเฉฐเจคเจฐเฉ€ เจ•เฉ‹เจฒ เจ•เจธเจŸเจฎ เจเจฐเจฐ เจนเฉˆเจ‚เจกเจฒเจฟเฉฐเจ— เจตเฉ€ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจเจชเฉ€เจ†เจˆ เจ—เจฒเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจนเฉˆเฅค

Sentry.captureException(err)

เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ, เจˆเจฎเฉ‡เจฒ เจ†เจฆเจฟ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ—เจฒเจคเฉ€ เจฆเจพ เจจเจพเจฎ, เจชเฉฑเจงเจฐ, เจกเฉ‡เจŸเจพ เจœเฉ‹เฉœเฉ‹, เจตเจฟเจฒเฉฑเจ–เจฃ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

superagent
  .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
  .set("X-RapidAPI-Key", #id_key)
  .end((err, response) => {
    if (err) {
      Sentry.configureScope(
        scope => scope
          .setUser({"email": "[email protected]"})
          .setLevel("Error")
      );
      return Sentry.captureException(err);
    }

    if (response) {
      return dispatch(setList(response.body.data));
    }
  });

เจฎเฉˆเจ‚ เจ•เฉˆเจš API เจฒเจˆ เจ‡เฉฑเจ• เจ†เจฎ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ.

import * as Sentry from "@sentry/browser";

export const apiCatch = (error, getState) => {
  const store = getState();
  const storeStringify = JSON.stringify(store);
  const { root: { user: { email } } } = store;

  Sentry.configureScope(
    scope => scope
      .setLevel("Error")
      .setUser({ email })
      .setExtra("store", storeStringify)
  );
    // Sentry.showReportDialog(); - If you want get users feedback on error
  return Sentry.captureException(error);
};

เจ‡เจธ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€ เจเจชเฉ€เจ†เจˆ เจ•เจพเจฒ เจตเจฟเฉฑเจš เจ†เจฏเจพเจค เจ•เจฐเฉ‹เฅค

export default query => (dispatch, getState) => {
  superagent
    .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
    .set("X-RapidAPI-Key", #id_key)
    .end((error, response) => {
      if (error) {
        return apiCatch(error, getState)
      }

      if (response) {
        return dispatch(setList(response.body.data));
      }
    });
};

เจ†เจ“ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ:

  • เจธเฉˆเฉฑเจŸ เจฒเฉˆเจตเจฒ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉˆเจ‚เจŸเจฐเฉ€ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉฑเจงเจฐ เจฆเฉ€ เจ—เจฒเจคเฉ€ เจชเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจนเจจ - 'เจ˜เจพเจคเจ•', 'เจ—เจฒเจคเฉ€', 'เจšเฉ‡เจคเจพเจตเจจเฉ€', 'เจฒเจพเจ—', 'เจœเจพเจฃเจ•เจพเจฐเฉ€, 'เจกเฉ€เจฌเฉฑเจ—', 'เจจเจพเจœเจผเฉเจ•')เฅค
  • setUser เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉ‡เจŸเจพ (เจ†เจˆเจกเฉ€, เจˆเจฎเฉ‡เจฒ เจชเจคเจพ, เจญเฉเจ—เจคเจพเจจ เจฏเฉ‹เจœเจจเจพ, เจ†เจฆเจฟ) เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • setExtra เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจ•เฉ‹เจˆ เจตเฉ€ เจกเจพเจŸเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจŸเฉ‹เจฐเฅค

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจฌเฉฑเจ— เจฌเจพเจฐเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจซเฉ€เจกเจฌเฉˆเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ showReportDialog เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค

Sentry.showReportDialog();

เจธเจฟเฉฑเจŸเจพ:

เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ Sentry เจจเฉ‚เฉฐ เจ‡เฉฑเจ• React เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจคเจฐเฉ€เจ•เจพ เจฆเฉฑเจธเจฟเจ† เจนเฉˆเฅค

โ†’ เจŸเฉˆเจฒเฉ€เจ—เฉเจฐเจพเจฎ เจšเฉˆเจŸ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจคเจฐเฉ€

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹