如何深入理解 StatsD 与 Graphite ?

article/2025/9/20 15:28:41

众所周知,StatsD 负责收集并聚合测量值。之后,它会将数据传给 Graphite,后者以时间序列为依据存储数据,并绘制图表。但是,我们不知道,基于 http 访问的图表在展示时,是基于每秒钟的请求数,每次留存的平均请求数还是其它。让我们就以此为目标,来一探究竟吧!本文系 OneAPM 工程师编译整理。

理解 StatsD 与 Graphite

StatsD

为了全面了解 StatsD 的工作原理,我阅读了它的源码。之前我就耳闻 StatsD 是一种简单的应用,但读过源码后才发现它竟如此简单!在主脚本文件只有300多行代码,而 Graphite 的后端代码只有150行左右。

StatsD 中的概念

在这个文档中,列出了一些需要理解的 StatsD 概念。

Buckets

当一个 Whisper 文件被创建,它会有一个不会改变的固定大小。在这个文件中可能有多个 “buckets” 对应于不同分别率的数据点,每个 bucket 也有一个保留属性指明数据点应该在 bucket 中应该被保留的时间长度,Whisper 执行一些简单的数学计算来计算出多少数据点会被实际保存在每个 bucket 中。

Values

每个 stat 都有一个 value,该值的解释方式依赖于 modifier。通常,values 应该是整数。

Flush Interval

在 flush interval (冲洗间隔,通常为10秒)超时之后,stats 会聚集起来,传送到上游的后端服务。

测量值类别

计数器

计数器很简单。它会给 bucket 加 value,并存储在内存中,直到 flush interval 超时。

让我们看一下生成计数器 stats 的源码,该 stats 会被推送到后端。

for (key in counters) {var value = counters[key];var valuePerSecond = value / (flushInterval / 1000); // calculate "per second" ratestatString += 'stats.'+ key + ' ' + valuePerSecond + ' ' + ts + "\n";statString += 'stats_counts.' + key + ' ' + value  + ' ' + ts + "\n";numStats += 1;
}

首先,StatsD 会迭代它收到的所有计数器,对每个计数器它都会分配两个变量。一个变量用于存储计数器的 value,另一个存储 per-second value。之后,它会将 values 加至 statString,同时增加 numStats 变量的值。

如果你使用默认的 flush interval(10秒),并在每个间隔通过某个计数器给 StatsD 传送7个增量。则计时器的 value 为 7,而 per-second value 为 0.7。

计时器

计时器用于收集数字。他们不必要包含时间值。你可以收集某个存储器中的字节数、对象数或任意数字。计时器的一大好处在于,你可以得到平均值、总值、计数值和上下限值。给 StatsD 设置一个计时器,就能在数据传送给 Graphite 之前自动计算这些量。

计时器的源码比计数器的源码要稍微复杂一些。

for (key in timers) {if (timers[key].length > 0) {
var values = timers[key].sort(function (a,b) { return a-b; });
var count = values.length;
var min = values[0];
var max = values[count - 1];var cumulativeValues = [min];
for (var i = 1; i < count; i++) {cumulativeValues.push(values[i] + cumulativeValues[i-1]);
}var sum = min;
var mean = min;
var maxAtThreshold = max;var message = "";var key2;for (key2 in pctThreshold) {var pct = pctThreshold[key2];if (count > 1) {var thresholdIndex = Math.round(((100 - pct) / 100) * count);var numInThreshold = count - thresholdIndex;maxAtThreshold = values[numInThreshold - 1];sum = cumulativeValues[numInThreshold - 1];mean = sum / numInThreshold;}var clean_pct = '' + pct;clean_pct.replace('.', '_');message += 'stats.timers.' + key + '.mean_'  + clean_pct + ' ' + mean           + ' ' + ts + "\n";message += 'stats.timers.' + key + '.upper_' + clean_pct + ' ' + maxAtThreshold + ' ' + ts + "\n";message += 'stats.timers.' + key + '.sum_' + clean_pct + ' ' + sum + ' ' + ts + "\n";
}sum = cumulativeValues[count-1];
mean = sum / count;message += 'stats.timers.' + key + '.upper ' + max   + ' ' + ts + "\n";
message += 'stats.timers.' + key + '.lower ' + min   + ' ' + ts + "\n";
message += 'stats.timers.' + key + '.count ' + count + ' ' + ts + "\n";
message += 'stats.timers.' + key + '.sum ' + sum  + ' ' + ts + "\n";
message += 'stats.timers.' + key + '.mean ' + mean + ' ' + ts + "\n";
statString += message;numStats += 1;
}}

