
แแแแแแแแแแแปแแแนแแแแแถแแแขแแแแขแแแธแแถแแแถแแแถแแแแ แปแแแแแปแแแแแแถแแแแแแแแแ แแแแปแแแแแแแทแแธ React แ แแแแแแทแแธแแแแแแแถแแแปแแแทแแแแแผแแแถแแแแแพแแถแแแแแแถแแแแแถแแแแถแแแถแแแถแแแแ แปแแแแ แแแแปแแ แแปแแแฝแแ แแแฝแแแแแแแแทแแแถแแแถแแแถแแแแ แปแ แแแแแแแแแแแ แแถแแทแแแแแแถแแแแธแฏแแแถแ แแถแแแแแพแแแแแแแแ แแแถแโแแถโแแทแ แแแแแทแโแแพโแขแแแโแขแถแ โแแแแถแแโแแแแผโแโแแแทแแแโแแแแโแขแแแโแฑแแโแแถแแโแแโแแแขโแแแแแพแโแแแโแแแแถแแโแแโแแแแพโแแถโ!
1. แ แแแปแขแแแธแแถแแแถแขแแแแแแแผแแแถแ Sentry?
แแแแปแแแแแแแแแถแขแแแแ แถแแแขแถแแแแแแแแแแปแแแถแแแถแแแถแแแแ แปแแขแแกแปแแแแแแแทแ
แแพแขแแแแแทแแแถแแแแแทแแแแแแแแแแถแแแแ?
แแทแแขแธแแ แแแแแพแแแแแแแถแแแแแขแทแแ
แ แแแปแแแแแแผแแแแแแถแแแขแแแแขแแทแแแแแแแแแแปแแแถแแแแแพแแแแถแแ Sentryแ
- แขแแปแแแแถแแฑแแแขแแแแแแแแถแแ แถแแทแแแแแ แแแแแถแแแแแแแถแแแผแแแแแแถแแแแ แปแ
- แแฝแ QA แแถแแฝแแแถแแแแแพแแแแแแแผแ
- แแแฝแแแถแแแถแแแผแแแแแนแแแ แแแขแแแธแแแแ แถ
- แแแแแแแถแแแแแปแแแถแแแแแแ แปแแแแถแแแถแแแแ แแ
- แแแฝแแแถแแแถแแแแแ แถแแแถแแแแแฝแแแแแแ แปแแแ แแแแปแแแแแถแแแแแแแแแแแ
- แแแแแแแแแ แปแแแถแแแแแแแขแแแแแแแพแแแแถแแ/แแแแแแทแแธแแปแแแ
แ แแแปแแแ แแแแแแแแแถแแแแแแแแแแถแแแแแแแทแแแแแท/แขแแแแแนแแแถแ
- แแแแแแแแแถแแ (Sentry แขแถแ แแแแผแแแถแแแแกแพแแแ แแพแแแถแแแธแแแแแแแแขแแแ)
- แแแฝแแแถแแแแทแขแแแแแแแพ
- แแแแแแแแแแธแขแแแธแแแแแปแแแถแแฝแแแแแแแแแแแแขแแแแแแแปแแแแแแถแแแแแแแ
- แแถแแแแแแนแแขแแแธแ แแแฝแแแแแ แถแแแแแแปแแแแแถแแแถแแฝแแแแแแแทแแธแแแแแขแแแแ
- แแฝแแขแแแแแแแแแแแแแแแแแแแแขแแแแขแแทแแแแแแแแแแแขแแแแแถแแแแ แปแ
แแแแปแแแทแแแถแขแแแแขแแทแแแแแแแแนแแ แถแแแขแถแแแแแแแแพแขแแแแแแแแแแถแแปแแแทแแ แขแแแแแแขแถแ แแแแพแแแแแธแ แแแปแแแแแแแพแแแแธแแแแ แปแแแแแ แผแแ แ แ แแแถแแแแแแขแแแแฑแแแแฝแแแแแ แผแ Sentry แแแแแแ
แแผแแแแแแแแแแแถแแฝแแแถแแปแ แปแแแแแแแแ แแแแปแแแแแแธแขแถแแธแแแแแแ
แแพแขแแแแ แถแแแขแถแแแแแแแ แพแแฌแแ ?

