写点什么

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:002487
用户头像

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

关注

评论

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

上海首个大模型产业发展研讨会圆满落幕,众顶尖专家共探大模型产业

NLP资深玩家

JSF源码分析(一)

京东科技开发者

spring jsf 企业号 4 月 PK 榜

终于有人把动态规划、冒泡排序、二叉树、链表、栈全部讲清楚了

Java你猿哥

数据结构 算法 二叉树 排序 LeetCode算法

大语言模型时代狂飙以来,到底是谁在让你失业|社区征文

小诚信驿站

三周年征文

面试官:介绍一下什么是缓存雪崩、缓存击穿、缓存穿透?

Java你猿哥

redis 面试题 缓存穿透 缓存击穿 缓存雪崩

品牌活动|行云创新出席“新工业·智物联”全国巡回 CEO 峰会

行云创新

行云创新 新工业 智物联 全国巡回CEO峰会珠海站

生物计算大模型技术在药物研发领域的应用

Baidu AICLOUD

生命科学 PaddleHelix

中国边缘云公有云服务市场 Top2,百度智能云让智算无处不在

Baidu AICLOUD

分布式云

为什么说网络安全行业是IT行业最后的红利?

网络安全学海

网络安全 安全 信息安全 渗透测试 WEB安全

python中对象引用 | python小知识

AIWeker

Python python小知识 三周年连更

Mybatis返回集合类型到底是空集合还是null?源码解读

做梦都在改BUG

Java 源码 mybatis

超级详细|Linux系统下从0到1的玩法大全

浅羽技术

Linux unix 操作系统 命令 三周年连更

GPU 加速药物研发与基因组学分析

Baidu AICLOUD

生命科学

The Beacon链游NFT系统开发技术

薇電13242772558

NFT

阿里“妈宝级”之作,Kubernetes原理剖析与实战应用手册,太全了

做梦都在改BUG

Java Kubernetes k8s

Java中的「接口」到底是什么?

海拥(haiyong.site)

三周年连更

ChatGPT及大模型专题研讨会在蓉成功举办共探前沿技术与产业发展

NLP资深玩家

每个Java程序员都必须知道的四种负载均衡算法

做梦都在改BUG

Java 负载均衡 负载均衡算法

拿来吧你!保姆级Docker底层原理及源码实战手册,上线点赞破10W

做梦都在改BUG

Java Docker 容器

Typescript- 数据类型

格斗家不爱在外太空沉思

typescript 三周年连更

天呐!我真的没想到推特GIF动图保存到手机相册竟然简单几步就能完成!

frank

twitter

超简单!Java 项目自动生成接口文档教程

Apifox

Java 接口文档 API 文档生成 自动生成

GitHub爆款!Java性能优化:轻松道破软件性能调优,不止搞定JVM

Java你猿哥

Java JVM Java性能优化

全栈开发实战|Vue进阶——使用静态模块打包工具webpack

TiAmo

Vue webpack 三周年连更 静态模块打包

华为云开源项目OpenTiny中TinyVue有什么优势?

英勇无比的消炎药

开源 Vue 组件库

我认真总结并分析了Spring事务失效的十种常见场景

做梦都在改BUG

Java spring Spring事务

一文详解RocketMQ-Spring的源码解析与实战

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

【Linux】firewall-cmd之防火墙简介及命令详解【附加实战⭐建议收藏!!⭐】

A-刘晨阳

Linux 防火墙 Firewalld防火墙 三周年连更

浅谈智能语音交互

六月的雨在InfoQ

语音识别 语音合成 三周年连更 智能语音交互

《人间失格》

后台技术汇

三周年连更 人间失格

ARB链质押挖矿代币空投游戏dapp系统开发合约定制

开发微hkkf5566

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