
Hoje eu vou falar sobre o monitoramento de erros em tempo real em aplicações React. Normalmente, a interface do usuário não é utilizada para o monitoramento de erros. Algumas empresas frequentemente adiam o monitoramento de erros, voltando a ele somente após a documentação, testes e outras coisas. No entanto, se você pode melhorar seu produto, então simplesmente faça isso!
1. Por que você precisa do Sentry?
Suponho que você esteja interessado em monitorar erros durante o processo de produção.
Você acha que isso é insuficiente?
Bem, vamos olhar os detalhes.
Principais razões para usar o Sentry para desenvolvedores:
- Permite eliminar riscos ao implantar código com erros.
- Apoio ao QA na teste do código.
- Receber notificações rápidas sobre problemas.
- Possibilidade de corrigir erros rapidamente.
- Obtenção de uma visualização conveniente de erros no painel de administração.
- Classificação de erros por segmentos de usuário / navegador.
Principais razões para CEOs / Líderes de projeto.
- Economia de dinheiro (o Sentry pode ser instalado em seus servidores).
- Receber feedback dos usuários.
- Compreensão do que está errado com seu projeto em tempo real.
- Entender a quantidade de problemas que as pessoas estão enfrentando com seu aplicativo.
- Ajudar a identificar onde seus desenvolvedores cometeram erros.
Acredito que os desenvolvedores estariam mais interessados neste artigo. Você também pode usar esta lista de razões para convencer a alta administração a integrar o Sentry.
Cuidado com o último item da lista para os negócios.
Já está interessado?

O que é o Sentry?
O Sentry é uma aplicação de monitoramento de erros de código aberto que ajuda desenvolvedores a rastrear e corrigir falhas em tempo real. Não se esqueça que a aplicação também aumenta a eficiência e melhora a experiência do usuário. O Sentry suporta JavaScript, Node, Python, PHP, Ruby, Java e outras linguagens de programação.

2. Faça login e crie um projeto.
- Abra sua conta Sentry. Você pode precisar fazer login. (Lembre-se de que o Sentry pode ser instalado em seus servidores.)
- O próximo passo é criar um projeto.
- Escolha sua linguagem na lista. (Vamos escolher React. Clique em "Criar projeto".)

Configure sua aplicação. Um exemplo básico de como integrar o Sentry em um contêiner pode ser visto abaixo:
import * as Sentry from '@sentry/browser';
// Sentry.init({
// dsn: "<https:>"
// });
// deveria ter sido chamado antes de usá-lo aqui
// idealmente, antes mesmo de renderizar seu aplicativo react
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) {
// renderizar UI de fallback
return (
<a onclick="{()" > Sentry.showReportDialog()}>Reportar feedback</a>
);
} else {
// quando não há erro, renderizar filhos inalterados
return this.props.children;
}
}
}O Sentry tem um Assistente útil que ajudará você a entender o que deve fazer em seguida. Você pode seguir os seguintes passos. Quero mostrar como criar seu primeiro manipulador de erros. Ótimo, criamos o projeto! Vamos para o próximo passo.
3. Integração do React com Sentry
Você deve instalar o pacote npm em seu projeto.
npm i @sentry/browserInicialize o Sentry em seu contêiner:
Sentry.init({
// dsn: #dsnUrl,
});O DSN pode ser encontrado em Projetos -> Configurações -> Chaves do Cliente. Você pode encontrar as chaves do cliente na barra de pesquisa.

componentDidCatch(error, errorInfo) {
Sentry.withScope(scope => {
Object.keys(errorInfo).forEach(key => {
scope.setExtra(key, errorInfo[key]);
});
Sentry.captureException(error);
});
}4. Rastreando o primeiro erro
Por exemplo, eu usei um aplicativo musical simples com a API do Deezer. Você pode ver isso. . Precisamos criar um erro. Uma maneira é acessar uma propriedade "undefined".
Devemos criar um botão que chama console.log com user.email. Após essa ação, devemos receber uma mensagem de erro: Uncaught TypeError (não é possível ler a propriedade de indefinido email) por causa da ausência do objeto usuário. Você também pode usar exceção JavaScript.
Todo o contêiner se parece com isso:
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:\/\/fc0edcf6927a4397855797a033f04085@sentry.io\/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)}
>
erro de teste1
</button>
<div onclick="{()" > Sentry.showReportDialog()}>Relatar feedback1</div>
<h1>Encontrador de Música</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);Após a integração deste botão, você deve testá-lo no navegador.

Temos nosso primeiro erro

Uhuul!

Se você clicar no erro do cabeçalho, verá a rastreação da pilha.

As mensagens parecem ruins. Claro, vimos mensagens de erro sem entender de onde vem esse código. Por padrão, isso se refere ao mapa fonte no ReactJS, pois eles não estão configurados.
Eu também gostaria de fornecer instruções sobre como configurar o mapa fonte, mas isso tornaria este artigo muito mais longo do que eu planejava.
Você pode explorar este tópico . Se você está interessado neste artigo, publicará a segunda parte sobre a integração do mapa fonte. Então, curta mais e inscreva-se , para não perder a segunda parte.
5. Usando Sentry com o ponto final API
Ok. Abordamos a exceção JavaScript nas seções anteriores. No entanto, o que faremos com erros de XHR?
O Sentry também tem um tratamento de erros personalizado. Eu o utilizei para rastrear erros de API.
Sentry.captureException(err)Você pode configurar o nome do erro, o nível, adicionar dados, dados únicos do usuário com seu aplicativo, e-mail, 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));
}
});Eu gostaria de usar uma função genérica para a captura de 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(); - Se você quiser obter o feedback dos usuários sobre o erro
return Sentry.captureException(error);
};Importe essa função na chamada da 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));
}
});
};Vamos verificar os métodos:
- setLevel permite inserir um erro de nível no painel de controle do Sentry. Ele tem propriedades - ‘fatal’, ‘error’, ‘warning’, ‘log’, ‘info’, ‘debug’, ‘critical’).
- setUser ajuda a armazenar quaisquer dados do usuário (id, endereço de e-mail, plano de pagamento, etc.).
- setExtra permite especificar quaisquer dados que você precisar, como a loja.
Se você deseja obter feedback dos usuários sobre o erro, deve usar a função showReportDialog.
Sentry.showReportDialog();Conclusão:
Hoje, descrevemos uma das maneiras de integrar o Sentry em um aplicativo React.
→ Chat no Telegram sobre
Fonte: habr.com