แแพ Sentry แแถแขแแแธ?
Sentry แแบแแถแแแแแแทแแธแแถแแแถแแแแ แปแแแแแแแแพแแ แแ แแแแแฝแแขแแแแขแแทแแแแแแแแถแแแถแ แแทแแแฝแแแปแแแถแแแถแแแแแแปแแแแแแถแแแแแแแแ แแปแแแแแแ แแถแแแแแแทแแธแขแแปแแแแถแแฑแแแขแแแแแแแแพแแแแแแทแแแแแถแ แแทแแแแแแแขแแแแทแแแแแแขแแแแแแแพแแแแถแแแ Sentry แแถแแแแ JavaScript, Node, Python, PHP, Ruby, Java แแทแแแถแแถแแแแแแแแแแแทแแธแแแแแแแแแ

2. แ แผแ แแทแแแแแแพแแแแแแแ
- แแพแแแแแธ Sentry แแแแแขแแแแ แขแแแแแแแ แแแแถแแแแผแแ แผแแ (แแผแแ แแแถแแแถ Sentry แขแถแ แแแแผแแแถแแแแกแพแแแ แแพแแแถแแแธแแแแแแแแขแแแ)
- แแแ แถแแแแแแถแแแแบแแแแแพแแแแแแแ
- แแแแพแแแพแแแถแแถแแแแแขแแแแแธแแแแแธแ (แแพแแแนแแแแแพแแแพแ แแแแแทแแแแแ แ แปแ "แแแแแพแแแแแแแ")

แแแแผแแแแแแแทแแธแแแแแขแแแแแถแแแแแแ แงแแถแ แแแแแถแแผแแแแแถแแแแแแแแแแแ แผแ Sentry แแ แแแแปแแแปแแแบแแแ แขแถแ แแพแแแพแแแถแแแแแแแ
import * as Sentry from '@sentry/browser';
// Sentry.init({
// dsn: "<https://63bbb258ca4346139ee533576e17ac46@sentry.io/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. แแถแแแฝแแแแแ แผแแแแแแทแแแแ แแทแ Sentry
แขแแแแแแแผแแแแแแกแพแแแแแ แแ npm แแ แแแแปแแแแแแแแแแแแขแแแแ
npm i @sentry/browserแ แถแแแแแแพแ Sentry แแ แแแแปแแแปแแแแแแขแแแแ
Sentry.init({
// dsn: #dsnUrl,
});DSN แแถแแแธแแถแแแแ แแแแปแ Projects -> Settings -> Client Keysแ แขแแแแขแถแ แแแแแแแแแผแแแแแ แแแแปแแแแถแแแแแแแแแ

componentDidCatch(error, errorInfo) {
Sentry.withScope(scope => {
Object.keys(errorInfo).forEach(key => {
scope.setExtra(key, errorInfo[key]);
});
Sentry.captureException(error);
});
}4. แแถแแแถแแแแ แปแแแแแผแ
แแถแงแแถแ แแแ แแแแปแแแถแแแแแพแแแแแแทแแธแแแแแแแธแแถแแแแแแถแแฝแ Deezer APIแ แขแแแแขแถแ แแพแแแถแ . แแพแแแแแผแแแแแแพแแแแ แปแแ แแทแแธแแฝแแแบแแแแผแแ แผแแแแแพแแแแแแแแแแแแแท "แแทแแแถแแแแแแ"
แแพแแแแแผแแแแแแพแแแแผแแปแแแแแ แ
console.log ั user.email. แแแแแถแแแแธแแแแแแแถแแแแ แแพแแแฝแแแแแแฝแแแถแแแถแแแแ แปแแแฝแแ Uncaught TypeError (แแทแแขแถแ
แขแถแแแแแแแแแแแแแแทแแธแแทแแแถแแแแแแ 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://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)}
>
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);แแแแแถแแแแธแแแแ แผแแแแผแแปแแแแ แขแแแแแฝแแแแแถแแแแแแแถแแ แแแแปแแแแแแแทแแธแแปแแแแ

