แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

แžแŸ’แž„แŸƒแž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž”แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžขแŸ†แž–แžธแž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž€แŸ’แž“แžปแž„แž–แŸแž›แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แŸ” แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž•แŸ’แž“แŸ‚แž€แžแžถแž„แž˜แžปแžแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž‡แžถแž’แž˜แŸ’แž˜แžแžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž‘แŸแŸ” แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แžแŸ‚แž„แžแŸ‚แž”แžทแž‘แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸ แžŠแŸ„แž™แžแŸ’แžšแž›แž”แŸ‹แž‘แŸ…แžœแžถแžœแžทแž‰แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแžฏแž€แžŸแžถแžš แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแŸ”แž›แŸ” แž™แŸ‰แžถแž„โ€‹แžŽแžถโ€‹แž˜แžทแž‰ แž”แŸ’แžšแžŸแžทแž“โ€‹แž”แžพโ€‹แžขแŸ’แž“แž€โ€‹แžขแžถแž…โ€‹แž•แŸ’แž›แžถแžŸแŸ‹โ€‹แž”แŸ’แžแžผโ€‹แžšโ€‹แž•แž›แžทแžแž•แž›โ€‹แžšแž”แžŸแŸ‹โ€‹แžขแŸ’แž“แž€โ€‹แžฑแŸ’แž™โ€‹แž€แžถแž“แŸ‹โ€‹แžแŸ‚โ€‹แž›แŸ’แžขโ€‹แž”แŸ’แžšแžŸแžพแžšโ€‹แž“แŸ„แŸ‡โ€‹แž‚แŸ’แžšแžถแž“แŸ‹โ€‹แžแŸ‚โ€‹แž’แŸ’แžœแžพโ€‹แžœแžถโ€‹!

1. แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžš Sentry?

แžแŸ’แž‰แžปแŸ†แžŸแž“แŸ’แž˜แžแŸ‹แžแžถแžขแŸ’แž“แž€แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž€แŸ’แž“แžปแž„แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแžขแŸ†แžกแžปแž„แž–แŸแž›แž•แž›แžทแž

แžแžพแžขแŸ’แž“แž€แž‚แžทแžแžแžถแž“แŸแŸ‡แž˜แžทแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แž‘แŸ?

แž˜แžทแž“แžขแžธแž‘แŸ แžแŸ„แŸ‡แž˜แžพแž›แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแŸ”

แž แŸแžแžปแž•แž›แž€แŸ†แž–แžผแž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž€แŸ’แž“แžปแž„แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ SentryแŸ–

  • แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž‡แŸ€แžŸแžœแžถแž„แž แžถแž“แžทแž—แŸแž™แž“แŸ…แž–แŸแž›แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แžผแžŠแžŠแŸ‚แž›แž˜แžถแž“แž€แŸ†แž แžปแžŸ
  • แž‡แžฝแž™ QA แž‡แžถแž˜แžฝแž™แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแž€แžผแžŠ
  • แž‘แž‘แžฝแž›แž”แžถแž“แž€แžถแžšแž‡แžผแž“แžŠแŸ†แžŽแžนแž„แžšแž แŸแžŸแžขแŸ†แž–แžธแž”แž‰แŸ’แž แžถ
  • แžŸแž˜แžแŸ’แžแž—แžถแž–แž€แŸ’แž“แžปแž„แž€แžถแžšแž€แŸ‚แž€แŸ†แž แžปแžŸแž™แŸ‰แžถแž„แž†แžถแž”แŸ‹แžšแž แŸแžŸ
  • แž‘แž‘แžฝแž›แž”แžถแž“แž€แžถแžšแž”แž„แŸ’แž แžถแž‰แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž“แŸƒแž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„
  • แžแž˜แŸ’แžšแŸ€แž”แž€แŸ†แž แžปแžŸแžแžถแž˜แž•แŸ’แž“แŸ‚แž€แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹/แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€

