เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบกเบทเป‰เบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ React. เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ”เป‰เบฒเบ™เบซเบ™เป‰เบฒเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบšเบฒเบ‡เบšเปเบฅเบดเบชเบฑเบ”เบกเบฑเบเบˆเบฐเบ›เบดเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก bug, เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบกเบฑเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบญเบเบฐเบชเบฒเบ™, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบซเป‰เบ”เบตเบ‚เบถเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบกเบฑเบ™!

1. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ Sentry?

เบ‚เป‰เบญเบเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเปเบกเบ‡เป„เบกเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบœเบฐเบฅเบดเบ”

เป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเบžเบฝเบ‡เบžเปเบšเป?

เบ•เบปเบเบฅเบปเบ‡, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

เป€เบซเบ”เบœเบปเบ™เบญเบฑเบ™เบ”เบฑเบšเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ Sentry:

  • เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”
  • เบŠเปˆเบงเบ QA เบเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”
  • เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เป„เบงเบเปˆเบฝเบงเบเบฑเบšเบšเบฑเบ™เบซเบฒ
  • เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบขเปˆเบฒเบ‡เป„เบงเบงเบฒ
  • เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™เบเบฐเบ”เบฒเบ™ admin
  • เบˆเบฑเบ”เบฎเบฝเบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ•เบฒเบกเบžเบฒเบเบชเปˆเบงเบ™เบœเบนเป‰เปƒเบŠเป‰/เบšเบฃเบฒเบงเป€เบŠเบต

เป€เบซเบ”เบœเบปเบ™เบซเบผเบฑเบเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ CEO/Lead

  • เบ›เบฐเบซเบเบฑเบ”เป€เบ‡เบดเบ™ (Sentry เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™)
  • เป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ•เบดเบŠเบปเบกเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰
  • เป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบœเบดเบ”เบžเบฒเบ”เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเปƒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡
  • เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบ›เบฐเบŠเบฒเบŠเบปเบ™เบกเบตเบเบฑเบš app เบ‚เบญเบ‡เบ—เปˆเบฒเบ™
  • เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบŠเบญเบเบซเบฒเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบœเบดเบ”เบžเบฒเบ”

เบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบˆเบฐเบชเบปเบ™เปƒเบˆเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเปˆเบญเบ™. เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰เป€เบžเบทเปˆเบญเบŠเบฑเบเบŠเบงเบ™เปƒเบซเป‰เบ™เบฒเบเบˆเป‰เบฒเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ Sentry.

เบˆเบปเปˆเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบเบฑเบšเบฅเบฒเบเบเบฒเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบธเบฅเบฐเบเบดเบ”.

เป€เบˆเบปเป‰เบฒเบชเบปเบ™เปƒเบˆเปเบฅเป‰เบงเบšเป?

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

Sentry เปเบกเปˆเบ™เบซเบเบฑเบ‡?

Sentry เปเบกเปˆเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเปˆเบ™เบ•เบดเบ”เบ•เบฒเบกเปเบกเบ‡เป„เบกเป‰เบ—เบตเปˆเป€เบ›เบตเบ”เปเบซเบผเปˆเบ‡เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบดเบ”เบ•เบฒเบก เปเบฅเบฐเปเบเป‰เป„เบ‚เบเบฒเบ™เบ‚เบฑเบ”เบ‚เป‰เบญเบ‡เปƒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡. เบขเปˆเบฒเบฅเบทเบกเบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰. Sentry เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ JavaScript, Node, Python, PHP, Ruby, Java เปเบฅเบฐเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบญเบทเปˆเบ™เป†.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

2. เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเปเบฅเบฐเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™

  • เป€เบ›เบตเบ”เบšเบฑเบ™เบŠเบต Sentry เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš. (เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ Sentry เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™)
  • เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™
  • เป€เบฅเบทเบญเบเบžเบฒเบชเบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฒเบเบฅเบฒเบเบเบฒเบ™. (เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฅเบทเบญเบ React. เบ„เบฅเบดเบ "เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™")

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบ›เบฑเบšเปเบ•เปˆเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบฅเบงเบก Sentry เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

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;
        }
    }
}

Sentry เบกเบตเบ•เบปเบงเบŠเปˆเบงเบเบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เป€เบžเบทเปˆเบญเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ„เบดเบ”เบญเบญเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ„เบงเบ™เบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบ•เปเปˆเป„เบ›. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบเบดเปˆเบ‡เปƒเบซเบเปˆ, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™! เบ‚เปเปƒเบซเป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›

3. เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ React เปเบฅเบฐ Sentry

เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบžเบฑเบเป€เบเบฑเบ” npm เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

