背景:

公司出口有3条ISP出口,某些特定应用必须要从指定线路出去,由于出口设备线路选录是采用只能DNS去解析选路,有时候会存在选路错误的情况,会导致特定应用选路错误,无法访问,故此利用PRTG 自定义sensor来实现监控。

实现方式:

这里实现方式有很多种,可是使用powershell 等Windows编程语言实现,也可使用Python实现,因为作者Python比较熟悉所以选择Python语言实现。

1.首先编写Python脚本

# _*_ coding=utf-8 _*_
# name tracert.py
import subprocess
import sys
import json
#下面的2个prtg libs 直接引用即可,prtg自带的Python目录下已经有了
from prtg.sensor.result import CustomSensorResult
from prtg.sensor.units import ValueUnit

#该方法用户使用Python的subprocess 模块调用window的tracert 路由工具对目标站点进行路由探测,并返回预期的线路网关值,因为prtg 的监控返回值中
只接受integer或者float的数据类型,所以这里根据不会gw return 不同的integer ,如1,2,3等
def tracertIP(ip=""):
p = subprocess.Popen(['tracert', ip], stdout=subprocess.PIPE)
while True:
try:
line = p.stdout.readline()
#线路1gw ip 1.1.1.1
if line.find(b'1.1.1.1') != -1 :
print(line)
return 1
#线路2gw 2.2.2.2
if line.find(b'2.2.2.2') != -1:
print(line)
return 2
#线路3 gw ip 3.3.3.3
if line.find(b'3.3.3.3') != -1:
print(line)
return 3
except p.stderr as err:
print(err)
break
#该方法是将上面tracertIP方法返回的gw integer code ,传递给prtg监控,进而以我们想要方式展示出来
def toPrtg(host=''):
try:
data = json.loads(host)
print(data)
res = tracertIP(data["host"])
#这里初始化csr对象,传递的参数可以缺省,这里自定义了返回给prtg监控的message,方便监控人员识别。缺省情况下返回的正常message为ok。
csr = CustomSensorResult(text="ISP outing code : CT(1) CM(2) CU(3),current isp code is %s" % str(res))
#这里自定义channel,即需要监控和展示的数据,name可以自定义,value就是监控指标值,这里是tracertIP 返回的 ISP gw code.这个监控项没有单位所以缺省
csr.add_primary_channel(name="ISP",
value=res,
unit='#',
is_float=False,
is_limit_mode=False)

print(csr.json_result)
return csr.json_result
except Exception as e:
csr = CustomSensorResult(text="Python Script execution error")
csr.error = "Python Script execution error: %s" % str(e)
print(csr.json_result)

if __name__ == '__main__':
#定义要监控的目标域名或者IP,这里定义成dict ,因为prtg的借口只接受json数据,方便转json,
也可以将下面的dict直接用‘’ 括起来,以字符串形式穿进去,接口会解析成json格式
host = {"host": "www.baidu.com"}
toPrtg(json.dumps(host))

2.环境准备即部署sensor

注意在prtg 的probe中无需单独安装Python,prtg自带Python并调用自己的Python位置在 prtg安装目录\python 这里,我这里安装在c盘,目录是C:\Program Files (x86)\PRTG Network Monitor\python

上述编写好的Python文件tracert.py 放置在 prtg安装目录\Custom Sensors\python 目录下,我这里的目录是

C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\python ,这个目录下有一个example,编写前可以参考,如何使用prtg的Python sdk来进行自定义sensor。

3.在prtg web或者client添加监控

选中任意设备添加sensor,选择 Python Script Advanced 这个sensor ,添加,Sensor名称随便,Python Script这里,选择我们刚才放置的脚本tracert.py

Prtg 实现出口线路路由变化监控_prtg

其它默认不懂,additional parameters这里不用填,需要探测的目标已经写在脚本中了,本来之前是要在这里传参数的,但经过多次测试都有问题,所以目前是写死在脚本中了。直接save就可以。

Prtg 实现出口线路路由变化监控_prtg_02


这里就创建好了,等一会就可以看到我么要监控的数据了,

Prtg 实现出口线路路由变化监控_prtg_03

3.告警设定

选中sensor的notification Trigers  , 设定档channel ISP 的value  not equal 1 ,且持续多长时间会触发告警,可以是邮件也可以是ticket通知,

本文中的告警实例是,监控的目标正常走CT ,即监控到的ISP value 应该为之前定义好的1,只要是不等于1就触发告警。

Prtg 实现出口线路路由变化监控_prtg_04