แแพแแแถแแแแ แปแแแแแผแแแแแแแพแแ

แ แผแ แผ!

แแแแแทแแแพแขแแแแ แปแ แแพแแแ แปแแแแแแแถ แขแแแแแนแแแพแแแถแแแแแ

แแถแแแพแแแ แขแถแแแแแแ แแถโแแถแโแแทแโแแถแแโแแพแโแแถแโแแพแโแแถแโแแแ แปแโแแแโแแทแโแแแโแแธโแแแแแแโแแแโแแผแโแแแโแ แแถแแแแแถแแแพแ แแพแแแแแปแแแทแแถแแขแแแธแแแแแธแแแแแแแ แแแแปแ ReactJS แแแแแแแถแแทแแแแแผแแแถแแแแแแแแ แแถแแแแแแแแแแแ
แแแแปแโแแโแ แแโแแแแแโแแถแแแแแถแโแแแแแถแแโแแถแโแแแแแพแโแแแแแธโแแแแแ แแแปแแแแโแแถโแแนแโแแแแพโแฑแแโแขแแแแแโแแแโแแแโแแถแโแขแแแธโแแแโแแแแปแโแ แแโแแถแแ
แขแแแแขแถแ แแทแแแแถแแแแแถแแแแแแแ . แแแแแทแแแพแขแแแแ แถแแแขแถแแแแแแแขแแแแแแแแ, แแนแแแแแแปแแแแแแแแแแธแแธแแขแแแธแแถแแแฝแแแแแ แผแแแแแแธแแแแแแ แแผแ แแแแแแผแแ แปแ Like แแทแ Subscribe แแแแแแแแแ แแพแแแแธแแปแแฑแแแแแแถแแแแแแแแธแแธแแ
แแถแแแแแพแแแแถแแ แแแแถแแ แแถแแฝแแแนแแ แแแปแ แแแแ แแ แแถแ 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": "john.doe@example.com"})
.setLevel("Error")
);
return Sentry.captureException(err);
}
if (response) {
return dispatch(setList(response.body.data));
}
});แแแแปแแ แแแแแแพแแปแแแถแแแผแแ แแแแแถแแ 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));
}
});
};แแแแแทแแทแแแแแพแแแทแแธแแถแแแแแแ
- แแแแแทแแแแแแ แขแแปแแแแถแแฑแแแขแแแแแแแ แผแแแแ แปแแแแแแทแแแฝแแแ แแแแปแแแแแถแแแแแแแแแแแแแถแแแแแแผแแ แแถแแถแแแแแแแแแแแแแแแท - 'fatal', 'error', 'warning', 'log', 'info, 'debug', 'critical') แ
- แแแแแแขแแแแแแแพแแแแถแแ แแฝแแแแแแถแแปแแแทแแแแแแแขแแแแแแแพแแแแถแแแแถแแฝแ (แแแแแแแแถแแ แขแถแแแแแแถแแขแแธแแแ แแแแแถแแแผแแถแแแแแ)แ
- แแแแแแแแแแแ แขแแปแแแแถแแฑแแแขแแแแแแแแถแแแแทแแแแแแแแถแแฝแแแแแขแแแแแแแผแแแถแ แงแแถแ แแแ แแแแแถแแปแแ
แแแแแทแแแพแขแแแแ แแแแแฝแแแถแแแแทแขแแแแแแแพแขแแแธแแแ แปแ แขแแแแแฝแแแแแแแพแแปแแแถแ showReportDialogแ
Sentry.showReportDialog();แแแ แแแแธแแแแแทแแแแถแ:
แแแแแแแแแพแแแถแแแแแแถแขแแแธแแทแแธแแฝแแแแแปแแแถแแแแแ แผแ Sentry แแ แแแแปแแแแแแแทแแธ React แ
โ Telegram แแแแแแแ
แแแแแ: www.habr.com
