分享一下微服务监控软件以及其部署

最近在寻找有利的监控软件为我的微服务献身,于是乎整理文档,试验,花了很长时间。今天分享一下整理的部分工具,有时间会继续在此post中更新的!🙃

想要解锁更多新姿势?请访问我的博客

influxDB

什么是influxDB

influxDB是一个分布式时间序列数据库。cAdvisor仅仅显示实时信息,但是不存储监视数据。因此,我们需要提供时序数据库用于存储cAdvisor组件所提供的监控信息,以便显示除实时信息之外的时序数据。

influxDB安装

(1)下载镜像

1
docker pull tutum/influxdb

(2)创建容器

1
2
3
4
5
6
7
docker run ‐di \
‐p 8083:8083 \
‐p 8086:8086 \
‐‐expose 8090 \
‐‐expose 8099 \
‐‐name influxsrv \
tutum/influxdb

端口概述: 8083端口:web访问端口 8086:数据写入端口
打开浏览器 http://192.168.184.135:8083/ (ip自觉替换)

influxDB常用操作

创建数据库

1
CREATE DATABASE "cadvisor"

回车创建数据库

1
SHOW DATABASES

查看数据库

创建用户并授权

创建用户

1
CREATE USER "cadvisor" WITH PASSWORD 'cadvisor' WITH ALL PRIVILEGES

查看用户

1
SHOW USRES

用户授权

1
2
3
grant all privileges on cadvisor to cadvisor
grant WRITE on cadvisor to cadvisor
grant READ on cadvisor to cadvisor

查看采集的数据

切换到cadvisor数据库,使用以下命令查看采集的数据

1
SHOW MEASUREMENTS

如果想采集系统的数据,我们需要使用Cadvisor软件来实现

More

官方文档 : https://github.com/influxdata/docs.influxdata.com

cAdvisor

啥么是cAdvisor

Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机。

cAdvisor安装

(1)下载镜像
docker pull google/cadvisor
(2)创建容器

1
2
3
4
5
docker run ‐‐volume=/:/rootfs:ro ‐‐volume=/var/run:/var/run:rw ‐‐
volume=/sys:/sys:ro ‐‐volume=/var/lib/docker/:/var/lib/docker:ro ‐‐
publish=8080:8080 ‐‐detach=true ‐‐link influxsrv:influxsrv ‐‐name=cadvisor
google/cadvisor ‐storage_driver=influxdb ‐storage_driver_db=cadvisor ‐
storage_driver_host=influxsrv:8086

WEB前端访问地址
http://192.168.184.135:8080/containers/ (请自觉替换实际ip)
性能指标含义参照如下地址
https://blog.csdn.net/ZHANG_H_A/article/details/53097084
再次查看influxDB,发现已经有很多数据被采集进去了。

Grafana

Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。

Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。

Grafana安装

(1)下载镜像
docker pull grafana/grafana
(2)创建容器

1
2
3
4
docker run ‐d ‐p 3001:3000 ‐e INFLUXDB_HOST=influxsrv ‐e
INFLUXDB_PORT=8086 ‐e INFLUXDB_NAME=cadvisor ‐e INFLUXDB_USER=cadvisor ‐e
INFLUXDB_PASS=cadvisor ‐‐link influxsrv:influxsrv ‐‐name grafana
grafana/grafana

注意,INFLUXDB配置请与上文我的写的配置相同。
(3)访问
http://192.168.184.135:3001 (自觉更换ip)
用户名密码均为admin

使用

//TODO

pinpoint

是啥

pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响最小(只增加约3%资源利用率),安装agent是无侵入式的,只需要在被测试的Tomcat中加上3句话,打下探针,就可以监控整套程序了。

所需软件

1
2
3
4
5
6
7
hbase-1.2.6-bin.tar.gz
pinpoint-1.6.2.zip pinpoint源码,使用hbase-create.hbase脚本初始化
hbase
pinpoint-collector-1.6.2.war collector模块,使用tomcat进行部署
pinpoint-web-1.6.2.war web管控台,使用tomcat进行部署
pinpoint-agent-1.6.2.tar.gz 不需要部署,在被监控应用一端
apache-tomcat-8.5.15.zip

准备两个tomcat环境,一个部署pinpoint-collector-1.6.2.war,另一个部署pinpoint-web-1.6.2.war

安装hbase

环境配置

解压hbase-1.2.6-bin.tar.gz,修改hbase/conf/hbase-site.xml文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///pinpoint/data/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/pinpoint/data/zookeeper</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>60020</value>
</property>
</configuration>

修改hbase/conf/hbase-env.sh文件,设置JAVA_HOME环境变量
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

启动hbase

hbase/bin/start-hbase.sh

执行jps查看是否有HMaster进程