如果在默认的 flush interval 内,你将下列计数器 values 传给 StatsD:

  • 450
  • 120
  • 553
  • 994
  • 334
  • 844
  • 675
  • 496

StatsD 将会计数下面的 values:

  • mean_90 496
  • upper_90 844
  • sum_90 3472
  • upper 994
  • lower 120
  • count 8
  • sum 4466
  • mean 558.25

Gauges

一个 guage 代表着时间段内某点的任意 vaule,是 StatsD 中最简单的类型。你可以给它传任意值,它会传给后端。
Gauge stats 的源码只有短短四行。

for (key in gauges) {statString += 'stats.gauges.' + key + ' ' + gauges[key] + ' ' + ts + "\n";numStats += 1;
}

给 StatsD 传一个数字,它会不经处理地将该数字传到后端。值得注意的是,在一个 flush interval 内,只有 gauge 最后的值会传送到后端。因此,如果你在一个 flush interval 内,将下面的 gauge 值传给 StatsD:

  • 643
  • 754
  • 583

会传到后端的值只有583而已。该 gauge 的值会一直存储在内存中,直到 flush interval 结束才传值。

Graphite

现在,我们已经了解数据是怎样从 StatsD 传出来的,让我们看看它在 Graphite 里是如何存储并处理的。

总览

在 Graphite 文档里,我们可以找到 Graphite 概览,此概览总结了 Graphite 的两个要点:

  • Graphite 存储数值型带有时间序列的数据。
  • Graphite 按需绘制图表。

Graphite 由三部分组成:

  • carbon :监听时间序列的数据的后台程序。
  • whisper:一个简单的数据库库,用来存储时间序列数据。
  • webapp: Django webapp,使用 Cairo 来根据需要呈现图形。

Graphite 当做时间序列数据的格式如下:

<key> <numeric value> <timestamp>

存储方案

Graphite 采用可配置的存储方案用以定义所存数据的留存率。它会给数据路径匹配特定的模式,从而决定所存数据的频率和来历。

以下配置示例截取自 StatsD 文档。

[stats]
pattern = ^stats\..*
retentions = 10:2160,60:10080,600:262974

该示例表明,匹配上述样式的数据都会套用这些留存。留存的格式为 frequency: history。所以,该配置允许我们将10秒钟的数据存储6个小时,1分钟的数据存储1周,10分钟的数据存储5年。

在 Graphite 显示计时器

了解了这么多,我们来看看一个简单的 ruby 脚本,该脚本能收集 HTTP 请求的时间。

#!/usr/bin/env rubyrequire 'rubygems' if RUBY_VERSION < '1.9.0'
require './statsdclient.rb'
require 'typhoeus'Statsd.host = 'localhost'
Statsd.port = 8125def to_ms time(1000 * time).to_i
endwhile truestart_time = Time.now.to_fresp = Typhoeus::Request.get 'http://www.example.org/system/information'end_time = Time.now.to_felapsed_time = (1000 * end_time) - (to_ms start_time)response_time = to_ms resp.timestart_transfer_time = to_ms resp.start_transfer_timeapp_connect_time = to_ms resp.app_connect_timepretransfer_time = to_ms resp.pretransfer_timeconnect_time = to_ms resp.connect_timename_lookup_time = to_ms resp.name_lookup_timeStatsd.timing('http_request.elapsed_time', elapsed_time)Statsd.timing('http_request.response_time', response_time)Statsd.timing('http_request.start_transfer_time', start_transfer_time)Statsd.timing('http_request.app_connect_time', app_connect_time)Statsd.timing('http_request.pretransfer_time', pretransfer_time)Statsd.timing('http_request.connect_time', connect_time)Statsd.timing('http_request.name_lookup_time', name_lookup_time)sleep 10
end

让我们看看该数据生成的 Graphite 图。该数据来自 2 分钟前,而 elapsed_time 则来自前面的脚本。

图像生成

Render URL

下面图片的 Render URL

/render/?width=586&height=308&from=-2minutes&target=stats.timers.http_request.elapsed_time.sum

Graphite 生成的图片

该图片简单地描绘了 http 请求在一段时间内的 elapsed_time 值。

JSON-data

Render URL

下面 JSON-data 的 Render URL

/render/?width=586&height=308&from=-2minutes&target=stats.timers.http_request.elapsed_time.sum&format=json

来自 Graphite 的 JSON-output

在下面的结果中,我们可以查看来自 Graphite 的源数据。这些数据来自12个不同的数据点,也即 StatsD 10 秒 flush internal 的两分钟。Graphite 绘制数据就是如此简单。

此外,借助 JSONLint,JSON-data 的数据显示更加美观。

[{"target": "stats.timers.http_request.elapsed_time.sum","datapoints": [[53.449951171875,1343038130],[50.3916015625,1343038140],[50.1357421875,1343038150],[39.601806640625,1343038160],[41.5263671875,1343038170],[34.3974609375,1343038180],[36.3818359375,1343038190],[35.009033203125,1343038200],[37.0087890625,1343038210],[38.486572265625,1343038220],[45.66064453125,1343038230],[null,1343038240]]}
]

在 Graphite 绘制 gauge 图像

下面的简单脚本能将 gauge 传送给 StatsD,模拟用户注册的过程。

#!/usr/bin/env rubyrequire './statsdclient.rb'Statsd.host = 'localhost'
Statsd.port = 8125user_registrations = 1while trueuser_registrations += Random.rand 128Statsd.gauge('user_registrations', user_registrations)sleep 10
end

图像显示——用户注册数量

Render URL

下面图片的 Render URL

/render/?width=586&height=308&from=-20minutes&target=stats.gauges.user_registrations

来自 Graphite 的图片

另一个简单的图片,展示总的注册数。

图片显示——每分钟的用户注册数

使用 Graphite 的衍生函数,可以获得每分钟的用户注册数量。

Render URL

下面图片的 Render URL

/render/?width=586&height=308&from=-20minutes&target=derivative(stats.gauges.user_registrations)

来自 Graphite 的图片

该图片所用的数据跟之前的图片一致,但是使用了衍生函数从而显示每分钟的注册率。

结论

深入了解 StatsD 与 Graphite 的工作原理,能让我们更加明白 StatsD 所传送的数据种类,如何传送,以及怎样更有效地根据 Graphite 读取数据。

原文地址:https://blog.pkhamre.com/understanding-statsd-and-graphite/

OneAPM 是应用性能管理领域的新兴领军企业,Cloud Insight 能帮助企业用户和开发者轻松实现:监控各项基础组件以及对数据进行聚合、过滤和筛选的功能,致力于打造一个更为强大的数据管理平台。想技术文章,请访问 OneAPM 官方博客。


http://chatgpt.dhexx.cn/article/B819SsWE.shtml

相关文章

graphite 监控 简介

graphite是一个监控业务数据的监控系统。&#xff0c;该系统架构如下&#xff1a; 系统分为三大组件&#xff1a; carbon&#xff1a; 负责后端数据采集,可以通过以下客户端来采集数据 客户端应用有多个方式来发布度量值&#xff1a; 使用一个纯文本协议工具比如 netcat (n…

graphite在centos7上的部署搭建

Graphite安装笔记 实验环境&#xff1a; CentOS7.5 x64 部署python的程序推荐使用virtualenv这列的虚拟环境来进行&#xff0c;防止污染系统自带的python包。 安装一些必要的rpm包 yum install cairo -- 另外的2个包 cairo-devel pycairo 可以不用安装 安装virtualenv yum ins…

Graphite Simulator模拟器详解

Graphite模拟器 Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器。设计目标是针对与未来的多核甚至千核&#xff0c;提供高性能的设计和软件开发平台。使用了直接执行、无缝多核和多机分布、可分析性建模、松散同步等技术来提高模拟性能。提供了功能…

业务监控系统如何做,一起来看看如何使用Statsd+Graphite+Grafana搭建业务监控系统

背景介绍 希望能够对业务指标监控&#xff0c;通过业务指标监控反应业务系统的稳定性&#xff0c;原因是通过对基础资源&#xff0c;应用服务状态&#xff0c;性能监控&#xff0c;不能够反应业务系统的稳定性&#xff0c;举个栗子&#xff1a;服务程序一切正常&#xff0c;下…

Spark 应用监控告警-Graphite_exporter

Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面事后查看REST API度量高级工具一、下载graphite_exporter 1.1 修改graphite_exporter_mapping1.2 启动graphite_exporter二、Spark配置Graphite metrics三、启动Spark程序四、配置Prometheus 4.1 查看Prometheus…

Graphite系统监控

转载至 : http://my.oschina.net/fufangchun/blog/232895?p1 目录[-] 一、简介&#xff1a; 二、Graphite的安装及配置 0.Graphite目录 1.安装环境 2.所需软件 3.安装依赖 4.安装Graphite组件 ①.检查依赖&#xff1a; ②.安装graphite-web&#xff1a; ②.安装whisper&#x…

【大数据监控】Prometheus、Node_exporter、Graphite_exporter安装部署详细文档

目录 Prometheus简介下载软件包安装部署创建用户创建Systemd服务修改配置文件prometheus.yml启动Prometheus node exporter下载软件包安装部署创建systemd服务启动node_exporter graphite_exporter下载软件包安装部署创建systemd服务启动 graphite_exporter Prometheus 简介 P…

