元芳算法服务部署-监控篇(内部)
简介
夜莺(Nightingale)是滴滴基础平台联合滴滴云研发和开源的企业级监控解决方案。旨在满足云原生时代企业级的监控需求。Nightingale在产品完成度、系统高可用、以及用户体验方面,达到了企业级的要求,可满足不同规模用户的场景,小到几台服务,大到数十万都可以完美支撑。兼顾云原生和裸金属,支持应用监控和系统监控,插件机制灵活,插件丰富完善,具有高度的灵活性和可扩展性。
在夜莺(Nightingale)的基础上进行了二次开发,支持docker化部署(不推荐),支持GPU指标监控、第三方应用指标监控等。
下载&安装
准备工作
如果非docker化部署,需要安装go(可选)及python3环境,参考附录。
部署安装
- master节点docker镜像地址:/nightingale-tool.tar
- collector部署包地址:/nightingale-collector.tar
- collector(即agent,可以采集机器常见指标,原生支持日志监控,支持插件机制,支持业务通过接口直接上报数据),建议直接部署collector到待监控主机:
## 部署nightingale-tool
tar -xvf nightingale-tool.tar
## 安装mysql和redis
cd ./nightingale-tool
#### 修改mysql用户名、密码及挂载目录
vi config.sh
#### 使用mysql.sh 安装并启动mysql
./mysql.sh {install|start}
#### 使用redis.sh 安装并启动redis
./redis.sh {install|start}
#### 使用nightingale-all.sh 安装并启动tool
./nightingale-all.sh {install|start}
## 单独部署collector
tar -xvf nightingale-collector.tar
cd ./nightingale-collector
#### 修改 etc/address.yml
修改monapi和transfer的IP和端口(端口默认不需要修改,如果你手动修改了这两个服务的端口,则根据实际情况修改)
#### 设置自启动
cp etc/n9e-collector.service /usr/lib/systemd/system
修改/usr/lib/systemd/system/n9e-collector.service文件ExecStart的值
#### 使用collector.sh 启停服务
./collector.sh {start|stop|restart|status}
实际部署【需要修改的配置项】:
nightingale-tool:
修改数据库、RedisIP的IP地址、mysql挂载目录:/opt/monitor/nightingale-tool/config.sh
修改addresses的IP地址:/opt/monitor/nightingale-tool/config/address.yml
去掉参数--gpus all:/opt/monitor/nightingale-tool/nightingale-all.sh、nightingale-collector.sh
nightingale-collector:
修改IP地址、端口:/opt/monitor/nightingale-collector/etc/address.yml
☆☆注意如果在某台机器上既部署nightingale-tool和ightingale-collector时,需修改nightingale-collector的collect端口
collector:
http: 0.0.0.0:2059
如果GPU脚本插件无法运行,请将
code, endpoint = subprocess.getstatusoutput("timeout 1 /usr/sbin/ifconfig `/usr/sbin/route|grep '^default'|awk '{print $NF}'`|grep inet|awk '{print $2}'|head -n 1")
修改为:
code, endpoint = subprocess.getstatusoutput("timeout 1 /usr/sbin/ifconfig eth0|grep inet|awk '{print $2}'|head -n 1")
使用
使用说明
监控指标
监控指标的数据结构如下:
[
{
"metric": "disk.io.util",
"endpoint": "192.168.0.131",
"tags": "device=sda",
"value": 15.4,
"timestamp": 1554455574,
"counterType": "GAUGE",
"step": 20
}
]
- metric是监控指标
- endpoint是监控实体,主机IP
- tags是监控数据的属性标签
- step为监控数据的上报周期
- value是监控指标的当前值
- timestamp是当前时间戳,单位是秒
- counterType字段表示指标类型,支持GAUGE和COUNTER,如果不上报这个字段,默认为GAUGE,如果上报的指标是COUNTER类型,需要明确指定。另外,COUNTER类型的指标的计算逻辑是在collector模块实现的,所以不要把COUNTER类型的指标直接推给transfer。
插件机制
可以指定某个目录为插件目录,读取该目录下符合特定格式的文件,当成插件执行,以此扩展collector的能力。对于业务系统的监控指标采集,可以把采集脚本放到业务程序发布包中,随着业务代码上线而上线(上线的时候把脚本放到collector的plugin目录下)。
注意:插件执行需要在页面(采集配置页面)上配置才能运行
- 支持给插件传参数,传环境变量,传Stdin,非常灵活
- 分发插件的时候可以无差别分发到所有机器,不同机器执行不同的插件直接在web上即可控制
对于插件,有如下几个要求:
- 插件脚本必须具有可执行权限,部署完了脚本记得chmod +x一下
- 插件脚本可以是sh、py、pl、rb,甚至可以是二进制,只要机器上有runtime环境
- 插件脚本的命名:${step}_xx.xx,比如20_uptime.sh,${step}是在告诉collector多久跑一次
- plugin目录下非${step}_xx.xx命名格式的文件或者目录可以存在没关系,collector不会识别为插件
- 插件执行之后要在stdout输出一个json array,collector会截获这个输出,解析为监控指标上报
- 如果插件执行报错了,报错消息要打印到stderr,不要打印到stdout
插件示例如下:
#!/usr/bin/python3
#-*- coding:utf-8 -*-
import time
import subprocess
import json
import sys
import os
items = []
def collect_myself_status():
item = {}
item["metric"] = "plugin.myself.status"
item["value"] = 1
item["tags"] = ""
items.append(item)
def main():
code, endpoint = subprocess.getstatusoutput(
"timeout 1 /usr/sbin/ifconfig `/usr/sbin/route|grep '^default'|awk '{print $NF}'`|grep inet|awk '{print $2}'|head -n 1")
if code != 0:
sys.stderr.write('cannot get local ip')
return
timestamp = int("%d" % time.time())
plugin_name = os.path.basename(sys.argv[0])
step = int(plugin_name.split("_", 1)[0])
collect_myself_status()
for item in items:
item["endpoint"] = endpoint
item["timestamp"] = timestamp
item["step"] = step
print(json.dumps(items))
if __name__ == "__main__":
sys.stdout.flush()
main()
sys.stdout.flush()
另外,第三方指标采集器不是以插件机制存在,而是以独立进程或者cron脚本的方式存在,这种方式和插件类似,只是需要自己将采集的监控数据push给collector或者transfer,也算是一种广义的插件。
collector的数据采集API接口默认为:http://127.0.0.1:2058/api/collector/push
界面预览
附录
CentOS安装go环境(可选)
直接从Oss下载: /go1.15.3.linux-amd64.tar.gz
tar -zxvf go1.15.3.linux-amd64.tar.gz
mv go /usr/local
## #配置系统变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
source /etc/profile
## 查看版本,正常显示则表明安装正常
go version
CentOS安装python3环境
直接从Oss下载:
- python3安装包:python-devel.tar.gz
- python3依赖包:Python-3.7.5.tgz
## 安装依赖
tar -zxvf python-devel.tar.gz
cd python-devel
rpm -ivh --nodeps --force ./*
## 安装python3
mkdir /usr/local/python3
tar -zxvf ../Python-3.7.5.tgz -C /usr/local/python3
cd /usr/local/python3/Python-3.7.5
./configure --prefix=/usr/local/python3
## 编译安装
make && make install
【离线环境:如果编译安装出现问题:缺少zlib库时请使用gcc离线安装包.zip,否则跳过该安装包】
## #配置系统变量
echo 'export PATH=$PATH:/usr/local/python3/bin' >> /etc/profile
source /etc/profile
## 查看版本,正常显示则表明安装正常
python3 -V
Python GPUtil组件安装(监控GPU资源)
直接从Oss下载:
- GPUtil包:GPUtil.tar.gz
## 安装
tar -zxvf GPUtil.tar.gz -C /usr/local/python3/lib/python3.7/site-packages
#设置python3软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
#创建pip3的软连接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3