访问 http://127.0.0.1:16010/master-status 查看hbase web管控台
导入hbase初始化脚步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
hbase/bin/hbase shell /pinpoint-1.6.2/hbase/scripts/hbase-create.hbase
.
.
.
0 row(s) in 1.4160 seconds
0 row(s) in 1.2420 seconds
0 row(s) in 2.2410 seconds
0 row(s) in 1.2400 seconds
0 row(s) in 1.2450 seconds
0 row(s) in 1.2420 seconds
0 row(s) in 1.2360 seconds
0 row(s) in 1.2400 seconds
0 row(s) in 1.2370 seconds
0 row(s) in 2.2450 seconds
0 row(s) in 4.2480 seconds
0 row(s) in 1.2310 seconds
0 row(s) in 1.2430 seconds
0 row(s) in 1.2390 seconds
0 row(s) in 1.2440 seconds
0 row(s) in 1.2440 seconds
TABLE
AgentEvent
AgentInfo
AgentLifeCycle
AgentStat
AgentStatV2
ApiMetaData
ApplicationIndex
ApplicationMapStatisticsCallee_Ver2
ApplicationMapStatisticsCaller_Ver2
ApplicationMapStatisticsSelf_Ver2
ApplicationTraceIndex
HostApplicationMap_Ver2
SqlMetaData_Ver2
StringMetaData
TraceV2
Traces
16 row(s) in 0.0190 seconds

进入hbase shell

1
2
3
4
5
hbase/bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
hbase(main):001:0>

输入status ‘detailed’查看刚才初始化的表,是否存在

1
hbase(main):001:0> status 'detailed'

访问 http://127.0.0.1:16010/master-status 查看hbase web管控台

部署collector

解压apache-tomcat-8.5.15.zip并重命名为collector
拷贝pinpoint-collector-1.6.2.war到collector\webapps\目录下并重命名为ROOT.war
涉及到两个配置文件

  • hbase.properties
    由于使用的为hbase自带的zookeeper即hbase和zookeeper在同一台机器上,则不需要修改collector/webapps/ROOT/WEB-INF/classes/hbase.properties文件
  • pinpoint-collector.properties
    注意观察该配置文件中中的三个端口9994、9995、9996 默认不需要修改,其中9994为collector监听的tcp端口,9995为collector监听的udp端口

执行collector/bin/startup.sh启动collector
部署web管控台
解压apache-tomcat-8.5.15.zip并重命名为web
拷贝pinpoint-web-1.6.2.war到web\webapps\目录下并重命名为ROOT.war
同样留意web/webapps/ROOT/WEB-INF/classes/hbase.properties中的配置,若与hbase在同一台机器则不需要修改
执行web/bin/startup.sh启动web管控台(注意修改tomcat端口号,防止冲突,这里修改端口为8088)
浏览器访问 http://127.0.0.1:8088/ 查看pinpoint管控台

监控spring boot应用

这里有一个spring-boot-example.jar的应用,现在要使用pinpoint来对其监控跟踪。操作很简单,分两步
解压pinpoint-agent-1.6.2.tar.gz并对其进行配置

1
tar zxvf pinpoint-agent-1.6.2.tar.gz -C pinpoint-agent

修改pinpoint-agent/pinpoint.config中的配置与collector服务一致。此处因为pinpoint-agent与collector在同
一台机器,因此默认配置即可不需要修改。
为spring-boot应用配置pinpoint-agent
启动spring-boot应用时添加如下参数

1
2
3
-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
-Dpinpoint.agentId
-Dpinpoint.applicationName

本例中的启动参数为

1
java -javaagent:/pinpoint-agent/pinpoint-bootstrap-1.6.2.jar -Dpinpoint.agentId=spring-boot-app -Dpinpoint.applicationName=spring-boot-app -jar spring-boot-docker-example-1.0.jar

访问 http://127.0.0.1:8088/ ,第一次访问可能没有数据,可以先访问下应用,然后在刷新pinpoint管控台即可

more

https://www.cnblogs.com/yyhh/p/6106472.html

Open-Falcon

Open-Falcon,小米家的开源监控系统。

特点

1、强大灵活的数据采集:自动发现,支持falcon-agent、snmp、支持用户主动push、用户自定义插件支持、opentsdb data model like(timestamp、endpoint、metric、key-value tags)

2、水平扩展能力:支持每个周期上亿次的数据采集、告警判定、历史数据存储和查询

3、高效率的告警策略管理:高效的portal、支持策略模板、模板继承和覆盖、多种告警方式、支持callback调用

4、人性化的告警设置:最大告警次数、告警级别、告警恢复通知、告警暂停、不同时段不同阈值、支持维护周期

