Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рдЖрдЬ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдЕреЕрдХреНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рд░рд┐рдЕрд▓-рдЯрд╛рдЗрдо рдПрд░рд░ рдЯреНрд░реЕрдХрд┐рдВрдЧрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреЗрди. рдПрд░рд░ рдЯреНрд░реЕрдХрд┐рдВрдЧрд╕рд╛рдареА рдлреНрд░рдВрдЯ-рдПрдВрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдпрдд: рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рдХрд╛рд╣реА рдХрдВрдкрдиреНрдпрд╛ рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдмрдЧ рдЯреНрд░реЕрдХрд┐рдВрдЧ рдмрдВрдж рдареЗрд╡рддрд╛рдд, рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг, рдЪрд╛рдЪрдгреНрдпрд╛ рдЗ. рдирдВрддрд░ рддреНрдпрд╛рдХрдбреЗ рдкрд░рдд рдпреЗрддрд╛рдд. рддрдерд╛рдкрд┐, рдЬрд░ рддреБрдореНрд╣реА рддреБрдордЪреЗ рдЙрддреНрдкрд╛рджрди рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реНрдпрд╛рд╕рд╛рдареА рдмрджрд▓реВ рд╢рдХрдд рдЕрд╕рд╛рд▓ рддрд░ рддреЗ рдХрд░рд╛!

1. рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдВрдЯреНрд░реАрдЪреА рдЧрд░рдЬ рдХрд╛ рдЖрд╣реЗ?

рдореА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрддреНрдкрд╛рджрдирд╛рджрд░рдореНрдпрд╛рди рдмрдЧ рдЯреНрд░реЕрдХ рдХрд░рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ

рд╣реЗ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА рдЕрд╕реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рдЯрддреЗ рдХрд╛?

рдареАрдХ рдЖрд╣реЗ, рдЪрд▓рд╛ рддрдкрд╢реАрд▓ рдкрд╛рд╣реВ.

рд╡рд┐рдХрд╕рдХрд╛рдВрдиреА рд╕реЗрдВрдЯрд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдореБрдЦ рдХрд╛рд░рдгреЗ:

  • рддреНрд░реБрдЯреАрдВрд╕рд╣ рдХреЛрдб рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЛрдЦреАрдо рдЯрд╛рд│рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рджреЗрддреЗ
  • рдХреЛрдб рдЪрд╛рдЪрдгреАрд╕рд╣ QA рд▓рд╛ рдорджрдд рдХрд░рд╛
  • рд╕рдорд╕реНрдпрд╛рдВрдмрджреНрджрд▓ рддреНрд╡рд░рд┐рдд рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛
  • рддреНрд╡рд░реАрдд рдЪреБрдХрд╛ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
  • рдНрдбрдорд┐рди рдкреЕрдиреЗрд▓рдордзреАрд▓ рддреНрд░реБрдЯреАрдВрдЪреЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдкреНрд░рджрд░реНрд╢рди рдорд┐рд│рд╡рдгреЗ
  • рд╡рд╛рдкрд░рдХрд░реНрддрд╛/рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд┐рднрд╛рдЧрд╛рдиреБрд╕рд╛рд░ рддреНрд░реБрдЯреАрдВрдЪреА рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рд╛

рд╕реАрдИрдУ/рд▓реАрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯрдЪреА рдореБрдЦреНрдп рдХрд╛рд░рдгреЗ

  • рдкреИрд╕реЗ рд╡рд╛рдЪрд╡рд╛ (рдЖрдкрд▓реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реЗрдВрдЯреНрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ)
  • рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рдорд┐рд│рд╡рдд рдЖрд╣реЗ
  • рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдХрд╛рдп рдЪреВрдХ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ
  • рддреБрдордЪреНрдпрд╛ рдЕреЕрдкрд╕рд╣ рд▓реЛрдХрд╛рдВрдирд╛ рдХрд┐рддреА рд╕рдорд╕реНрдпрд╛ рдпреЗрдд рдЖрд╣реЗрдд рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ
  • рддреБрдордЪреНрдпрд╛ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рдиреА рдЬрд┐рдереЗ рдЪреБрдХрд╛ рдХреЗрд▓реНрдпрд╛ рддреНрдпрд╛ рдард┐рдХрд╛рдгреЗ рд╢реЛрдзрдгреНрдпрд╛рдд рддреБрдореНрд╣рд╛рд▓рд╛ рдорджрдд рдХрд░рд╛

рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рдкреНрд░рдердо рдпрд╛ рд▓реЗрдЦрд╛рдд рд░рд╕ рдЕрд╕реЗрд▓. рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдмреЙрд╕рд▓рд╛ рд╕реЗрдиреНрдЯреНрд░реА рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрдЯрд╡реВрди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░рдгрд╛рдВрдЪреА рд╣реА рдпрд╛рджреА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.

рд╡реНрдпрд╡рд╕рд╛рдп рд╕реВрдЪреАрддреАрд▓ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдЖрдпрдЯрдордЪреА рдХрд╛рд│рдЬреА рдШреНрдпрд╛.

рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ?

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рд╕рдВрддрд░реА рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?

рд╕реЗрдиреНрдЯреНрд░реА рд╣рд╛ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдмрдЧ рдЯреНрд░реЕрдХрд┐рдВрдЧ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд╣реЗ рдЬреЛ рдбреЗрд╡реНрд╣рд▓рдкрд░рдирд╛ рд░реАрдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдХреНрд░реЕрд╢ рдЯреНрд░реЕрдХ рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЛ. рд╣реЗ рд╡рд┐рд╕рд░реВ рдирдХрд╛ рдХреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рдврд╡рд┐рдгреНрдпрд╛рд╕ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ. рд╕реЗрдиреНрдЯреНрд░реА JavaScript, Node, Python, PHP, Ruby, Java рдЖрдгрд┐ рдЗрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрдирд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ.

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

2. рд▓реЙрдЧрд┐рди рдХрд░рд╛ рдЖрдгрд┐ рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рд╛

  • рддреБрдордЪреЗ рд╕реЗрдиреНрдЯреНрд░реА рдЦрд╛рддреЗ рдЙрдШрдбрд╛. рддреБрдореНрд╣рд╛рд▓рд╛ рдХрджрд╛рдЪрд┐рдд рд▓реЙрдЧ рдЗрди рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. (рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдХреА рд╕реЗрдиреНрдЯреНрд░реА рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ)
  • рдкреБрдвреАрд▓ рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреЗ
  • рд╕реВрдЪреАрдордзреВрди рддреБрдордЪреА рднрд╛рд╖рд╛ рдирд┐рд╡рдбрд╛. (рдЖрдореНрд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рд╡рдбрдгрд╛рд░ рдЖрд╣реЛрдд. "рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рд╛" рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛)

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

рдЖрдкрдг рдкреБрдвреЗ рдХрд╛рдп рдХрд░рд╛рд╡реЗ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рдд рдорджрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЗрдиреНрдЯреНрд░реАрдХрдбреЗ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдЭрд╛рд░реНрдб рдЖрд╣реЗ. рддреБрдореНрд╣реА рдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛ рдлреЙрд▓реЛ рдХрд░реВ рд╢рдХрддрд╛. рдорд▓рд╛ рддреБрдордЪрд╛ рдкрд╣рд┐рд▓рд╛ рдПрд░рд░ рд╣рдБрдбрд▓рд░ рдХрд╕рд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рджрд╛рдЦрд╡рд╛рдпрдЪреЗ рдЖрд╣реЗ. рдЫрд╛рди, рдЖрдореНрд╣реА рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ! рдЪрд▓рд╛ рдкреБрдврдЪреНрдпрд╛ рдкрд╛рдпрд░реАрд╡рд░ рдЬрд╛рдКрдпрд╛

3. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рд╕рдВрддрд░реА рдПрдХрддреНрд░реАрдХрд░рдг

рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ npm рдкреЕрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

npm i @sentry/browser