แž แŸแžแžปแž•แž›แž…แž˜แŸ’แž”แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แž˜แŸ’แžšแŸ„แž„แž“แžถแž™แž€แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžท/แžขแŸ’แž“แž€แžŠแžนแž€แž“แžถแŸ†

  • แžŸแž“แŸ’แžŸแŸ†แž”แŸ’แžšแžถแž€แŸ‹ (Sentry แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€)
  • แž‘แž‘แžฝแž›แž”แžถแž“แž˜แžแžทแžขแŸ’แž“แž€แž”แŸ’แžšแžพ
  • แžŸแŸ’แžœแŸ‚แž„แž™แž›แŸ‹แž–แžธแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแžปแžŸแž‡แžถแž˜แžฝแž™แž‚แž˜แŸ’แžšแŸ„แž„แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž€แŸ’แž“แžปแž„แž–แŸแž›แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„
  • แž€แžถแžšแž™แž›แŸ‹แžŠแžนแž„แžขแŸ†แž–แžธแž…แŸ†แž“แžฝแž“แž”แž‰แŸ’แž แžถแžŠแŸ‚แž›แž˜แž“แžปแžŸแŸ’แžŸแž˜แžถแž“แž‡แžถแž˜แžฝแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ”
  • แž‡แžฝแž™แžขแŸ’แž“แž€แžŸแŸ’แžœแŸ‚แž„แžšแž€แž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž˜แžถแž“แž€แŸ†แž แžปแžŸ

แžแŸ’แž‰แžปแŸ†แž‚แžทแžแžแžถแžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž“แžนแž„แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž›แžพแžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แž‡แžถแž˜แžปแž“แžŸแžทแž“แŸ” แžขแŸ’แž“แž€แž€แŸแžขแžถแž…แž”แŸ’แžšแžพแž”แž‰แŸ’แž‡แžธแž แŸแžแžปแž•แž›แž“แŸแŸ‡แžŠแžพแž˜แŸ’แž”แžธแž”แž‰แŸ’แž…แžปแŸ‡แž”แž‰แŸ’แž…แžผแž›แž…แŸ…แž แŸ’แžœแžถแž™แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžฑแŸ’แž™แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž› Sentry แž•แž„แžŠแŸ‚แžšแŸ”

แžŸแžผแž˜แž”แŸ’แžšแž™แŸแžแŸ’แž“แž‡แžถแž˜แžฝแž™แž’แžถแžแžปแž…แžปแž„แž€แŸ’แžšแŸ„แž™แž“แŸ…แž€แŸ’แž“แžปแž„แž”แž‰แŸ’แž‡แžธแžขแžถแž‡แžธแžœแž€แž˜แŸ’แž˜แŸ”

แžแžพแžขแŸ’แž“แž€แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž แžพแž™แžฌแž“แŸ…?

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

แžแžพ Sentry แž‡แžถแžขแŸ’แžœแžธ?

Sentry แž‚แžบแž‡แžถแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž”แŸ’แžšแž—แž–แž”แžพแž€แž…แŸ†แž แžŠแŸ‚แž›แž‡แžฝแž™แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžแžถแž˜แžŠแžถแž“ แž“แžทแž„แž‡แžฝแžŸแž‡แžปแž›แž€แžถแžšแž‚แžถแŸ†แž„แž€แŸ’แž“แžปแž„แž–แŸแž›แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แŸ” แž€แžปแŸ†แž—แŸ’แž›แŸแž…แžแžถแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž– แž“แžทแž„แž€แŸ‚แž›แž˜แŸ’แžขแž”แž‘แž–แžทแžŸแŸ„แž’แž“แŸแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ” Sentry แž‚แžถแŸ†แž‘แŸ’แžš JavaScript, Node, Python, PHP, Ruby, Java แž“แžทแž„แž—แžถแžŸแžถแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแŸ”

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

2. แž…แžผแž› แž“แžทแž„แž”แž„แŸ’แž€แžพแžแž‚แž˜แŸ’แžšแŸ„แž„

  • แž”แžพแž€แž‚แžŽแž“แžธ Sentry แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” แžขแŸ’แž“แž€แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแžแŸ’แžšแžผแžœแž…แžผแž›แŸ” (แžŸแžผแž˜แž…แŸ†แžŽแžถแŸ†แžแžถ Sentry แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€)
  • แž‡แŸ†แž แžถแž“แž”แž“แŸ’แž‘แžถแž”แŸ‹แž‚แžบแž”แž„แŸ’แž€แžพแžแž‚แž˜แŸ’แžšแŸ„แž„
  • แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž—แžถแžŸแžถแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž–แžธแž”แž‰แŸ’แž‡แžธแŸ” (แž™แžพแž„แž“แžนแž„แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แž”แŸ’แžšแžแžทแž€แž˜แŸ’แž˜แŸ” แž…แžปแž… "แž”แž„แŸ’แž€แžพแžแž‚แž˜แŸ’แžšแŸ„แž„")

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