5、高效率的graph组件:单机支撑200万metric的上报、归档、存储(周期为1分钟)

6、高效的历史数据query组件:采用rrdtool的数据归档策略,秒级返回上百个metric一年的历史数据

7、dashboard:多维度的数据展示,用户自定义Screen

8、高可用:整个系统无核心单点,易运维,易部署,可水平扩展

9、开发语言: 整个系统的后端,全部golang编写,portal和dashboard使用python编写。

社区和文档支持

http://book.open-falcon.org/zh/index.html

环境准备

安装redis

yum安装

1
yum install -y redis

修改配置redis.conf

1
vi /etc/redis.conf

启动redis:redis-server &

安装mysql

1
yum install -y mysql-server

启动mysql:service mysqld start
查看mysql状态:service mysqld status

初始化mysql数据库表

数据默认没有设置密码,执行的时候出现输入密码,直接回车。

1
2
3
4
5
6
7
8
cd /tmp/ && git clone https://github.com/open-falcon/falcon-plus.git 
cd /tmp/falcon-plus/scripts/mysql/db_schema/
mysql -h 127.0.0.1 -u root -p < 1_uic-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 2_portal-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 3_dashboard-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 4_graph-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql
rm -rf /tmp/falcon-plus/

设置mysql的root用户密码:
mysql –u root
查看mysql用户和密码
select user,host,password from mysql.user;

发现查询密码都是空,然后开始设置root的密码为bigdata

1
mysql> set password for root@localhost=password('bigdata');

退出:mysql>exit

下载编译后的二进制包

1
2
cd /data/program/software
wget https://github.com/open-falcon/falcon-plus/releases/download/v0.2.1/open-falcon-v0.2.1.tar.gz

后端安装

创建工作目录

1
2
3
export FALCON_HOME=/home/work
export WORKSPACE=$FALCON_HOME/open-falcon
mkdir -p $WORKSPACE

解压二进制包

1
2
cd /data/program/software
tar -xzvf open-falcon-v0.2.1.tar.gz -C $WORKSPACE

配置数据库账号和密码

1
2
cd $WORKSPACE
grep -Ilr 3306 ./ | xargs -n1 -- sed -i 's/root:/root:bigdata/g'

注意root:后面默认密码为空.

启动

查看目录下包括Open-Falcon的所有组件

1
2
cd $WORKSPACE
./open-falcon start

检查所有模块的启动状况
./open-falcon check

更多命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
./open-falcon [start|stop|restart|check|monitor|reload] module
./open-falcon start agent

./open-falcon check
falcon-graph UP 53007
falcon-hbs UP 53014
falcon-judge UP 53020
falcon-transfer UP 53026
falcon-nodata UP 53032
falcon-aggregator UP 53038
falcon-agent UP 53044
falcon-gateway UP 53050
falcon-api UP 53056
falcon-alarm UP 53063

For debugging , You can check $WorkDir/$moduleName/log/logs/xxx.log

前端安装

创建工作目录

这一步在创建后端服务的时候已经建立好,所以不需要再进行操作。

1
2
3
4
export HOME=/home/work
export WORKSPACE=$HOME/open-falcon
mkdir -p $WORKSPACE
cd $WORKSPACE

克隆前端组件代码

1
2
cd $WORKSPACE
git clone https://github.com/open-falcon/dashboard.git

安装依赖包

1
2
3
4
5
yum install -y python-virtualenv
yum install -y python-devel
yum install -y openldap-devel
yum install -y mysql-devel
yum groupinstall "Development tools"
1
2
cd $WORKSPACE/dashboard/
virtualenv ./env
1
./env/bin/pip install -r pip_requirements.txt -i https://pypi.douban.com/simple

注意:如果执行上面有问题,就直接执行./env/bin/pip install -r pip_requirements.txt

修改配置

dashboard的配置文件为: ‘rrd/config.py’,请根据实际情况修改

1
2
3
4
## API_ADDR 表示后端api组件的地址
API_ADDR = "http://127.0.0.1:8080/api/v1"
## 根据实际情况,修改PORTAL_DB_*, 默认用户名为root,默认密码为""
## 根据实际情况,修改ALARM_DB_*, 默认用户名为root,默认密码为""

启动

1
bash control start

open http://127.0.0.1:8081 in your browser.

停止bash control stop

安装-Agent

介绍

agent用于采集机器负载监控指标,比如cpu.idle、load.1min、disk.io.util等等,每隔60秒push给Transfer。agent与Transfer建立了长连接,数据发送速度比较快,agent提供了一个http接口/v1/push用于接收用户手工push的一些数据,然后通过长连接迅速转发给Transfer。

部署

