背景
招聘面试的时候,我最喜欢问题前端如何做稳定性保障,也就是如何做线上系系统监控。
- 如何收集错误(js script error、 promise exception、404资源加载失败信息等)?
- 如何收集统计接口的成功率?
- 如何统计页面加载的性能?有哪些关键指标和维度?
对于创业团队来说,很多都不会关心监控。
- 一是是业务开发本来就繁忙,接入日志监控需开发工作量,哪来时间开搞?
- 二是日志监控系统它是一个系统,前端埋点、收集日志。后端有接收日志与展示日志的服务。高级的日志监控系统还带有报警与问题自动定位、甚至问题重现与定位功能。很复杂下,自己开发还是接入第三方服务?
作为(或者想成为)开发主管的你,想想你负责的产品,如果没有前端日志监控?
- 你负责的产品就是在线上裸奔呀!线上出现问题客户已经发起投诉,你还不知道从何查起,无从入手。
- 用户页面发生异常,如何能远程快速定位问题?错误栈信息在哪里?
- 你老板说页面怎么那么卡那么慢,加载性能优化,又该从何处下手?
- 更重要的是,你老板有时会说,这个产品上线,感觉没谱呀。这些你能不能站出来,拍出胸脯说:老板请放心,我们有监控系统666,线上稳定性自有保障!不用担心睡不好觉啦!
无论如何,“If you cannot measure it, you cannot improve it.”(你不能监测的东西,也无从改善。)

所以基于以上实际生产中的痛点,我们希望有一个前端监控平台。它提供了强大的在线页面监控能力,可以灵活监控业务数据,设置报警,并用可视化图表展示监控数据,助你实时洞察,提升质量和性能。
网上搜前端监控系统搭建会出来一大堆,可选方案如:
- 自行可以规划定义一套完善的监控系统。需要人力重新开发。
- 如何人力财力充足。建议部署ELK。
- 借助/部署第三方服务/插件
- 阿里ARMS :是阿里的一个前端数据监控的服务,是收费的。
- fundebug :挺完善的前端错误日志服务,也是收费的。
- BadJS :腾讯团队的一个开源项目,没看过,应该很不错的
- webfunny:作者是个人,开源部署,没用过。
- sentry :个人项目不收费,企业收费。但是它是github 上面的一个开源项目,支持各端的错误监控
收费的项目/自已从头到尾开发都不是创业公司技术团队的首选。成本就在那里,策略是选取一个开源项目快速,先满足当前业务需求,等业务起色后,如果开源项目不满足后,再想办法升级或迁移到收费项目。
所以,本文将基于 sentry 快速搭建的错误监控系统,包括服务端与客户端的部署(小程序端)
一、搭建 sentry
官网提供了两种部署方式: 1. docker , 2. python 原码部署
这里我使用的是 docker 的方式来安装,比较快捷
服务器环境:CentOS 7.x
1. 用wget安装安装docker
- 安装wget
$sudo apt-get update
$ sudo apt-get install wget- 安装docker
$ wget -qO- https://get.docker.com/ | sh
$ docker --version通过 docker --version 可以查看版本号并确认是否安装成功。
ps: 由于某种神秘原因国内无法直接从 docker 官方库直接获取镜像 这里我们使用 Docker 加速器 运行下面命令即可。
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://4031ebb7.m.daocloud.io
2、用pip安装 docker-compose
- 安装pip
$ sudo yum install -y python-pip- 安装发现python需要升级
$ python -V
如果是2.x 版本需要升级
$ yum install python3
$ python3 -V
$ cd /usr/bin
#备份原有默认Python路径
$ mv python python.bak
#将 python 链接至 python3
$ ln -s python3 python
$ python -V
显示是3.x 版本详情步骤可以参考:www.cnblogs.com/leon-zyl/p/…
- 安装过程如何发现pip 依赖 不支持python 2.x, 要3.x 所以也要先升级
$ pip -V
pip 20.0.2 from /usr/lib/python2.7
$ rm /usr/bin/pip
$ ln -s /usr/local/bin/pip3.8 /usr/bin/pip
$ pip -V
pip 19.2.3 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
- 用pip 安装docker-compose
$ sudo pip install docker-compose
$ docker-compose --version // 查看版本是否安装成功docker-compose 学习请参考:www.cnblogs.com/minseo/p/11…
3、部署sentry
克隆sentry项目
$ git clone https://github.com/getsentry/onpremise.git
# 执行安装脚本,结束时会询问是否创建初始账号
$ bash install.sh
# 完成后启动容器
$ docker-compose up -d
网上说按上面,可以让我们监控系统的后端服务器已经跑起来了,访问本地的9000端口。

但我的实际操作过程并没有成功。估计是secret-key没有配置进去。
$ docker-compose run --rm web config generate-secret-key这里会生成生产密钥:

- 网上说要装SENTRY_SECRET_KEY 这个需要添加到 docker-compose.yml 中。但 vi docker-compose.yml 并没有这个KEY, 那应该是 2.0版本的产物。
- 网上也有说放到 .env 文件中。但vi .env 文件也没有这个KEY
后来查资料发现,需要在docker 服务启动时。
$ SENTRY_IMAGE=getsentry/sentry:10 ./install.sh
$ docker run -d --name sentry-redis redis
$ docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry postgres
$ docker run --rm sentry config generate-secret-key
$ docker run -it --rm -e SENTRY_SECRET_KEY='生成的secret-key密钥串' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade到这一步会创建账号:

注意命令行前后不要有多余的空格
$ docker run -d -p 9000:9000 --name my-sentry -e SENTRY_SECRET_KEY='生成的secret-key密钥串' --link sentry-redis:redis --link sentry-postgres:postgres sentry
$ docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='生成的secret-key密钥串' --link sentry-postgres:postgres --link sentry-redis:redis sentry run cron
$ docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='生成的secret-key密钥串' --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker至此, sentry 后台服务9000就运行了,用刚才的创建的账号登录即可

二、sentry 创建项目,获取监控上报配置


上面框选的代码便是,前端调用监控API前要配置的。
三、小程序中使用sentry 上报
这里以Taro 为例,
$ npm install --save sentry-weapp
src/app.js
import Raven from 'sentry-weapp'
componentDidMount () {
const options = {
environment: 'production', // 指定为production才会上报
sampleRate: 1, // 100% 上报, 采样 0.1 表示 10%
debug: true, // 上线可以删除
}
// 上面在后台的项目生成的上报地址
Raven.config('http://xxxxxxxxxxxxx@xxxxxxxxxx:9000/2', options).install()
Taro.Logger = Raven;
}测试业务代码里这样写
Taro.Logger.captureMessage('Hello, world!'));
// Taro.Sentry = Sentry;
Taro.Logger.captureException('try to ', {
level: 'error'
})
try{
test()
} catch (ex) {
Taro.Logger.captureException(ex); // 上报异常
}后台看,异常已经上报进去了。

最后。
一个成熟的错误监控系统不止于此,智能监控才是更高阶的应用。后续会继续分享这方面的实践。
喜欢看技术管理类文章,请关注公众号“群鱼湾”,与你一起成长。
