微服务架构统一异常监控Sentry

开发 架构
sentry主要用于实时监控的应用服务,收集相关应用服务在运行状态时出现的异常或者错误日志信息,并且sentry会通过自身集成的通知渠道将错误信息推送给维护人员。

1、sentry[1]

sentry是一个跨平台的错误监控和搜集的异常上报监控系统。sentry主要用于实时监控的应用服务,收集相关应用服务在运行状态时出现的异常或者错误日志信息,并且sentry会通过自身集成的通知渠道将错误信息推送给维护人员。

sentry收集到的异常或者错误日志,会在告警规则的匹配下,第一时间让维护人员接收到服务运行的异常信息,便于快速定位问题以及解决问题。

sentry支持绝大多数的语言以及框架,使用相对便捷。

2、sentry特点

优点:

  • 产品体验好,功能完善。
  • 接入工作量少。
  • Sentry专注于 Error、Exception、Crash。可以查看到具体的错误信息和调用栈,能快速定位问题代码。
  • 提供丰富的上下文信息。SDK 会自动上报基础信息,也支持上报自定义的信息,便于排查问题。
  • 自动合并重复问题。重复的报错被自动合并且累计次数,避免开发者在大量重复冗余的信息寻找 bug 的蛛丝马迹。
  • 主动邮件告警。不用再等客户反馈后才开始排查问题。
  • 能通过主动上报的事件,准确定位是自身的服务的问题还是第三方平台的问题(大多数在使用三方平台的时候,很难会在服务出现问题的时候,去想到是三方平台的问题。)
  • 帮助前端项目更快的发现问题。

缺点:

  • 部署依赖繁多,30左右个容器依赖。
  • 维护成本较高,待日均接口请求量规模较大的时候,sentry单实例部署会引发雪崩的问题(大量请求发到sentry,造成sentry响应延迟、Redis队列内存占满、NGINX出现504等等),会拖垮服务本身。

规避sentry雪崩的优化

保障Sentry服务端高可用。

  • 使用sentry SaaS服务。
  • 自建的sentry实例高可用(成功高)。

在SDK上设置请求sentry的超时时间

合理设置SDK的采样率。

  • 0.00: 拒绝发送任何事件。
  • 1.00: 发送全部事件。

sentry在高负载下,应及时熔断处理,比如优化采样率为0.00。

SDK使用异步发送请求,避免同步阻塞。

sentry实例采用环境隔离的方式使用。

通过队列来缓冲请求至 Sentry 的并发压力。

3、组件架构

sentry组件架构。

sentry组件架构

4、安装

准备sentry的工作目录:

mkdir sentry && cd $_
touch sentry.env docker-compose.yml # 分别填充以下内容

DotEnv

sentry.env:

SENTRY_SECRET_KEY=0x4r6f^0ak5w_3)w1ybh2qbr4@-0tr33ey)lf*e5_cq55xae&5-)r*=9
DB_PASSWORD="bw1knjWnUA"
DB_USER=sentry

docker-compose安装sentry

将以下内容填充到docker-compose.yml中:

version: '2'
volumes:
pgdb:
services:
redis:
image: redis:alpine
restart: always
#command: /bin/sh -c "redis-server --requirepass $$REDIS_HOST_PASSWORD"
postgres:
image: postgres
environment:
POSTGRES_USER: $$DB_USER
POSTGRES_PASSWORD: $$DB_PASSWORD
POSTGRES_DB: sentry
volumes:
- pgdb:/var/lib/postgresql/data
env_file:
- sentry.env
sentry:
image: sentry
links:
- redis
- postgres
ports:
- 9000:9000
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env
cron:
image: sentry
links:
- redis
- postgres
command: "sentry run cron"
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env
worker:
image: sentry
links:
- redis
- postgres
command: "sentry run worker"
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env

生成sentry secret key填充到sentry.env中的SENTRY_SECRET_KEY。

docker run --rm sentry config generate-secret-key

初始化数据库以及创建登录用户。

docker-compose up -d # 部署sentry以及相关依赖的服务
docker-compose exec sentry sentry upgrade ## create user and password.

5、sentry dashboard使用

使用前面创建的用户以及密码登录:

sentry dashboard login

创建项目:

创建项目

一个配置demo:

配置demo

大概就是这些,具体的各语言的SDK还要看对应的文档以及源码。

6、go sentry测试

本实例,将通过创建一个go语言编写的demo服务,测试错误上报到sentry的效果

创建go项目:

mkdir go-sentry-gin
cd $_

初始化模块:

go mod init go-gin-sentry
go get github.com/getsentry/sentry-go
go get github.com/getsentry/sentry-go/gin

source code:

package main
import (
"github.com/getsentry/sentry-go"
sentrygin "github.com/getsentry/sentry-go/gin"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
err := sentry.Init(sentry.ClientOptions{
Dsn: "http://c0056580f26c469c8cc31d780d1995a8@localhost:9000/6",
Environment: "dev",
Release: "go-sentry-gin@0.0.1",
Debug: true,
})
if err != nil {
sentry.CaptureMessage("Sentry initialization failed." + err.Error())
}
r := gin.Default()
r.Use(sentrygin.New(sentrygin.Options{}))
r.Use(func(ctx *gin.Context) {
if hub := sentrygin.GetHubFromContext(ctx); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
ctx.Next()
}
})
r.GET("/demo", func(c *gin.Context) {
if hub := sentrygin.GetHubFromContext(c); hub != nil {
hub.WithScope(func(scope *sentry.Scope) {
scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
hub.CaptureMessage("User provided unwanted query string, but we recovered just fine")
})
c.Status(http.StatusOK)
}
panic("error occured")
})
r.Run()
}

运行后,访问服务路由,错误日志信息即上报到sentry上。

打开项目详情页,即可看到整个项目的状态信息。

go-gin-sentry相关信息

7、参考

  1. Introducing Snuba: Sentry's New Search Infrastructure。
  2. 转转商业前端错误监控系统(Sentry)策略升级。
  3. Sentry(v20)云原生架构探索,前/后端监控与事件日志大数据分析,高性能高可用可扩展可伸缩集群。
  4. 事件存储过程。
  5. sentry系列的文章。

参考资料

[1]sentry官网: https://sentry.io/welcome/。

责任编辑:姜华 来源: 云原生生态圈
相关推荐

2020-12-11 09:06:50

异常监控云服务

2022-11-28 07:35:52

前端错误

2023-07-28 09:23:24

微服务架构

2024-04-03 12:14:15

微服务架构监控

2020-08-26 08:21:59

微服务

2019-10-24 11:17:57

架构运维技术

2020-09-02 08:10:33

微服务标准化设计

2021-10-11 19:36:08

监控Sentry架构

2021-10-09 23:33:55

监控

2021-09-14 23:50:17

Sentry后端监控

2021-09-27 19:41:31

监控Sentry Alerts

2022-11-16 09:03:35

Sentry前端监控

2022-08-16 10:44:11

Sentry前端异常

2022-05-07 10:09:01

开发Java日志

2016-03-25 09:57:09

统一监控报警平台运维

2023-11-28 14:32:04

2024-03-06 14:58:52

客户端微服务架构

2020-06-10 10:20:24

微服务架构WEB2.0

2021-11-27 23:54:44

监控Snuba数据

2021-10-09 00:00:40

Sentr 监控架构
点赞
收藏

51CTO技术栈公众号