agent需要部署到所有要被监控的机器上,比如公司有10万台机器,那就要部署10万个agent。agent本身资源消耗很少,不用担心。
首先找到之前后端服务的解压目录:
/home/work/open-falcon/
拷贝agent到需要监控的服务器上面
scp -r agent/ root@dst1:/home/work/open-falcon
拷贝open-falcon到需要监控的服务器上面
scp -r open-falcon root@dst1:/home/work/open-falcon
修改配置文件:
配置文件必须叫cfg.json,如下参照修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"debug": true, # 控制一些debug信息的输出,生产环境通常设置为false
"hostname": "", # agent采集了数据发给transfer,endpoint就设置为了hostname,默认通过`hostname`获取,如果配置中配置了hostname,就用配置中的
"ip": "", # agent与hbs心跳的时候会把自己的ip地址发给hbs,agent会自动探测本机ip,如果不想让agent自动探测,可以手工修改该配置
"plugin": {
"enabled": false, # 默认不开启插件机制
"dir": "./plugin", # 把放置插件脚本的git repo clone到这个目录
"git": "https://github.com/open-falcon/plugin.git", # 放置插件脚本的git repo地址
"logs": "./logs" # 插件执行的log,如果插件执行有问题,可以去这个目录看log
},
"heartbeat": {
"enabled": true, # 此处enabled要设置为true
"addr": "127.0.0.1:6030", # hbs的地址,端口是hbs的rpc端口
"interval": 60, # 心跳周期,单位是秒
"timeout": 1000 # 连接hbs的超时时间,单位是毫秒
},
"transfer": {
"enabled": true,
"addrs": [
"127.0.0.1:18433"
], # transfer的地址,端口是transfer的rpc端口, 可以支持写多个transfer的地址,agent会保证HA
"interval": 60, # 采集周期,单位是秒,即agent一分钟采集一次数据发给transfer
"timeout": 1000 # 连接transfer的超时时间,单位是毫秒
},
"http": {
"enabled": true, # 是否要监听http端口
"listen": ":1988",
"backdoor": false
},
"collector": {
"ifacePrefix": ["eth", "em"], # 默认配置只会采集网卡名称前缀是eth、em的网卡流量,配置为空就会采集所有的,lo的也会采集。可以从/proc/net/dev看到各个网卡的流量信息
"mountPoint": []
},
"default_tags": {
},
"ignore": { # 默认采集了200多个metric,可以通过ignore设置为不采集
"cpu.busy": true,
"df.bytes.free": true,
"df.bytes.total": true,
"df.bytes.used": true,
"df.bytes.used.percent": true,
"df.inodes.total": true,
"df.inodes.free": true,
"df.inodes.used": true,
"df.inodes.used.percent": true,
"mem.memtotal": true,
"mem.memused": true,
"mem.memused.percent": true,
"mem.memfree": true,
"mem.swaptotal": true,
"mem.swapused": true,
"mem.swapfree": true
}
}

启动

./open-falcon start agent 启动进程
./open-falcon stop agent 停止进程
./open-falcon monitor agent 查看日志
看var目录下的log是否正常,或者浏览器访问其1988端口。另外agent提供了一个–check参数,可以检查agent是否可以正常跑在当前机器上
./falcon-agent --check可进入监控界面查看

安装数据转发服务-Transfer

简介

transfer是数据转发服务。它接收agent上报的数据,然后按照哈希规则进行数据分片、并将分片后的数据分别push给graph&judge等组件。

服务部署

服务部署,包括配置修改、启动服务、检验服务、停止服务等。这之前,需要将安装包解压到服务的部署目录下。

1
2
# 修改配置, 配置项含义见下文
vim cfg.json

1
2
# 启动服务
./open-falcon start transfer
1
2
# 校验服务,这里假定服务开启了6060的http监听端口。检验结果为ok表明服务正常启动。
curl -s "127.0.0.1:6060/health"
1
2
# 停止服务
./open-falcon stop transfer
1
2
# 查看日志
./open-falcon monitor transfer

配置说明

配置文件默认为./cfg.json
debug: true/false, 如果为true,日志中会打印debug信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
minStep: 30, 允许上报的数据最小间隔,默认为30秒

http
- enabled: true/false, 表示是否开启该http端口,该端口为控制端口,主要用来对transfer发送控制命令、统计命令、debug命令等
- listen: 表示监听的http端口

rpc
- enabled: true/false, 表示是否开启该jsonrpc数据接收端口, Agent发送数据使用的就是该端口
- listen: 表示监听的http端口

socket #即将被废弃,请避免使用
- enabled: true/false, 表示是否开启该telnet方式的数据接收端口,这是为了方便用户一行行的发送数据给transfer
- listen: 表示监听的http端口

