Inception:LinkedIn是如何利用异常日志实现服务监控的

来自LinkedIn性能工程团队的的工程师Toon Sripatanaskul和Zhengyu Cai在官方网站上披露了他们是如何通过Inception处理内部系统的日志,从而实现服务监控的。

早在2012年初,LinkedIn的性能工程团队就尝试构建一种工具,它可以对发生代码变更后的服务进行有效性验证。日志消息,特别是异常日志,可以很准确地反应服务的运行状况。对于新部署的服务,通过检查是否有新的异常日志出现就可以知道服务的健康状况。那个时候,他们使用脚本把日志文件拷贝到其它机器上,然后通过正则表达式生成最终的日志报告。这种方式在刚开始的时候运作良好,但LinkedIn发展迅速,脚本工具不具备伸缩性,无法跟上公司的发展速度。

2012年底,他们构建了一个日志消息处理系统,叫作Inception(Linked In Ex ception的合体)。他们把各个数据中心产生的日志消息聚集到Kafka上,然后Inception通过Kafka客户端处理这些消息,并把它们存放到如下几个数据库表中:

唯一性异常(What):异常日志消息的堆栈信息被抽取出来,并通过散列生成MD5串,这个串就是这个消息的签名。这样,他们就可以通过比较这个散列值快速地识别出新的异常,同时可以对异常进行去重。在计算散列值时,消息里的动态数据会被过滤掉,比如时间戳和代码行数。这个表保存的是日志消息和它的散列值。 实例(Where):这个表保存的是发生异常的服务实例,包括主机名、服务名和代码版本号。 时间序列(When):他们以分钟时间为单位,并检查在一分钟内某种异常发生的次数。这个表同时还引用了上述两个表的数据。

把以上三个表的数据连接起来,他们就有足够的信息来生成日志报表,包括唯一性日志消息以及它们的发生次数和发生地点。

几年来,为了适应LinkedIn迅速的发展,Inception的架构也在不断演进。在经历了几次伸缩性问题之后,他们决定使用在Inception里使用Apache Samza来处理日志。Samza不仅处理速度快,而且高度可伸缩。Inception现在每秒可以处理110万条日志消息。除此以外,Inception还支持多种数据源。

服务端异常: Inception现在支持Java、Python、Scala和C++的服务端异常。 JavaScript异常:他们使用一种数据管道从用户的浏览器端收集JavaScript异常,这些客户端异常通过REST API发送到专门的服务器上,并被转成Kafka事件。 移动设备异常:移动设备异常跟服务端异常一样,也包含了堆栈信息。不过收集这些信息会比较困难一些,目前他们还在不断解决这方面的问题。 测试框架异常: Inception集成了Selenium框架,对于每一个测试用例,他们都会有一个唯一的标识,它们会被传播到下游的后端服务上。Inception因此可以知道下游服务是否运行正常。 JIRA集成:当Inception检测到异常时,他们的另外一个系统就会创建一个JIRA ticket。他们通过这种方式报告缺陷,不过这种方式会创建过多的ticket,从而造成干扰,他们正在完善这个方案。

说到这里,不得不提一下,在日志分析技术领域,ELK(Elasticsearch、Logstash、Kibana)是另外一个值得一说的日志分析技术栈。ELK可以保存完整的日志信息,包括时间戳、实际发生次数和具体的堆栈信息。不过ELK会占用大量的存储空间。对于LinkedIn来说,为了得到一个粗略的报表,可能因此需要耗费50T的存储空间,而Inception只需要30G的空间,并且处理速度更快。这么说来,Inception似乎在这方面更胜一筹。

本文转自d1net(转载)

时间: 2024-10-22 09:17:07

Inception:LinkedIn是如何利用异常日志实现服务监控的的相关文章

前端代码异常日志收集与监控

在复杂的网络环境和浏览器环境下,自测.QA测试以及 Code Review 都是不够的,如果对页面稳定性和准确性要求较高,就必须有一套完善的代码异常监控体系,本文从前端代码异常监控的方法和问题着手,尽量全面地阐述错误日志 收集各个阶段中可能遇到的阻碍和处理方案. 收集日志的方法 平时收集日志的手段,可以归类为两个方面,一个是逻辑中的错误判断,为主动判断:一个是利用语言给我们提供的捷径,暴力式获取错误信息,如 try..catch 和 window.onerror. 1. 主动判断 我们在一些运算

利用事务日志来恢复Update、Delete误操作引起的数据丢失

恢复|数据 可能有不少朋友遇到过这样的问题:update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者只能恢复到最近一次的备份的数据了. 以下简单说明恢复数据方法:1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行

利用事务日志来恢复Update、Delete误操作引起的数据丢

恢复|数据 可能有不少朋友遇到过这样的问题:update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者只能恢复到最近一次的备份的数据了. 以下简单说明恢复数据方法:1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行

协议-Android软件使用TCP进行通信,连接不到服务端,在同一子网,代码跟异常日志都有,请大神指教

问题描述 Android软件使用TCP进行通信,连接不到服务端,在同一子网,代码跟异常日志都有,请大神指教 客户端线程:class BB1 extends Thread{ public void run() { try { System.out.println(""hahahha""); Socket client=new Socket(ipadressPORT); System.out.println(client.getPort()); mingling=&qu

阿里巴巴 Java 开发手册之异常日志(二)-------我的经验

二.异常日志 (一) 异常处理 1. [强制]Java 类库中定义的一类RuntimeException可以通过预先检查进行规避,而不应该通过catch 来处理,比如:IndexOutOfBoundsException,NullPointerException等等. 说明:无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过catch NumberFormatException来实现. 正例:if (obj != null) {...} 反例:try { obj.method(

利用数据库日志恢复数据到点的操作

可能有不少朋友遇到过这样的问题:update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者只能恢复到最近一次的备份的数据了.以下简单说明恢复数据方法:1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行一次日志备份(

ssh2集成-SSH集成,log4j 记录异常日志

问题描述 SSH集成,log4j 记录异常日志 所有异常全部抛给Action层,想用log4j记录这些异常,求配置文件.

mysql利用binlog日志恢复数据库的例子

binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句.语句以"事件"的形式保存,它描述数据更改.当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回(前提是已经配置好了binlog),接下来我们来配置 一.开启mysql-binlog日志 在mysql配置文件my.cnf加上如下配置  代码如下 复制代码 [mysqld] log-bin=mysql-bin 重启mysql  代码如下 复制代码   service mysqld restart 二

《智能数据时代:企业大数据战略与实战》一3.6 学会利用异常数据

3.6 学会利用异常数据 有人认为在处理大数据时忽略各种异常数据是最好的做法,为此他们创建了复杂的过滤程序,来舍弃那些异常的信息.在处理特定类型的数据时,这可能算是较为稳妥的做法,因为异常往往会导致结果的不准确.但实践证明,在某些时候和某些特定的情景中,异常数据要比其他的数据更有价值.对此,我们应该认识到的是"在没有进一步分析的情况下,丢弃数据的做法是不正确的".举例来说,在以数据加密为标准做法并且需要实时进行访问记录和数据检查的高端网络安全领域,识别并认定符合数据非特征运动的情况(即