Sentry搭建

Posted by JJput on 09-07,2022

简介

sentry是一款错误日志收集平台,可以将代码错误信息进行收集。

平常我们开发完成以后,发现问题的手段仅自测-》测试人员-》最后市场反馈。一般我们收到市场反馈的时候已经产生了事故,作为一个合格的程序猿,如果默默等着市场提问题肯定是不够滴!

sentry就非常贴心的帮助我们收集了所有的错误异常(注意不是日志!)

image

还能点进这个异常查看原始代码(基本都能定位到代码的哪一行),这样我们就能主动发现问题,然后结合我们的日志,排查问题。是不是很优雅?

image-1662539437940

还能收集部份其他信息!我这里是springboot的服务,只记录了java的平台版本。像Android和IOS这种还能收集到当前手机型号、版本、分辨率等信息。千万别小看这些信息,像移动端这种客户端的日志,如果客户不主动上报,就需要一套非常完善的日志系统。

非常优雅有木有?

而且支持的平台非常的多,基本涵盖了所有语言和平台。
image-1662540125114
image-1662540184135

安装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组件非常多,如下图所示。所以不要想自己一个个去装,能要你命

image-20220908192634470

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),接着输入对应信息即可。

image-20220907170713783

启动

docker compose up -d

image-1665220452798

可以看到启动的服务贼多…
注意一定得在onpremise文件目录下执行

打开浏览器输入IP地址+端口号9000就可以访问Sentry登录界面了。

image-20220908182443616

邮箱配置

mail配置

进入onpremise/sentry目录下,编辑config.yml

image-20220908185344173

着重讲解一下几个配置项

  • 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

验证并测试

启动成功后,登入并进入管理

image-20220908191412634

选择mail,可以看到邮箱配置已生效,点击发送测试邮件进行测试~

img

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配置

image-1682126919305

将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

image-1676279976165

我这边直接占用了170G,也是恐怖。

通过docker ps查看所有容器

image-20230216164231488

可以看到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文件中有说明。

image-1722236253209

数据库如何清理可以查看这篇文章

我把整理后的命令放下面了,重点主要就是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。。。

image-20230217170342797

这里必须吐槽一下,执行VACUUM居然还要占用磁盘空间来清理磁盘空间,所以磁盘不够还不能释放…真是醉了

kafka清理

后续使用过程中,我还发现kafka也会增加大量数据

image-1732095333370

# 进入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.hourslog.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’)

大概率是你密码用了邮箱登录密码,要使用生成的授权码~