БлСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React со помош Π½Π° Sentry

БлСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React со помош Π½Π° Sentry

ДСнСс ќС Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π·Π° слСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React. ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ ΠΏΡ€Π΅Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΎΠ±ΠΈΡ‡Π½ΠΎ Π½Π΅ сС користи Π·Π° слСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ. НСкои ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ чСсто Π³ΠΎ ΠΎΠ΄Π»ΠΎΠΆΡƒΠ²Π°Π°Ρ‚ ΡΠ»Π΅Π΄Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, Π²Ρ€Π°ΡœΠ°Ρ˜ΡœΠΈ сС Π½Π° Π½Π΅Π³ΠΎ ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°, тСстови ΠΈΡ‚Π½. ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ, Ρ‚ΠΎΠ³Π°Ρˆ само Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π³ΠΎ Ρ‚ΠΎΠ°!

1. Π—ΠΎΡˆΡ‚ΠΎ Π²ΠΈ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅Π½ Sentry?

ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΠΌ Π΄Π΅ΠΊΠ° стС заинтСрСсирани Π΄Π° слСдитС Π³Ρ€Π΅ΡˆΠΊΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° производството

Π”Π°Π»ΠΈ мислитС Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π½Π΅ Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ?

Π”ΠΎΠ±Ρ€ΠΎ, ајдС Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈΡ‚Π΅.

Π“Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π΄Π° користат Sentry:

  • Π’ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ Ρ€ΠΈΠ·ΠΈΡ†ΠΈ ΠΏΡ€ΠΈ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ со Π³Ρ€Π΅ΡˆΠΊΠΈ
  • ΠŸΠΎΠΌΠΎΠ³Π½Π΅Ρ‚Π΅ QA со Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚
  • Π”ΠΎΠ±ΠΈΠ²Π°Ρ˜Ρ‚Π΅ Π±Ρ€Π·ΠΈ ΠΈΠ·Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡšΠ° Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ
  • Бпособност Π·Π° Π±Ρ€Π·ΠΎ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅
  • Π”ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½ ΠΏΡ€ΠΈΠΊΠ°Π· Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ административниот ΠΏΠ°Π½Π΅Π»
  • Π‘ΠΎΡ€Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΏΠΎ сСгмСнт ΠΎΠ΄ корисник/прСлистувач

Π“Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€/Π’ΠΎΠ΄Π΅Ρ‡ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

  • Π—Π°ΡˆΡ‚Π΅Π΄Π΅Ρ‚Π΅ ΠΏΠ°Ρ€ΠΈ (Sentry ΠΌΠΎΠΆΠ΅ Π΄Π° сС инсталира Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ сСрвСри)
  • Π”ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ΄ корисницитС
  • Π Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ ΡˆΡ‚ΠΎ Π½Π΅ Π΅ Π²ΠΎ Ρ€Π΅Π΄ со Π²Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅
  • Π Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΡˆΡ‚ΠΎ Π»ΡƒΡ“Π΅Ρ‚ΠΎ Π³ΠΈ ΠΈΠΌΠ°Π°Ρ‚ со Π²Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°
  • Π’ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ мСста ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π²Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ

Мислам Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π²ΠΎ Π±ΠΈ Π±ΠΈΠ»Π΅ заинтСрСсирани Π·Π° овој напис. ΠœΠΎΠΆΠ΅Ρ‚Π΅ исто Ρ‚Π°ΠΊΠ° Π΄Π° ја користитС ΠΎΠ²Π°Π° листа Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° Π΄Π° Π³ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ Π²Π°ΡˆΠΈΠΎΡ‚ ΡˆΠ΅Ρ„ Π΄Π° Π³ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π° Sentry.

Π‘ΠΈΠ΄Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΈ со послСдната ставка ΠΎΠ΄ Π΄Π΅Π»ΠΎΠ²Π½ΠΈΠΎΡ‚ список.

Π”Π°Π»ΠΈ стС вСќС заинтСрСсирани?

БлСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React со помош Π½Π° 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;
        }
    }
}

Π‘Π΅Π½Ρ‚Ρ€ΠΈ ΠΈΠΌΠ° корисСн Π’ΠΎΠ»ΡˆΠ΅Π±Π½ΠΈΠΊ кој ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° сфатитС ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ слСдно. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ слСдитС ΠΎΠ²ΠΈΠ΅ Ρ‡Π΅ΠΊΠΎΡ€ΠΈ. Π‘Π°ΠΊΠ°ΠΌ Π΄Π° Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π²Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€Π² ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ со Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠžΠ΄Π»ΠΈΡ‡Π½ΠΎ, создадовмС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚! АјдС Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌΠ΅ Π½Π° слСдниот Ρ‡Π΅ΠΊΠΎΡ€

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. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊΠ°. Π’Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π³Ρ€Π΅ΡˆΠΊΠ°. Π•Π΄Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π΅ Π΄Π° пристапитС Π΄ΠΎ ΠΈΠΌΠΎΡ‚ΠΎΡ‚ β€žΠ½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½β€œ.