judge
- enabled: true/false, 表示是否开启向judge发送数据
- batch: 数据转发的批量大小,可以加快发送速度,建议保持默认值
- connTimeout: 单位是毫秒,与后端建立连接的超时时间,可以根据网络质量微调,建议保持默认
- callTimeout: 单位是毫秒,发送数据给后端的超时时间,可以根据网络质量微调,建议保持默认
- pingMethod: 后端提供的ping接口,用来探测连接是否可用,必须保持默认
- maxConns: 连接池相关配置,最大连接数,建议保持默认
- maxIdle: 连接池相关配置,最大空闲连接数,建议保持默认
- replicas: 这是一致性hash算法需要的节点副本数量,建议不要变更,保持默认即可
- cluster: key-value形式的字典,表示后端的judge列表,其中key代表后端judge名字,value代表的是具体的ip:port

graph
- enabled: true/false, 表示是否开启向graph发送数据
- batch: 数据转发的批量大小,可以加快发送速度,建议保持默认值
- connTimeout: 单位是毫秒,与后端建立连接的超时时间,可以根据网络质量微调,建议保持默认
- callTimeout: 单位是毫秒,发送数据给后端的超时时间,可以根据网络质量微调,建议保持默认
- pingMethod: 后端提供的ping接口,用来探测连接是否可用,必须保持默认
- maxConns: 连接池相关配置,最大连接数,建议保持默认
- maxIdle: 连接池相关配置,最大空闲连接数,建议保持默认
- replicas: 这是一致性hash算法需要的节点副本数量,建议不要变更,保持默认即可
- cluster: key-value形式的字典,表示后端的graph列表,其中key代表后端graph名字,value代表的是具体的ip:port(多个地址用逗号隔开, transfer会将同一份数据发送至各个地址,利用这个特性可以实现数据的多重备份)

tsdb
- enabled: true/false, 表示是否开启向open tsdb发送数据
- batch: 数据转发的批量大小,可以加快发送速度
- connTimeout: 单位是毫秒,与后端建立连接的超时时间,可以根据网络质量微调,建议保持默认
- callTimeout: 单位是毫秒,发送数据给后端的超时时间,可以根据网络质量微调,建议保持默认
- maxConns: 连接池相关配置,最大连接数,建议保持默认
- maxIdle: 连接池相关配置,最大空闲连接数,建议保持默认
- retry: 连接后端的重试次数和发送数据的重试次数
- address: tsdb地址或者tsdb集群vip地址, 通过tcp连接tsdb.

部署完成transfer组件后,请修改agent的配置,使其指向正确的transfer地址。在安装完graph和judge后,请修改transfer的相应配置、使其能够正确寻址到这两个组件。

安装查询组件-API

介绍

api组件,提供统一的restAPI操作接口。比如:api组件接收查询请求,根据一致性哈希算法去相应的graph实例查询不同metric的数据,然后汇总拿到的数据,最后统一返回给用户。

服务部署

服务部署,包括配置修改、启动服务、检验服务、停止服务等。这之前,需要将安装包解压到服务的部署目录下。

1
2
3
4
5
6
7
8
9
10
11
# 修改配置, 配置项含义见下文, 注意graph集群的配置
vim cfg.json

# 启动服务
./open-falcon start api

# 停止服务
./open-falcon stop api

# 查看日志
./open-falcon monitor api

服务说明

注意: 请确保 graphs的内容与transfer的配置完全一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"log_level": "debug",
"db": { //数据库相关的连接配置信息
"faclon_portal": "root:@tcp(127.0.0.1:3306)/falcon_portal?charset=utf8&parseTime=True&loc=Local",
"graph": "root:@tcp(127.0.0.1:3306)/graph?charset=utf8&parseTime=True&loc=Local",
"uic": "root:@tcp(127.0.0.1:3306)/uic?charset=utf8&parseTime=True&loc=Local",
"dashboard": "root:@tcp(127.0.0.1:3306)/dashboard?charset=utf8&parseTime=True&loc=Local",
"alarms": "root:@tcp(127.0.0.1:3306)/alarms?charset=utf8&parseTime=True&loc=Local",
"db_bug": true
},
"graphs": { // graph模块的部署列表信息
"cluster": {
"graph-00": "127.0.0.1:6070"
},
"max_conns": 100,
"max_idle": 100,
"conn_timeout": 1000,
"call_timeout": 5000,
"numberOfReplicas": 500
},
"metric_list_file": "./api/data/metric",
"web_port": ":8080", // http监听端口
"access_control": true, // 如果设置为false,那么任何用户都可以具备管理员权限
"salt": "pleaseinputwhichyouareusingnow", //数据库加密密码的时候的salt
"skip_auth": false, //如果设置为true,那么访问api就不需要经过认证
"default_token": "default-token-used-in-server-side", //用于服务端各模块间的访问授权
"gen_doc": false,
"gen_doc_path": "doc/module.html"
}

