Sentry yordamida React ilovasida xatolarni kuzatish

Sentry yordamida React ilovasida xatolarni kuzatish

Bugun men sizga React ilovasida real vaqtda xatolarni kuzatish haqida gapirib beraman. Front-end ilovasi odatda xatolarni kuzatish uchun ishlatilmaydi. Ba'zi kompaniyalar xatolarni kuzatishni to'xtatib qo'yishadi, hujjatlar, testlar va hokazolardan so'ng unga qaytadilar. Biroq, agar siz mahsulotingizni yaxshi tomonga o'zgartira olsangiz, shunchaki qiling!

1. Sentry nima uchun kerak?

O'ylaymanki, siz ishlab chiqarish jarayonida xatolarni kuzatishga qiziqasiz

Sizningcha, bu etarli emasmi?

Mayli, keling, tafsilotlarni ko'rib chiqaylik.

Ishlab chiquvchilarning Sentry-dan foydalanishining asosiy sabablari:

  • Xatolar bilan kodni joylashtirishda xavflardan qochish imkonini beradi
  • Kodni tekshirishda QAga yordam bering
  • Muammolar haqida tezkor bildirishnomalarni oling
  • Xatolarni tezda tuzatish qobiliyati
  • Administrator panelida xatolarning qulay ko'rinishini olish
  • Xatolarni foydalanuvchi/brauzer segmenti bo‘yicha tartiblang

Bosh direktor/Lead loyihasining asosiy sabablari

  • Pulni tejash (Sentry serverlaringizga o'rnatilishi mumkin)
  • Foydalanuvchilarning fikr-mulohazalarini olish
  • Haqiqiy vaqtda loyihangizda nima noto'g'ri ekanligini tushunish
  • Odamlar sizning ilovangiz bilan bog'liq muammolar sonini tushunish
  • Ishlab chiquvchilaringiz xato qilgan joylarni topishga yordam bering

O'ylaymanki, ishlab chiquvchilar birinchi navbatda ushbu maqolaga qiziqishadi. Shuningdek, siz xo'jayiningizni Sentryni birlashtirishga ishontirish uchun ushbu sabablar ro'yxatidan foydalanishingiz mumkin.

Biznes ro'yxatidagi oxirgi element bilan ehtiyot bo'ling.

Siz allaqachon qiziqasizmi?

Sentry yordamida React ilovasida xatolarni kuzatish

Sentry nima?

Sentry - bu ishlab chiquvchilarga real vaqt rejimida nosozliklarni kuzatish va tuzatishga yordam beradigan ochiq kodli xatolarni kuzatish ilovasi. Ilova samaradorlikni oshirish va foydalanuvchi tajribasini yaxshilash imkonini berishini unutmang. Sentry JavaScript, Node, Python, PHP, Ruby, Java va boshqa dasturlash tillarini qo'llab-quvvatlaydi.

Sentry yordamida React ilovasida xatolarni kuzatish

2. Tizimga kiring va loyiha yarating

  • Sentry hisobingizni oching. Siz tizimga kirishingiz kerak bo'lishi mumkin. (Iltimos, Sentry serverlaringizga o'rnatilishi mumkinligini unutmang)
  • Keyingi qadam loyihani yaratishdir
  • Roʻyxatdan oʻz tilingizni tanlang. (Biz Reactni tanlaymiz. "Loyiha yaratish" tugmasini bosing)

Sentry yordamida React ilovasida xatolarni kuzatish

Ilovangizni moslashtiring. Sentry-ni konteynerga qanday integratsiya qilishning asosiy misolini quyida ko'rish mumkin:

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-da keyingi nima qilish kerakligini aniqlashga yordam beradigan yordamchi usta bor. Siz ushbu bosqichlarni bajarishingiz mumkin. Men sizga birinchi xato ishlov beruvchingizni qanday yaratishni ko'rsatmoqchiman. Ajoyib, biz loyiha yaratdik! Keling, keyingi bosqichga o'tamiz

3. React va Sentry integratsiyasi

Loyihangizga npm paketini o'rnatishingiz kerak.

npm i @sentry/browser

Konteyneringizda Sentryni ishga tushiring:

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