แž”แŸ’แžŠแžผแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžแžถแž˜แž”แŸ†แžŽแž„แŸ” แžงแž‘แžถแž แžšแžŽแŸแž‡แžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแžšแž”แŸ€แž”แž”แž‰แŸ’แž…แžผแž› Sentry แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แžปแž„แžแžบแž“แŸแžš แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ–

import * as Sentry from '@sentry/browser';
// Sentry.init({
//  dsn: "<https://63bbb258ca4346139ee533576e17ac46@sentry.io/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. แž€แžถแžšแžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž”แŸ’แžšแžแžทแž€แž˜แŸ’แž˜ แž“แžทแž„ Sentry

แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžแŸ‚แžŠแŸ†แžกแžพแž„แž€แž‰แŸ’แž…แž”แŸ‹ npm แž“แŸ…แž€แŸ’แž“แžปแž„แž‚แž˜แŸ’แžšแŸ„แž„แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ”

npm i @sentry/browser

แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ Sentry แž“แŸ…แž€แŸ’แž“แžปแž„แž’แžปแž„แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ–

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

DSN แž˜แžถแž“แž‘แžธแžแžถแŸ†แž„แž“แŸ…แž€แŸ’แž“แžปแž„ Projects -> Settings -> Client KeysแŸ” แžขแŸ’แž“แž€แžขแžถแž…แžŸแŸ’แžœแŸ‚แž„แžšแž€แž€แžผแž“แžŸแŸ„แž“แŸ…แž€แŸ’แž“แžปแž„แžšแž”แžถแžšแžŸแŸ’แžœแŸ‚แž„แžšแž€แŸ”

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ 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 (แž˜แžทแž“แžขแžถแž…แžขแžถแž“แž›แž€แŸ’แžแžŽแžŸแž˜แŸ’แž”แžแŸ’แžแžทแž–แžธแž˜แžทแž“แž”แžถแž“แž€แŸ†แžŽแžแŸ‹ 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://fc0edcf6927a4397855797a033f04085@sentry.io/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

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แžปแž…แž›แžพแž€แŸ†แž แžปแžŸแž”แž‹แž˜แž€แžแžถ แžขแŸ’แž“แž€แž“แžนแž„แžƒแžพแž‰แžŠแžถแž“แž‡แž„แŸ‹แŸ”

แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž€แŸ†แž แžปแžŸแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แžŠแŸ„แž™แž”แŸ’แžšแžพ Sentry

แžŸแžถแžšแž˜แžพแž›แž‘แŸ…แžขแžถแž€แŸ’แžšแž€แŸ‹แŸ” แž‡แžถโ€‹แž€แžถแžšโ€‹แž–แžทแžโ€‹แžŽแžถแžŸแŸ‹โ€‹แž™แžพแž„โ€‹แž”แžถแž“โ€‹แžƒแžพแž‰โ€‹แžŸแžถแžšโ€‹แž€แŸ†แž แžปแžŸโ€‹แžŠแŸ„แž™โ€‹แž˜แžทแž“โ€‹แž™แž›แŸ‹โ€‹แž–แžธโ€‹แž€แž“แŸ’แž›แŸ‚แž„โ€‹แžŠแŸ‚แž›โ€‹แž€แžผแžŠโ€‹แž“แŸ„แŸ‡โ€‹แŸ” แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แž™แžพแž„แž€แŸ†แž–แžปแž„แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž•แŸ‚แž“แž‘แžธแž”แŸ’แžšแž—แž–แž“แŸ…แž€แŸ’แž“แžปแž„ ReactJS แž–แŸ’แžšแŸ„แŸ‡แžœแžถแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž‘แŸแŸ”

แžแŸ’แž‰แžปแŸ†โ€‹แž€แŸโ€‹แž…แž„แŸ‹โ€‹แž•แŸ’แžแž›แŸ‹โ€‹แž€แžถแžšแžŽแŸ‚แž“แžถแŸ†โ€‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹โ€‹แž€แžถแžšโ€‹แž”แž„แŸ’แž€แžพแžโ€‹แž•แŸ‚แž“แž‘แžธโ€‹แž”แŸ’แžšแž—แž– แž”แŸ‰แžปแž“แŸ’แžแŸ‚โ€‹แžœแžถโ€‹แž“แžนแž„โ€‹แž’แŸ’แžœแžพโ€‹แžฑแŸ’แž™โ€‹แžขแžแŸ’แžแž”แž‘โ€‹แž“แŸแŸ‡โ€‹แžœแŸ‚แž„โ€‹แž‡แžถแž„โ€‹แžขแŸ’แžœแžธโ€‹แžŠแŸ‚แž›โ€‹แžแŸ’แž‰แžปแŸ†โ€‹แž…แž„แŸ‹โ€‹แž”แžถแž“แŸ”

แžขแŸ’แž“แž€แžขแžถแž…แžŸแžทแž€แŸ’แžŸแžถแž”แŸ’แžšแž’แžถแž“แž”แž‘แž“แŸแŸ‡แŸ” แž“แŸ…แž‘แžธแž“แŸแŸ‡. แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡, แž›แŸ„แž€ Dmitry Nozhenko แž“แžนแž„แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แž“แŸ‚แž€แž‘แžธแž–แžธแžšแžขแŸ†แž–แžธแž€แžถแžšแžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž•แŸ‚แž“แž‘แžธแž”แŸ’แžšแž—แž–แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แžŸแžผแž˜แž…แžปแž… Like แž“แžทแž„ Subscribe แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แž แž›แŸ„แž€ Dmitry NozhenkoแžŠแžพแž˜แŸ’แž”แžธแž€แžปแŸ†แžฑแŸ’แž™แžแž€แžแžถแž“แž•แŸ’แž“แŸ‚แž€แž‘แžธแž–แžธแžšแŸ”

แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แž†แŸ’แž˜แžถแŸ†แŸ” แž‡แžถแž˜แžฝแž™แž“แžนแž„แž…แŸ†แžŽแžปแž…แž”แž‰แŸ’แž…แž”แŸ‹ แž€แžถแžš 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": "john.doe@example.com"})
          .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));
      }
    });
};

