如何从graphite7获取数据
发布网友
发布时间:2022-11-28 06:18
我来回答
共1个回答
热心网友
时间:2023-10-21 16:11
一、 基础概念
如果你有一些随时间变化的数值,然后你想他们绘图,那么 Graphite 非常有用。基本上你编写一个程序来收集这些数值,然后将他们发送到graphite的后端即可。
二、 第一步 – 选择一个好的命名方案
存储在Graphite的任何东西都有一个路径,这些路径由多个部分组成,每个部分以点号相隔。比如website.orbitz.bookings.air可能表示在orbitz中的air bookings。在产生你的数据之前你需要先选择好你的命令方案。
比如在”foo.bar.baz”这个路径中,每个点周围的东西都称为一个路径组件,因此“foo”,“bar”,“baz”都是路径组件。
每个路径组件必须是明确的,有目的的。路径组件应该和系统层次尽量保持相对应的深度。
三、 第二步 – 配置数据保存
Graphite建立在固定尺寸的数据库上 (参考whisper) ,因此我们必须预先配置我们想存储多少数据和数据的精度。比如你想以一分钟的精度(即每分钟有一个数据节点)保存2小时的数据。另外你还可以以10分钟的精度保存2周的数据。其理念就是存储开销由你想存储的数据节点决定的,精度越低,那就可以以更少的节点覆盖更长的时间。
要确定最佳的保存配置,你必须回答以下所有问题:
你的数据多久产生一次?
你要求的最大精度是多少?
在那个精度下,你需要查看多久的数据?
你能使用的最小精度是多少?
你要查看多久之前的数据?(它必须是个有限时,且提前确定好)
一旦你选择好了命令方案和回答了以上所有问题,那么你可以通过创建或修改/opt/graphite/conf/storage-schemas.conf文件来创建一个schema。
schema文件的格式通过示例最容易说明。假设我们已经写了一个脚本,这个脚本会从不同的服务器中收集系统性能数据,它的命名方案类似于:
servers.HOSTNAME.METRIC
其中HOSTNAME是服务器的主机名,METRIC是一个像 cpu_load, mem_usage, open_files的性能数据。同时假设我们想以一分钟的精度保存这些数据30天,以15分钟的精度保存10年。
下面是我们要写入到schema文件的内容:
[server_load]
priority = 100
pattern = ^servers\.
retentions = 60:43200,900:350400
简单来说,当carbon接收到一个指标数据时,Graphtie会确定这个指标数据应该保存到文件系统的哪个whisper数据文件中。如果数据文件不存在,carbon知道它必须创建一个,但是因为whisper是一个确定尺寸的数据库,在创建文件时必须确定某些参数(这就是为什么我们写入schema的原因)。Carbon查看schema文件,然后根据优先规则选择第一个匹配指标数据名称的schema。如果没有schema匹配,那么默认的schema会被启用 (每分钟一分,保存2小时) 。一旦合适的schema确定之后,carbon会使用schema中的保存配置参数创建whisper数据文件。
现在回到我们的schema内容。
server_load 表示我们的shema名称,你如何写都无所谓。
priority 是一个整数,表示优先级,使用这个数值告诉carbon如何评估schma中的顺序(由高到低)。优先级有两个作用:一个是让测试更常使用的schema更快;二是优先级提供了一种方式,通过这种方式可以为已经匹配另外一个schema的指标数据提供一个不同的保存。
pattern 参数是一个正则表达式,它用来匹配一个新的指标名称来查找它适用于哪个schema。在我们的例子中,这个模式就匹配所有以servers.开头的指标数据。
retentions 参数有点复杂,它是这样工作的:
保存配置之间以逗号相隔,每个保存配置的格式为:seconds_per_data_point:data_points_to_store。因此在我们的例子中,第一个保存配置是每个数据节点为60秒,然后存储43,200个这样的节点。 第二个保存配置是每900秒一个数据节点, 然后保存350,400 这样的点。
四、 如何产生数据?
既然已经知道了如何实施你的配置,那么你需要开始发送数据给Graphite了。推荐你看看发布的tarball包中的examples/example-client.py来获得基本的认识。你可以自行编写你的客户端,只要你能够以合适的格式发送你的数据。
五、 Graphite信息格式
所有graphite信息格式如下:
metric_path value timestamp\n
官方示例如下:
PORT=2003
SERVER=graphite.your.org
echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT};
比如使用shell script以每分钟一次的频率产生当前进程总数的数据,并将数据发送到本机的graphite,脚本运行1小时:
i=1;
while [ $i -le 60 ]
do
echo "local.system.proc_numbers `ps aux |sed 1d |wc -l` `date +%s`" |nc 127.0.0.1 2003;
sleep 60 ;
let "i=i+1";
done
其中单条数据内容(由“echo “local.system.proc_numbers `ps aux |sed 1d |wc -l` `date +%s`” |nc 127.0.0.1 2003; ”命令产生)类似如下:
local.system.proc_numbers 71 1341198181
local.system.proc_numbers 71 1341198182
local.system.proc_numbers 71 1341198183
local.system.proc_numbers 71 1341198184
local.system.proc_numbers 70 1341198185
local.system.proc_numbers 70 1341198186