DSN Loyihalar -> Sozlamalar -> Mijoz kalitlarida joylashgan. Qidiruv satrida mijoz kalitlarini topishingiz mumkin.

Sentry yordamida React ilovasida xatolarni kuzatish

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

4. Birinchi xatoni kuzatish

Masalan, men Deezer API bilan oddiy musiqa ilovasidan foydalandim. Siz buni ko'rishingiz mumkin shu yerda. Biz xato yaratishimiz kerak. Buning bir usuli "aniqlanmagan" xususiyatga kirishdir

Biz chaqiradigan tugmani yaratishimiz kerak console.log с user.email. Ushbu amaldan so'ng biz xato xabarini olishimiz kerak: Tugallanmagan TypeError (belgilanmagan xususiyatdan xususiyatni o'qib bo'lmaydi email) yo'qolgan foydalanuvchi ob'ekti tufayli. Siz ham foydalanishingiz mumkin Javascriptdan istisno.

<button type="button" onClick={() => console.log(user.email)}>   
  Test Error button 
</button>

Butun konteyner quyidagicha ko'rinadi:

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

Ushbu tugmani birlashtirgandan so'ng, uni brauzerda sinab ko'rishingiz kerak.

Sentry yordamida React ilovasida xatolarni kuzatish

Bizda birinchi xato bor

Sentry yordamida React ilovasida xatolarni kuzatish

Voy!

Sentry yordamida React ilovasida xatolarni kuzatish

Agar siz sarlavha xatosini bossangiz, stek izini ko'rasiz.

Sentry yordamida React ilovasida xatolarni kuzatish

Xabarlar yomon ko'rinadi. Albatta, biz kodning qaerdaligini tushunmasdan xato xabarlarini ko'rdik. Odatiy bo'lib, biz ReactJS-dagi manba xaritasi haqida gapiramiz, chunki ular sozlanmagan.

Men manba xaritasini o'rnatish bo'yicha ko'rsatmalar bermoqchiman, ammo bu maqolani men o'ylaganimdan ancha uzoqroq qiladi.

Siz ushbu mavzuni o'rganishingiz mumkin shu yerda. Agar siz ushbu maqolaga qiziqsangiz, Dmitriy Nozhenko manba xaritasi integratsiyasi haqida ikkinchi qismni nashr etadi. Shunday qilib, ko'proq layk bosing va obuna bo'ling Dmitriy Nozhenkoikkinchi qismni o'tkazib yubormaslik uchun.

5. Foydalanish soqchi yakuniy nuqta bilan API

KELISHDIKMI. Biz oldingi paragraflarda javascript istisnosini ko'rib chiqdik. Biroq, XHR xatolari haqida nima qilamiz?

Sentry shuningdek, maxsus xatolarni qayta ishlashga ega. Men uni api xatolarini kuzatish uchun ishlatardim.

Sentry.captureException(err)

Siz ilovangiz, elektron pochtangiz va h.k.lar yordamida xato nomini, darajasini sozlashingiz, maʼlumotlar, noyob foydalanuvchi maʼlumotlarini qoʻshishingiz mumkin.

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 uchun umumiy funksiyadan foydalanmoqchiman.

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

Ushbu funktsiyani api chaqiruvingizga import qiling.

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

Keling, usullarni ko'rib chiqaylik:

  • setLevel qo'riqchi asboblar paneliga daraja xatosini kiritish imkonini beradi. Uning xususiyatlari bor - "halokatli", "xato", "ogohlantirish", "jurnal", "ma'lumot", "debug", "tanqidiy").
  • setUser har qanday foydalanuvchi ma'lumotlarini (id, elektron pochta manzili, to'lov rejasi va boshqalar) saqlashga yordam beradi.
  • setExtra sizga kerak bo'lgan har qanday ma'lumotlarni, masalan, do'konni belgilash imkonini beradi.

Xato haqida foydalanuvchi fikr-mulohazalarini olishni istasangiz, showReportDialog funksiyasidan foydalanishingiz kerak.

Sentry.showReportDialog();

xulosa:

Bugun biz Sentry-ni React ilovasiga integratsiya qilishning bir usulini tasvirlab berdik.

→ Telegram orqali suhbat soqchi

Manba: www.habr.com

a Izoh qo'shish