写点什么

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

  • 2017-01-16
  • 本文字数:1453 字

    阅读完需:约 5 分钟

来自 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 似乎在这方面更胜一筹。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-01-16 18:002508
用户头像

发布了 322 篇内容, 共 135.9 次阅读, 收获喜欢 144 次。

关注

评论

发布
暂无评论
发现更多内容

服务治理的目标与愿景

阿泽🧸

服务治理 6月月更

课程背景

IT蜗壳-Tango

6月月更

架构实战营模块4作业

挖了蘑菇哩斯

架构实战营 存储方案

攻防演练中红队的外网纵向突破口

穿过生命散发芬芳

6月月更 攻防演练

一个完整挖洞/src漏洞实战流程【渗透测试】

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

C语言中奇妙又有趣的符号——C语言运算(操作)符

未见花闻

6月月更

在线多行文本行转列工具

入门小站

工具

千万级学生管理系统的考试试卷存储方案设计

Geek_7a789a

基于Redis sentinel的千万级学生管理系统的考试试卷存储方案

Geek_e8bfe4

我理解的微服务 -- 读《微服务设计模式》总结

潜水员

golang 微服务

高效的代码版本控制,让你居家办公游刃有余 | 社区征文

代码托管 6月月更 初夏征文 协同开发

JVM调优简要思想及简单案例-JVM分代模型

zarmnosaj

6月月更

【PIMF】盘点开源鸿蒙第三方组件(第三方库)【2】

离北况归

OpenHarmony 三方库

LabVIEW Arduino RS-485智能农业监测系统(项目篇—4)

不脱发的程序猿

传感器 智慧农业 LabVIEW Arduino RS-485智能农业监测系统

千万级学生管理系统试卷存储方案(架构实战营 模块四作业)

Gor

wapper解析

卢卡多多

6月月更

618战报销冠谜底:“收割机”联想屠榜背后的三大利器是什么?

脑极体

又回到最初的起点,记忆中你青涩的脸,我们终于来到了这一天

百思不得小赵

阅读 毕业生 6月月更

架构实战营第四模块作业

Geek_53787a

flutter系列之:flutter中常用的box

程序那些事

flutter 程序那些事 6月月更

网页设计的发展趋势如何

源字节1号

Java Core 「12」ReentrantLock 再探析

Samson

学习笔记 Java core 6月月更

架构实战营模块 4 作业

Roy

架构实战营

linux几个不常用但是很有用的命令

入门小站

Linux

NodeJS Stream入门 🦺

德育处主任

node.js 6月月更

GetX 响应式状态管理简介

岛上码农

flutter ios 安卓 跨平台应用 6月月更

数据库每日一题---第17天:丢失信息的雇员

知心宝贝

数据库 前端 后端 6月月更

leetcode 542. 01 Matrix 01 矩阵(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

千万级学生管理系统考试试卷存储方案

地下地上

架构实战营

在线JSON转TSV工具

入门小站

工具

echo命令实用技巧

Nick

Docker 镜像源 echo 6月月更 tldr

Inception:LinkedIn是如何利用异常日志实现服务监控的_语言 & 开发_薛命灯_InfoQ精选文章