docker部署grafana graphite stastd实时监控告警配置_亲测成功

docker部署grafana graphite stastd实时监控告警配置_亲测成功 实时监控请求的次数和响应时间及异常报警 项目中需要监控API接口的调用情况,如:调用次数,每次调用耗时,调用高峰期,异常报警等 grafana graphite stastd这一套对代码没有侵入,也不会影响接口性能 安装docker环…

graphite安装笔记

0.Graphite目录 Graphite安装之后&#xff0c;在安装位置(默认为/opt/graphite)的文件布局如下&#xff1a; 目录介绍/opt/graphite/bin二进制文件目录/opt/graphite/conf配置文件目录/opt/graphite/lib库目录/opt/graphite/storage数据存放目录&#xff0c;包括log&#xff0c…

graphite 数据库_大数据存储和分析-IBM DB2和Graphite

在本文中,我们将结合IBM™Persistence API使用IBM DB2作为数据源,描述PCC系统中的数据存储。 此外,我们讨论了如何使用Graphite来检测代码库和工作负载。 最后,我们描述了用于分析数据的工具。 成绩单 IBM DB2和Java Persistence API DB2是IBM关系数据库服务器,已在整个…

graphite安装(一键搞定版)

一、python部分&#xff1a; 0、系统&#xff1a; $ cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1、检查系统python是否2.7以上&#xff08;最新graphite需要python至少2.7&#xff09;&#xff1a; $ python -V Python 2.7.5 2、安装pip&#xff1a;…

graphite http api

Render API Graphite web 提供了/render API用来生成图片和获取原始数据。这个API通过查询字符串支持各种参数。参数之间通过&进行分割&#xff0c;如下所示&#xff1a; &namevalue 你可以通过访问 http://GRAPHITE_HOST:GRAPHITE_PORT/render 这个url来确认这个A…

sitespeed+graphite+grafana

最近在看性能UI performance testing 的工具 其中一个是 sitespeed。 sitespeed.io 是 一款可监视和衡量网站前端性能的开源工具。 1. 开 源 2 . 支持事务模 拟 3 . 自动性能分析&#xff0c;形成可视化报 告 4 . 提供的 docker 镜像已搭建完成监控系统&#xff0c;满足…

在Ubuntu18.04使用Docker安装graphite

安装docker apt install docker.io 参照graphite官网&#xff0c;运行docker docker run -d \--name graphite \--restartalways \-p 80:80 \-p 2003-2004:2003-2004 \-p 2023-2024:2023-2024 \-p 8125:8125/udp \-p 8126:8126 \graphiteapp/graphite-statsd 查看docker&am…

graphite

Graphite 是一个用于采集网站实时信息并进行统计的开源项目&#xff0c;可用于采集多种网站服务运行状态信息。Graphite服务平均每分钟有4800次更新操作。实践已经 证实要监测网站发发生什么是非常有用的&#xff0c;它的简单文本协议和绘图功能可以方便地即插即 用的方式用于任…

Graphite详解

Graphite详解 作者&#xff1a;chszs&#xff0c;未经博主允许不得转载。经许可的转载需注明作者和博客主页&#xff1a;http://blog.csdn.net/chszs Graphite是一个开源实时的、显示时间序列度量数据的图形系统。Graphite并不收集度量数据本身&#xff0c;而是像一个数据库&…

时序数据库-Graphite

Graphite就属于一种时序数据库&#xff0c;作用是存储和聚合监控数据并绘制图标&#xff0c;不负责数据的收集。之所以想写一篇关于Graphite的博文主要是因为这是我接触到的另一种新型数据库&#xff0c;其特点和功能让人眼前一亮。但是需要强调的是&#xff0c;这里所谓的时序…

Graphite介绍

Graphite详解 https://www.2cto.com/kf/201603/494435.html Graphite是一个开源实时的、显示时间序列度量数据的图形系统。Graphite并不收集度量数据本身&#xff0c;而是像一个数据库&#xff0c;通过其后端接收度量数据&#xff0c;然后以实时方式查询、转换、组合这些度量数…

http中的XFF(X-Forwarded-For)

详细知识请移步大佬网页

攻防世界-xff_referer

题目 访问题目场景 抓包看看&#xff0c;打开场景&#xff0c;页面提示我们ip必须是123.123.123.123&#xff0c;我们就想到burpsuite抓包&#xff0c;添加上X-Forwarded-For:123.123.123.123 GET / HTTP/1.1 Host: 223.112.5.156:54671 X-Forwarded-For:123.123.123.123 User-…