แžแŸ„แŸ‡แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแŸ–

  • แž€แž˜แŸ’แžšแžทแžแž€แŸ†แžŽแžแŸ‹ แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž”แž‰แŸ’แž…แžผแž›แž€แŸ†แž แžปแžŸแž€แž˜แŸ’แžšแžทแžแž˜แžฝแž™แž‘แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แžถแžšแž”แž‰แŸ’แž‡แžผแž“แŸ” แžœแžถแž˜แžถแž“แž›แž€แŸ’แžแžŽแŸˆแžŸแž˜แŸ’แž”แžแŸ’แžแžท - 'fatal', 'error', 'warning', 'log', 'info, 'debug', 'critical') แŸ”
  • แž€แŸ†แžŽแžแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แž‡แžฝแž™แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž‘แžทแž“แŸ’แž“แž“แŸแž™แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŽแžถแž˜แžฝแž™ (แž›แŸแžแžŸแž˜แŸ’แž‚แžถแž›แŸ‹ แžขแžถแžŸแž™แžŠแŸ’แž‹แžถแž“แžขแŸŠแžธแž˜แŸ‚แž› แž•แŸ‚แž“แž€แžถแžšแž‘แžผแž‘แžถแžแŸ‹แŸ”แž›แŸ”)แŸ”
  • แž€แŸ†แžŽแžแŸ‹แž”แž“แŸ’แžแŸ‚แž˜ แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž”แž‰แŸ’แž‡แžถแž€แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŽแžถแž˜แžฝแž™แžŠแŸ‚แž›แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžš แžงแž‘แžถแž แžšแžŽแŸ แžšแž€แŸ’แžŸแžถแž‘แžปแž€แŸ”

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แž‘แž‘แžฝแž›แž”แžถแž“แž˜แžแžทแžขแŸ’แž“แž€แž”แŸ’แžšแžพแžขแŸ†แž–แžธแž€แŸ†แž แžปแžŸ แžขแŸ’แž“แž€แž‚แžฝแžšแžแŸ‚แž”แŸ’แžšแžพแž˜แžปแžแž„แžถแžš showReportDialogแŸ”

Sentry.showReportDialog();

แžŸแŸแž…แž€แŸ’แžแžธแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“:

แžแŸ’แž„แŸƒแž“แŸแŸ‡แž™แžพแž„แž”แžถแž“แž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแžœแžทแž’แžธแž˜แžฝแž™แž€แŸ’แž“แžปแž„แž€แžถแžšแž”แž‰แŸ’แž…แžผแž› Sentry แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ React แŸ”

โ†’ Telegram แž‡แž‡แŸ‚แž€แžŠแŸ„แž™ แž†แŸ’แž˜แžถแŸ†แŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster