转载自DevOps实战:Graphite监控上手指南
英文原文Getting Started with Monitoring using Graphite
英文原文Google快照
做者 Franklin Angulo , 译者 丛一 发布于 2015年3月17日html
在本文中, 我将提供一个帮助读者了解用Graphite套件建立监控系统所涉及的所有工做的指南. 前端
在本文中咱们将会谈及以下用于建立Graphite监控系统的主题:python
首先, 咱们须要可以运行Graphite套件的硬件资源. 为了简单起见, 我将使用Amazon Web Services EC2主机. 不过, 你也可使用办公室或家中已有的任何型号的计算机. git
技术规格:github
Graphite由多个后端和前端组件组成. 后端组件用于存储数值型的时间序列数据. 前端组件则用于获取指标项数据并根据状况渲染图表. 在本文中, 我首先会介绍后端组件:Carbon和Whisper. web
指标项能够被发布到一个负载均衡器或直接发布到一个Carbon线程中. Carbon线程与Whisper数据库交互, 将时间序列数据存储到文件系统中. 算法
Carbon(Git)其实是一系列守护进程, 组成一个Graphite安装的存储后端. 这些守护进程用一个名为Twisted的事件驱动网络引擎监听时间序列数据.
Twisted(TwistedMatrixLab)框架让Carbon守护进程可以以很低的开销处理大量的客户端和流量. sql
要安装Carbon, 运行以下命令便可(假设目标系统是RHEL操做系统):数据库
$ sudo yum groupinstall "Development Tools"
$ sudo yum install python-devel
$ sudo yum install git
$ sudo easy_install pip
$ sudo pip install twisted
$ cd /tmp
$ git clone https://github.com/graphite-project/carbon.git
$ cd /tmp/carbon
$ sudo python setup.py install
/opt/graphite
文件夹下将包含以下Carbon库和配置文件:django
$ ls -l /opt/graphite
drwxr-xr-x. 2 root root 4096 May 18 23:56 bin
drwxr-xr-x. 2 root root 4096 May 18 23:56 conf
drwxr-xr-x. 4 root root 4096 May 18 23:56 lib
drwxr-xr-x. 6 root root 4096 May 18 23:56 storage
在bin文件夹下, 可以找到以下三种不一样类型的Carbon守护进程:
Whisper是一个用于存储时间序列数据的数据库, 以后应用程序能够用create, update和fetch操做获取并操做这些数据.
安装Whisper, 须要运行以下命令:
$ cd /tmp
$ git clone https://github.com/graphite-project/whisper.git
$ cd /tmp/whisper
$ sudo python setup.py install
Whisper脚本如今应该已经相应的位置:
$ ls -l /usr/bin/whisper*
-rwxr-xr-x. 1 root root 1711 May 19 00:00 /usr/bin/whisper-create.py
-rwxr-xr-x. 1 root root 2902 May 19 00:00 /usr/bin/whisper-dump.py
-rwxr-xr-x. 1 root root 1779 May 19 00:00 /usr/bin/whisper-fetch.py
-rwxr-xr-x. 1 root root 1121 May 19 00:00 /usr/bin/whisper-info.py
-rwxr-xr-x. 1 root root 674 May 19 00:00 /usr/bin/whisper-merge.py
-rwxr-xr-x. 1 root root 5982 May 19 00:00 /usr/bin/whisper-resize.py
-rwxr-xr-x. 1 root root 1060 May 19 00:00 /usr/bin/whisper-set-aggregation-method.py
-rwxr-xr-x. 1 root root 969 May 19 00:00 /usr/bin/whisper-update.py
Carbon安装包中包含了关于端口号和其余多个配置参数的明确缺省值. 拷贝这些已有的示例配置文件:
$ cd /opt/graphite/conf
$ cp aggregation-rules.conf.example aggregation-rules.conf
$ cp blacklist.conf.example blacklist.conf
$ cp carbon.conf.example carbon.conf
$ cp carbon.amqp.conf.example carbon.amqp.conf
$ cp relay-rules.conf.example relay-rules.conf
$ cp rewrite-rules.conf.example rewrite-rules.conf
$ cp storage-schemas.conf.example storage-schemas.conf
$ cp storage-aggregation.conf.example storage-aggregation.conf
$ cp whitelist.conf.example whitelist.conf
$ vi carbon.conf
在cache区段下, 接收端口这一行包含一个默认值, 用于经过平文本协议(plaintext protocol )接受输入指标项(以下所示):
[cache]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003
执行以下命令, 能够启动一个carbon-cache进程:
$ cd /opt/graphite/bin
$ ./carbon-cache.py start
Starting carbon-cache (instance a)
这个进程如今应该正在监听2003端口:
$ ps -efla | grep carbon-cache
1 S root 2674 1 0 80 0 - 75916 ep_pol 00:18 ?
00:00:03 /usr/bin/python ./carbon-cache.py start
$ netstat -nap | grep 2003 tcp 0 0 0.0.0.0:2003 0.0.0.0:* LISTEN 2674/python
指标项(metric )是一种随着时间不断变化的可度量的数量, 例如:
数据点(datapoint)是包含以下信息的三元组:
客户端应用程序经过将数据点发送至Carbon进程发布指标项. 应用程序在Carbon进程所监听的端口上创建TCP链接, 而后以简单平文本格式发送数据点信息. 在本文的示例中, 这个端口号是2003. 这个TCP链接可能会一直处于打开状态并根据须要尽量屡次重复使用. Carbon进程监听输入的数据可是并不会给客户端返回任何响应.
数据点的格式定义以下:
例如, 下面是一些有效的数据点:
carbon-cache进程每分钟接收到的指标项数量
carbon.agents.graphite-tutorial.metricsReceived 28198 1400509108
carbon-cache每分钟建立的指标项数量
carbon.agents.graphite-tutorial.creates 8 1400509110
示例服务器端点每分钟的p95响应次数
PRODUCTION.host.graphite-tutorial.responseTime.p95 0.10 1400509112
客户端应用程序发布指标项的方式能够有多种:
为了简单起见, 在本文示例中我将经过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)
Carbon与Whisper交互, 将这些时间序列数据存储到文件系统中. 切换到文件系统相应的位置, 确保数据文件已经建立成功:
$ ls -l /opt/graphite/storage/whisper/carbon/agents/graphite-tutorial/
total 3040
-rw-r--r--. 1 root root 1555228 May 19 10:42 creates.wsp
-rw-r--r--. 1 root root 1555228 May 19 10:42 metricsReceived.wsp
$ ls -l /opt/graphite/storage/whisper/PRODUCTION/host/graphite-tutorial/responseTime/
total 20
-rw-r--r--. 1 root root 17308 May 19 10:42 p95.wsp
最后, 你能够用whisper-info脚本获取为这些指标项建立的Whisper文件的元数据信息.
$ whisper-info.py /opt/graphite/storage/whisper/PRODUCTION/host/graphite-tutorial/responseTime/p95.wsp
maxRetention: 86400
xFilesFactor: 0.5
aggregationMethod: average
fileSize: 17308
Archive 0
retention: 86400
secondsPerPoint: 60
points: 1440
size: 17280
offset: 28
whisper-dump是一个更完整的脚本, 能够输出全部存储保留周期内的原始数据以及Whisper文件的元数据信息.
$ whisper-dump.py /opt/graphite/storage/whisper/PRODUCTION/host/graphite-tutorial/responseTime/p95.wsp
Meta data:
aggregation method: average
max retention: 86400
xFilesFactor: 0.5
Archive 0 info:
offset: 28
seconds per point: 60
points: 1440
retention: 86400
size: 17280
Archive 0 data:
0: 1400609220, 0.1000000000000000055511151231257827
1: 0, 0
2: 0, 0
3: 0, 0
4: 0, 0
5: 0, 0
...
1437: 0, 0
1438: 0, 0
1439: 0, 0
理解聚合方法, 最大保留期, xFilesFactor和Whisper文件中的其余属性是至关重要的. 若是如今你有一点迷茫, 也不要过于担忧, 我将在接下来的章节中详细讨论这些属性.
当你或你的开发者同事和系统管理员们开始发布数据点却获得了一些意想不到的结果时, 可能会有一些困惑:
首先咱们须要理解数据是如何在Whisper文件中存储的. 当Whisper文件被建立时, 将拥有一个固定的文件尺寸, 这个尺寸永远不会再改变. 在Whisper文件中可能会包含多个用于不一样分辨率的数据点的“存储区(bucket)”, 这些存储区是在配置文件中定义的.
例如:
每一个存储区还拥有一个保留期(retention)属性用于标识该存储区中的数据点应该保留的时间长度. 例如:
根据上述两种信息, Whisper能够进行一些简单的数学计算, 计算出在每一个存储区中实际须要保存多少数据点.
若是根据这个存储模式配置建立Whisper文件, 该文件大小是56KB. 若是在这个文件上执行whisper-dump.py脚本, 会有以下输出. 须要注意的是, 一个archive对应一个存储区, 每点秒数(seconds per point )和点数(points )属性则与咱们以前的计算相匹配.
元数据:
aggregation method: average
max retention: 604800
xFilesFactor: 0.5
Archive 0 info:
offset: 52
seconds per point: 10
points: 2160
retention: 21600
size: 25920
Archive 1 info:
offset: 25972
seconds per point: 60
points: 1440
retention: 86400
size: 17280
Archive 2 info:
offset: 43252
seconds per point: 600
points: 1008
retention: 604800
size: 12096
当数据从一个较高精度的存储区移动到一个较低精度的存储区时, 聚合开始发挥做用. 让咱们之前一个示例中的存储区A和存储区B为例:
咱们可能有一个每10秒钟发布一个数据点的应用程序. 在存储区A中能够找到6小时以内发布的任何数据点. 不过, 若是我开始查询6小时以前发布的数据点, 就能够在存储区B中找到它们.
用高精度值除以低精度值, 以肯定须要聚合的数据点的数量.
l 60秒(存储区B)/10秒(存储区A)= 6个数据点须要聚合
注:Whisper须要较高精度的值可以整除较低精度的值(也就是说, 相除的结果必须是整数). 不然聚合的结果可能会不许确.
聚合数据时, Whisper从存储区A中读取6个10秒数据点, 而后将函数应用于这些数据点上, 得出一个将被存储在存储区B中的60秒数据点. 有5个聚合函数选项:average, sum, max, min和last. 聚合函数的选择取决于须要处理的数据点. 例如, 第95百分位的值可能应该用max函数聚合. 另外一方面, 对于计数器来讲, sum函数可能更合适.
在聚合数据点时, Whisper还处理了xFilesFactor的概念. xFilesFactor表示为了保证聚合准确, 一个存储区必须包含的数据点比率. 在咱们以前的示例中, Whisper肯定了它须要聚合6个10秒数据点. 因为网络问题, 应用重启等缘由, 可能只有4个数据点有数据而其余2个数据点是空值.
若是咱们的Whisper文件的xFilesFactor是0.5, 这意味着只有存在至少50%的数据点时, Whisper才会聚合数据. 若是超过50%的数据点为空时, Whisper会建立一个空值聚合. 在咱们的例子中, 即6个数据点中的4个——也就是66%. 聚合函数会被应用在非空数据点上, 建立聚合值.
你能够将xFilesFactor设置为0到1之间的任意值. 值0表示即便只有一个有效数据点, 就会执行聚合. 值1则表示只有所有的数据点都有效, 才会执行聚合.
在前一章节中, 咱们将全部的样例配置文件拷贝到了/opt/graphite/conf 文件夹中. 控制Whisper文件如何建立的配置文件以下:
存储模式(storage-schemas)配置文件由多个条目组成, 每一个条目中包含一个模式, 用于匹配指标项名称和保留期定义. 默认状况下, 包含两个条目:Carbon和所有其余.
carbon条目匹配以“carbon”字符串开头的指标项名称. 默认状况下, Carbon守护进程每60秒发布一次它们本身内部的指标项(这一间隔是能够更改的). 例如, carbon-cache进程会发布指标项, 用于标识该进程每分钟建立的指标项文件的数量. 保留期的定义则表示数据点每60秒记录一次, 并保存90天.
[carbon]
pattern = ^carbon\.
retentions = 60s:90d
所有其余条目经过指定带星号的模式捕捉所有其余与Carbon无关的指标项. 这个保留期的定义表示数据点每60秒记录一次, 并保存1天.
[default_1min_for_1day]
pattern = .*
retentions = 60s:1d
storage-aggregation配置文件也是由多个条目组成, 其中包括:
默认状况下, 包含4个条目:
[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min
[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max
[sum]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum
[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average
在测试环境下, 默认的存储模式和存储聚合函数能够很好的完成任务, 不过真正应用到生产指标项时, 可能还要修改配置文件.
首先, 我会修改Carbon条目. 我但愿Carbon每60秒记录一次指标项, 并将这些指标项保存180天(6个月). 180天以后, 我但愿可以以10分钟的精度将这些指标项归档, 再保存180天.
[carbon]
pattern = ^carbon\.
retentions = 1min:180d,10min:180d
在Squarespace, 咱们用Dropwizard框架构建RESTful的Web Service. 在准生产环境和生产环境中, 咱们运行了许多这样的服务, 全部这些服务都使用Dropwizard Metrics库以每10秒一次的速度发布应用和业务指标项. 这种10秒一次的数据我会保存3天. 3天后, 这些数据将被聚合为1分钟数据并保存180天(6个月). 最后, 6个月以后, 这些数据将被聚合为10分钟数据并再保存180天.
注:若是个人指标项库以不一样的速度发布数据点, 我就须要修改保留的定义以匹配新的速度.
[production_staging]
pattern = ^(PRODUCTION|STAGING).*
retentions = 10s:3d,1min:180d,10min:180d
而Carbon, 生产环境或准生产环境以外的指标项, 可能只是用于测试. 我会将这些数据保存1天而且假设他们会每1分钟发布一次.
[default_1min_for_1day]
pattern = .*
retentions = 60s:1d
我会保留默认的存储聚合条目, 不过会增长几条新的条目用于以ratio, m1_rate和p95结尾的指标项.
注:新增的条目须要添加到default条目以前.
[ratio]
pattern = \.ratio$
xFilesFactor = 0.1
aggregationMethod = average
[m1_rate]
pattern = \.m1_rate$
xFilesFactor = 0.1
aggregationMethod = sum
[p95]
pattern = \.p95$
xFilesFactor = 0.1
aggregationMethod = max
目前为止, 你已经完成了Graphite后端的配置以匹配应用程序发布数据点的速率而且已经彻底理解数据点是如何在文件系统中存储的. 接下来的一章, 咱们将尝试用graphite-webapp将这些数据可视化.
如今, 后端组件已经成功启动并运行, 而且可以用咱们指定的格式存储数值型的时间序列数据, 接下来咱们将了解Graphite的前端组件. 具体说来, 咱们须要查询并可视化已存储的信息的途径.
据其Github描述文件所介绍, Graphite Web应用程序是一个运行在Apache/mod_wsgi下的Django应用程序. 通常来讲, 可以提供以下功能:
graphite-web的安装真的能够称得上是一个迷阵. 我已经屡次尝试安装graphite-web——在RHEL, CentOS, Ubuntu和Mac OS X上——而每一次的安装步骤都是有不一样的. 你能够把它当成一场游戏, 享受这个过程, 当全部必需的依赖都成功安装完成后, 你就知道你已经完成了这个迷阵.
RHEL 6.5安装指南:
$ cd /tmp
$ git clone https://github.com/graphite-project/graphite-web.git
$ cd /tmp/graphite-web
$ python check-dependencies.py
[REQUIRED] Unable to import the 'django' module, do you have Django installed for python 2.6.6?
[REQUIRED] Unable to import the 'pyparsing' module, do you have pyparsing module installed for python 2.6.6?
[REQUIRED] Unable to import the 'tagging' module, do you have django-tagging installed for python 2.6.6?
[OPTIONAL] Unable to import the 'memcache' module, do you have python-memcached installed for python 2.6.6? This feature is not required but greatly improves performance.
[OPTIONAL] Unable to import the 'txamqp' module, this is required if you want to use AMQP as an input to Carbon. Note that txamqp requires python 2.5 or greater.
[OPTIONAL] Unable to import the 'python-rrdtool' module, this is required for reading RRD.
3 optional dependencies not met. Please consider the optional items before proceeding.
3 necessary dependencies not met. Graphite will not function until these dependencies are fulfilled.
目标是保证至少全部必需的依赖都安装成功. 若是计划使用AMQ功能或Memcache的缓存功能, 就还须要安装可选依赖.
$ sudo yum install cairo-devel
$ sudo yum install pycairo-devel
$ sudo pip install django
$ sudo pip install pyparsing
$ sudo pip install django-tagging
$ sudo pip install python-memcached
$ sudo pip install txamqp
$ sudo pip install pytz
$ cd /tmp/graphite-web
$ python check-dependencies.py
[OPTIONAL] Unable to import the 'python-rrdtool' module, this is required for reading RRD.
1 optional dependencies not met. Please consider the optional items before proceeding.
All necessary dependencies are met.
我已经安装了不少包, 知足必需依赖的要求后, 就能够开始安装graphite-web:
$ cd /tmp/graphite-web
$ sudo python setup.py install
$ ls -l /opt/graphite/webapp/
total 12
drwxr-xr-x. 6 root root 4096 May 23 14:33 content
drwxr-xr-x. 15 root root 4096 May 23 14:33 graphite
-rw-r--r--. 1 root root 280 May 23 14:33 graphite_web-0.10.0_alpha-py2.6.egg-info
安装脚本会将web应用文件移动到/opt/graphite/webapp文件夹下适当的位置.
web应用程序维护了一个内部数据库用于保存用户信息和仪表盘. 运行以下命令初始化该数据库:
$ cd /opt/graphite
$ export PYTHONPATH=$PYTHONPATH:`pwd`/webapp
$ django-admin.py syncdb --settings=graphite.settings
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): feangulo
Email address: feangulo@yaipan.com
Password:
Password (again):
Error: Blank passwords aren't allowed. Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)
上述命令将建立一个新的数据库并将其保存在/opt/graphite/storage文件夹下:
$ ls -l /opt/graphite/storage/graphite.db
-rw-r--r--. 1 root root 74752 May 23 14:46 /opt/graphite/storage/graphite.db
包含graphite-webapp设置的配置文件位于/opt/graphite/webapp/graphit文件夹下. 将样例配置文件拷贝到该文件夹下:
$ vi /opt/graphite/webapp/graphite/local_settings.py
#########################
$ General Configuration $
#########################
TIME_ZONE = 'UTC'
#########################
$ Database Configuration $
#########################
DATABASES = {
'default': {
'NAME': '/opt/graphite/storage/graphite.db',
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': ''
}
}
到如今为止, 若是你遵循前述章节的指令, 如今只会有一个运行在2003端口上的carbon-cache进程和一个7002查询端口. 这些是默认状况下graphite-webapp所需的端口. 所以, 配置文件无需任何修改.
$ ps -efla | grep carbon-cache
1 S root 14101 1 0 80 0 - 75955 ep_pol May20 ? 00:00:26 /usr/bin/python ./carbon-cache.py start
$ netstat -nap | grep 2003
tcp 0 0 0.0.0.0:2003 0.0.0.0:* LISTEN 14101/python
$ netstat -nap | grep 7002
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 14101/python
不过, 你也能够在设置文件中显式指定从哪一个carbon-cache进程读取数据:
$ vi /opt/graphite/webapp/graphite/local_settings.py
#########################
$ Cluster Configuration $
#########################
CARBONLINK_HOSTS = ["127.0.0.1:7002:a"]
上述代码的含义是我有一个本地运行的名为‘a’的carbon-cache进程, 其查询端口设置为7002. 查看Carbon配置文件, 将会看到以下配置:
$ vi /opt/graphite/conf/carbon.conf
[cache]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003
CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7002
注:‘a’ 是从何而来的呢?是默认分配的名字. 若是要定义更多缓存, 须要在配置文件中建立新的命名区块.
[cache:b]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2004
CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7003
Graphite Web应用中包含默认的仪表盘和图表模版. 拷贝样例配置文件:
$ cd /opt/graphite/conf
$ cp dashboard.conf.example dashboard.conf
$ cp graphTemplates.conf.example graphTemplates.conf
我对仪表盘配置文件做了一些修改, 让图表展现区块更大.
$ vi /opt/graphite/conf/dashboard.conf
[ui]
default_graph_width = 500
default_graph_height = 400
automatic_variants = true
refresh_interval = 60
autocomplete_delay = 375
merge_hover_delay = 750
我对默认的图表模版也作了一些修改, 让它有一个黑色背景和白色前景. 另外我还把字体调小了一些.
$ vi /opt/graphite/conf/graphTemplates.conf
[default]
background = black
foreground = white
minorLine = grey
majorLine = rose
lineColors = blue,green,red,purple,brown,yellow,aqua,grey,magenta,pink,gold,rose
fontName = Sans
fontSize = 9
fontBold = False
fontItalic = False
终于, 一切准备就绪, 能够运行Web应用程序了. 我会在8085端口运行这个Web应用, 你能够随意设置这个端口号. 运行以下命令:
$ cd /opt/graphite
$ PYTHONPATH=`pwd`/storage/whisper ./bin/run-graphite-devel-server.py --port=8085 --libs=`pwd`/webapp /opt/graphite 1>/opt/graphite/storage/log/webapp/process.log 2>&1 &
$ tail -f /opt/graphite/storage/log/webapp/process.log
打开一个Web浏览器并输入以下地址http://your-ip:8085. 确保Graphite Web应用可以正常加载. 用tail命令查看process.log文件的输出, 应该能够看到资源的加载和来自于web应用的查询.
在上一章中, 咱们用netcat命令将几个指标项发布到carbon-cache进程中. 具体以下:
“`
carbon.agents.graphite-tutorial.metricsReceived
carbon.agents.graphite-tutorial.creates
PRODUCTION.host.graphite-tutorial.responseTime.p95
Web应用程序以树状结构展现这些指标项. 若是在左侧面板中操做指标树, 就能够看到所有的指标项.
点击任意一个指标项, 右边的面板上将绘制出这个指标项的图表(默认状况下是过去24小时的数据). 能够经过面板中图表上方的按钮修改查询的日期范围.
(点击图片查看大图)
默认的视图适于快速浏览指标项并将其可视化. 不过若是想构建一个仪表盘, 能够将浏览器地址指向http://your-ip:8085/dashboard. 该页面的顶栏是另一种方式的指标项导航. 能够用点击选项的方式导航, 也能够直接输入文本获取建议. 点击某个指标项在底部区域将出现相应的图表区块. 继续点击新的指标项, 下方的面板中将会显示新增的图块, 从而建立一个仪表盘. 有时你可能想要在一个图表中展现多个指标项. 要实现这个功能, 将一个图块拖拽到另外一个图块上方, 多个指标项就会绘制在同一张图表上. 经过图块的拖拽, 也能够改变其在布局中的位置.
(点击图片查看大图)
用户界面看起来十分简单, 不过不要感到灰心. 你仍然能够在指标项数据上完成强大的操做. 点击某个图表区块, 会弹出一个对话框. 对话框中展现了正在绘制的指标项列表, 你能够直接编辑这些指标项. 对话框中还有多个菜单, 用于在数据上应用函数, 修改可视化界面的外观以及其余许多操做.
此外, 还能够用最顶端的菜单保存仪表盘, 加载其余仪表盘, 修改当前仪表盘的日期范围, 分享仪表盘以及其余一些功能. 目前为止我最喜欢的功能是Dashboard -> Edit Dashboard. 当我须要建立或修改仪表盘时, 这个功能节省了我许多时间.
(点击图片查看大图)
为了举例说明这一功能, 我将构建一个用于监控carbon-cache进程的仪表盘. 前一章中曾经提到过, Carbon进程会记录内部指标项. 相比于手工构建仪表盘, 我更喜欢用Edit Dashboard这一功能.
在Edit Dashboard窗口中输入以下代码, 便可构建用于监控carbon-cache进程的仪表盘.
注:该仪表盘会监控全部正在运行的carbon-cache进程. 注意在指标项名称中星号(*)的使用会匹配全部以carbon.agents为前缀的值.
[
{
“target”: [
“aliasByNode(carbon.agents.*.metricsReceived,2)”
],
“title”: “Carbon Caches - Metrics Received”
},
{
“target”: [
“aliasByNode(carbon.agents.*.creates,2)”
],
“title”: “Carbon Caches - Create Operations”
},
{
“target”: [
“aliasByNode(carbon.agents.*.cpuUsage,2)”
],
“title”: “Carbon Caches - CPU Usage”
},
{
“target”: [
“aliasByNode(carbon.agents.*.memUsage,2)”
],
“title”: “Carbon Caches - Memory Usage”
}
]
更新仪表盘的定义会看到以下界面:
(点击图片查看大图)
修改Edit Dashboard对话框中的内容会更新浏览器中的仪表盘. 不过这些修改并无保存到Graphite的内部仪表盘数据库中. 继续并保存该仪表盘, 以即可以分享并再次打开它.
若是要查找仪表盘, 打开发现器(Finder):
在Graphite的生产安装环境中, Graphite Caches仪表盘的外观界面更相似下图:
与其余工具同样, Graphite也有一些缺点:例如扩展性不是很好, 存储机制并不是最优——可是Graphite的API是至关漂亮的. 有用户界面的感受很不错, 不过最重要的是经过UI能够完成的工做, 彻底均可以经过graphite-web API请求来完成. 用户能够经过构造一个简单的URL来请求定制化图表. 在HTTP GET请求的查询串中指定参数. 默认状况下, 请求响应会返回一个PNG图片, 不过用户也能够指明所需返回的格式——如, JSON数据.
样例请求$1:
样例请求$2:
Graphite API支持多种显示选项以及遵循简单的函数式语法的数据操做函数. 考虑到复杂的表达式和计算过程, 函数能够嵌套. 查看在线文档以详细了解所有可用的函数:
假设我有一个运行在上百台服务器上的应用, 每一个服务器每10秒钟发布一次各自的p95响应时间. 利用API中所提供的函数, 我能够对指标项进行加工并构建一个信息化图表:
咱们想要看一下所有p95时延的平均值
时延是以毫秒为单位记录的, 咱们想要以秒为单位展现.
做为指标项查询的一部分传递给API的函数参数以下:
恭喜!咱们已经完成了Carbon, Whisper和graphite-webapp的安装和配置, 指标项的发布和导航以及仪表盘的构建. 如今你能够为你的业务和应用指标项构建漂亮的仪表盘.
本文是关于Graphite的一篇入门级文章. 关于更高级的主题请参考:
Carbon Cache压力测试
Carbon聚合器
基于ELK组件的Graphite查询统计
关于做者
Franklin Angulo在Squarespace的负责管理构建和维护大型核心后端引擎的团队, Squarespace是一家位于纽约市的网站构建平台. Franklin是一名在带领复杂的跨领域的大型工程项目方面有丰富经验的专业人士. 在加入Squarespace以前他曾经是亚马逊的一名资深软件开发工程师, 主要负责全球进货物流和亚马逊储物柜计划的路由规划调优, 运率购买和容量规划算法.
查看英文原文: Getting Started with Monitoring using Graphite
Q : graphite数据接收和存储正常,可是dashboard中不能正常显示图像.
A : 多是由于graphite.wsgi被vi了,从新拷贝一份覆盖掉原来的就行.
Q :
A :