使用graphite和grafana进行应用程序监控

本文仅涉及报警数据存储盒展现部分,关于数据收集部分,请参阅【监控系统】使用collect进行进程监控; 关于报警服务部分,请参阅【监控系统】配合Graphite使用的报警系统

graphite+grafana 介绍

grafana,按照官方的说法是 Beautiful metric & analytic dashboards。grafana 负责数据的展示,可以配置各种不同的数据源,其中包括 graphite。

graphite 包含多个模块,这里我们使用的模块包括:

  • Whisper:固定大小的数据库,存储方式类似RRD (round-robin-database),用来存储收集到的 metrics

  • Carbon:metrics 接收服务,接收到 metrics 以后调用 Whisper 进行存储

  • graphite-api:WSGI webapp 接口服务,grafana 在需要展现数据的时候使用其提供的 REST API 进行数据的获取

本文的搭建的监控系统结构如下:

图片描述

在本文档中,我们会尽量将相关文件安装在/opt/graphite目录

准备Python 2.7 环境

对于某些默认Python环境不是2.7的系统,需要安装Python2.7。

从源码编译Python2.7

configure
make
make install

创建Python2.7的virtualenv环境

virtualenv /opt/graphite --python=/usr/local/bin/python

加载virtualenv环境

source /opt/graphite/bin/activate

安装Carbon+Whisper

pip install carbon --install-option="--prefix=/opt/graphite" --install-option="--install-lib=/opt/graphite/lib"
pip install whisper

使用默认的配置文件:

cp /opt/graphite/conf/storage-schemas.conf.example /opt/graphite/conf/storage-schemas.conf
cp /opt/graphite/conf/carbon.conf.example /opt/graphite/conf/carbon.conf

启动 Carbon

/opt/graphite/bin/carbon-cache.py start

carbon的文件目录在配置文件 /opt/graphite/conf/carbon.conf 中进行定义,下面是默认的配置:

LOCAL_DATA_DIR = /opt/graphite/storage/whisper/

安装graphite-api

yum install libffi-devel
pip install graphite-api --install-option="--prefix=/opt/graphite"

使用nginx+uwsgi的方式部署graphite-api

首先安装uwsgi

pip install uwsgi

创建graphite-api的配置文件:/opt/graphite/etc/graphite-api.yml

search_index: /opt/graphite/index
finders:
 - graphite_api.finders.whisper.WhisperFinder
functions:
 - graphite_api.functions.SeriesFunctions
 - graphite_api.functions.PieFunctions
whisper:
 directories:
 - /opt/graphite/storage/whisper
carbon:
 hosts:
 - 127.0.0.1:7002
 timeout: 1
 retry_delay: 15
 carbon_prefix: carbon
 replication_factor: 1

在这个配置文件中,whisper的数据路径配置为/opt/graphite/storage/whisper,这个是在carbon配置文件 /opt/graphite/conf/carbon.conf 中使用配置项LOCAL_DATA_DIR进行定义的。

centos中没有uwsgi的package,需要自行下载相关的启动脚本,这里使用 https://github.com/jgoldschrafe/rpm-uwsgi

wget -O /etc/init.d/uwsgi https://raw.githubusercontent.com/jgoldschrafe/rpm-uwsgi/master/SOURCES/uwsgi.init
chmod +x /etc/init.d/uwsgi

编辑文件 /etc/init.d/uwsgi 进行目录配置

uwsgi="/opt/graphite/bin/uwsgi"
prog=$(basename "$uwsgi")
UWSGI_CONF_DIR="/etc/uwsgi"
UWSGI_LOG_DIR="/var/log/uwsgi"
PIDFILE_DIR="/var/run/uwsgi"

创建文件/etc/uwsgi/graphite-api.ini

[uwsgi]
processes = 2
socket = 0.0.0.0:5000
module = graphite_api.app:app
home = /opt/graphite
env = GRAPHITE_API_CONFIG=/opt/graphite/conf/graphite-api.yml

启动uwsgi

service uwsgi start

启动以后会监听5000端口,注意这里5000端口是uwsgi协议,需要后面配置nginx进行代理。

server {
    listen 81;
    location / {
        include uwsgi_params;
        uwsgi_pass localhost:5000;
    }
}

nginx启动后可以访问洗面的链接检查数据返回是否正常

http://127.0.0.1:81/render?target=test.metric

向监控系统中写入数据

可以使用多种个方式向监控系统中写入数据,例如 dropwizard metrics。这里为了方便使用Python进行数据上报:

import socket
import time
CARBON_SERVER = 'xxx.xxx.xxx.xxx'
CARBON_PORT = 2003

for k in xrange(100000):
    sock = socket.socket()
    sock.connect((CARBON_SERVER, CARBON_PORT))
    message = "test.meter.qps %d %d\n" % (k % 10, int(time.time()))
    print message
    sock.sendall(message)
    sock.close()
    time.sleep(5)

程序运行以后可以在carbon的数据目录中会发现如下的文件结构:

test
  |-- metric.wsp
  |-- meter
  |     |-- qps.wsp

配置grafana展现metric

首先配置grafana使用graphite作为数据源

图片描述

配置数据显示:

图片描述

历史数据处理

对于监控系统,长期运行以后必然会积攒大量的历史数据,whisper 通过配置数据保存的时间段以及在时间短内每间隔多长时间保存一条数据来解决历史数据问题。

配置文件 /opt/graphite/conf/storage-schemas.conf 中描述了上述信息:

[default]
pattern = .*
retentions = 1m:30d,1h:1y

这个配置中,30天内的数据每间隔1分钟保存一条数据,30天-1年之间的数据,每个小时保存一条数据。

由于 whisper 是一个固定大小的数据库,所以当 storage-schemas.conf 设定以后,一个metrics所占的磁盘空间就已经确定了。在系统运行的周期中只要根据 metrics 的增加进行适当扩容即可。

注意:storage-schemas.conf修改以后对于已经在磁盘上进行记录的Metrics不会生效,需要删除数据重新写入或者进行数据迁移才行。

阅读 16.6k

推荐阅读
ChanningBJ
用户专栏

3 人关注
11 篇文章
专栏主页