16boke - 一路博客

Graphite监控后端组件Carbon详解

Graphite是由多个后端和前端组件组合而成。后端组件被用于存储数值的时间序列数据。前端组件被用于检索度量数据和可选的图像渲染,本章主要讲解carbon的使用以及如何通过客户端来访问carbon。

大概回顾一下graphite监控的各个组件:

  • statsd:负责接收数据、聚合

  • carbon:负责将数据写入whisper,自身也可收集数据

  • Whisper:数据存储

  • Graphite Web:提供前端展示和API接口服务

下图描述graphite的指标输入过程以及用户通过web界面来查看的过程,指标数据可以通过发送给statsd,再由stats将数据汇总、计算等处理之后传给carbon。也可以由用户将指标数据直接发送给carbon。

那么即然有statsd来发送数据,为什么还需要直接将数据发送给carbon呢?其中一个很重要的原因就是直接发送给carbon的时候可以带上自已的时间戳。比如在对日志文件的前二十分钟的数据进行分析后将结果发送给graphite,这个时候就需带上二十分钟之前的那个时间戳,如果使用statsd则时间为statsd发送给carbon的当前时间。

图片2.png

关于怎么安装carbon,可以参考本站:Ubuntu Server 14.04 x64安装Graphite

发布度量指标

一个度量值是任何可以随时间变化的可测量的值:

  • 每秒的请求数

  • 进程请求时间

  • CPU 利用率

一个数据点是一个元组包含:

  • 一个度量值的名字

  • 一个可度量的值

  • 在一个指定时间点(通常是一个 timestamp)

客户端应用通过发送数据点到一个 Carbon 进程来发布度量值。这个应用在 Carbon 进程的端口上建立一个TCP连接并以一个简单的纯文本格式发送数据点。在我们的例子中,端口是2003。Carbon进程监听进入的数据但是不给客户端发送任何响应。

数据点格式被定义成:

每个数据点是一个单行文本

  • 在位置 0 是一个带点的度量名称

  • 在位置 1 是一个值

  • 在位置 2 是一个 Unix Epoch 的 timestamp(10位长度)

空格作为位置的分隔符

比如,这里有一些有效的数据点:

carbon.agents.graphite-tutorial.metricsReceived 28198 1400509108
carbon.agents.graphite-tutorial.creates 8 1400509110
PRODUCTION.host.graphite-tutorial.responseTime.p95 0.10 1400509112

客户端应用有多个方式来发布度量值:

  • 使用一个纯文本协议工具比如 netcat (nc) 命令

  • 使用 pickle 协议

  • 使用高级消息队列协议(AMQP)

  • 使用 lib 包比如 Coda Hale metrics library

  • 使用udp协议来发送(注:默认carbon是不开启udp协议的监听的,需要在carbon.conf中自已打开)

为了简单起见,在这个教程中我先通过netcat 命令使用纯文本协议。为了发布以上列出的示例数据点,运行以下命令:

sudo yum install nc
echo "carbon.agents.graphite-tutorial.metricsReceived 28198 `date +%s`" | nc localhost 2003
echo "carbon.agents.graphite-tutorial.creates 8 `date +%s`" | nc localhost 2003
echo "PRODUCTION.host.graphite-tutorial.responseTime.p95 0.10 `date +%s`" | nc localhost 2003

carbon-cache 日志文件将包含关于新的被接收到的度量值的信息,信息被存储在:

# tail -f /opt/graphite/storage/log/carbon-cache/carbon-cache-a/creates.log
19/05/2014 10:42:44 :: creating database file /opt/graphite/storage/whisper/carbon/agents/graphite-tutorial/metricsReceived.wsp (archive=[(60, 129600)] xff=0.5 agg=average)
19/05/2014 10:42:53 :: creating database file /opt/graphite/storage/whisper/carbon/agents/graphite-tutorial/creates.wsp (archive=[(60, 129600)] xff=0.5 agg=average)
19/05/2014 10:42:57 :: creating database file /opt/graphite/storage/whisper/PRODUCTION/host/graphite-tutorial/responseTime/p95.wsp (archive=[(60, 1440)] xff=0.5 agg=average)

如果再次通过nc来发送指标给Carbon时,由于已经存在wsp文件,则不会生成,此时可以查看生成的wsp文件是否发生变化。

下面提供一个java版通过udp协议发送指标数据给carbon的例子:

首先要carbon支持udp协议需要修改/opt/graphite/conf/carbon.conf文件,修改ENABLE_UDP_LISTENER = True

/**
	 * 使用udp协议向carbon发送数据
	 * 注意:默认carbon是不开启udp监控的,需要修改/opt/graphite/conf/carbon.conf文件,修改ENABLE_UDP_LISTENER = True
	 * @param ip
	 * @param port
	 * @param msg
	 */
	public static void sendByUdp(String ip, int port, String msg) {
		try {
			DatagramSocket client = new DatagramSocket();
			byte[] sendBuf = new byte[1024];
			sendBuf = msg.getBytes("utf-8");
			DatagramPacket sendPacket = new DatagramPacket(sendBuf, 0, sendBuf.length, InetAddress.getByName(ip), port);
			client.send(sendPacket);
			client.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}