整个系统以 Graphite (carbon + whisper) 为核心, kong 经过 statsd plugin 将服务调用信息发送至 statsd, 而 statsd 则将统计信息经过 Web API 保存至Graphite . 最终在 Grafana 中经过 Graphite Data Source 获取统计信息并输出图表到面板. php
这是网上找到的, 对 Grafana 的描述mysql
Grafana 是一个开源的指标量监测和可视化工具。经常使用于展现基础设施的时序数据和应用程序运行分析。Grafana 的 dashboard 展现很是炫酷,绝对是运维提高逼格的一大利器。
grafana 的套路基本上跟 kibana 差很少,都是根据查询条件设置聚合规则,在合适的图表上进行展现,多个图表共同组建成一个 dashboard,熟悉 kibana 的用户应该能够很是容易上手。另外 grafana 的可视化功能比 kibana 强得多,并且 4 以上版本将集成报警功能。nginx
在以前的监控中, 只能统计到 kong 的调用信息, 整个结构的复杂度高, 而实现的功能却比较简单. 搞了这么大一套鬼东西, 只能查看 kong 的监控. 虽然能经过 Zabbix Plugin 在 Grafana 中查看 zabbix 的监控数据, 可是支持度有限, zabbix 的性能也... 叔恶死 ...git
开源的时序性数据库很少, 其中比较出名的有 Graphite 跟 influxdb.github
这是维基百科上对 influxdb 的介绍正则表达式
InfluxDB 是一个由 InfluxData 开发的开源时序型数据库[note 1]。它由 Go 写成,着力于高性能地查询与存储时序型数据。InfluxDB 被普遍应用于存储系统的监控数据,IoT 行业的实时数据等场景。redis
经过了解, influxdb 相比 Graphite 有这些优点:sql
提供 telegraf 做为 agent 采集服务器信息, 并有很是丰富的插件用户采集 Nginx/Redis/PHPFPM/Elasticsearch 等的状态信息. 真正提供了采集/存储/可视化, 屌屌屌.数据库
可扩展能力 (待实践)浏览器
方便而强大的查询语言
高效存储 (待验证)
而其中, Telegraf 也提供了 Statsd Server 功能, 解决了 Statsd 官方推荐的 influxdb backend 插件只支持 influxdb 0.9 的状况 .
在这一版的监控系统中, 咱们将利用 Telegraf 或者直接提交至 Influxdb, 来采集三种信息:
在每台机器上安装 Telegraf 用于采集服务器及其安装的软件的状态和统计信息
在网关所处的机器上, 启用 Telegraf 提供的 Statsd Server 功能, 在 Kong 中, 启用 Statsd 插件, 将调用日志提交至 Statsd.
在服务中建立计划任务定时提交业务数据提交至 Influxdb
Influxdb 提供了一个 Web API 用于管理, 相似于 Mysql, Influxdb 也提供了 命令行的 Client 用于管理.
同时, 须要部署 Grafana 用于可视化面板. 部署 Chronograf 用于管理 Influxdb. Chronograf 提供了 Influxdb 的 Web Admin 功能(在 Influxdb 0.9时代是内置在 Influxdb中的), 以及比较丰富的图表功能, 可是不能跟 Grafana 比. 所以咱们只把它用来管理 Influxdb.
telegraf 内置了不少 Input Plugin
, 用途是什么呢?
回想到若是是你本身去作一个监控, 可以作到记录每分钟 CPU 的空闲率是多少, 要怎么作?
搞一个数据库, 用来放数据的
写一个脚本, 用来获取 CPU 的相关数据, 加上时间戳, 而后保存到数据库
建立一个定时任务, 一分钟运行一次脚本
写一个简单的程序, 从数据库查到数据, 而后根据时间戳, 绘制成图表.
在你的脚本里面, 你能够采集任何你采集获得的数据, 而后怼到数据库. 而 Input Plugin
就是写好了的脚本. 只须要在配置文件中开启, 就能够采集到对应的数据. telegraf 内置的 Input Plugin
有这些:
Nginx
MySQL
PHP FPM
redis
Net
Netstat
MongoDB
PostgreSQL
Zipkin
Zookeeper
Elasticsearch
Apache
Docker
...
oh shit! 我要的都有!
并且, 前面讲到, telegraf 内置了一个 Statsd Server (Service Inputs), 从而解决了 Kong 调用监控的问题. 然而这不是所有, telegraf 还提供了:
HTTP Listener
TCP Listener
UDP Listener
Webhooks Listener
shit..
这只是 Input
, Output 还支持 Graphite
, Elasticsearch
, Datadog
等等.. shit..
须要准备一台机器用于安装数据库及 UI. 安装完成后启动服务, 并在须要监控的每台机器上安装 agent. 根据须要配置好 input plugin
.
每一个 telegraf
只能提交到一个 database
. telegraf 的每一个 input
项都会有一个 host
的 tag
, 它的值默认是机器的 hostname
, 能够在 telegraf 的配置文件中修改.
根据资源编排, 以及 Grafana 的面板模板变量, 将机器与数据库的关系定位:
以每台机的 IP 做为 hostname
, 或是以 {分组名}+{组内编号}
.
一个分组一个数据库
根据分组须要开启 input plugin
固定一个台机采集全部 mysql, redis 等服务
好了, 那么开工!
cd /usr/local/src wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.2.x86_64.rpm yum localinstall influxdb-1.3.2.x86_64.rpm # 启动 /etc/init.d/influxdb start # 检查 8086 端口 curl -i 'http://127.0.0.1:8086'
cd /usr/local/src wget https://dl.influxdata.com/chronograf/releases/chronograf-1.3.6.1.x86_64.rpm yum localinstall chronograf-1.3.6.1.x86_64.rpm # 启动 /etc/init.d/chronograf start # 检查 8888 端口 curl -i 'http://127.0.0.1:8888'
若是 8888
已被占用, 须要指定端口运行
nohup chronograf --port=8889 > /dev/null 2>&1 &
cd /usr/local/src wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.4.3-1.x86_64.rpm yum localinstall grafana-4.4.3-1.x86_64.rpm # 启动 /etc/init.d/grafana-server start # 检查 3000 端口 curl -i 'http://127.0.0.1:3000'
须要在每一台机器上安装 Telegraf 做为 agent, 采集跟上报数据到 Influxdb. 包括安装 Influxdb 的机器
cd /usr/local/src wget https://dl.influxdata.com/telegraf/releases/telegraf-1.3.5-1.x86_64.rpm yum localinstall telegraf-1.3.5-1.x86_64.rpm
安装完成后, 默认配置已经有采集系统信息的了, 须要增长几项 input
若是配置的 database
不存在, 将自动建立.
[[outputs.influxdb]] urls = ["http://10.1.0.1:8086"] database = "servers_xxxx" retention_policy = "" write_consistency = "any" timeout = "5s"
须要在 nginx 上启用 status, 咱们固定使用 1200 端口.
server { listen *:1200 default_server; server_name _; location /nginx_status { stub_status on; access_log off; } }
而后修改 /etc/telegraf/telegraf.conf
[[inputs.nginx]] urls = ["http://127.0.0.1:1200/nginx_status"]
须要启用 fpm 的status
pm.status_path = /status
而后修改 /etc/telegraf/telegraf.conf
[[inputs.phpfpm]] urls = ["fcgi://127.0.0.1:7006/status"]
[[inputs.net]] interfaces = ["eth0", "eth1"]
[[inputs.netstat]]
配置完成后, 须要对配置进行测试, 完成后启动再启动
telegraf -config /etc/telegraf/telegraf.conf -test /etc/init.d/telegraf start
在 Grafana 中, 须要先配置数据源 (Data Source), 而后建立 Dashboard, 在 Dashboard 中建立 Panel 也就是各类统计组件. 最终完成一个面板的配置.
配置数据源须要注意几个地方:
type, 选择 Influxdb,
name, 固定 server_{name}
url, Influxdb 的地址
access, 固定 proxy. 此外还有 direct. 前者是经由 Grafana 所在机器代理访问 Influxdb, 后者是在浏览器直接访问 Influxdb.
database, 目标机器的 Telegraf 作配置的 database
配置完成后, 点及 Add
两次, 若是显示 test success
即为成功.
能够选择切换到手动编辑 SQL 模式.
而后保存, 这样就建立好了第一个面板了.
具体须要查看官方文档
Influxdb 使用的查询语言是一种类 SQL 的查询语言
InfluxDB’s SQL-like query language for interacting with data in InfluxDB.
Influxdb 是一种时序型的数据库, 跟关系型数据库(以 mysql 为例)的区别, 我理解就是数据库自动维护着 created_at
都有 database, 而且都须要建立才能使用
mysql 有 table, Influxdb 有 measurement, 二者的角色差很少
measurement 下有 tag, tag 下才是 field.
measurement + tag = serie
CRUD 中 Influxdb 只有 C R D
Influxdb 对正则表达式的支持. 例如 SELECT "value" FROM /kong_sms_request_status_*/
tag 跟 field 均可以用于 where 查询
Influxdb 有更丰富的聚合查询
固然, 两种类型的数据库的主要用途不一样, 对比只是用于方便上手, 并不是对比二者优劣.
> create database "demo" > show databases name: databases name ---- _internal demo > use "demo" Using database demo > insert hello,tag_alpha=2 value=3 > insert hello,tag_alpha=2 value=3 > insert hello,tag_alpha=4 value=5 > insert hello,tag_alpha=4 value=6 > show measurements; name: measurements name ---- hello > select * from hello name: hello time tag_alpha value ---- --------- ----- 1503037127485600991 3 3 1503037249575451262 2 4 1503037384953683603 4 5 1503037626342109770 4 6 > select * from hello where tag_alpha='2' name: hello time tag_alpha value ---- --------- ----- 1503037249575451262 2 4 > select * from hello where tag_alpha='4' and value=6 name: hello time tag_alpha value ---- --------- ----- 1503037626342109770 4 6
给一张公司内部署以后的面板图
RunnerLee: fastD 贡献者之一