Π’Ρ€Π΅Π±Π° Π΄Π° создадСмС ΠΊΠΎΠΏΡ‡Π΅ ΡˆΡ‚ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.Π»ΠΎΠ³ с корисник.Π΅-ΠΏΠΎΡˆΡ‚Π°. По ΠΎΠ²Π°Π° Π°ΠΊΡ†ΠΈΡ˜Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΏΠΎΡ€Π°ΠΊΠ° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°: НСфатСн Ρ‚ΠΈΠΏ Π“Ρ€Π΅ΡˆΠΊΠ° (Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‡ΠΈΡ‚Π° ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΎ ΠΎΠ΄ Π½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ 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

Ако ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π²ΠΎ Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ, ќС Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚Ρ€Π°Π³Π° Π½Π° стСк.

БлСдСњС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React со помош Π½Π° Sentry

ΠŸΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ‚ лошо. Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, Π²ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ ΠΏΠΎΡ€Π°ΠΊΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π±Π΅Π· Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ ΠΊΠ°Π΄Π΅ Π΅ ΠΊΠΎΠ΄ΠΎΡ‚. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° ΠΌΠ°ΠΏΠ°Ρ‚Π° Π½Π° ΠΈΠ·Π²ΠΎΡ€ΠΎΡ‚ Π²ΠΎ ReactJS бидСјќи Ρ‚ΠΈΠ΅ Π½Π΅ сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ.

Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π±ΠΈ сакал Π΄Π° Π΄Π°Π΄Π°ΠΌ инструкции Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΡ€Π½Π°Ρ‚Π° ΠΌΠ°ΠΏΠ°, Π½ΠΎ Ρ‚ΠΎΠ° Π±ΠΈ ја Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠ΄ΠΎΠ»Π³Π° ΠΎΡ‚ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ ΠΈΠΌΠ°Π² Π½Π°ΠΌΠ΅Ρ€Π°.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°Ρ‚Π΅ ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ° Ρ‚ΡƒΠΊΠ°. Ако стС заинтСрСсирани Π·Π° овој напис, Π”ΠΌΠΈΡ‚Ρ€ΠΈΡ˜ НоТСнко ќС Π³ΠΎ објави Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π΄Π΅Π» Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΈΠ·Π²ΠΎΡ€Π½Π°Ρ‚Π° ΠΌΠ°ΠΏΠ°. Π—Π°Ρ‚ΠΎΠ°, притиснСтС повСќС лајкови ΠΈ ΠΏΡ€Π΅Ρ‚ΠΏΠ»Π°Ρ‚Π΅Ρ‚Π΅ сС Π½Π° Π”ΠΌΠΈΡ‚Ρ€ΠΈΡ˜ НоТСнкоза Π΄Π° Π½Π΅ сС ΠΏΡ€ΠΎΠΏΡƒΡˆΡ‚ΠΈ Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π΄Π΅Π».

5. Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Sentry со ΠΊΡ€Π°Ρ˜Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° 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));
    }
  });

Π‘ΠΈ сакал Π΄Π° користам Π³Π΅Π½Π΅Ρ€ΠΈΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π·Π° catch 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));
      }
    });
};

АјдС Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅:

  • setLevel Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π²ΠΌΠ΅Ρ‚Π½Π΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° Π²ΠΎ Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π²ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»Π° Π½Π° страТар. Има ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° - β€žΡ„Π°Ρ‚Π°Π»Π½Π°β€œ, β€žΠ³Ρ€Π΅ΡˆΠΊΠ°β€œ, β€žΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅β€œ, β€žΠ»ΠΎΠ³β€œ, β€žΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈβ€œ, β€žΠ΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅β€œ, β€žΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π°β€œ).
  • setUser ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° сС Π·Π°Ρ‡ΡƒΠ²Π°Π°Ρ‚ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ кориснички ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (ΠΈΠ΄, адрСса Π½Π° Π΅-ΠΏΠΎΡˆΡ‚Π°, ΠΏΠ»Π°Π½ Π·Π° плаќањС ΠΈΡ‚Π½.).
  • setExtra Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ Π²ΠΈ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅.

Ако сакатС Π΄Π° Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚Π΅ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ΄ корисницитС Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја користитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° showReportDialog.

Sentry.showReportDialog();

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ:

ДСнСс опишавмС Π΅Π΄Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° Sentry Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° React.

β†’ ВСлСграмски Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΎΠ΄ Sentry

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€