当前位置: 首页 > 科技观察

错误跟踪系统哨兵在哪里?

时间:2023-03-22 11:33:37 科技观察

本文转载自微信公众号《运维开发故事》,作者笑话。转载本文请联系运维开发故事公众号。大家好,我是Joke,一名一线运维从业者。今天和大家分享一下什么是bug跟踪系统,以及如何使用它。在应用程序的整个生命周期中,“错误”是不可避免的。很多时候都是通过日志平台抓取查看日志来查找错误原因。但是,应用程序日志通常具有误导性。也不能直观的指出问题的根源,也缺乏及时的分析和告警能力(当然现在很多商业日志系统都有这个功能,但是需要Money)。有没有比较好用的开源软件?Sentry就是这样一个优秀的应用程序错误跟踪系统,它支持大多数语言,如下。什么是错误跟踪系统?从字面上看,可以很好理解。错误跟踪系统是一种跟踪系统错误和异常的软件。它旨在帮助开发、运维人员跟踪应用程序的一些错误信息。通过对应用错误的实时跟踪和统一跟进,提升管理错误的能力。让自己在业务场景中比用户报告bug更快地发现bug。什么是哨兵?Sentry是一个跨平台的应用程序错误跟踪系统,专注于错误报告。哨兵的原理是什么?首先,应用程序必须集成Sentry的SDK,然后在应用程序出错时向Sentry服务器发送错误信息。Sentry的服务器分为几个部分:web、cron、worker。应用程序(客户端)发生错误后,将错误信息上报到Web上。web处理完成后,放入消息队列或Redis内存队列中。工作人员使用队列处理中的数据。其主要优势如下:提供精美的WEBUI界面支持几乎所有主流开发语言的SDK,接入方便提供完整的错误详情支持统一的错误聚合分析支持dashboard、监控、告警等功能支持团队管理和成员管理当然,在支持日志审计方面存在一些不足。维护和部署需要用到很多中间件,比如kafka、rabbitMQ、redis、pgsql等,这套部署成本还是比较高的。然而,缺点并不能掩盖优点。与它给我们带来的好处相比,这些问题是可以克服的。image.png部署Sentry为Sentry提供服务的方式有两种:SAAS平台,支付方式不同私有化部署这里主要讲解如何在Kubernetes中进行部署。环境介绍Kubernetes:1.17.17Docker:18.09.0Helm:3.6.3Storage:UseLocalPVOpenEBS简介OpenEBS是一个用Go语言编写的基于容器的块存储开源软件。OpenEBS使在容器中运行关键任务和数据持久性工作负载变得更加可靠。使用OpenEBS,您可以像处理任何其他普通容器一样处理具有持久数据的容器。OpenEBS本身也是通过容器部署的。它支持Kubernetes、Swarm、Mesos和Rancher编排和调度。存储服务可以分配到每个Pod、应用程序、集群或容器级别,包括:跨可用区和云的跨节点数据持久化供应商的数据同步使用商业硬件和容器引擎提供高度可扩展的块存储和容器编排引擎集成,开发者的应用可以自动配置OpenEBS基于CloudByte在BSD的容器化经验,为用户提供OpenEBSQoS保障OpenEBS的架构可以分为两个部分:DataPlane和ControlPlane:DataPlane:为应用提供数据存储ControlPlane:管理OpenEBS卷容器,通常使用容器编排软件的功能环境部署1.部署OpenEBSOpenEBS支持HelmChart和Operator部署。(1)使用HelmChart部署helmrepoaddopenebshttps://openebs.github.io/chartshelmrepoupdatehelminstallopenebs--namespaceopenebsopenebs/openebs--create-namespace(2)使用Operator部署kubectlapply-fhttps://openebs.github.io/charts之后/openebs-operator.yaml部署完毕,会生成如下Pod。#kubectlgetpod-nopenebsNAMEREADYSTATUSRESTARTSAGEmaya-apiserver-67b5b5c858-4mstb1/1Running05d19hopenebs-admission-server-6bdf9b76d6-r4r6b1/1Running05d19hopenebs-localpv-provisioner-966d864cd-sf8fp1/1Running05d19hopenebs-ndm-59lkx1/1Running05d19hopenebs-ndm-bphgw1/1Running05d19hopenebs-ndm-grxlb1/1Running05d19hopenebs-ndm-operator-55b8ccc64b-r7tkr1/1Running05d19hopenebs-ndm-zwhmm1/1Running05d19hopenebs-provisioner-55794b6cd4-ptd851/1Running05d19hopenebs-snapshot-operator-5d78fcbd96-7xqzv2/19Running05d19hopebs-snapshot-operator-5d78fcbd96下的Class及其下的Classage05d19hopebs-provisioner-55794b6cd4-ptd851#kubectlgetsc|grepopenebslocal(default)openebs.io/localDeleteWaitForFirstConsumerfalse5d19hopenebs-deviceopenebs.io/localDeleteWaitForFirstConsumerfalse5d19hopenebs-hostpathopenebs.io/localDeleteWaitForFirstConsumerfalse5d19hopenebs-jiva-defaultopenebs.io/provisioner-iscsiDeleteImmediatefalse5d19hopenebs-snapshot-promotervolumesnapshot.external-storage.k8s.io/snapshot-promoterDeleteImmediatefalse5d19h2,部署Postgresql其实在Sentry的HelmChart中就有一个PostgresqlChart包。这里之所以单独部署是因为在Sentry中通过部署Chart包,在Postgresql链接中出现了各种问题,比如:FATAL:passwordauthenticationfailedforuser"postgres"这里Postgresql是通过HelmChart部署的,具体步骤如下:#添加Helm仓库helmrepoaddbitnamihttps://charts.bitnami.com/bitnamihelmrepoupdate#下载Chart包helmpullbitnami/postgresql并编写配置文件(my-value.yaml),如下:global:postgresql:postgresqlDatabase:“哨兵”postgresql用户名:“postgres”existingSecret:“”postgresql密码:“postgres”服务端口:“”复制密码:“》安装PGSQL,命令如下:helminstallpostgresql-nsentry-fmy-value.yamlbitnami/postgresql部署完成后可以看到如下Pod:#kubectlgetpo-nsentryNAMEREADYSTATUSRESTARTSAGEpostgresql-postgresql-01/1Running03h39m3,部署SentrySentry也是使用HelmChart部署,如下:#添加Helm仓库helmrepoaddsentryhttps://sentry-kubernetes.github.io/chartshelmrepoupdatehelmsearchreposentry#下载Chart包,方便查看和修改Charthelmpullsentry/sentry写入配置文件(my-value.yaml),如下:externalPostgresql:database:sentryport:5432username:postgreshost:postgresqlpassword:postgrespostgresql:enabled:falsemail:backend:dummyfrom:"joker2021@163.com"host:"smtp"password:"UZKSGLFEANWGLZNT"port:465useTls:trueusername:""user:create:truemail:admin@sentry.localpassword:P@ssword部署哨兵如下:helminstallsentry-nsentry-fmy-value.yamlsentry/sentry部署完成后,如下Pod将生成:#kubectlgetpo-nsentryNAMEREADYSTATUSRESTARTSAGEpostgresql-postgresql-01/1Running03h50msentry-clickhouse-01/1Running03h50msentry-clickhouse-11/1Running03h50msentry-clickhouse-21/1Running03h50msentry-cron-578647dd7-gk7gf1/1Running03h50msentry-ingest-consumer-7564f644bf-srkj21/1Running03h47msentry-kafka-01/1Running23h50msentry-kafka-11/1Running23h50msentry-kafka-21/1Running23h50msentry-nginx-675d779699-tfdr51/1Running03h50msentry-post-process-forward-5f586f6cdf-lxmc41/1Running03h47msentry-rabbitmq-01/1Running03h50msentry-rabbitmq-11/1Running03h49msentry-rabbitmq-21/1Running03h48msentry-relay-75597cb98b-jm2821/1Running03h47msentry-sentry-redis-master-01/1Running03h50msentry-sentry-redis-slave-01/1Running03h50msentry-sentry-redis-slave-11/1Running03h49msentry-sessions-consumer-6b499bf64d-lm7gq1/1Running03h47msentry-snuba-api-5586d5f9f8-tcn5s1/1Running03h50msentry-snuba-cleanup-errors-1630472400-xv5wh0/1Completed0134msentry-snuba-cleanup-errors-1630476000-xd7d20/1Completed074msentry-snuba-cleanup-errors-1630479600-sd59b0/1Completed014msentry-snuba-cleanup-transactions-1630472400-l9bcx0/1Completed0134msentry-snuba-cleanup-transactions-1630476000-cjsbd0/1Completed074msentry-snuba-cleanup-transactions-1630479600-zn5dz0/1Completed014msentry-snuba-consumer-58b7bfd545-rnjmx1/1Running03h47msentry-snuba-outcomes-consumer-57c589bf6d-lxg5m1/1Running03h47msentry-snuba-replacer-5bf4d6b5d7-gcc7g1/1Running03h47msentry-snuba-transactions-consumer-57bb7f8ccb-q6gkt1/1Running03h47msentry-web-7c9766768b-njxjl1/1Running03h50msentry-worker-844fd65687-6b26p1/1Running23h50msentry-worker-844fd65687-k2h6z1/1Running23h50msentry-worker-844fd65687-rfjcl1/1Running23h50msentry-zookeeper-01/1Running03h50m然后就可以通过ingress或者nodeport访问了,用户名和密码是上面配置的admin@sentry.local和P@ssword创建项目进入WEBUI界面,在项目栏中创建项目,如下:我这里创建一个Go项目,如下:点击创建后,会生成一个Dsn地址,并给出配置示例,如下如下:packagemainimport("fmt""github.com/getsentry/sentry-go"sentrygin"github.com/getsentry/sentry-go/gin""github.com/gin-gonic/gin""github.com/pkg/errors""net/http")funcmain(){//初始化Sentry的处理程序,youneedtoinitializeSentryitselfbeforehandiferr:=sentry.Init(sentry.ClientOptions{Dsn:"https://b06bcc1c67b44084a3f65fc8b219a5fc@o985819.ingest.sentry.io/5942}nil245",.Printf("Sentryinitializationfailed:%v\n",err)}sentry.CaptureMessage("Itworks!")sentry.CaptureException(errors.New("errormsg"))//然后createyourappapp:=gin.Default()//Onceit'sdone,youcanattachthehandlerasoneofyourmiddlewareapp.Use(sentrygin.New(sentrygin.Options{}))//Setuproutesapp.GET("/",func(ctx*gin.Context){ctx.String(http.StatusOK,"Helloworld!")})//Andrunitapp.Run(":3000")}其他类型的项目与此类似,具体步骤只有三步:在SentryWEBUI界面创建项目生成对应的DSN,导入到具体的应用代码中,应用部署完成后,会通过PostError报错申请,届时可以在WEB界面查看。image.png创建警报。可以创建的告警类型还是挺丰富的,如下:然后创建规则,如下:另外还可以管理团队、成员、日志审计等,更多的功能需要自己去实践。