statsd + Telegraf + influxdb + grafana 配置网站性能监控
本文默认开发环境为 CentOS
statsd
StatsD 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构。后来其他语言也开发了此功能,它收集数据时基于两大功能:Counting & Timing
StatsD 其实就是一个监听UDP(默认)或者TCP的守护程序,根据简单的协议收集statsd客户端发送来的数据,聚合之后,定时推送给后端,如graphite和influxdb等,再通过grafana等展示。
现在通常指StatsD系统,包括客户端(client)、服务器(server)和后端(backend)三部分。客户端植入于应用代码中,将相应的metrics上报给StatsD server。
为什么使用 statsd
- 协议简单外面可以非常方便的对接使用,rust也有相关的library。
- 使用UDP,速度快,client这边即使频繁发送,也不会降低系统性能。
- StatsD还支持多种backend,我们可以将StatsD收集到的信息转发到其他的系统譬如graphite,influxdb,prometheus上面。
Telegraf
监听本地UDP端口(默认8125),聚合StatsD数据后写入InfluxDB;
influxdb
是一个时间序列数据库,用于存储历史性能能检测数据;
grafana
用于展示性能采集数据。
第一步:InfluxDB安装和设置
influxDB 官方介绍
下载
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.7.x86_64.rpm
安装
sudo yum localinstall influxdb-1.3.7.x86_64.rpm
启动
systemctl start influxdb
登录 influxDB 并且创建账号和数据库
influx # 启动influx客户端
create database telegraf # 创建名为telegraf的数据库
use telegraf # 切换到telegraf库下
下面创建用户名telegraf 密码为telegraf的用户,注意用户名用双引号,密码用单引号
create user "telegraf" with password 'telegraf'
设置数据保留策略,如果不设置则采用默认策略(autogen),数据永久保存。
其目的是让InfluxDB知道哪些数据可以丢弃
CREATE RETENTION POLICY "1_year" ON telegraf DURATION 365d REPLICATION 1
ALTER RETENTION POLICY "1_year" ON telegraf DURATION 365d REPLICATION 1 default
注意:如果库已有数据,再修改数据保留策略,会出现数据丢失的假象。
若要访问旧数据,需要带旧策略名称(autogen):
select count(*) from autogen.my_measurement
或者重新将autogen设置为默认策略
ALTER RETENTION POLICY autogen ON telegraf default
第二步: Telegraf的安装和设置
Telegraf也是InfluxData公司开发的,安装方法类似
相关文献:https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/
下载安装
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.4.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.4.3-1.x86_64.rpm
配置修改
vim /etc/telegraf/telegraf.conf
修改 statsd 相关配置
[[inputs.statsd]]
protocol = "udp"
service_address = ":8125"
修改 InfluxDB 相关配置
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "telegraf"
username = "telegraf"
password = "telegraf"
启动 telegraf
systemctl start telegraf # 启动 telegraf
netstat -naup|grep 8125 # 确认端口已监听
第三步:Grafana的安装和配置
安装 Grafana
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.1-1.x86_64.rpm
sudo yum localinstall grafana-4.6.1-1.x86_64.rpm
systemctl start grafana # 启动
第四步:Python 为例发送 statsd 打点信息
代码示例
云服务器需要开启 udp 协议,入规则,8125端口
import statsd
from time import sleep, time
from random import random
STATSD_HOST = 'xx.xx.xx.xx'
client = statsd.StatsClient(host=STATSD_HOST, port= 8125, prefix='test.statsd')
def push_data_to_statsd():
service_id = 'abcd1234'
total_time = random() * 100.0
res = client.incr('service.%s.success' % service_id)
client.timing('service.%s.total_time' % service_id, total_time)
with client.timer('service.%s.calling_time' % service_id):
sleep(random())
if __name__ == '__main__':
while True:
push_data_to_statsd()
sleep(1)