рддреБрдордЪреНрдпрд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд╕реЗрдиреНрдЯреНрд░реА рд╕реБрд░реВ рдХрд░рд╛:

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

DSN рдкреНрд░рдХрд▓реНрдк -> рд╕реЗрдЯрд┐рдВрдЧреНрдЬ -> рдХреНрд▓рд╛рдпрдВрдЯ рдХреА рдордзреНрдпреЗ рд╕реНрдерд┐рдд рдЖрд╣реЗ. рддреБрдореНрд╣реА рд╕рд░реНрдЪ рдмрд╛рд░рдордзреНрдпреЗ рдХреНрд▓рд╛рдпрдВрдЯ рдХреА рд╢реЛрдзреВ рд╢рдХрддрд╛.

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

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. рдпрд╛ рдХреНрд░рд┐рдпреЗрдирдВрддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ: рди рдкрдХрдбрд▓реЗрд▓реА 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 рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рдЖрдордЪреА рдкрд╣рд┐рд▓реА рдЪреВрдХ рдЖрд╣реЗ

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рд╣реВ-рд╣реВ!

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рдЖрдкрдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рддреНрд░реБрдЯреАрд╡рд░ рдХреНрд▓рд┐рдХ рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕реНрдЯреЕрдХ рдЯреНрд░реЗрд╕ рджрд┐рд╕реЗрд▓.

Sentry рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рддреНрд░реБрдЯреАрдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ

рд╕рдВрджреЗрд╢ рд╡рд╛рдИрдЯ рджрд┐рд╕рдд рдЖрд╣реЗрдд. рдЕрд░реНрдерд╛рдд рдЖрдореНрд╣реА рдХреЛрдб рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рди рдШреЗрддрд╛ рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рдкрд╛рд╣рд┐рд▓реЗ рдЖрд╣реЗрдд. рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЖрдореНрд╣реА 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));
      }
    });
};

рдЪрд▓рд╛ рдкрджреНрдзрддреА рддрдкрд╛рд╕реВрдпрд╛:

  • рд╕реЗрдЯ рд▓реЗрд╡реНрд╣рд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдиреНрдЯреНрд░реА рдбреЕрд╢рдмреЛрд░реНрдбрдордзреНрдпреЗ рд▓реЗрд╡реНрд╣рд▓ рдПрд░рд░ рдШрд╛рд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдпрд╛рдд рдЧреБрдгрдзрд░реНрдо рдЖрд╣реЗрдд - 'рдШрд╛рддрдХ', 'рддреНрд░реБрдЯреА', 'рдЪреЗрддрд╛рд╡рдгреА', 'рд▓реЙрдЧ', 'рдорд╛рд╣рд┐рддреА, 'рдбреАрдмрдЧ', 'рдЧрдВрднреАрд░').
  • рд╕реЗрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреЛрдгрддрд╛рд╣реА рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдбреЗрдЯрд╛ (рдЖрдпрдбреА, рдИрдореЗрд▓ рдкрддреНрддрд╛, рдкреЗрдореЗрдВрдЯ рдпреЛрдЬрдирд╛ рдЗ.) рдЬрддрди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЗ.
  • рд╕реЗрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдгрддрд╛рд╣реА рдбреЗрдЯрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдВрдЪрдпрд┐рдд рдХрд░рд╛.

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдмрдЧрдмрджреНрджрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рдлреАрдбрдмреЕрдХ рдорд┐рд│рд╡рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рддреБрдореНрд╣реА showReportDialog рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛рд╡реЗ.

Sentry.showReportDialog();

рдирд┐рд╖реНрдХрд░реНрд╖:

рдЖрдЬ рдЖрдореНрд╣реА рд╕реЗрдиреНрдЯреНрд░реАрд▓рд╛ рд░рд┐рдНрдХреНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╛рд░реНрдЧ рд╡рд░реНрдгрди рдХреЗрд▓рд╛ рдЖрд╣реЗ.

тЖТ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░реЗ рдЪреЕрдЯ рд╕реЗрдВрдЯреНрд░реА

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