简介
sentry是一款错误日志收集平台,可以将代码错误信息进行收集。
平常我们开发完成以后,发现问题的手段仅自测-》测试人员-》最后市场反馈。一般我们收到市场反馈的时候已经产生了事故,作为一个合格的程序猿,如果默默等着市场提问题肯定是不够滴!
sentry就非常贴心的帮助我们收集了所有的错误异常(注意不是日志!)
还能点进这个异常查看原始代码(基本都能定位到代码的哪一行),这样我们就能主动发现问题,然后结合我们的日志,排查问题。是不是很优雅?
还能收集部份其他信息!我这里是springboot的服务,只记录了java的平台版本。像Android和IOS这种还能收集到当前手机型号、版本、分辨率等信息。千万别小看这些信息,像移动端这种客户端的日志,如果客户不主动上报,就需要一套非常完善的日志系统。
非常优雅有木有?
而且支持的平台非常的多,基本涵盖了所有语言和平台。
安装Sentry
安装Docker以及相关依赖
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
注:安装过程如果特别慢,请稍安勿躁;也可以切换为国内源进行安装。
启动Docker后台服务
systemctl start docker
测试运行
docker run hello-world
设置开机启动
systemctl enable docker
查看一下docker和docker compose的版本,以验证是否安装成功
查看Docker版本
docker --version
查看Docker compose版本
docker compose version
安装git
yum install git
下载onpremise
官方制作的自动化安装脚本,sentry组件非常多,如下图所示。所以不要想自己一个个去装,能要你命
git clone https://github.com/getsentry/onpremise.git
这个是旧的
git https://github.com/getsentry/self-hosted.git
这个是新仓库
两个地址可以拉取,网上大多数都是旧的,后面估计仓库迁移了,但旧的也能用。
安装sentry
安装的过程中会下载很多docker镜像,能否成功就看这一步了~
cd onpremise
./install.sh
安装过程中,如果出现错误,本地会有日志,可以看下。
出现超时情况,可以多次重试./install.sh
命令来尝试解决,如果一直不行的话,可以看下我后面的问题总结。
安装快结束的时候会提示你是否现在注册账户,我这里选择是(输入y),接着输入对应信息即可。
启动
docker compose up -d
可以看到启动的服务贼多…
注意一定得在onpremise
文件目录下执行
打开浏览器输入IP地址+端口号9000就可以访问Sentry登录界面了。
邮箱配置
mail配置
进入onpremise/sentry
目录下,编辑config.yml
着重讲解一下几个配置项
- mail.host:邮件服务域名
- mail.port:587
- mail.username:邮箱登录名
- mail.use-tls&ssl:我这里都是false,实际应该是true对应587,但我测试下来是能成功发送的。
- mail.password:不是邮箱登录密码,是邮箱给的IMAP/SMTP服务密码
- mail.from:与mail.username要一致
域名配置
域名配置
system.url-prefix: 'https://sentry.xxx.com/'
system.internal-url-prefix: 'https://sentry.xxx.com/'
这里配置的主要影响我们邮件发送出去后,点击跳转的访问地址。
不配置的话默认使用当前部署的外网ip+9000端口
重新部署
先进入到之前下载的onpremise
目录下
改好配置以后,执行命令将原来的容器都移除
docker compose down
不用担心数据会没,sentry默认是用文件存储数据,都存在本地,所以不用担心。
重新运行并启动
docker compose up -d
验证并测试
启动成功后,登入并进入管理
选择mail,可以看到邮箱配置已生效,点击发送测试邮件进行测试~
HTTPS配置
基本配置
看了下网上的文章,大概就是修改onpremise
目录下的nginx/nginx.conf
,即可完成https配置:
...
http {
...
server {
listen 80;
## 新增配置
listen 443 ssl;
ssl_certificate 9685043__xx.pem;
ssl_certificate_key 9685043__xx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
## 新增配置 end
location /api/store/ {
proxy_pass http://relay;
}
location ~ ^/api/[1-9]\d*/ {
proxy_pass http://relay;
}
location / {
proxy_pass http://sentry;
}
}
}
.pem和.key文件也是放到onpremise/nginx/
目录下即可,会自动将文件copy到容器中。
随后重新部署但问题来了,但重启后并不能正确访问。
docker ps查看了下发现sentry-nginx还是监听80端口,尝试修改onpremise/docker-compose.yml
中的nginx配置
将80改为443。
再次重新部署,发现还是不行。。。
仔细思考一番,docker ps查看,sentry-nginx监听着443端口,没有问题,lsof查看一下本机的80和443端口,发现并未有服务使用80或443,也就是说sentry-nginx并没有监听本机的80和443。。。
于是我将配置恢复至一开始的状态
- sentry-nginx配置恢复
- docker-compose.yml端口恢复成80
再在物理机上安装nginx,并配置如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream relay {
server localhost:3000;
}
upstream sentry {
server localhost:9000;
}
server {
listen 80;
location /api/store/ {
proxy_pass http://relay;
}
location ~ ^/api/[1-9]\d*/ {
proxy_pass http://relay;
}
location / {
proxy_pass http://sentry;
}
}
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate 你的ssl证书.pem;
ssl_certificate_key 你的ssl证书.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:9000;
}
}
}
这份配置我是多次尝试,最终才ok的,这里要注意的是443这边的
location / {
proxy_pass http://localhost:9000;
}
原来我也是抄80的配置,但配置完后,web能正常访问,但异常不能正常上报,或者说sentry没有收到上报,多番研究后,发现网上有部分文章是直接写死localhost:9000,结果一试,居然真的可以。。😭😭😭
清理数据
手动清理
docker system df -v
可以通过以上命令,看到占用最大的一般是sentry-postgres
我这边直接占用了170G,也是恐怖。
通过docker ps
查看所有容器
可以看到sentry-self-hosted-postgres-1
服务
我们进入容器中
sudo docker exec -it sentry-self-hosted-postgres-1 /bin/bash
登录postgres数据库
psql postgres postgres
具体的账户名与密码在/senty/sentry.conf.example.py
文件中有说明。
数据库如何清理可以查看这篇文章
我把整理后的命令放下面了,重点主要就是nodestore_node
表,字段就3个id、内容、时间
//查看表大小
select pg_size_pretty(pg_relation_size('nodestore_node'));
//删除一周前的数据,删除不会直接释放磁盘,这里的删除你可以理解为假删,只是做了个标记;1 week是一周,根据你需求修改
DELETE FROM nodestore_node WHERE timestamp < (now() - interval '1 week');
//清理并释放磁盘空间,真正的删了
VACUUM FULL public.nodestore_node;
清理完后,一下清理了几百G。。。
这里必须吐槽一下,执行VACUUM居然还要占用磁盘空间来清理磁盘空间,所以磁盘不够还不能释放…真是醉了
kafka清理
后续使用过程中,我还发现kafka也会增加大量数据
# 进入docker容器
sudo docker exec -it sentry-self-hosted-postgres-1 /bin/bash
# 进入kafka目录
cd /var/lib/kafka/
查看具体是那些占用容量,如果是log直接删除即可。
如果是data占用太多,检查/etc/kafka/server.properties配置中的log.retention.hours
和log.retention.bytes
建议配置:
log.retention.hours=24
log.retention.bytes=1073741824 # 每个分区限制为 1GB
如果遇到无法修改,可以回到宿主机进行修改后再回传。
# 从容器复制文件到主机
docker cp sentry-self-hosted-kafka-1:/etc/kafka/server.properties ./server.properties
# 将修改后的文件传回容器
docker cp ./server.properties sentry-self-hosted-kafka-1:/etc/kafka/server.properties
自动清理
通过crontab -e
添加定时任务如下:
0 0 * * * docker exec -it sentry-self-hosted-sentry-cleanup-1 sentry cleanup --days 14 && docker exec -it sentry-self-hosted-postgres-1 vacuumdb -U postgres -d postgres -v -f --analyze
常见问题
安装
报错1
▶ Parsing command line ...
▶ Detecting Docker platform
Detected Docker platform is linux/amd64
▶ Initializing Docker Compose ...
▶ Setting up error handling ...
▶ Checking for latest commit ...
▶ Checking minimum requirements ...
Found Docker version 20.10.17
Found Docker Compose version 1.25.0
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
2c39bef88607: Pulling fs layer
2c39bef88607: Verifying Checksum
2c39bef88607: Download complete
2c39bef88607: Pull complete
Digest: sha256:20142e89dab967c01765b0aea3be4cec3a5957cc330f061e5503ef6168ae6613
Status: Downloaded newer image for busybox:latest
WARN: Recommended minimum CPU cores available to Docker is 4, found 2
WARN: Recommended minimum RAM available to Docker is 7800 MB, found 7678 MB
▶ Turning things off ...
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert keys
in v3 files to their non-Swarm equivalent
--env-file PATH Specify an alternate environment file
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
An error occurred, caught SIGERR on line 8
Cleaning up...
大概率是你的docker-compose版本不对,可以更新到最新版本后再尝试。
我做的过程中也遇到很多问题,装了好多次才成功。问题五花八门~,就不一一列出来,大概讲下排错思路。
网络问题
这个是以前最经常遇到的,什么github 443 timout,docker连接超时。
阿里云最近好像对这块都打通了(去年的时候还是各种超时),速度还挺快的。
如果你也是阿里云,遇到超时,不妨多试试~。
其他的云服务商,docker相关的都可以通过配置国内镜像源解决,但我不确定国内源都有同步所有docker仓库数据,不然又遇到奇奇怪怪的问题。
github相关的,我有看到是配置host解析的ip,亲测是有效的。
异常无法上报
我遇到是配置了https,然后异常上报但sentry平台未接收到,后面配置了SSL证书后才成功上报的~
所以要注意如果选择了https,nginx一定要配置ssl证书!!
邮箱配置
[Errno 101] Network is unreachable
大概率是mail.host
或 mail.port
配置有误
(501, b’Mail from address must be same as authorization user.', ‘sentry@localhost’)
大概率是你密码用了邮箱登录密码,要使用生成的授权码~