npm i @sentry/browser

เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ Sentry เปƒเบ™เบ–เบฑเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™:

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

DSN เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ -> เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> เบฅเบนเบเบ„เป‰เบฒเบ„เบต. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบฅเบฐเบซเบฑเบ”เบฅเบนเบเบ„เป‰เบฒเปƒเบ™เปเบ–เบšเบ„เบปเป‰เบ™เบซเบฒ.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

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

4. เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ‚เป‰เบญเบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบžเบ‡เปเบšเบšเบ‡เปˆเบฒเบเป†เบเบฑเบš Deezer API. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบกเบฑเบ™ เบ—เบตเปˆเบ™เบตเป‰. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบงเบดเบ—เบตเบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” "เบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”".

เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ›เบธเปˆเบกเบ—เบตเปˆเป‚เบ—เบซเบฒ console.log ั user.email. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹: Uncaught TypeError (เบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบˆเบฒเบ undefined 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);

เบซเบผเบฑเบ‡เบˆเบฒเบเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ›เบธเปˆเบกเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบ—เบปเบ”เบชเบญเบšเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบงเป‰เบฒเบง!

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ„เบฅเบดเบเปƒเบชเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” header, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เป€เบ›เบฑเบ™ stack trace.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React เป‚เบ”เบเปƒเบŠเป‰ Sentry

เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบšเบดเปˆเบ‡เบšเปเปˆเบ”เบต. เปเบ™เปˆเบ™เบญเบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป‚เบ”เบเบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบขเบนเปˆเปƒเบช. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเปเบœเบ™เบ—เบตเปˆเปเบซเบผเปˆเบ‡เปƒเบ™ ReactJS เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบขเบฒเบเบˆเบฐเปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบœเบ™เบ—เบตเปˆเปเบซเบผเปˆเบ‡, เปเบ•เปˆเบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเบฒเบงเบเบงเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡เปƒเบˆ.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบถเบเบชเบฒเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰ เบ—เบตเปˆเบ™เบตเป‰. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, Dmitry Nozhenko เบˆเบฐเป€เบœเบตเบเปเบœเปˆเบžเบฒเบเบ—เบตเบชเบญเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒเปเบœเบ™เบ—เบตเปˆเปเบซเบผเปˆเบ‡. เบชเบฐเบ™เบฑเป‰เบ™, เบเบปเบ”เบ–เบทเบเปƒเบˆเปเบฅเบฐเบ•เบดเบ”เบ•เบฒเบกเป€เบžเบตเปˆเบกเป€เบ•เบตเบก Dmitry Nozhenkoเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบžเบฒเบ”เบžเบฒเบเบ—เบตเบชเบญเบ‡.

5. เบเบฒเบ™ เบ™เบณ เปƒเบŠเป‰ เบ—เบฐเบซเบฒเบ™เป€เบฎเบทเบญ เบเบฑเบšเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” API

เบ•เบปเบโ€‹เบฅเบปเบ‡. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบงเบกเป€เบญเบปเบฒเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™ javascript เปƒเบ™เบงเบฑเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” XHR?

Sentry เบเบฑเบ‡เบกเบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡. เบ‚เป‰เบญเบเปƒเบŠเป‰เบกเบฑเบ™เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡ api.

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);
};

เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เปƒเบ™เบเบฒเบ™เป‚เบ— api เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

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));
      }
    });
};

เปƒเบซเป‰โ€‹เบเบงเบ”โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹:

  • เบฅเบฐเบ”เบฑเบš เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เปƒเบชเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบ”เบฑเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ dashboard sentry. เบกเบฑเบ™เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” - 'fatal', 'error', 'warning', 'log', 'info, 'debug', 'critical').
  • setUser เบŠเปˆเบงเบเบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰เปƒเบ”เป† (id, เบ—เบตเปˆเบขเบนเปˆเบญเบตเป€เบกเบง, เปเบœเบ™เบเบฒเบ™เบˆเปˆเบฒเบเป€เบ‡เบดเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†).
  • setExtra เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบฅเบฐเบšเบธเบ‚เปเป‰เบกเบนเบ™เปƒเบ”เป†เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ•เบดเบŠเบปเบกเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบเปˆเบฝเบงเบเบฑเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เบ—เปˆเบฒเบ™เบ„เบงเบ™เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ showReportDialog.

Sentry.showReportDialog();

เบชเบฐเบซเบผเบธเบš:

เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบฅเบงเบก Sentry เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ React.

โ†’ Telegram เบชเบปเบ™เบ—เบฐเบ™เบฒเป‚เบ”เบ เบ—เบฐเบซเบฒเบ™เป€เบฎเบทเบญ

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™