python脚本实现open-falcon自定义监控服务器时间

前段时间公司有两台服务器的时间突然不准,因为没有做服务器时间的监控,导致在实施反馈的时候去排查才知道是服务器时间没有同步。服务器是确定做了时间同步的,但是不知道因为什么原因突然不同步了,为防止类似事情再次发生,就打算在open-falcon监控系统的时候把系统时间也添加进去。

openfalcon不会自动监控服务器的时间并上报,所以需要自己写脚本并push上去。

因为主要监控的是服务器时间的准确性,进行报警的时候也是通过查看服务器和网络时间的差值是否超过设定才决定是否进行报警,所以可以在脚本里将上传的metric改成当前服务器时间和网络时间的差值,而不是当前服务器的时间。

1、 编写脚本

具体脚本如下:

#! /usr/bin/python3
import time 
import datetime
import os
import http.client
import requests
import socket
import json

#获取网络服务器的时间
def get_werbservertime(host):
	conn = http.client.HTTPConnection(host)
	conn.request("GET","/")
	r = conn.getresponse()
	ts = r.getheader('date')#获取http头date部分

	#将GMT时间转换成北京时间
	ltime = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")
	ttime = time.localtime(time.mktime(ltime)+8*60*60)
	dat = "%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)
	tm = "%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)
	print(dat,tm)
	timeAll = dat + ' ' + tm
	#将时间转换为时间戳
	timeArray = time.strptime(timeAll,"%Y-%m-%d %H:%M:%S")
	timestamp = time.mktime(timeArray)
	return (timestamp)

#将数据上传至agent
def pushtime(hostname,timed):
	ts = int(time.time())
	payload = [
		{
			"endpoint": hostname,
            "metric": "timed",
            "timestamp": ts,
            "step": 60,
            "value": timed,
            "counterType": "GAUGE",
            "tags": "",
		}
	]
	r = requests.post("http://127.0.0.1:1988/v1/push",data = json.dumps(payload))
	print(r.text)
#设定为每60s上传一次
while True:
	webts = int(get_werbservertime('10.200.9.111'))
	print (webts)
	#获取服务器时间戳
	localts = int(time.time())
	#打印服务器当前时间
	print(time.strftime("%Y-%m-%d %H:%M:%S" ,time.localtime(time.time())))
	print (localts)
	#将服务器时间和时间服务器时间相减,得到的差值是秒数
	timed = abs(localts - webts)
	print (timed)
	hostname = socket.gethostname()
	pushtime(hostname,timed)
	time.sleep(60)

2、执行脚本测试

python3 open-falcon-timed.py

执行命令后查看打印出的信息,看到success表明执行成功(因为我这里测试的虚拟机一直没有进行时间同步,所以和时间服务器时间相差较大)。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_配置文件


隔一会就可以在openfalcon的监控页面看到数据上报了。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_02


点进去可以看到折线图

sentinel 实时监控 设置监控时长 怎样设置监控的时间_配置文件_03

因为上传的时间戳是服务器时间戳,所以一旦服务器时间不准确,图表中的时间也会不准。

3、生成可执行文件

使用pyinstaller将脚本打包生成可执行文件。

pyinstaller -F  open-falcon-timed.py

建议使用低版本的系统安装pyinstaller生成可执行文件,可以适用任何系统。

生成的可执行文件在dist路径下。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_可执行文件_04


使用命令./open-falcon-timed执行文件

sentinel 实时监控 设置监控时长 怎样设置监控的时间_配置文件_05

4、配置报警

在Templates上配置策略,metric为timed,当timed值大于等于5时就报警。并配置报警接收组。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_可执行文件_06


在HostGroups菜单中上创建hostgroup,其中hosts中添加需要监控的服务器IP/hostname,templates中绑定之前配置的策略。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_07


sentinel 实时监控 设置监控时长 怎样设置监控的时间_监控类_08


等一会就可以在Alarm-Dashboard看到报警

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_09

5 使用plugin定时执行插件

如果需要监控的服务器很多的话,每台服务器都要部署可执行文件,逐个部署比较耗费时间,open-falcon提供plugin功能可以自动下发插件并定时执行。具体步骤如下:

  1. 修改脚本

plugin提供定时执行插件的功能,所以不用在脚本中循环每60s执行脚本中的方法。

可以将脚本中以下部分

sentinel 实时监控 设置监控时长 怎样设置监控的时间_监控类_10


改为

sentinel 实时监控 设置监控时长 怎样设置监控的时间_监控类_11


执行一次之后结束

  1. 重新生成可执行文件
pyinstaller -F open-falcon-timed.py
  1. 将插件改名后上传至指定的代码仓库
    open-falcon的plugin功能会自动执行指定路径下的以数字和下划线开头的插件,其中数字代表间隔秒数,所以我这里将文件名改为60_open-falcon-timed,表示每60秒执行一次插件。timed.ini是配置文件,这里我做了配置分离。
  2. sentinel 实时监控 设置监控时长 怎样设置监控的时间_配置文件_12

  3. 在服务器的agent中的plugin模块的配置文件中配置代码仓库的地址
    在agent的配置文件cfg.json中修改如下内容为代码仓库的地址和账密:
    格式为:http://账号:密码@地址
    在agent的配置文件cfg.json中修改从仓库中拉取下来的插件存放的位置
    修改完成后重启agent
./open-falcon restart agent

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_13

  1. 使用命令行测试是否能获取到代码仓库的文件
    注:确保已经安装git命令,如果未安装,使用命令 yum install -y git下载。下载完成后使用如下命令将代码仓库上的插件下载下来:
curl http://127.0.0.1:1988/plugin/update

显示success证明拉取成功,可以在配置文件中配置好的路径中看到插件。

  1. 添加可执行权限
chmod +x 60_open-falcon-timed

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_14


time.ini 是我做了配置分离之后的配置文件,如果需要open-falcon的plugin自动执行插件,则需要把配置文件放到启动open-falcon的可执行文件open-falcon同级目录下。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_可执行文件_15


7. 绑定plugin

打开open-falcon的dashboard,在HostGroups菜单栏中新建HostGroup,在hosts中添加endpoint,在plugtins中添加可执行插件的路径,该路径是相对路径,相对于agent的配置文件中dir 的路径。plugin会自动执行指定的路径下的以数字和下划线开头的插件。

sentinel 实时监控 设置监控时长 怎样设置监控的时间_配置文件_16

查看agent日志,可以发看到时间插件每60s执行一次:

sentinel 实时监控 设置监控时长 怎样设置监控的时间_服务器_17