Felsökning i React-applikationer med Sentry

Felsökning i React-applikationer med Sentry

Idag kommer jag att berÀtta om realtidsfelspÄrning i en React-applikation. GrÀnssnittsapplikationen anvÀnds vanligtvis inte för felspÄrning. MÄnga företag skjuter ofta upp felspÄrning och Äterkommer till det efter dokumentation, tester och sÄ vidare. Men om du kan förbÀttra din produkt, gör bara det!

1. Varför behöver du Sentry?

Jag antar att du Àr intresserad av att spÄra fel i produktionsprocessen.

Tycker du att det Àr otillrÀckligt?

Bra, lÄt oss titta pÄ detaljerna.

HuvudskÀlen till att anvÀnda Sentry för utvecklare:

  • Minskar riskerna vid distribution av kod med fel.
  • HjĂ€lper QA att testa koden.
  • FĂ„r snabba aviseringar om problem.
  • Möjlighet att snabbt Ă„tgĂ€rda fel.
  • FĂ„r en anvĂ€ndarvĂ€nlig visualisering av fel i administrationspanelen.
  • Sortera fel efter anvĂ€ndarsegment / webblĂ€sare.

HuvudskÀlen för CEO / projektledare.

  • Spara pengar (Sentry kan installeras pĂ„ era servrar).
  • FĂ„ anvĂ€ndarfeedback.
  • FörstĂ„ vad som gĂ„r fel med ditt projekt i realtid.
  • FörstĂ„ hur mĂ„nga problem anvĂ€ndare har med din applikation.
  • HjĂ€lper till att identifiera omrĂ„den dĂ€r dina utvecklare har gjort misstag.

Jag tror att utvecklare skulle vara sÀrskilt intresserade av den hÀr artikeln. Du kan ocksÄ anvÀnda denna lista med skÀl för att övertyga ledningen att integrera Sentry.

Var försiktig med den sista punkten pÄ listan för företaget.

Är du redan intresserad?

Felsökning i React-applikationer med Sentry

Vad Àr Sentry?

Sentry Àr en felspÄrningsapplikation med öppen kÀllkod som hjÀlper utvecklare att spÄra och ÄtgÀrda krascher i realtid. TÀnk ocksÄ pÄ att applikationen kan öka effektiviteten och förbÀttra anvÀndarupplevelsen. Sentry stöder JavaScript, Node, Python, PHP, Ruby, Java och andra programmeringssprÄk.

Felsökning i React-applikationer med Sentry

2. Logga in och skapa ett projekt.

  • Öppna ditt Sentry-konto. Du kanske mĂ„ste logga in. (Observera att Sentry kan installeras pĂ„ era servrar.)
  • Det nĂ€sta steget Ă€r att skapa ett projekt.
  • VĂ€lj ditt sprĂ„k frĂ„n listan. (Vi kommer att vĂ€lja React. Klicka pĂ„ 'Skapa projekt.')

Felsökning i React-applikationer med Sentry

StÀll in din applikation. Ett grundlÀggande exempel pÄ hur man integrerar Sentry i en behÄllare kan ses nedan:

import * as Sentry from '@sentry/browser';
// Sentry.init({
//  dsn: "<https:>"
// });
// skulle ha anropats innan det används här
// helst innan din React-app ens renderas

class ExampleBoundary extends Component {
    constructor(props) {
        super(props);
        this.state = { error: null };
    }

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

    render() {
        if (this.state.error) {
            //render fallback UI
            return (
              <a onclick="{()" > Sentry.showReportDialog()}&gt;Rapportera feedback</a>
            );
        } else {
            //när det inte finns något fel, rendera barnen oförändrade
            return this.props.children;
        }
    }
}

I Sentry finns det en anvÀndbar guide som hjÀlper dig att förstÄ vad du bör göra hÀrnÀst. Du kan följa dessa steg. Jag vill visa dig hur du skapar din första felhanterare. UtmÀrkt, vi har skapat ett projekt! LÄt oss gÄ vidare till nÀsta steg.

3. Integration av React och Sentry

Du mÄste installera npm-paketet i ditt projekt.

npm i @sentry/browser

Initiera Sentry i din behÄllare:

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

DSN finns under Projekt -> InstÀllningar -> Klientnycklar. Du kan hitta klientnycklarna i sökfÀltet.