备注:
部署完成api组件后,请修改dashboard组件的配置、使其能够正确寻址到api组件。
请确保api组件的graph列表 与 transfer的配置 一致。

安装绘图数据的组件- Graph

介绍

graph是存储绘图数据的组件。graph组件 接收transfer组件推送上来的监控数据,同时处理api组件的查询请求、返回绘图数据。

服务部署

服务部署,包括配置修改、启动服务、检验服务、停止服务等。这之前,需要将安装包解压到服务的部署目录下。(通知之前的一样,拷贝需要的包到指定的服务器)

修改配置, 配置项含义见下文

1
2
3
4
5
6
7
8
9
10
vim cfg.json

# 启动服务
./open-falcon start graph

# 停止服务
./open-falcon stop graph

# 查看日志
./open-falcon monitor graph

三、 配置说明
配置文件默认为./cfg.json,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"debug": false, //true or false, 是否开启debug日志
"http": {
"enabled": true, //true or false, 表示是否开启该http端口,该端口为控制端口,主要用来对graph发送控制命令、统计命令、debug命令
"listen": "0.0.0.0:6071" //表示监听的http端口
},
"rpc": {
"enabled": true, //true or false, 表示是否开启该rpc端口,该端口为数据接收端口
"listen": "0.0.0.0:6070" //表示监听的rpc端口
},
"rrd": {
"storage": "./data/6070" // 历史数据的文件存储路径(如有必要,请修改为合适的路径)
},
"db": {
"dsn": "root:@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true", //MySQL的连接信息,默认用户名是root,密码为空,host为127.0.0.1,database为graph(如有必要,请修改)
"maxIdle": 4 //MySQL连接池配置,连接池允许的最大连接数,保持默认即可
},
"callTimeout": 5000, //RPC调用超时时间,单位ms
"migrate": { //扩容graph时历史数据自动迁移
"enabled": false, //true or false, 表示graph是否处于数据迁移状态
"concurrency": 2, //数据迁移时的并发连接数,建议保持默认
"replicas": 500, //这是一致性hash算法需要的节点副本数量,建议不要变更,保持默认即可(必须和transfer的配置中保持一致)
"cluster": { //未扩容前老的graph实例列表
"graph-00" : "127.0.0.1:6070"
}
}
}

备注

如果上图红框中出现同一台服务器的不同名字的配置,则进入数据库,进行如下操作:
进入数据库:mysql –u root –p
查看所有数据库:show databses;
选择数据库:use graph;
查看表:show tables;
查询表:select * from endpoint;
删除不需要的数据:delete from endpoint where id=153;
如下可以不操作:
可以一起删除falcon_portal库中的host表中的无用数据。

Mysql监控

工作原理

在数据采集一节中我们介绍了常见的监控数据源。open-falcon作为一个监控框架,可以去采集任何系统的监控指标数据,只要将监控数据组织为open-falcon规范的格式就OK了。
MySQL的数据采集可以通过mymon来做。
mymon是一个cron,每分钟跑一次,配置文件中配置了数据库连接地址,mymon连到该数据库,采集一些监控指标,比如global status, global variables, slave status等等,然后组装为open-falcon规定的格式的数据,post给本机的falcon-agent。falcon-agent提供了一个http接口,使用方法可以参考数据采集中的例子。比如我们有1000台机器都部署了MySQL实例,可以在这1000台机器上分别部署1000个cron,即:与数据库实例一一对应。

配置安装

下载地址:https://github.com/open-falcon/mymon
安装:
设置$GOPATH:export $GOPATH =/src/

1
2
3
4
5
6
7
8
9
mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/mymon.git

cd mymon
go get ./...
go build -o mymon

echo '* * * * * cd $GOPATH/src/github.com/open-falcon/mymon && ./mymon -c etc/mon.cfg' > /etc/cron.d/mymon

执行go get ./…的时候出现如下错误:

