文档章节

Sentry

mac_zhao
 mac_zhao
发布于 2015/02/25 16:02
字数 2567
阅读 87
收藏 1
点赞 0
评论 0

1. Sentry介绍及使用

Sentry is a realtime event logging and aggregation platform. At its core it specializes in monitoring errors and extracting all the information needed to do a proper post-mortem without any of the hassle of the standard user feedback loop.

Sentry 是一个实时事件日志记录和汇集的平台。其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈。

1.1 Sentry介绍

无论测试如何完善的程序,bug总是免不了会存在的,有些bug不是每次都会出现,测试时运行好好的代码可能在某个用户使用时就歇菜了,可是当程序在用户 面前崩溃时,你是看不到错误的,当然你会说:”Hey, 我有记日志呢”。 但是说实话,程序每天每时都在产生大量的日志,而且分布在各个服务器上,并且如果你有多个服务在维护的话,日志的数量之多你是看不过来的吧。等到某天某个 用户实在受不了了,打电话来咆哮的时候,你再去找日志你又会发现日志其实没什么用:缺少上下文,不知道用户什么操作导致的异常,异常太多(从不看日志的缘 故)不知如何下手 等等。

Sentry就是来帮我们解决这个问题的,它是一款精致的Django应用,目的在于帮助开发人员从散落在多个不同服务器上毫无头绪的日志文件里发掘活跃的异常,继而找到潜在的臭虫。

Sentry是一个日志平台, 它分为客户端和服务端,客户端(目前客户端有Python, PHP,C#, Ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web节目方便查看。 Sentry由python编写,源码开放,性能卓越,易于扩展,目前著名的用户有Disqus, Path, mozilla, Pinterest等。

1.2 Sentry安装

Sentry构建依赖于Python, Django, Mysql/Postgresql, memcache, RabbitMQ/Redis等。

1.3 Sentry权限介绍

Sentry目前用户类型有四种: 超级管理员, 管理员,普通用户和System agents. 超级用户只能通过命令行来创建,其他用户可以自己注册或由其他用户邀请注册加入,然后由超级管理员或管理员分配项目和权限。为了更好支持团队协助以及信息 安全,新版本Sentry(5.4.2)经过了重新设计,重新设计后的Sentry以Team为中心组织权限。所谓Team就是一个团队,一些用户组织在 一起对某些项目有操作权限的组织。一个项目只能属于一个Team, 一个用户却可以属于多个Team, 并可在不同Team中扮演不同角色, 如用户A在Team X是管理员而在Team Y中是System agents. Sentry对用户角色的指定只能到Team级别,不能到Project级别, 所以将某个用户加入到某个Team之后,这个用户就对所有所有属于这个Team下所有project有了相同的权限。

Sentry的如此设计虽说不够细致,但我们使用时只要遵照现实世界的情况来划分Team和project即可。比如我们目前有一个团队,这个团队负责两 个项目,我们在Sentry上就建立一个Team A和属于这个Team的project a和project b. 当在使用过程中我们发现project b的等级较高,不能让所有人都可以看到信息,我们可以建立一个虚拟Team B,然后将project b的team 改Team B, 然后再给Team B添加用户和相应权限即可. Sentry对team的owner, project的owner, project属于的team 等等实体关系的修改都极为简单,没有副作用。

下面简单介绍下Sentry中各个类型用户的权限。

  • 超级管理员: 能创建各种用户, team和project只能由超级管理员创建。项目的一些设置比如改变Owner, 数据公开可见与否(设为public的数据可以通过url不登陆也能查看)以及客户端domain限制的设定。另外还有管理项目的api key(客户端只有得到此api key才能向Sentry发送消息)的权限等等。
  • 管理员: 能创建用户, team和项目设定中除改变owner之外的权限, 可以对项目中具体数据做resolve, bookmark, public/public和remove操作。
  • 普通用户: 无Team界面,只能对项目中具体数据做resolve, bookmark, public/unpublic和remove操作。
  • System agents: 无Team界面,只能对项目中具体数据做bookmark, unpublic和remove操作。

此外,还需知晓Sntry中team和project的Onwer概念,只有是team或project的owner(除超级管理员外)才能更改其owner, 一旦成为team或project的Owner,则获得对此team或project如同超级管理员般的权限。

Sentry的权限和实体设置基本可以满足现实的需求:

  1. 如果一个团队负责多个项目,可以通过一个Team多个项目方式来实现。
  2. 如果一个人参与多个团队, 可以将该用户添加到多个team中去。
  3. 一个team或project设置相应的Owner,则可以由此人负责该team或project内的活动。(唯一的缺点是team owner不可以创建project)
  4. 一个team或项目的分工应该是有一个管理者来设定项目的基本设定,管理api key, 并将api key分发给项目开发者,项目开发者以普通用户身份登陆Sentry查看错误和resolve错误, 运维以System agents身份登陆Sentry查看系统运行状态。

1.4 Sentry性能

有些人担心Sentry会影响程序性能,所以我搭建了一个Sentry服务器做了下测试。

我一共使用了两台机器(机器是HP ProLLiant DL360 G4p)作为服务器, 一台安装了Sentry和Mysql, 一台安装了memcache和redis, 然后在sentry.conf.py里将QUEUE和CACHE都打开。使用supervisor启了三个服务

sentry start http

sentry start udp

sentry celeryd -B

首先测试下直接插入消息的效率如何:

from raven import Client from timeit import timeit try: import cProfile as profile except ImportError: import profile from pstats import Stats client = Client('udp://11c5f6e203cb4b228b2dcac3df29dad2:55adfa2e6d8c4fd799694d8dcde372c3@172.16.97.11:9001/2') def do_capture_msg2(): for i in range(1000): client.captureMessage(str(i) + 'hello world! from do_capture_msg2') def test(f, number=1000): time = timeit(f, number=number) st = Stats(profile.Profile().runctx('f()', globals(), locals())) print("funcation_name     msec    rps  tcalls  funcs") print("%-11s %6.0f %6.0f %7d %6d" % (f.__name__, 1000 * time, number / time, st.total_calls, len(st.stats))) test(do_capture_msg2, number=10)

测试结果:

funcation_name     msec    rps  tcalls  funcs
do_capture_msg2   4093      2  287004    101

我一共提交了10000个消息,共耗时4093ms, 每次消息耗时很少,这里有两个需要注意的地方,一个是我使用的是udp接口,如果使用http接口,这个耗时会增加不少。对于udp的传输非可靠性,我认 为在内网环境内应该是基本可靠的,在测试过程中,未发现消息遗漏的情况。另一个需要注意的地方是由于我的服务器性能不高,这10000个消息并不是在这 4s中内就被处理完了,而是被记录到任务队列了,所以在服务器可以看到,客户端的请求完成之后,服务器的cpu使用率还需要一段时间才能降下来。

普通消息的提交处理非常快,那对于异常消息又如何:

def do_capture_exc(): try: 1 / 0 except ZeroDivisionError: client.captureException() test(do_capture_exc, number=1000)

测试结果:

funcation_name     msec    rps  tcalls  funcs
do_capture_exc   1061    942    1029    121

略慢,但我估计异常的抛出和捕获才是元凶

下面结合应用程序来测试性能,创建一个django程序,添加一个非常简单的view响应函数:

def sentry(request): t = random.randint(1, 10) time.sleep(t/1000.0) u = User.objects.all()[0] return HttpResponse('user %s say hello world from django: %sms '%(u.username, t))

启动脚本是:

#!/bin/bash
gunicorn_django -k gevent -w 8 --worker-connections 3000 -b 0.0.0.0:8001 -D

ab测试结果是:

ab -n 1000 -c 100 http://172.16.97.12:8001/
Server Software:        gunicorn/0.17.2
Server Hostname:        172.16.97.12
Server Port:            8001

Document Path:          /sentry
Document Length:        45 bytes

Concurrency Level:      100
Time taken for tests:   2.298 seconds
Complete requests:      1000
Failed requests:        90
   (Connect: 0, Receive: 0, Length: 90, Exceptions: 0)
Write errors:           0
Total transferred:      185090 bytes
HTML transferred:       45090 bytes
Requests per second:    435.11 [#/sec] (mean)
Time per request:       229.827 [ms] (mean)
Time per request:       2.298 [ms] (mean, across all concurrent requests)
Transfer rate:          78.65 [Kbytes/sec] received

Connection Times (ms)
                 min  mean[+/-sd] median   max
                 Connect:        0    0   0.7      0       9
                 Processing:    16  219 149.6    180     823
                 Waiting:       16  219 149.6    180     823
                 Total:         16  219 149.9    180     825

将view函数改为如下:

def sentry(request): t = random.randint(1, 10) time.sleep(t/1000.0) u = User.objects.all()[0] client.captureMessage('user %s say hello world from django: %sms '%(u.username, t)) return HttpResponse('user %s say hello world from django: %sms '%(u.username, t))

ab测试结果如下:

ab -n 1000 -c 100 http://172.16.97.12:8001/sentry

Server Software:        gunicorn/0.17.2
Server Hostname:        172.16.97.12
Server Port:            8001

Document Path:          /sentry
Document Length:        45 bytes

Concurrency Level:      100
Time taken for tests:   3.175 seconds
Complete requests:      1000
Failed requests:        90
   (Connect: 0, Receive: 0, Length: 90, Exceptions: 0)
Write errors:           0
Total transferred:      185090 bytes
HTML transferred:       45090 bytes
Requests per second:    314.95 [#/sec] (mean)
Time per request:       317.510 [ms] (mean)
Time per request:       3.175 [ms] (mean, across all concurrent requests)
Transfer rate:          56.93 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
              Connect:        0    0   0.6      0       8
              Processing:    17  301 225.2    241    1308
              Waiting:       17  301 225.2    241    1307
              Total:         17  302 225.5    241    1310

1000次请求运行时间从2.298s变为3.175s, rps从435.11降为314.95

1.5 总结

虽然从上面测试看起来,程序效率下降了大概1/4左右,但测试毕竟和实际应用有一些差距,实际运行的应用有更复杂的逻辑,更多的运算和更多的io操作,所 以实际上sentry的影响会很小,而带来的好处则很多,并且,Sentry是一个平台级的服务,一旦构建好,所有应用都可以使用受益。

当然,Sentry和log不是相互重叠的东西,他们各有用处,不能把Sentry当做log来使用,大量的网络操作对应用程序来说还是会有影响的。而且有了Sentry后log还是需要的,Sentry在服务器网络异常时会失效,并且业务逻辑的跟踪等等也离不开log。

© 著作权归作者所有

共有 人打赏支持
mac_zhao
粉丝 40
博文 249
码字总数 304575
作品 0
普陀
程序员
搭建私有的前端监控服务: sentry

去年底写过一篇简单而完整地体验一遍sentry的sourcemap服务, 是完全基于使用层面的. 由于有需求需要自行搭建sentry, 整理一下搭建流程 版本 8.22.0 参考github release 搭建方式 通过Docker ...

YDJFE ⋅ 06/15 ⋅ 0

nginx temp缓存导致的诡异问题描述

站点结构是nginx+fpm所有的配置检查都没有问题但是站点去下载文件的时候只能传递一点点数据,剩余的文件无法加载,无法读取,无法下载,这种问题多么的诡异开始以为Laravel的文件下载用错了不...

xueyi28 ⋅ 04/19 ⋅ 0

谷歌黑科技:gVisor轻量级容器运行时沙箱

谷歌发布了一种新型沙箱gVisor,可以用于为资源占用较少、不需要运行完整VM的容器提供安全隔离。gVisor的核心是一个使用Go编写的开源用户空间内核,与现有的容器技术相比,其设计做了不同的权...

六库科技 ⋅ 05/29 ⋅ 0

前端代码错误日志监控——Sentry

随着项目工程化的发展,对于提升产品性能的要求也越来越多。产品即便通过研发自测,测试各种测,到了用户使用过程中,依然还是会出现一些bug;这对这些bug,不是所有用户会进行反馈(难以发现...

黑魔法 ⋅ 04/17 ⋅ 0

django 1.8 官方文档翻译: 6-6-2 如何使用WSGI 部署

如何使用WSGI 部署 Django 首要的部署平台是WSGI,它是Python Web 服务器和应用的标准。 Django 的 管理命名为你设置一个简单的默认WSGI 配置,你可以根据你项目的需要做调整并指定任何与WSG...

apachecn_飞龙 ⋅ 2015/08/29 ⋅ 0

2016中国“互联网+”千人论坛 ——“互联网业务与技术”分论坛成功举办 聚焦大数据与人工智能

活动现场 2016年9月3日,由CIO时代网、中国互联网协会、“互联网+”研究咨询中心、正益移动AppCan联合主办,中国互联网协会互联网工业应用委员会协办的2016中国“互联网+”千人论坛在北京国际...

玄学酱 ⋅ 05/15 ⋅ 0

关于一个NMOS+PMOS开关电路失效的分析

MOS为电压控制电流的模式,BJT(三极管)为电流控制电流,因此MOS相比于BJT更常用一些。 最近一个项目用到了PMOS+NMOS作为开机信号,开机要求为高电平开机,最小电压为1.8V,耐压可达17V,为...

kingsai2012 ⋅ 2017/03/08 ⋅ 0

Nigelthorn恶意软件滥用Chrome扩展来加密挖矿和窃取数据

     2018年5月3日,Radware用机器学习算法检测到一个0 day恶意软件威胁。该恶意软件通过Facebook的社会工程链接进行传播,并通过滥用Chrome扩展来感染用户,该扩展可以执行证书窃取,加密货...

嘶吼RoarTalk ⋅ 05/15 ⋅ 0

详解Linux运维工程师高级篇(大数据安全方向)

详解linux运维工程师高级篇(大数据安全方向) hadoop安全目录: kerberos(已发布) elasticsearch knox oozie ranger apache sentry 简介: 从运维青铜到运维白银再到运维黄金,这里就要牵...

cs312779641 ⋅ 02/07 ⋅ 0

VUE+WebPack前端游戏设计:实现外星人的动态下滑特效

在上一节,我们完成了道具在页面上的拖拽特效。当用户在页面底部点击按钮选择一个道具后,鼠标在页面上移动时,一个闪光方块会跟随着鼠标移动,一旦鼠标在页面上单击后,相应的道具就会出现在...

望月从良 ⋅ 03/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 26分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 59分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部