Felsökning i React-applikationer med Sentry

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

4. SpÄra det första felet

Jag anvÀnde till exempel en enkel musikapplikation med Deezer API. Du kan se det. hÀr. Vi behöver skapa ett fel. Ett sÀtt att göra detta Àr att Ätkomma egenskapen "undefined".

Vi mÄste skapa en knapp som anropar. console.log med user.email. Efter detta ÄtgÀrd bör vi fÄ ett felmeddelande: Uncaught TypeError (kan inte lÀsa egenskap frÄn undefined e-post) pÄ grund av att anvÀndarobjektet saknas. Du kan ocksÄ anvÀnda Javascript-undantag.

Hela behÄllaren ser ut sÄ hÀr:

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 =&gt; ({
  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 =&gt; {
      Object.keys(errorInfo).forEach(key =&gt; {
        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)}
        &gt;
          test error1
        </button>
        <div onclick="{()" > Sentry.showReportDialog()}&gt;Rapportera feedback1</div>
        <h1>Musik Sökare</h1>
        <br />
        <search onsearch="{value" > getList(value)} enterButton \/&gt;
        {loading &amp;&amp; <skeleton avatar title="{false}" loading="{true}" active />}
        {!loading &amp;&amp; (
          <list
            itemlayout="horizontal"
            datasource="{list}"
            locale="{{" emptytext: <div /> }}
            renderItem={item =&gt; (
              <List.Item>
                &lt;List.Item.Meta
                  avatar={<avatar src="{item.artist.picture}" />}
                  title={item.title}
                  description={item.artist.name}
                \/&gt;
              </List.Item>
            )}
          />
        )}
      </div>
    );
  }
}

export default connect(
  mapState,
  mapDispatch
)(Container);

Efter att ha integrerat denna knapp bör du testa den i webblÀsaren.

Felsökning i React-applikationer med Sentry

Vi har vÄrt första fel.

Felsökning i React-applikationer med Sentry

Whoo-hoo!

Felsökning i React-applikationer med Sentry

Om du klickar pÄ felrubriken kommer du att se stacktraceringen.

Felsökning i React-applikationer med Sentry

Meddelandena ser dÄliga ut. SjÀlvklart har vi sett felmeddelanden utan att förstÄ var denna kod Àr. Som standard handlar det om kÀllkartan i ReactJS, eftersom de inte Àr konfigurerade.

Jag skulle ocksÄ vilja ge instruktioner om hur man konfigurerar kÀllkartan, men det skulle göra denna artikel mycket lÀngre Àn jag hade planerat.

Du kan utforska detta Àmne. hÀr. Om du Àr intresserad av denna artikel, Dmitry Nozhenko kommer att publicera del tvÄ om integration av kÀllkartan. SÄ tryck gÀrna pÄ fler gilla-markeringar och prenumerera pÄ Dmitry Nozhenko, sÄ att du inte missar del tvÄ.

5. AnvÀndning Sentry med slutpunkt API

Okej. Vi har gÄtt igenom Javascript-undantaget i de tidigare punkterna. Men vad ska vi göra med XHR-fel?

Sentry har ocksÄ anpassad felhantering. Jag har anvÀnt den för att spÄra API-fel.

Sentry.captureException(err)

Du kan konfigurera felnamn, nivÄ, lÀgga till data, unika anvÀndardata med din app, e-post etc.

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

Jag skulle vilja anvÀnda en gemensam funktion för API catch.

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(); - Om du vill fÄ Äterkoppling frÄn anvÀndare om fel
  return Sentry.captureException(error);
};

Importera denna funktion i api-anropet.

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

LÄt oss kolla metoderna:

  • setLevel lĂ„ter dig infoga en fel nivĂ„ i Sentrys instrumentbrĂ€da. Den har egenskaper – 'fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'.
  • setUser hjĂ€lper till att spara alla anvĂ€ndardata (id, e-postadress, betalningsplan etc.).
  • setExtra lĂ„ter dig ange vilken data du behöver, till exempel butiken.

Om du vill fÄ anvÀndarfeedback om ett fel bör du anvÀnda funktionen showReportDialog.

Sentry.showReportDialog();

Slutsats:

Idag har vi beskrivit ett av sÀtten att integrera Sentry i en React-app.

→ Telegram-grupp om Sentry

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster