《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Sentry/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

Sentry 是统一的异常管理平台,支持异常事件的收集展示告警等功能。整体如下图所示:整体

Sentry 基本支持所有主流平台进行接入,这样我们可以把 Java 项目和前端项目,将程序中运行的异常,统一上报给 Sentry 服务,实现统一的收集展示告警。目前支持的平台如下图所示:Sentry 支持的平台

例如说,在 Java 项目中,我们可以很方便的通过 logger.error("...") 的方式,将错误日志上传到 Sentry 服务,即可在 Sentry 控制台中查看到该错误,并通过邮箱收到相应的告警日志。如下图所示:Sentry 示例

2. 基于 Docker 安装

Sentry 官方提供了两种安装方式:

目前比较推荐采用 Docker 方式来安装,😈 因为官方只提供了这种方式的安装文档,哈哈哈。因此,艿艿的生产环境中,也是基于 Docker 来安装。

我们先来安装 Sentry 的前置需求:

友情提示:如下的安装教程,基于 CentOS 7.X 版本。

2.1 安装 Docker

友情提示:如果胖友安装了 Docker 老版本(例如说 1.13),就是 docker-engine。此时,可以通过 yum remove docker docker-common container-selinux docker-selinux docker-engine 命令来移除。

如下安装 Docker 的教程,参考 https://tecadmin.net/install-docker-centos-7/ 文章。

下面,我们来安装 docker-ce,它是 Docker 进入新版本(自 17.X 开始),重新起的名字。

① 添加 docker-ce 的 YUM 源。操作命令如下:

# 安装 `yum-utils` 软件,提供了 `yum-config-manager` 命令来安装 YUM 源
$ yum install yum-utils

# 使用 `yum-config-manager` 命令,添加 docker-ce 的 YUM 源
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 更新 YUM 源的索引
$ yum makecache fast

② 安装 docker-ce 软件。操作命令如下:

# 安装 docker-ce 软件
$ yum install docker-ce -y

# 查看 docker-ce 版本
$ docker --version
Docker version 19.03.8, build afacb8b

# 启动 Docker
$ service docker start

2.2 安装 Docker Compose

友情提示:直接使用 yum install docker-compose 命令来安装 Docker Compose 软件,版本较低,所以不能这么安装。

如果安装 Docker Compose 的教程,参考 https://docs.docker.com/compose/install/ 文章

安装 Docker Compose,操作命令如下:

# 下载 Docker Compose,并另存为 /usr/local/bin/docker-compose
$ curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给 docker-compose 添加执行权限
$ chmod +x /usr/local/bin/docker-compose

# 添加 docker-compose 软链到 /usr/bin/ 目录下,方便直接使用
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 查看 docker-compose 版本
$ docker-compose --version
docker-compose version 1.25.4, build 8d51620a

友情提示:如果胖友没有科学上网,在使用 curl 命令下载 Docker Compose 时,会非常非常非常慢,艿艿一开始用了 20 分钟!

2.3 安装 Sentry

Sentry 官方提供 https://github.com/getsentry/onpremise.git 项目,方便我们使用 Docker 启动 Sentry。

克隆 onpremise 项目。命令行操作如下:

# 安装 git 工具
$ yum install git

# 克隆 onpremise 项目
$ git clone https://github.com/getsentry/onpremise.git

执行 onpremise 安装脚本。命令行操作如下:

# 进入 onpremise 目录
$ cd onpremise

# 执行 install.sh 安装脚本
$ ./install.sh

友情提示:如果胖友没有科学上网,执行 install.sh 安装脚本,这个过程会非常痛苦,艿艿卡了一个下午 + 一个晚上。最后,愤而使用阿里云香港按量服务器,在其上安装完 Sentry 之后,做成镜像在同步到阿里云上海正式服务器。

初始化 Sentry 管理员账号。命令行交互如下:

> Would you like to create a user account now? [Y/n]:
# 选择 Y

> Email:
# 输入你可爱的邮箱,例如艿艿输入为 7685413@qq.com

> Password:
# 输入你可爱的密码
> Repeat for confirmation:
# 再次输入你可爱的密码
User created: 7685413@qq.com
Added to organization: sentry
Creating missing DSNs
Correcting Group.num_comments counter

# 完成后最终会打印如下提示
----------------
You're all done! Run the following command to get Sentry running:

docker-compose up -d

启动 Sentry 服务。命令行操作如下:

# 启动 Sentry 的 Docker 容器,并后台运行
$ docker-compose up -d
sentry_onpremise_smtp_1 is up-to-date
sentry_onpremise_postgres_1 is up-to-date
sentry_onpremise_clickhouse_1 is up-to-date
sentry_onpremise_symbolicator_1 is up-to-date
sentry_onpremise_symbolicator-cleanup_1 is up-to-date
sentry_onpremise_memcached_1 is up-to-date
sentry_onpremise_zookeeper_1 is up-to-date
sentry_onpremise_redis_1 is up-to-date
sentry_onpremise_kafka_1 is up-to-date
sentry_onpremise_snuba-replacer_1 is up-to-date
sentry_onpremise_snuba-api_1 is up-to-date
sentry_onpremise_snuba-consumer_1 is up-to-date
sentry_onpremise_snuba-cleanup_1 is up-to-date
sentry_onpremise_cron_1 is up-to-date
sentry_onpremise_worker_1 is up-to-date
sentry_onpremise_sentry-cleanup_1 is up-to-date
sentry_onpremise_web_1 is up-to-date
sentry_onpremise_post-process-forwarder_1 is up-to-date

启动完成后,我们可以查看 Sentry 相关的正在运行中的 Docker 容器。命令行操作如下:

$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
sentry_onpremise_clickhouse_1 /entrypoint.sh Up 8123/tcp, 9000/tcp, 9009/tcp
sentry_onpremise_cron_1 /bin/sh -c exec /docker-en ... Up 9000/tcp
sentry_onpremise_kafka_1 /etc/confluent/docker/run Up 9092/tcp
sentry_onpremise_memcached_1 docker-entrypoint.sh memcached Up 11211/tcp
sentry_onpremise_post-process-forwarder_1 /bin/sh -c exec /docker-en ... Up 9000/tcp
sentry_onpremise_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
sentry_onpremise_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
sentry_onpremise_sentry-cleanup_1 /entrypoint.sh 0 0 * * * g ... Up 9000/tcp
sentry_onpremise_smtp_1 docker-entrypoint.sh exim ... Up 25/tcp
sentry_onpremise_snuba-api_1 ./docker_entrypoint.sh api Up 1218/tcp
sentry_onpremise_snuba-cleanup_1 /entrypoint.sh */5 * * * * ... Up 1218/tcp
sentry_onpremise_snuba-consumer_1 ./docker_entrypoint.sh con ... Up 1218/tcp
sentry_onpremise_snuba-replacer_1 ./docker_entrypoint.sh rep ... Up 1218/tcp
sentry_onpremise_symbolicator-cleanup_1 /entrypoint.sh 55 23 * * * ... Up 3021/tcp
sentry_onpremise_symbolicator_1 /bin/bash /docker-entrypoi ... Up 3021/tcp
sentry_onpremise_web_1 /bin/sh -c exec /docker-en ... Up 0.0.0.0:9000->9000/tcp
sentry_onpremise_worker_1 /bin/sh -c exec /docker-en ... Up 9000/tcp
sentry_onpremise_zookeeper_1 /etc/confluent/docker/run Up 2181/tcp, 2888/tcp, 3888/tcp

  • 贼多!!!

友情提示:如果后续胖友相要关闭 Sentry 相关的 Docker 容器,可以通过 docker-compose down 命令,然后逐个就会关闭了。

初始化 Sentry 系统邮箱

1、使用浏览器,访问 http://47.56.150.64:9000/ 地址,自动跳转到 Sentry 登录界面。如下图所示:登录界面

2、输入管理员账号和密码,进行登录。登录完成后,自动跳转到 Sentry 首次初始化界面。填写信息,如下图所示:Welcome to Sentry

不过比较坑爹的是,Outbound mail 竟然没有提供 STMP Host 地址的表单,这样就导致我们不得不手动修改 Sentry 配置文件!!!不过不要慌,继续「2.4 Sentry 配置文件」小节走起即可。

2.4 Sentry 配置文件

艿艿的旁白:摸索 Sentry 配置文件的过程,简直是血泪史!文档少,网上资料又各种方式,完全不统一!

onpremise 项目中,有三处可以实现 Sentry 的自定义配置,如下图所示:Sentry 配置文件 - 三处

目前 Sentry 官方推荐修改 sentry/config.yml 配置文件。在 https://docs.sentry.io/server/config/ 文档中,有介绍相应的配置项。

① 下面,我们通过使用 vi sentry/config.yml 命令,来添加下 Sentry 系统邮箱的配置项。如下图所示:Sentry 配置文件 - 邮件配置项

友情提示:这里有一个可能是巨坑的地方,艿艿跳进去大半天!!!

我们以腾讯企业邮箱举例子,SMTP 服务器提供了三种类型的端口:

  • 25 端口,非加密
  • 465 端口,SSL 加密
  • 587 端口,TLS 加密

在阿里云或是腾讯云上,考虑到邮件的安全性,禁止使用 25 端口发送邮件。因此,我们只能使用 465 端口的 SSL 加密,又或者 587 端口的 TLS 加密。

但是,因为 TLS 提供比 SSL 更高的安全性,所以 Sentry 官方只提供了 mail.use-tls 配置项,要么不进行加密,要么使用 TLS 加密。

这个仿佛也没啥问题,问题是常见的 163 邮箱、QQ 邮箱都没提供 TLS 加密的端口!!!这样就导致,我们只能寻找支持 TLS 加密的邮箱服务商。目前艿艿只找到两个邮箱可以解决:

② 配置完成后,需要重启 Sentry 的 Docker 容器。操作如下命令:

# 关闭
$ docker-compose down
# 启动
$ docker-compose up -d

③ 重启完成 Sentry 服务后,我们来测试下邮件是否能够发送成功。点击 Sentry 界面的左上角,弹出界面如下:首页 - 弹出界面

点击「Admin」选项,进入 Sentry 系统管理界面,如下图所示:系统管理界面

点击「Mail」选项,进入 Sentry 系统邮箱管理界面,如下图所示:系统管理界面 —— 邮箱

点击「Send a test email to xxxx」按钮,发送测试邮件。如果发送成功,会看到右下角会出现成功的提示,如下图所示:系统管理界面 —— 有哦建发送成功

打开件箱,可以刚发送的测试邮件,如下图所示:测试邮件

2.5 开始使用

至此,我们已经完成了 Sentry 的安装,路漫漫这才第一步,哈哈哈。后面,胖友必须阅读如下小节:

3. 基于 Python 安装

如果胖友想要使用 Python 安装 Sentry 的话,可以阅读如下文章:

4. Sentry 云服务

我们除了通过 Docker 或者 Python 的方式,部署私有化的 Sentry 服务之前,还可以用直接使用 Sentry 官方团队还提供了托管 的 Sentry 服务。仅仅在 Sentry 官网 进行注册即可,如下图所示:Sentry 免费注册

注册完成之后,完成一轮 Sentry 的新手引导,我们便会进入属于我们的 Sentry 控制台,如下图所示:Sentry 控制台

不过有一点要注意,因为 Sentry 部署在国外的服务器,所以访问起来的速度有点小乌龟,哈哈哈。

另外,胖友也需要看看 Sentry 的报价,到达一定使用量或者需要更强大的功能,需要进行一定的付费,并且还是蛮贵的。

5. 中文支持

Sentry 提供国际化的支持,这其实也包括了中文语言。通过切换语言为中文,更方面我们熟悉 Sentry 的功能。毕竟,和艿艿一样英语渣渣的胖友,还是一抓一大把的不是~

切换到中文语言仅仅通过设置即可,下面我们来设置一波哈。

① 点击 Sentry 界面的左上角,弹出界面如下:首页 - 弹出界面

② 点击「User settings」选项,进入个人设置界面,进行语言的设置。如下图所示:系统管理界面

③ 设置完成后,F5 刷新下 Sentry 界面,可以看到熟悉的中文落。如下图所示:系统管理界面

不过 Sentry 目前并没有完全汉化,问题不大,还是很舒服的。

6. 创建 Sentry 项目

当我们要将一个 Java 项目又或者前端项目接入 Sentry 服务时,需要创建一个 Sentry 项目与之对应。步骤如下:

① 点击「Project」菜单,进入 Sentry 的项目列表界面。如下图所示:Project 列表

② 点击右上角的「Create Project」按钮,进入创建 Sentry 项目的界面。输入相应的项目信息,如下图所示:创建 Project

③ 点击「Create Project」按钮,完成 Sentry 项目的创建。之后,我们会进入 Sentry 关于如何接入 Java 类型的项目的新手教程。如下图所示:创建 Project

④ 我们先不进行 Java 项目的接入,而是把这块的内容放在「7. 接入 Java 项目」小节。将页面拉到最底,点击「Got it! Take me to the Issue Stream.」按钮,进入刚创建的 Sentry 项目的错误列表界面。如下图所示:具体 Project

⑤ 点击「Create a sample event」按钮,让 Sentry 模拟创建一个错误。创建完成后,会自动跳转到该错误详情,如下图所示:错误详情

是不是贼丰富,哈哈哈,Sentry 真的是一款好用的神器啊!

⑥ 点击左上角的返回按钮,还是回到 Sentry 项目的错误列表界面。如下图所示:具体 Project - 有数据

这里我们要科普下 Sentry 里非常非常非常重要的两个概念:IssueEvent

  • Event:翻译为“事件”。每一次上传给 Sentry 服务的错误日志,都会被存储为一个 Event。

    友情提示:当然,胖友也可以上传其它级别的日志到 Sentry 服务,但是这样可能会导致过度的 Event,最终无人快速解决,这个也是所有监控系统的痛点之一。

    一般情况下,我们可以考虑将 ERRORWARN 级别的日志进行上传到 Sentry 服务,同时将 INFOERRORWARN 级别的日志上传到 ELK 等日志服务。

  • Issue:翻译为“问题”。Sentry 会将同一类的 Event 汇聚成同一个 Issue,方便我们查看和处理。🙂 这个也是艿艿最喜欢 Sentry 的地方之一,毕竟同一个错误可能出现多次,展示多个处理起来会很麻烦。

    友情提示:艿艿查找了下资料,Sentry 是按照 StackTrace > Exception > Template > Messages 优先级,自动判断 Event 为同一类,聚合到对应的 Issue 中。

    因此,如果日志记录不太规范,Sentry 自动欧诺个聚合的效果可能会很差。例如说,两个本来无关的 Issue 但是 StackTrace 相同,Sentry 会将它们聚合到相同的 Issue 之中。

⑦ 点击上方的项目筛选下拉框,会弹出所有可选的项目列表,如下图所示:项目下拉框

点击任一一个项目的「设置」图标按钮,可以进入项目的设置界面。如下图所示:项目设置

在项目设置界面中,我们针对该项目进行告警、Issue 自动分配等功能的配置。

⑧ 我们可以点击「Client Keys (DSN)」菜单,获得到该项目对应的 DSN,作为项目接入 Sentry 服务的“口令”配置。如下图所示:Client Keys (DSN)

  • 一个 DSN 由项目公钥、Sentry 服务器地址、项目编号三部分组成。

至此,我们已经完成了 Sentry 项目的学习与创建,后续胖友可以阅读如下小节,进行对应类型的项目接入:

7. 接入 Java 项目

直接阅读《芋道 Spring Boot 异常管理平台 Sentry 入门》文章,艿艿写的贼详细。

8. 接入前端项目

参考《接入 Sentry —— 让你的错误别再裸奔》文章即可。

666. 彩蛋

至此,我们已经完成了 Sentry 的学习。建议后续可以阅读下《Sentry 官方给文档》,例如说 Alerts & NotificationsIntegrations 章节的内容。

实际上,Sentry 不仅仅可以收集错误日志,也可以收集普通日志,但是它本质是面向异常的管理平台,所以最好配合ELK 等日志服务一起使用。

文章目录
  1. 1. 1. 概述
  2. 2. 2. 基于 Docker 安装
    1. 2.1. 2.1 安装 Docker
    2. 2.2. 2.2 安装 Docker Compose
    3. 2.3. 2.3 安装 Sentry
    4. 2.4. 2.4 Sentry 配置文件
    5. 2.5. 2.5 开始使用
  3. 3. 3. 基于 Python 安装
  4. 4. 4. Sentry 云服务
  5. 5. 5. 中文支持
  6. 6. 6. 创建 Sentry 项目
  7. 7. 7. 接入 Java 项目
  8. 8. 8. 接入前端项目
  9. 9. 666. 彩蛋