输出到 Statsd

基础知识

Statsd 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构。用于接收(默认 UDP)、写入、读取和聚合时间序列数据,包括即时值和累积值等。

Graphite 是用 Python 模仿 RRDtools 写的时间序列数据库套件。包括三个部分:

  • carbon: 是一个Twisted守护进程,监听处理数据;
  • whisper: 存储时间序列的数据库;
  • webapp: 一个用 Django 框架实现的网页应用。

Graphite 安装简介

通过如下几步安装 Graphite:

  1. 安装 cairo 和 pycairo 库
  1. # yum -y install cairo pycairo
  1. pip 安装
  1. # yum install python-devel python-pip
  2. # pip install django django-tagging carbon whisper graphite-web uwsgi
  1. 配置 Graphite
  1. # cd /opt/graphite/webapp/graphite
  2. # cp local_settings.py.example local_settings.py
  3. # python manage.py syncdb

修改 local_settings.py 中的 DATABASE 为设置的 db 信息。

  1. 启动 cabon
  1. # cd /opt/graphite/conf/
  2. # cp carbon.conf.example carbon.conf
  3. # cp storage-schemas.conf.example storage-schemas.conf
  4. # cd /opt/graphite/
  5. # ./bin/carbon-cache.py start

statsd 安装简介

  1. Graphite 地址设置
  1. # cd /opt/
  2. # git clone git://github.com/etsy/statsd.git
  3. # cd /opt/statsd
  4. # cp exampleConfig.js Config.js

根据 Graphite 服务器地址,修改Config.js 中的配置如下:

  1. {
  2. graphitePort: 2003,
  3. graphiteHost: "10.10.10.124",
  4. port: 8125,
  5. backends: [ "./backends/graphite" ]
  6. }
  1. uwsgi 配置
  1. cd /opt/graphite/webapp/graphite
  2. cat > wsgi_graphite.xml <<EOF
  3. <uwsgi>
  4. <socket>0.0.0.0:8630</socket>
  5. <workers>2</workers>
  6. <processes>2</processes>
  7. <listen>100</listen>
  8. <chdir>/opt/graphite/webapp/graphite</chdir>
  9. <pythonpath>..</pythonpath>
  10. <module>wsgi</module>
  11. <pidfile>graphite.pid</pidfile>
  12. <master>true</master>
  13. <enable-threads>true</enable-threads>
  14. <logdate>true</logdate>
  15. <daemonize>/var/log/uwsgi_graphite.log</daemonize>
  16. </uwsgi>
  17. EOF
  18. cp /opt/graphite/conf/graphite.wsgi /opt/graphite/webapp/graphite/wsgi.py
  1. nginx 的 uwsgi 配置
  1. cat > /usr/local/nginx/conf/conf.d/graphite.conf <<EOF
  2. server {
  3. listen 8081;
  4. server_name graphite;
  5. access_log /opt/graphite/storage/log/webapp/access.log ;
  6. error_log /opt/graphite/storage/log/webapp/error.log ;
  7. location / {
  8. uwsgi_pass 0.0.0.0:8630;
  9. include uwsgi_params;
  10. proxy_connect_timeout 300;
  11. proxy_send_timeout 300;
  12. proxy_read_timeout 300;
  13. }
  14. }
  15. EOF
  1. 启动
  1. # uwsgi -x /opt/graphite/webapp/graphite/wsgi_graphite.xml
  2. # systemctl nginx reload
  1. 数据测试
  1. echo "test.logstash.num:100|c" | nc -w 1 -u $IP $port

如果安装配置是正常的,在graphite的左侧metrics->stats->test->logstash->num的表,statsd里面多了numStats等数据。

配置示例

  1. output {
  2. statsd {
  3. host => "statsdserver.domain.com"
  4. namespace => "logstash"
  5. sender => "%{host}"
  6. increment => ["httpd.response.%{status}"]
  7. }
  8. }

解释

Graphite 以树状结构存储监控数据,所以 statsd 也是如此。所以发送给 statsd 的数据的 key 也一定得是 “first.second.tree.four” 这样的形式。而在 logstash-output-statsd 插件中,就会以三个配置参数来拼接成这种形式:

  1. namespace.sender.metric

其中 namespace 和 sender 都是直接设置的,而 metric 又分为好几个不同的参数可以分别设置。statsd 支持的 metric 类型如下:

metric 类型

  • increment
    增量,一个计量周期内,某个数字接收了多少次,比如 nginx 的 status 状态码。

示例语法:increment => ["nginx.status.%{status}"]

  • decrement

语法同 increment。

  • count
    对数字的计数,比如,每秒接收一个数字,一个计量周期内,所有数字的和,比如nginx 的 body_bytes_sent。

示例语法:count => {"nginx.bytes" => "%{bytes}"}

  • gauge

语法同 count。

  • set

语法同 count。

  • timing
    时间范围内,某种数字的最大值,最小值,平均值,比如 nginx 的响应时间 request_time。

语法同 count。

关于这些 metric 类型的详细说明,请阅读 statsd 文档:https://github.com/etsy/statsd/blob/master/docs/metric_types.md

推荐阅读