观测云,Datakit自定义pythond脚本指标上报。
import CUSTOMIZED_ALERT__DQL_UTIL as DQL_UTIL
import CUSTOMIZED_ALERT__TIME_UTIL as TIME_UTIL
import CUSTOMIZED_ALERT__DINGDING_UTIL as DINGDING_UTIL
import time
import math
# 报文格式:
# ---------------------------------------------------
# 您有2条新的消息
# 第1条:
# 【时间】2022-03-30 12:05:00
# 【标题】天津健康码亮码
# 【统计时间范围】2022-03-30 06:00 - 12:00
# 健康码负载均衡设备最近4小时最大流入带宽为{{Result}}MByte/s(设备支持最大流入带宽5000Mbps)。
# 第2条:
# 【时间】2022-03-30 12:05:00
# 【标题】健康码的场所码
# 【统计时间范围】2022-03-30 06:00 - 12:00
# 健康码负载均衡设备最近4小时最大流入带宽为{{Result}}MByte/s(设备支持最大流入带宽5000Mbps)。
@DFF.API('自定义告警SLB最大流入带宽')
def doAlert_SLB_TrafficRXNew_Maximum():
'''
按当前时间time.getTime(),计算时间区间,TIME_UTIL.保证CST时区
'''
print(TIME_UTIL.nowStr())
hour_decrement=6 #默认,减6小时
if TIME_UTIL.now().hour>=20:
hour_decrement=2 #20点,减2小时
time_range=''+TIME_UTIL.timeToHour(TIME_UTIL.date_add(TIME_UTIL.now(),-hour_decrement,'hour')) +' - '+ TIME_UTIL.timeToHour(TIME_UTIL.now())
time_range_dql=TIME_UTIL.dtToHour(TIME_UTIL.date_add(TIME_UTIL.now_UTC(),-hour_decrement,'hour')) +':'+ TIME_UTIL.dtToHour(TIME_UTIL.now_UTC())
print('显示time_range:',time_range)
print('计算time_range_dql:',time_range_dql)
'''
=============================================================================================================================================
1.使用DQL抽取统计数据,基本逻辑:
指标: 流入带宽 NewRX
统计函数: 最大
过滤条件:同【天津健康码亮码】,【健康码的场所码】告警,使用:IP+端口。
时间范围:(b)方法。
(a)过去4小时。(相对时间方案,要求:告警定时任务运行时,指标上报任务必须完成,有任务依赖。func平台暂时较难控制【触发频率】不同的任务依赖。)
当天 06:00 - 12:00, 12:00 -18:00 , 18:00-20:00 准确时间范围。
=============================================================================================================================================
'''
dql=''' M::aliyun_acs_slb_dashboard:(Max(TrafficRXNew_Maximum) as TrafficRXNew_Maximum){(protocol='192.156.35.76' and port='8089') or (protocol='192.156.32.54' and port='443')}['''+time_range_dql+'''] by protocol,port'''
print(dql)
status, rts=DQL_UTIL.query(dql)
# format result, unit, customized ordering
dataset=[rts["series"][0][0],rts["series"][1][0]]
print('1.使用DQL抽取统计数据------------------------------------',type(dataset))
print(dataset)
'''
=============================================================================================================================================
3.自定义排序规则(由于只有2种类型,暂时使用硬编码),python脚本实现:
天津健康码亮码 #健康码 (protocol='192.156.32.54' and port='443')
健康码的场所码 #场所码 (protocol='192.156.35.76' and port='8089')
* DQL指标类型数据,不支持除时间字段外的字段排序
=============================================================================================================================================
'''
orderingDict={
'192.156.32.54:443' :{'seq':1, 'name':'天津健康码亮码'},
'192.156.35.76:8089':{'seq':2, 'name':'健康码的场所码'},
}
default_fields={'seq':9999999, 'name':''}
for r1 in dataset:
# 未指定排最后
r1['orderingSeq'] =orderingDict.get(r1['tags']['protocol']+':'+r1['tags']['port'],default_fields)['seq']
r1['orderingName']=orderingDict.get(r1['tags']['protocol']+':'+r1['tags']['port'],default_fields)['name']
#orderingSeq 排序
def takeSecond(elem):
return elem['orderingSeq']
print("3.自定义排序规则------------------------------------")
dataset.sort(key=takeSecond, reverse=False)
print(dataset)
'''
=============================================================================================================================================
4.指标数据格式转换:
a)time转换为
b)流入带宽计量单位转换为 => MByte/s (去尾法)
=============================================================================================================================================
'''
for r1 in dataset:
print("----iterate----")
print(r1)
r1['最大流入带宽']=math.floor(r1['TrafficRXNew_Maximum']/1024/1024*100)/100
print("4.指标数据格式转换:------------------------------------")
print(dataset)
'''
=============================================================================================================================================
5.消息合并及钉钉报文格式:
通过webhook转发钉钉, 报文类型markdown。
=============================================================================================================================================
'''
msg=f'*您有{len(dataset)}条新的消息* \n\n'
for i in range(len(dataset)):
r=dataset[i]
msg=msg+f'''第{i+1}条:\n
【时间】{TIME_UTIL.nowStr()}\n
【标题】{r['orderingName']}\n
【统计时间范围】{TIME_UTIL.todayStr()} {time_range}\n
健康码负载均衡设备最近{hour_decrement}小时最大流入带宽为{r['最大流入带宽']}MByte/s(设备支持最大流入带宽5000Mbps)。\n\n'''
if i<(len(dataset)-1):
msg=msg+'---'+'\n\n'
print("5.消息合并及钉钉报文格式::------------------------------------")
print(msg)
sendMarkdown(msg)
return msg
#麻烦调试
#发送给多个钉钉
def sendMarkdown(msg):
# 监测告警播报
# DINGDING_UTIL.sendMarkdown(msg,'http://192.156.45.204:9530/robot/send?access_token=701875dfea9c6b9a5de2a92a9200b3cd155039e6b0a346e7eeb7f22738c1a8ec','SEC73005e5e8797e86626917e12f9b7244f1b512404be051f7a90dd9ade9599e817')
# dataflux
# DINGDING_UTIL.sendMarkdown(msg,'http://192.156.45.204:9530/robot/send?access_token=0e6853404b1c41fe2e970bfddcf118ae5e54f7d1d7b0e84fc49cda567339da05','SEC9ef071a749594c8262889254004ccf038506177c0ae9f537454f29c92b6c5c91')
pass
#测试
def test_hello_world():
'''
Test hello world function
'''
assert hello_world('Tom') == "Hello, world! Tom"
return 'OK'