1
2
package golang.org/x/crypto/ssh/terminal: unrecognized import path "golang.org/x/crypto/ssh/terminal" (https fetch: Get https://golang.org/x/crypto/ssh/terminal?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
package golang.org/x/sys/unix: unrecognized import path "golang.org/x/sys/unix" (https fetch: Get https://golang.org/x/sys/unix?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解决办法:
方法一:直接下载文件,然后把解压出来的文件夹放在src里。
下载地址:https://pan.baidu.com/s/1boVAtJp

方法二:直接从git上下载对应文件放到src下面。
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/crypto.git
git clone https://github.com/golang/sys.git

修改配置文件:
/src/github.com/open-falcon/mymon/etc
vi mon.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[default]
log_file=mymon.log # 日志路径和文件名
# Panic 0
# Fatal 1
# Error 2
# Warn 3
# Info 4
# Debug 5
log_level=4 # 日志级别

falcon_client=http://127.0.0.1:1988/v1/push # falcon agent连接地址

#自定义endpoint
endpoint=127.0.0.1 #若不设置则使用OS的hostname

[mysql]
user=root # 数据库用户名
password= # 数据库密码
host=127.0.0.1 # 数据库连接地址
port=3306 # 数据库端口

采集成功!

Redis监控

介绍~

Redis的数据采集可以通过采集脚本redis-monitor 或者 redismon来做。

redis-monitor是一个cron,每分钟跑一次采集脚本redis-monitor.py,其中配置了redis服务的地址,redis-monitor连到redis实例,采集一些监控指标,比如connected_clients、used_memory等等,然后组装为open-falcon规定的格式的数据,post给本机的falcon-agent。falcon-agent提供了一个http接口,使用方法可以参考数据采集中的例子。

比如,我们有1000台机器都部署了Redis实例,可以在这1000台机器上分别部署1000个cron,即:与Redis实例一一对应。

安装

下载地址:https://github.com/iambocai/falcon-monit-scripts

进入目录:/data/program/software/falcon-monit-scripts-master/redis

修改配置文件:vi redis-monitor.py
修改对应连接到agent的地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/bin/env python
#-*- coding:utf-8 -*-

__author__ = 'iambocai'

import json
import time
import socket
import os
import re
import sys
import commands
import urllib2, base64

class RedisStats:
# ĺýÍý?ăŔíťĐů??ÝťßţÓđredisŁŹ??ůťŘüîÜ?ôđ???Óđredis-cliÖŘ?
_redis_cli = '/usr/local/redis/redis-cli'
_stat_regex = re.compile(ur'(\w+):([0-9]+\.?[0-9]*)\r')

def __init__(self, port='6379', passwd=None, host='127.0.0.1'):
self._cmd = '%s -h %s -p %s info' % (self._redis_cli, host, port)
if passwd not in ['', None]:
self._cmd = '%s -h %s -p %s -a %s info' % (self._redis_cli, host, port, passwd)

def stats(self):
' Return a dict containing redis stats '
info = commands.getoutput(self._cmd)
return dict(self._stat_regex.findall(info))


def main():
ip = "dst6-redis"
timestamp = int(time.time())
step = 60
# inst_listńéÜÁđíÖőredisŰŐöÇŮţËěÖŞřúŁŹďďßí???ŢÁŰŐöÇńé?ö˘portűúpasswordŁŹËď?ŢĹéÄ????îÜŰ°Űö?ÔđŁŹĺýŁş
# inst_list = [ i for i in commands.getoutput("find /etc/ -name 'redis*.conf'" ).split('\n') ]
insts_list = [ '/usr/local/redis/redis.conf' ]
p = []

monit_keys = [
('connected_clients','GAUGE'),
('blocked_clients','GAUGE'),
('used_memory','GAUGE'),
('used_memory_rss','GAUGE'),
('mem_fragmentation_ratio','GAUGE'),
('total_commands_processed','COUNTER'),
('rejected_connections','COUNTER'),
('expired_keys','COUNTER'),
('evicted_keys','COUNTER'),
('keyspace_hits','COUNTER'),
('keyspace_misses','COUNTER'),
('keyspace_hit_ratio','GAUGE'),
]

for inst in insts_list:
port = commands.getoutput("sed -n 's/^port *\([0-9]\{4,5\}\)/\\1/p' %s" % inst)
passwd = commands.getoutput("sed -n 's/^requirepass *\([^ ]*\)/\\1/p' %s" % inst)
metric = "redis"
endpoint = ip
tags = 'port=%s' % port

try:
conn = RedisStats(port, passwd)
stats = conn.stats()
except Exception,e:
continue

for key,vtype in monit_keys:
#ěéŢÁÖŐ÷úÜâîÜredisńéinfo?őóîÜăáăÓ?á´ŁŹĺýÍýĚŔá´ěéŢÁä˛?âÍéŠóúó˘îÜkeyöŚÔŻ?
if key not in stats.keys():
continue
#?ߊ٤ńéáă
if key == 'keyspace_hit_ratio':
try:
value = float(stats['keyspace_hits'])/(int(stats['keyspace_hits']) + int(stats['keyspace_misses']))
except ZeroDivisionError:
value = 0
#áďř¸áăăŔÝŠďĂ?
elif key == 'mem_fragmentation_ratio':
value = float(stats[key])
else:
#ĐěöâîÜÔ´óúó˘ŕ÷counterŁŹint
try:
value = int(stats[key])
except:
continue

i = {
'Metric': '%s.%s' % (metric, key),
'Endpoint': endpoint,
'Timestamp': timestamp,
'Step': step,
'Value': value,
'CounterType': vtype,
'TAGS': tags
}
p.append(i)


print json.dumps(p, sort_keys=True,indent=4)
method = "POST"
handler = urllib2.HTTPHandler()
opener = urllib2.build_opener(handler)
url = 'http://127.0.0.1:1988/v1/push'
request = urllib2.Request(url, data=json.dumps(p) )
request.add_header("Content-Type",'application/json')
request.get_method = lambda: method
try:
connection = opener.open(request)
except urllib2.HTTPError,e:
connection = e

# check. Substitute with appropriate HTTP code.
if connection.code == 200:
print connection.read()
else:
print '{"err":1,"msg":"%s"}' % connection
if __name__ == '__main__':
proc = commands.getoutput(' ps -ef|grep %s|grep -v grep|wc -l ' % os.path.basename(sys.argv[0]))
sys.stdout.flush()
if int(proc) < 5:
main()

启动测试python redis-monitor.py

将脚本加入crontab执行即可

查看服务状态:service crond status

编辑:crontab –e

加入命令,一分钟执行一次,然后保存。

1
*/1 * * * * python /data/program/software/falcon-monit-scripts-master/redis/redis-monitor.py

重启服务service crond restart

汇报字段

key tag type note
redis.connected_clients port GAUGE 已连接客户端的数量
redis.blocked_clients port GAUGE 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
redis.used_memory port GAUGE 由 Redis 分配器分配的内存总量,以字节(byte)为单位
redis.used_memory_rss port GAUGE 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)
redis.mem_fragmentation_ratio port GAUGE used_memory_rss 和 used_memory 之间的比率
redis.total_commands_processed port COUNTER 采集周期内执行命令总数
redis.rejected_connections port COUNTER 采集周期内拒绝连接总数
redis.expired_keys port COUNTER 采集周期内过期key总数
redis.evicted_keys port COUNTER 采集周期内踢出key总数
redis.keyspace_hits port COUNTER 采集周期内key命中总数
redis.keyspace_misses port COUNTER 采集周期内key拒绝总数
redis.keyspace_hit_ratio port GAUGE 访问命中率

如需增减字段,请修改monit_keys变量

Rabbitmq监控

介绍

在数据采集一节中我们介绍了常见的监控数据源。open-falcon作为一个监控框架,可以去采集任何系统的监控指标数据,只要将监控数据组织为open-falcon规范的格式就OK了。

RMQ的数据采集可以通过脚本rabbitmq-monitor来做。

rabbitmq-monitor是一个cron,每分钟跑一次脚本rabbitmq-monitor.py,其中配置了RMQ的用户名&密码等,脚本连到该RMQ实例,采集一些监控指标,比如messages_ready、messages_total、deliver_rate、publish_rate等等,然后组装为open-falcon规定的格式的数据,post给本机的falcon-agent。falcon-agent提供了一个http接口,使用方法可以参考数据采集中的例子。

安装配置

下载地址:https://github.com/iambocai/falcon-monit-scripts/tree/master/rabbitmq
修改配置:vi rabbitmq-monitor.py
1、根据实际部署情况,修改15,16行的rabbitmq-server管理端口和登录用户名密码
2、确认1中配置的rabbitmq用户有你想监控的queue/vhosts的权限
3、将脚本加入crontab即可
新建脚本 : vi rabbitmq_cron

1
2
* * * * * root (cd /data/program/software/falcon-monit-scripts-master/rabbitmq && python  rabbitmq-monitor.py  > /dev/null)
cp rabbitmq_cron /etc/cron.d/

汇报字段

key tag type note
rabbitmq.messages_ready name(Queue名字) GAUGE 队列中处于等待被消费状态消息数
rabbitmq.messages_unacknowledged name(Queue名字) GAUGE 队列中处于消费中状态的消息数
rabbitmq.messages_total name(Queue名字) GAUGE 队列中所有未完成消费的消息数,等于messages_ready+messages_unacknowledged
rabbitmq.ack_rate name(Queue名字) GAUGE 消费者ack的速率
rabbitmq.deliver_rate name(Queue名字) GAUGE deliver的速率
rabbitmq.deliver_get_rate name(Queue名字) GAUGE deliver_get的速率
rabbitmq.publish_rate name(Queue名字) GAUGE publish的速率

全片结束,觉得我写的不错?想要了解更多精彩新姿势?赶快打开我的👉个人博客 👈吧!

谢谢你那么可爱,还一直关注着我~❤😝

-------------本稿が終わる感谢您的阅读-------------