Prometheus vs. Graphite:时序数据监控工具选择

2个月前

横向比较Prometheus和Graphite,并提供一些选择标准供参考。

本文获文章作者授权翻译,转载需要注明来自公众号EAWORLD

作者:Daniel Berman

译者:白小白 

原题:Prometheus vs. Graphite: Which Should You Choose for Time Series or Monitoring?

原文:https://logz.io/blog/prometheus-vs-graphite/

全文3742字,阅读约需要15分钟

任何系统、应用程序、产品或流程的关键性能指标之一是某些参数或数据点在一段时间内的表现。比如,如何 在几秒钟内监视API端点上的命中情况或数据库延迟?当下捕捉到的单个数据点本身不会有太多的表征意义。然而,随着时间的推移,对相同趋势的跟踪会告诉你更多的信息,包括特定指标变化所产生的影响。

例如,如果您想知道一个新的社区进程或文档对API的命中次数的影响,或者某个特定的软件修复是如何影响数据库的延迟的,请将当前值与引入变化 之前的值进行比较。这就是时序数据的价值。

围绕时间序列数据构建的监控工具需要在非常高的交易量下执行以下操作:

收集(或至少监听)事件,事件通常带有时间戳;
有效地存储这些事件的数量;
支持对这些事件的查询;
提供对这些功能的图形监视,以便随着时间的推移跟踪趋势。

Prometheus 和 Graphite是用于存储和绘制时间序列数据的开源监控工具。Prometheus是一个“时间序列DBMS和监视系统”,而Graphite是一个更简单的“时间序列数据记录和绘图工具”。两者都是开源的,主要用于系统监视。然而Prometheus是最近发展起来的,它承担了支撑扩展性的额外挑战,并包含了许多特性,包括灵活的查询语言、推送网关(用于从临时的或批处理的作业中收集指标数据)、一系列出口商以及其他工具。

在本文中,我们将横向比较Prometheus和Graphite,并提供一些选择标准供参考。

Graphite概述

