GTI应用服务性能监控平台
0. 版本获取
- InfluxDB: https://portal.influxdata.com/downloads
- Grafana: https://grafana.com/grafana/download?platform=linux
- Telegraf: https://github.com/influxdata/telegraf/releases
- Collectd: http://collectd.org/download.shtml
1. GTI应用服务性能监控平台介绍
想打造New Relic & One APM那样漂亮的实时监控平台, 我们只需要InfluxDB/Collectd&Telegraf/Grafana, 这些工具间关系如下:
采集数据(Collectd&Telegraf) -> 存储数据(InfluxDB) -> 显示数据(Grafana)
- InfluxDB是Go语言开发的一个开源分布式时序数据库, 非常适合存储指标, 事件, 分析等数据, 可任意独立部署;
- Collectd是C语言写的一个系统性能采集工具, 可任意独立部署, 我们用它监控Java应用(WebApp, NativeApp)的性能, 其工作原理如下:
- Telegraf是Go语言写的一个系统采集工具, 需部署在待监控的系统或中间件服务器上, 我们用它监控服务器系统及主流中间件的性能;
- Grafana是纯JavaScript开发的前端工具, 用于访问InfluxDB, 自定义报表, 显示图表等, 可任意独立部署;
1. InfluxDB
- 安装
- yum localinstall influxdb-1.2.4.x86_64.rpm
- 拷贝typs.db至/usr/local/share/collected/ (若不存在, 则创建该目录, 路径可自定义)
- chmod 777 /usr/local/share/collectd/types.db
- ps: influxdb更高版本去掉了图形化管理页面, 建议没有特殊需要则安装1.2.4版本
- 配置
- 修改/etc/influxdb/influxdb.conf如下:
- reporting-disabled = true (禁用InfluxDB将相关信息上传至其官网)
- bind-address = “:8090” (新增该节点, 同时使用命令: netstat -Inp | grep 8090查看端口是否已存在)
- [admin]
enabled = true
bind-adress = “:8083” - [http]
enabled = true
bind-adress = “:8086” - [[collectd]]
enabled = true
bind-adress = “服务器IP:25826”
database = “ktv” (建议按业务命名)
typesdb = “/usr/local/share/collectd/types.db”
batch-size = 5000
batch-pending = 10
batch-timeout = “10s”
read-buffer = 0
- 修改/etc/influxdb/influxdb.conf如下:
- 运行
- service influxdb start
- 报错
- 错误提示: Redirecting to /bin/systemctl start influxdb.service
原因: 当前Linux操作系统使用的是RedHat7&CentOS7&Fedora, 不支持service启动服务的方式, 需要使用systemctl命令启动
备注: 查看当前Linux操作系统版本信息: lsb_release -a 若该命令不存在, 则通过命令: yum install lsb安装
解决: systemctl start influxdb
- 错误提示: Redirecting to /bin/systemctl start influxdb.service
- 创建数据库
- 在浏览器上打开 http://服务器IP:8083
- 在Query栏中输入CREATE DATABASE "ktv"回车
- Influxdb1.2.4之后的版本去除管理页面, 需要通过后台命令进行登录
- 创建数据库: influx -host 127.0.0.1:8086
- 创建数据库: CREATE DATABASE “ktv”
2. Telegraf
1. Linux版本
- 安装
yum localinstall telegraf-1.10.1-1.x86_64.rpm - 升级
- 备份配置文件: /etc/telegraf/telegraf.conf
- 查询已安装版本: rpm -qa | grep telegraf
- 卸载已安装版本: rpm -e --nodeps telegraf-1.2.1-1.x86_64
- 安装最新版本: yum localinstall telegraf-1.10.1-1.x86_64.rpm
- 配置
- 基础配置
(1) 修改/etc/telegraf/telegraf.conf如下:
[agent]
logfile = “/var/log/telegraf/telegraf.log”
[[outputs.influxdb]]
urls = [“http://InfluxDB 服务器IP:8086”]
database = “实际数据库名” - 中间件配置
若需监控任意中间件, 则需配置IP, 端口及访问权限, 若需监控多个实例, 请用逗号隔开
例:
[[inputs.redis]]
servers = [“tcp://192.168.57.10:6379”, “tcp://192.168.57.10:6378”]
[[inputs.zookeeper]]
servers = [“192.168.57.10:2181”, “192.168.57.10:2182”] - 网络监控配置
将/etc/telegraf/telegraf.conf中的如下两个指标配置前的注释去掉, 开启网络监控:
[[input.net]]
[[input.netstat]] - 进程监控配置
- 按如下配置开启, 通过进程名单监控单个或多个进程
修改/etc/telegraf/telegraf.conf如下:
[[inputs.procstat]]
pattern = “processName”
可使用pgrep -f processName命令检查进程名是否对应目标监控进程, 需保证命令执行返回的进程号只有一个并且对应需要监控的进程. 可以通过修改processName的方式进行调试, 保证命令的执行结果唯一性, 如果需要监控多个进程, 则添加多个[[inputs.procatat]]节点, 如:
[[inputs.procstat]]
pattern = “processName1”
[[inputs.procstat]]
pattern = “processName2”
- 按如下配置开启, 通过进程名单监控单个或多个进程
- GPU监控配置
Telegraf当前支持nvidia卡的GPU监控, telegraf调用GPU驱动中自带的信息展示程序采集信息, 需要在telegraf.conf中新增配置:
[[inputs.nvidia_smi]]
## Optional: path to nvidia-smi binary, defaults to $PATH viaexec.LookPath
# bin_path = “/usr/bin/nvidia-smi”
## Optional: timeout for GPU polling
# timeout = “5s” - 监控配置扩展
当telegraf无法监控某些应用组件或中间件的性能指标, 需要编写监控脚本或监控命令来完成时, 可以使用[[inputs.exec]]配置项, 监控多个实例, 可添加多个[[inputs.exec]]节点, 同时以name_suffix参数区分不同实例
如下所示:
[[inputs.exec]]
----若执行多个命令或脚本, 需要使用逗号隔开, redis配置了密码, 存在特殊字符需要转义
commands = [
“/redis-3.0.5-master/src/redis-cil -h 192.168.57.10 -p 6379 slowlog len”
]
----表名前缀, 默认为exec, 可进行自定义
name_override = “redis_slowlog”
timeout = “5s”
----表名后缀, 用于区分不同监控实例, 若仅监控单个实例, 则配置可忽略
name_suffix = “_192.168.57.10”
----数据格式化
data_fromat = “value”
data_type = “integer”
- 基础配置
- 运行
service telegraf start - 报错
若运行过程中, 发现启动失败或启动成功无监控数据, 请查看打屏日志或查看/var/log/telegraf目录下运行日志.
3. Collectd
1. 安装
拷贝collectd至/opt
2. 配置
- 开启WebAPP(容器类)或NativeAPP(本地引用)的JMX远程监控:
例: Tomcat的JMX远程监控配置
修改/usr/local/tomcat7/bin/catalina.sh文件:
查找到如下行:
#-----ExecuteTheRequestedCommand-----
在该行之上添加如下信息:
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=XXX.XXX.XXX.XXX
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
例: Java本地应用的JMX远程监控配置
修改start.sh文件
新增如下行信息
JAVA_OPTS="$JAVA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=XXX.XXX.XXX.XXX
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
例: SpringBoot应用的JMX远程监控配置
修改/etc/telegraf/telegraf.conf文件
可修改
[[inputs.jolokia]]
[[inputs.jolokia2_agent]]
[[inputs.jolokia2_proxy]]
几处配置 - 修改/opt/collectd/etc/collectd.conf如下:
<Plugin network>
# client setup:
Server “InfluxDB服务器IP”“25826”
</Plugin>
----监控Java应用前, 则需开启JMX远程监控
<Connection>
Host “Java应用服务器IP:JMX端口”
ServiceURL “service:jmx:rmi:///jndi/rmi:// Java应用服务器IP:JMX端口/jmxrmi”
Collect “memory-heap”
Collect “memory-nonheap”
Collect “memory_pool”
Collect “cpu”
Collect “thread”
Collect “gc-count”
Collect “gc-time”
</Connection>
----若需监控多个 Java 应用,则添加多个 Connection 节点
3. 运行
/opt/collectd/sbin/collectd
4. 报错
- 错误提示: lt_dlopen (“/opt/collectd/lib/collectd/java.so”) failed: file
not found.
原因: libjvm.so 未加载.
解决:
(1) 打开/etc/profile,增加如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/java/jdk1.7.0_79/jre/lib/amd64/server:/home/java/jdk1.7.0_79/jre/lib/amd64
提示:关于 jdk 的 lib 库加载,需要看 jdk 默认安装路径在哪,然后根据实际路径对其修改
(2) 输入:source /etc/profile ,使上述配置生效
(3) 重启 collectd:/opt/collectd/sbin/collectd - 错误提示“没找到 java.so”(完成第 1 个问题中修改环境变量后)
问题原因: libjvm.so 未加载.
解决方法: 在/etc/ld.so.conf 中添加 libjvm.so 所在路径,执行命令
ldconfig 重启生效即可解决找不到 java.so 的问题
备注: ld.so.conf 执行优先级大于 profile - 错误提示:
解决方法: 拷贝一份 lib 放在 var 文件夹路径下即可 - 错误提示:.Lookingup “hostname”failed.
原因: 主机名未绑定 IP
解决:
(1) 打开/etc/hosts,增加如下:
主机 IP 地址 主机 Host 名
提示:关于主机名,可通过命令 hostname 查询
(2) 输入:source /etc/hosts ,使上述配置生效
(3) 关闭&重启 collectd - 错误提示:Grafana 无法监控到数据且 InfluxDB 中未写入 JVM 监控数据.
原因: JMX Server 在 启 用 JVM 参 数 配 置
-Dcom.sun.management.jmxremote.port=XXXX 监控端口 XXXX 时,会启用另外一个随机的数据通讯端口 YYYY
解决: 把这个随机端口固定,在 JVM 参数基础上添加如下配置:
-Dcom.sun.management.jmxremote.rmi.port=XXXX(与上一配置同一端口)
4. Granafa
1. 安装
yum localinstall granafa-5.4.2-1.x86_64.rpm
2. 配置
修改/etc/grafana/grafana.ini 如下:
[smtp]
enabled = true
3. 运行
service grafana-server start
4. 监控
- 登陆
在浏览器打开 http://服务器 IP:3000,输入 admin/admin,点击【Login】登录; - 报错
- 若运行过程中,发现 grafana-server 启动失败或端口号 3000 不存在,请查
看/var/log/grafana 目录下运行日志如下:
t=2018-08-10T10:36:34+0800 lvl=eror msg=“Failed to verify pid directory” lo
gger=server error=“mkdir /var/run/grafana: permission denied”
原因:因为权限原因导致无法创建目录/var/run/grafana,进而导致无法生成
grafana-server.pid 文件,grafana 缺少该文件自然无法正常启动.
解决: 依次执行命令:
mkdir /var/run/grafana
chmod -R 777 /var/run/grafana - 监控有数据,页面鼠标放图上有数据,但是没有图形展示,提示 Data points
outside time range:
原因: 浏览器所在的操作系统时间不对,导致数据无法展示
解决: 修改浏览器所在机器的系统时间,改为当前正确时间,关闭浏览器重新打
开监控页,显示正常 - 监控页面没有数据,查看 InfluxDB 数据,time 字段时间加 8 小时后与当前
时间不等
原因: InfluxDB 所在服务器系统时间时区不对,需将其改为 CST 时区.
解决: 修改系统时间时区
timedatectl set-timezone Asia/Shanghai
- 若运行过程中,发现 grafana-server 启动失败或端口号 3000 不存在,请查