应用错误跟踪系统:对软件系统运行过程中产生的错误日志进行收集从而实现监控告警。
虽然软件错误❌是不可避免的,但是可以降低错误数。
提高对错误的治理能力能让错误带来的损失降到最低 👍🏻 。
错误日志监控在最顶层的业务层监控,有他将会帮助你打造更好的软件!
我们需要业务场景下自己发现Bug的速度快于用户报告Bug的速度,毕竟让用户报告已经晚了。
典型的这套系统的架构:错误日志(前端、后端) => 传输(HTTP)=>错误跟踪平台(收集、展示、分析、告警)。
本文不讨论哪款软件来解决这个问题,只讲Sentry这个轮子,SASS版本和私有部署版体验几乎一致
本文主要讲了
应用错误需要监控的场景案例
Sentry有哪些功能
Sentry如何在k8s中私有化部署
本文由 www.iamle.com 流水理鱼 原创,wx公众号搜索 流水理鱼 或 liushuiliyu
SEO 关键字
Sentry私有化部署
Sentry helm部署
Sentry kubernets部署 k8s部署
1. 需要应用错误监控的场景案例
- 多年的老web项目需要https适配,因为老项目大量写死了http://所以文件修改数巨大,即便测试很仔细也不能保证完全没问题
- 运营发现落地页转化异常了,有访问没表单提交,找到技术,技术发现是某个JS报错,导致表单无法提交,造成推广费用的损失
- 上线了一个功能,由于环境差异,只在生产环境才触发,用户报告了才去查问题
- 应用错误日志虽然通过ELK采集了,但是缺乏及时分析和告警
- 特定的环境才产生错误,要解决问题的先去构建环境并复现错误,因为不清楚发生错误时的具体参数
2. Sentry有哪些功能
Sentry is cross-platform application monitoring, with a focus on error reporting.
Sentry跨平台应用监控,专注错误报告。
Sentry英文直译中文叫“哨兵”。
Sentry提供了一个应用程序监视平台,可以帮助您实时识别问题。
- 提供WEB UI
- 提供SASS版和私有部署2种方式
- 开源,授权协议为BSL,只要你不拿他来做SASS服务卖钱,自用可以免费商用
- 提供几乎所有主流开发语言和框架的SDK
- 提供完整的错误详情
- 支持自动上报错误和手动上报错误
- 支持WEB前端、后端、APP
- 支持多项目管理
- 支持账号权限管理
- 提供统一错误的聚合分析
-
今日头条等很多大公司都在用
3. 在Kubernets中部署Sentry
目前网上大部分都是讲DockerCompose的部署方式
其实Helm Hub上可以找到Sentry的helm charts包(⑤),那么直接用Helm部署Sentry是最快速方便的
3.1 Sentry部署资源要求
下面给出一个部署资源情况参考,这基本也就是最低资源消耗情况了
- Kubernets存储已经支持了动态PVC
-
Kubernets已经支持Ingress
-
准备一个子域名 (例如, sentry.iamle.com)
-
Helm部署Sentry会部署sentry-corn、sentry-web()、sentry-worker、Redis、PostgreSQL
-
空负载资源详细sentry-corn(220MB/0.01Core)、sentry-web(850MB/0.012Core)、sentry-worker(2048MB/0.04Core)、Redis(132+179MB/0.04+0.054Core)、PostgreSQL(506MB/0.03Core)
-
空负载整体资源占用情况,内存:3935MB、CPU核数:0.2 Cores、存储PVC:34G
3.2 Helm 部署 Sentry
helm为helm3
使用国内加速的charts(微软azure)
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator
helm repo update
helm search repo sentry
#NAME CHART VERSION APP VERSION DESCRIPTION
#stable/sentry 4.2.0 9.1.2 Sentry is a cross-platform crash reporting and ...
#已经可以在stable repo 找到 sentry
## helm安装sentry
kubectl create namespace sentry
helm install sentry stable/sentry \
-n sentry \
--set persistence.enabled=true,user.email=i@iamle.com,user.password=i@iamle.com \
--set ingress.enabled=true,ingress.hostname=sentry.iamle.com,service.type=ClusterIP \
--set email.host=smtp.yourhost.com,email.port=25 \
--set email.user=user,email.password=password,email.use_tls=false \
--wait
#参数一看就懂,更多安装参数看文末的参考⑤
#第一次安装需要耗时10分钟以上,等等等,db-init-job初始化数据库的时候花费了太多时间
#在安装完成之前,访问sentry.iamle.com会出现服务器内部错误
#出现下面的内容就表示部署好了
#NAME: sentry
#LAST DEPLOYED: Sun Apr 19 21:01:26 2020
#NAMESPACE: sentry
#STATUS: deployed
#REVISION: 1
#TEST SUITE: None
#NOTES:
#1. Get the application URL by running these commands:
# export POD_NAME=$(kubectl get pods --namespace sentry -l "app=sentry,role=web" -o jsonpath="{.items[0].metadata.name}")
# echo "Visit http://127.0.0.1:8080 to use your application"
# kubectl port-forward --namespace sentry $POD_NAME 8080:9000
#
#2. Log in with
#
# USER: i@iamle.com
# Get login password with
# kubectl get secret --namespace sentry sentry -o jsonpath="{.data.user-password}" | base64 --decode
#查看登陆密码,也就是user.password设置的值
#kubectl get secret --namespace default sentry -o jsonpath="{.data.user-password}" | base64 --decode
#删除sentry
#helm uninstall sentry -n sentry
ingress根据自己实际环境做一些微调,笔者的环境下ssl证书使用 cert-manager 自动管理,备注annotations就自动配置ssl
# sentry ingress示例
kubectl apply -f - <<EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sentry
namespace: sentry
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
rules:
- host: sentry.iamle.com
http:
paths:
- path: /
backend:
serviceName: sentry
servicePort: 9000
tls:
- hosts:
- sentry.iamle.com
secretName: sentry-cert
EOF
浏览器访问
https://sentry.iamle.com 使用安装时设置的账号密码登陆即可
3.3 Sentry新增一个项目
理论上是需要给每个项目都在Sentry中创建一个对应的项目
但是实际上这么干会比较麻烦,笔者建议对访问量不大,比如后台类的相同类型的新建一个项目即可
发现混在一起已经不好区分了,再去拆开也不迟
对于本身访问量巨大的“前端”项目,建议在Sentry管理后台的一对一配置
Projects 》 Add new Project 选择一个JavaScript类型
⚠️ 官方提供的SDK是国外的CDN,实际使用的时候需要把https://browser.sentry-cdn.com/5.5.0/bundle.min.js下载后放在自己的OSS+CDN上
SDK和初始化代码一般放入全站头部当中,当页面有js错误的时候已经会自动上报了
我们用chrome的console手动上报一个消息测试下sentry是否工作正常
Sentry.captureMessage("流水理鱼 www.iamle.com")
3.4 Helm安装sentry常见问题及解决
- 解决数据库不能初始化的问题
如果安装过程数据库不能初始化,可以手动初始化
kubectl exec -it -n sentry $(kubectl get pods -n sentry |grep sentry-web |awk '{print $1}') bash
sentry upgrade
- 手动创建一个新的管理员账号
kubectl exec -it -n sentry $(kubectl get pods -n sentry |grep sentry-web |awk '{print $1}') bash
sentry createuser
4. 总结
本文看起来洋洋洒洒一大篇,实际上15分钟就能部署好sentry🎉
Sentry不仅仅支持WEB前端,也支持桌面、APP、后端,全平台💯
注意如果要升级sentry,先备份数据先,之前的数据会被清空 ⚠️
如果遇到Sentry的部署、使用等问题可以在博客 www.iamle.com 中找到我的wx,加群讨论📣