在某种程度上,Graphite比Prometheus更简单,特征更少,使命也更简单。根据官方文档(http://graphite.readthedocs.io/en/latest/overview.html#about-the-project),它只做两件事:

存储数字时间序列数据
呈现此数据的图形

虽然Graphite不会进行数据收集,但是设计了名为Carbon的twisted守护进程来被动地监听时间序列数据,并将数据存储在一个名为Whisper的库文件中。最后,可以通过一个简单的Django Web应用程序按需绘制图形。

资料来源:Graphite 官方文档

值得重申的是,与Prometheus相比,Graphite的数据收集是被动的,这意味着发送数据的应用程序需要进行相关配置来将数据发送到Graphite的carbon组件。

Prometheus概述

相对来说,Graphite是一个简单的数据记录和绘图工具,可以广泛应用于包括并不限于监控在内的很多场景,而Prometheus是一个全面的系统和服务监控系统。这意味着,虽然Prometheus具有更丰富的特性,但它同时也有一个更具体和更窄的应用范畴。

Prometheusy 主动的搜刮数据,进行存储,支持查询、图表展现和告警,以及向其他API使用者(诸如Grafana,甚至Graphite)提供端点。它通过以下组件完成所有这些工作:

1. 客户端类库:插装应用程序代码(用于生成事件);
2. Prometheus服务器:一旦启动,将这些事件作为时间序列数据进行抓取和存储;
3. 推送网关:支持临时数据导入作业;
4. 数据导出工具:向HAProxy、StatsD、Graphite等导出数据;
5. 告警管理器:处理告警。

资料来源:Graphite 官方文档

根据其官方文档(https://github.com/prometheus/prometheus/blob/master/README.md),Prometheus因具备如下的特征而得以将自己与其他监控系统区别开来: 

多维数据模型,其时序数据由指标名称和键/值维度定义;
灵活的查询语言;
自治的单服务器节点,不依赖于分布式存储;
通过HTTP之上的pull model进行数据收集;
时间序列数据推通过中介网关传送到其他数据目的地和存储介质;
服务发现和静态配置来发现目标节点;
对图表和仪表板的多种支持模式;
垂直和水平上支持Federation。

如上图所示,Prometheus支持用于服务发现、告警、可视化和导出的多个第三方实现,从而使管理员能够为每种场景选用最适合的技术实现。这里仅只是展示了一部分。

Prometheus在Graphite发布数年后发布,也许可以被看作是对它的一种改进,专注于监视,并具有更多的特性和性能调优。

总体比较

Feature
Prometheus
Graphite
What it is
Fully integrated time series DBMS and monitoring system
Time series data logging and graphing tool
What it does
Scraping, storing, querying, graphing, and alerting based on time series data. Provides API endpoints for the data it holds
Stores numeric time series data and provides graphs of that data
Implemented in
Go
Python
Data types handled
Numeric
Numeric
Year released
2012
2006
Website
prometheus.io
github.com/-graphite-project/-graphite-web
Technical documentation
prometheus.io/docs
graphite.readthedocs.io
APIs and access methods
RESTful HTTP and JSON
HTTP API Sockets
XML support?
Yes (can be imported)
No
Server Operating Systems
Linux, Windows
Linux, Unix
Supported programming languages
.NET, C++, Go, Haskell, Java, JavaScript (Node.js), Python, Ruby
JavaScript (Node.js), Python, (although you can push metrics to it from virtually any language)
Partitioning supported?
Yes, sharding
Yes, via consistent hashing
Replication supported?
Yes, by federation
Not by default, but tools exist to support clustering
Data collection
Active or pull (configurable)
Passive or push

特性比较

数据收集和使用

Graphite没有直接的数据收集支持。Carbon被动地侦听数据,但是为了支持数据收集,需要在时序数据管道中引入像Flow entd、statd、collectd或其他解决方案。一旦收集完毕,Graphite就有一个内置的UI来可视化数据,而Prometheus则是一个完整的监控解决方案,内置了数据收集、存储、可视化和导出。

存储

Graphite可以存储时序数据,这些数据通常是从数据采集的守护进程(如上面提到的那些)或其他监控解决方案(如Prometheus)中收集的。Graphite通过其Metrics API或Render API基于HTTP协议进行数据查询。在Graphite中,Carbon把数据存储在Whisper里。随着时间的推移而被持续跟踪的变量,会生成一个单独的指标文件,其工作模式就像一个巨大的数组,文件的写入是非常精确的。每个自动汇总也会生成一个单独的文件。

Prometheus提供了时间序列本身的键值标记,这提供了更好的可组织性和更健壮的查询功能。

Prometheus的官方文档解释了其磁盘存储的机制。采集的数据按2小时为单位划分为若干块,每个块是包含一个或多个大文件的目录,以及一个元数据文件和索引文件,如下所示:

./data/01BKGV7JBM69T2G1BGBGM6KB12
./data/01BKGV7JBM69T2G1BGBGM6KB12/meta.json
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000002
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000001

同时,一个后台进程将每个两小时块压缩成更大的块文件。

数据可视化和仪表板

Graphite提供了相当基本的,但有用的可视化选项,可通过其Django网络应用调用。Graphite还支持仪表板编辑。

Prometheus在仪表板上使用控制台模板,但由于功能丰富,这些模板的学习曲线可能相当高。当然,作为开源软件,可以采用代码级或者方案级的自定义模板来进行客户化。

值得一提的是,Graphite和Prometheus这两种解决方案的用户通常依赖Grafana作为用户界面,因为其内置UI通常都不能满足用户的需要。

插件体系结构与可扩展性

Graphite不提供插件。但是很多工具都与Graphite兼容。

Prometheus运营了一个导出工具的生态系统,这使得第三方工具能够将其数据导出到Prometheus。许多开源组件默认与Prometheus兼容。

告擎和事件跟踪

Graphite可以跟踪事件,但不直接支持告警。

Prometheus不支持事件跟踪,但提供完全支持告警机制和警报管理。当然,Prometheus的查询语言允许用户自己实现事件跟踪。

云监控能力

AWS CloudWatch已经可以用于Graphite涵盖的大多数功能。而且,GitHub中有一些组件可以将AWS CloudWatch数据推送到Graphite。

Prometheus提供了支持AWS CloudWatch的官方导出工具,可以监控所有AWS云组件。虽然Prometheus还不支持OpenStack Gnocchi(OpenStack的时序数据即服务),但已经有用户提出了这方面的需求。

社区

Prometheus和Graphite都是开源的,并且由活跃的开发者社群提供着很好地维护。截至2018年7月,Prometheus的GitHub主库已被fork超过2,200次,Graphite是1,100多次。

这两个工具都是在开放环境下开发的,用户可以通过IRC、GitHub和其他通信渠道与开发人员和社区成员进行交互。

双方的IRC频道地址是:

Graphite – http://irc.netsplit.de/channels/details.php?room=%23graphite&net=freenode
Prometheus – https://riot.im/app/#/room/#freenode_#prometheus:matrix.org

受欢迎程度

截至2018年6月29日,解决方案在DB-Engines上的排名如下:

Graphite – #84 overall, #4 Time Series DBMS
Prometheus – #107 overall, #6 Time Series DBMS

近年来,时间序列解决方案的采用速度大大快于其他数据库类别。例如,到2016年年中,时序数据库管理系统在过去12个月中获得了近27%的流行份额,是图形数据库管理系统的两倍多。

时间序列解决方案通常针对典型的用例提供了专门的特性并进行了性能调优,从而使该类别发展迅猛。

相似点

Prometheus和Graphite的共同点是:

为时间序列数据提供可视化工具。

提供自己的查询语言。

为给定时序数据存储数字样本。

是开源的。

与广泛的工具和插件兼容,包括Grafana。

设计时考虑到可靠性和容错能力。

支持对时序数据的实时监视。

不同点

Prometheus为数据收集提供直接支持,而Graphite不提供。

Prometheus的查询语言和元数据模型比Graphite的更加健壮。

Prometheus是一个完整的监控和趋势系统,包括内置和主动的抓取机制、支持存储、查询、图形展现和告警机制。Graphite是一种被动时序日志和绘图工具。诸如数据抓取和告警这些内容,由外部组件解决。

Prometheus为告警提供内置支持,而Graphite需要额外的工具和工作来支持警报生成。

Prometheus提供了比Graphite更广泛的客户端类库支持。

两者都具备真正意义上的水平扩展性,但是Prometheus支持分区(sharding)和复制(federation)。

Prometheus支持XML数据导入,而Graphite不支持。

用户案例和用户

Prometheus于2012年由SoundCloud开发,在OutBrain、Docker、DigitalSea、Ericsson和Percona等公司获得持续采用。包括这些公司在内的用户,利用Prometheus的多维数据收集和查询能力的优势来对应用实施监控,无论该应用是静态的以机器为中心的架构,还是动态服务导向架构。

Graphite于2006年在Orbitz开始使用,在证明了它在处理数字时序数据方面的优势之后,被持续使用至今。其他公司包括Instagram、Canonical、Oracle、Uber、GitHub和Vimeo使用Graphite处理“操作严格型”时序数据,如应用指标、数据库指标、电子商务监控等等。阅读更多的石墨案例,可以访问这个地址 ( http://graphiteapp.org/case-studies/ )。

行动指南

如果想要一个能够长期保存历史数据的集群解决方案,那么Graphite可能是一个更好的选择,因为它简单而且在这方面的应用历史悠久。Graphite也有内置的数据汇总。同样的,如果您现有的基础结构已经使用了Flow entd、Gogtd或statd之类的集合工具,那么可以选择Graphite,因为Graphite与他们兼容,可以组合成为更完整的解决方案。

相反,如果是从零开始并打算使用完整的解决方案实施应用监控 (可能监控的对象包括更多的动态和多变的数据),并且数据保留是短期的,则Prometheus可能是一个更好的选择,因为监控所需的一切都已经集成了。

Prometheus的学习曲线略长一些。然而,投入的时间将值回票价,毕竟,不必去维护单独的工具集,如数据收集和告警。

在做出选择之前,仔细评估自己的需求和当前实现的状态。Prometheus是一个完整的监控系统,内置了所有的。Graphite只是一个存储和数据可视化的框架。自己现有的系统能做什么,需要新的工具做到什么?审慎决定。

关于作者:

丹尼尔•伯曼(Daniel Berman)是Logz.io的产品传播者。他热衷于日志分析、大数据、云计算、家庭,爱好跑步、利物浦足球俱乐部,以及写写关于颠覆性高科技东西的文章。在推特上@proudboffin关注他。

他的推特地址是:https://twitter.com/proudboffin

关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享,长按二维码关注



COMMENTS

需要 后方可回复
如果没有账号可以 一个帐号。