ΠŸΡ€ΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 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. ΠšΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ β€žΠ‘ΡŠΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚β€œ)

ΠŸΡ€ΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 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. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊ. Врябва Π΄Π° създадСм Π³Ρ€Π΅ΡˆΠΊΠ°. Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ свойството "undefined".

Врябва Π΄Π° създадСм Π±ΡƒΡ‚ΠΎΠ½, ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π΅Π½ Π΄Π½Π΅Π²Π½ΠΈΠΊ с 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

Ако Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π°, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ прослСдяванСто Π½Π° стСка.

ΠŸΡ€ΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React със Sentry

Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Π·Π»Π΅. Π Π°Π·Π±ΠΈΡ€Π° сС, Π²ΠΈΠΆΠ΄Π°Π»ΠΈ смС ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Π±Π΅Π· Π΄Π° Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅ къдС Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ става Π΄ΡƒΠΌΠ° Π·Π° ΠΊΠ°Ρ€Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π² ReactJS, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚Π΅ Π½Π΅ са ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ.

Π‘ΠΈΡ… искал ΡΡŠΡ‰ΠΎ Π΄Π° прСдоставя инструкции Π·Π° настройка Π½Π° ΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ°, Π½ΠΎ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚Π°Π·ΠΈ публикация ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-дълга, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π²ΡŠΠ·Π½Π°ΠΌΠ΅Ρ€ΡΠ²Π°Ρ….

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° Ρ‚ΡƒΠΊ. Ако сС интСрСсуватС ΠΎΡ‚ Ρ‚Π°Π·ΠΈ статия, Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ НоТСнко Ρ‰Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π° Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° част Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ°. Π’Π°ΠΊΠ° Ρ‡Π΅ Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ ΠΏΠΎΠ²Π΅Ρ‡Π΅ харСсвания ΠΈ сС Π°Π±ΠΎΠ½ΠΈΡ€Π°ΠΉΡ‚Π΅ Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ НоТСнкода Π½Π΅ пропусна Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° част.

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

Π‘ΠΈΡ… искал Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΎΠ±Ρ‰Π° функция Π·Π° 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 Π²ΠΈ позволява Π΄Π° Π²ΠΌΡŠΠΊΠ½Π΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° Π² Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΎΡ‚ΠΎ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° часовия. Π’ΠΎΠΉ ΠΈΠΌΠ° свойства - "fatal", "error", "warning", "log", "info, "debug", "critical").
  • setUser ΠΏΠΎΠΌΠ°Π³Π° Π·Π° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° всякакви потрСбитСлски Π΄Π°Π½Π½ΠΈ (ID, ΠΈΠΌΠ΅ΠΉΠ» адрСс, ΠΏΠ»Π°Π½ Π·Π° ΠΏΠ»Π°Ρ‰Π°Π½Π΅ ΠΈ Ρ‚.Π½.).
  • setExtra Π²ΠΈ позволява Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ всякакви Π΄Π°Π½Π½ΠΈ, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ°Π³Π°Π·ΠΈΠ½.

Ако искатС потрСбитСлска ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ функцията showReportDialog.

Sentry.showReportDialog();

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

ДнСс описахмС Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Sentry Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° React.

β†’ Telegram Ρ‡Π°Ρ‚ ΠΎΡ‚ ΠšΠ°Ρ€Π°ΡƒΠ»

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€