8.1
- hex内置函数直接将十进制数转换成十六进制
把十六进制等其他转回十进制可以使用eval 、eval ('0x3d') 就可以将16进制转换成十进制
- 数据库的集群配置得在同一个网段?zabbix的主备使用的是代理模式,正常情况下代理端指向主的数据库,异常情况可以改变为备数据库,代理端可以理解为一个zabbix服务端
- 集合真是个好东西,快速进行两个列表的比较,
- pymysql模块中使用conn对象创建的cursor对象,可以添加参数as_dict=true来输出字典
- sql语录的in判断where id in(1,2,3,4)
- 集合中的元素不能是字典,字典是不能被hash的,
删除列表中符合条件的某个元素,可以使用l.index找出元素的位置,再pop索引位置删除
8.2
- 整理了一天模板,思科路由器交换机模板通用,hp服务器使用ilo模板,已经集成到了hp snmpv2,有一些没得需要参照mib文件实际添加。
8.3
- 又浪费了一个美好的周末,浪费了48小时,真是闲的蛋疼,也不知道培养啥兴趣,另外哪儿托真好看。
- 有时候当下想不起来的东西,在某个瞬间就会思路通畅。
8.4
- 在参数的配置中,能拆分的尽量拆分。
- django orm 模型的多对多关系,还有多个字段对应同一张表的时候出现的问题,详情看django 的多对多。
- 模块的抽象尽量不要有啥联系
8.5
- Ubuntu真的难用
8.6
代码的优化问题,像今天一共有十二条数据,每个都要执行一次获取结果传值,使用了for便利了所有sql语句,就执行了12次,在数据库中,每个cursor对象都是宝贵的资源,不能这么浪费。尽量在一次查询中拿出所有的数据,可以拿出所有的条件,进行where xxx in (一个元祖,我们的条件),在进行sql占位匹配的时候,%s不好用,尽量还是用{}.foramat形式,而且in 后面的条件查询只接受元祖类型,记得转换格式,
当sql语句为 "select * from user where name = %s"这种类型的时候,对%s进行填充的参数为execute的第二个参数,
在使用cursor.execute(sqzl,占位参数)
还有一个cursor.executemany方法,一次执行多个sql语句
条件现在做的是一个映射表,维护起来不方便,可以考虑将其构造成一个数据库表使用zabbix_trapper方式进行监控的时候,zabbix_sender需指定的参数有-z 主机ip -s主机名字 -k自定义key(只是一个传值的形式键) -o 表示的是传的真实值
对于多名字的监控像,像网络链路这种的,一个NAME对应一个key,在创建自动发现规则的时候,设置为zabbix_trapper方式,定义一个key,在后台就可以使用zabbixsender给这个key发送所有的宏 {#NAME}:xxx,这样,这个{$NAME} 宏变量就可以在监控项原型触发器原型中使用了。更改完celery任务后,先在supervisorctl中关闭celery进程,删除项目的celery-schedule文件,再重启celery任务,
- 在将solarwinds的告警信息映射到监控系统中时,
- 深度系统,真香
firefox浏览器挺好用,国内不限制,可以各种端同步。
8.7
- mssql中的一个字段是uuid对象,直接在数据库中存储的数据是uuid值。取这个字段出来的时候是一个uuid对象。要获取到存储的uuid串可以对对象使用str函数进行强转换
- 各类监控产品逻辑都差不多,
- sys的argv是一个属性,不是一个方法,不用加括号,返回的是一个参数列表,可以作为一个接收参数的桥梁,按下标进行取值
- os执行linux方法可以用os.system会直接打印出命令执行的结果,他的返回值是一个执行状态值,0表示执行成功,非0则失败,如果不想要直接打印命令执行结果,可以使用os.popen,也可以执行命令,返回值有read方法。可以得出执行结果,不过结果中自带一个换行符,需要强制去除
- 深度系统可以在配置文件中配置它的主题 usr
- 判断文件是否存在的需求,想的用脚本的方式走,参数接收ip及文件名,一开始想的还是在脚本中执行ssh链接到主机,再用os来判断文件是否存在。 但是这样还需要用户名密码,还得提变更申请。
换一种思路,因为使用的是外部检查,脚本是放在server端的,就像在server端执行一条zabbix_get 配置zabbix的监控项vfs.file.exist[filename]来查找对应的文件,一样,在脚本中执行这条命令就可以。print他的返回值,就可以在zabbix端收到相应的数据。 - 在使用自动发现监控项原型创建出的监控项,如果取消掉其中一个监控项,会有一个延迟删除时间,在这段时间内,这个监控项还是在的,只不过后面的有一个黄标,表示在延迟时间后删除,也可以手动删除,
8.8
- zabbix 监控web页面的key web.page.regex[ip,url路径,port,对返回值可以使用的正则表达式,允许输出的内容] 相比较web.page.get[],后者只是去简单的get页面,拿到的时相应包,不做任何处理,所以还是regex好用一点,有个问题就是get取到的响应包是302的重定向,为啥
web.page.regex[127.0.0.1,/admin/,8080,"HTTP/ (.*) OK","\1"]
这样就可以提取出响应的状态码200 - 对于触发器的配置,除了可以正常的在页面点选意外,还可以手动的将两个监控项进行搭配使用
正常的表达式 agent.ping <> 1 报警
手动的 表达式1 比较符 表达式2 ,将另一个监控项的结果作为另一个监控项的判断条件 - 对于py脚本,在文件头申明解释器路径,类似于
#!/bin/bash
py的申明可以是#!/usr/bin/python3
也可以从环境中获取#!/usr/bin/env python3
创建完脚本后,也时需要授权,chmod +x xxxx.py 然后 ./ 脚本名执行。 - 对于迈普设备和思科设备的告警合并,迈普的sql语句查出来的正常ip值先存放一个cache,到了下次task执行获取到正常ip值,将后取到的ip值跟先前cache里存的正常ip值进行比较,这里使用的set,采用集合的形式去做比较,上一次值中有的,下一次没有,意味着这个ip值错误了,用a.difference(b),b.difference(a),两次比较产生错误的ip数和回复的ip数,再讲这个错误ip数单独存一份cache,专门对错误的ip进行统计,有报错的就添加进去,有恢复的就剔除出去,最后再和思科的告警信息合并,就是最终呈现的告警信息。
- datetime.datetime.now()获取的时当前日期,可以直接对这个对象使用strftime('%Y%m%d')进行格式化输出日期。
datetime.timedelta(days=1)是一个时间跨度对象,可以跟now对象做加减,表示日期的前后跨度。
%Y表示的是4位年信息,%y表示的时2位年信息
src = "127.0.01"
dst = "172.0.0,1"
netstat -an|awk -v src=$src -v dst=$dst '/ESTABLISHED/{if ($4 == src && $5==dst){a=1}}END{if (a==1) {print 1} else {print 0}}
8.9
- 对于监控项的定时监控设置:默认的监控项没有定时这个功能,只有一个自定义间隔时间,是设置周期的,需求是对于某个时间后的文件存在进行监控,可以换个思路,在触发器的设置中,有一个time函数,格式是
100000
时分秒 代表的是 十点零分零秒,触发器表达式:{xxxxx.time()>100000} and {xxxx.last()=0}和管辖,配合另外的监控项 就可以构造出在十点以后,某个监控项的最新值是0的时候就报警,就可以完成定时的对监控项实现定时执行的效果,
触发器还可以设置依赖关系,一个触发器依赖另一个触发器的触发 - pyexcel_xlsx模块挺好用的,函数save_data('xxx.xlsx',data)直接接受两个参数,表格文件名,二维数组数据对象或者orderdict对象,
二维数组 [[列1的值,列2的值],[列1的值,列2的值],[列1的值,列2的值],]
这样的sheet名是系统定的orderdict对象 from collection import orderdict {'sheet1_name':[一个二维数组数据对象],'sheet2_name':[一个二维数组数据对象],}
这样就可以定义sheet名 - 对于代码的健壮性,尽量考虑报错的场景,多用get,
8.12
- 中间变量用的太多会不会造成一些问题。
8.13
- 在部署项目的时候首先在家要把要用的包都下载好,因为在现场是不能连外网的。安装好环境之后,就可以部署软件了。需要的mysql,redis,nginx都可以在114的repo上下载,如果没有的话也需要提前准备。
- 因为新上的消息平台跟原来的监控系统也有联系,所以在更新监控系统的时候,遵循操作手册,先把所有涉及的项目先备份,然后替换要更换的文件。
因为监控系统主服务及celery和一些命令格式都是用supervisor来管理的进程,所以在用supervisor来启动这些进程的时候,就打开日志文件,以确保服务的正常启动。当感觉更新不稳定的时候,时刻准备将代码退回到备份档。因为supervisor有大概两分钟的重试时间,超过两分钟的话,如果服务不可用,立马退回备份档,以确保生产环境不受影响,然后查看日志信息查错再准备更新。 - 今天在上线消息平台的时候,因为测试的那期间监控系统时没有报错的,当看到消息平台半天没动静,以为代码出问题了,就给回退了,然后一直发不出消息,这是一种对自己代码的没信心,然后就在那盲目的瞎找问题,浪费了很多时间,正确做法是,对自己的代码逻辑清晰,知道哪儿在哪,即使是出了问题,首要是去查看日志,而且以后在代码中要对错误日志的logging即使进行记录,try except也要多用,这样才能发现问题。即使排除
- 在监控系统发消息的拦截部分中,今天明明设置拦截了,但是没有及时生效,也浪费了很多时间,莫名其妙的产生的bug,而且在send_msg中因为拦截了消息,进行消息转发,但是在连接的close中没有进行处理,在close进行了处理,接触bug,
- supervisor的使用,由python编写,安装supervisor 用systemctl启动supervisord.service服务,在/etc/supervisor.d/目录下配置我们的进程管理.conf文件,需要在/etc/supervisor.conf中的最后include中修改为 ./supervisor.d/*.conf
- zabbix中修改触发器的时候,需注意触发器的更新时间,否则立马更新后使用的还是先前的触发器,会造成误报警。
8.14
- 数据结构的优化是有很大空间可以压缩的,只要方法作对,瞬间可以省去很多代码,还都可以达到目的。
- 使用zabbix的api来创建虚拟主机可监控项触发器,配合使用zabbix_sender方式可以完成其他业务的的告警集成到zabbix告警系统
- 今天将测试环境的监控系统告警发送转移到消息平台,测试环境的send_msg直接夯住了,没找到原因
8.15
- 更到生产环境,心里就是没底,特别没底,就怕出问题。
- 消息平台运行成功,另外以后还要把代码中的print去掉,不要遗漏
8.16
- 数据结构的拼接还是个大问题,一个好的数据结构可以省去很多的事情。更高效。
- 变量的申明,最好是见名知意的那种。
- dbeval很好用,还可以生成表之间的ER关系图谱
- 对于websocket,需要在consumer中创建生成数据的函数,然后在routing文件中创建相应branch的url
8.19
- 做客户的poc测试,需要提前沟通好,需要的设备信息,需要使用的测试包,包括license,甚至是linux的镜像源,当前我们使用的是centos的7.4版本。所有能考虑到的地方都要准备好。
- 进行poc测试看poc手册。
- 各个功能软件的ip连接,需要把各自的hosts内容都配置好,要学会多利用日志报错来查看问题所在点。
8.20
- 使用pyinstaller进行py文件的打包处理。
- 在写脚本的时候,健壮性是前提,对于可能取不到的值,可以提前进行变量的申明,
- 今天在fping脚本的编码中,我的想法是同一个脚本执行多次然后分别取出想要的loss值,delay值,status值,但是这样会很繁琐,而且效率很低。奇哥的写法是直接一次执行,所有结果都取到,然后构造成一个字典,将每个值匹配一个key,在zabbix执行的时候,传入一个key值,根据key值的不同来取出相应的值,
还有就是在配置userparamsters的时候,直接配置三个不通的监控项,依次取值,这个真的很强。 - 跟用户沟通,需要明确需求,列出清单,一项一项的走。而且今天中午明明我把包放进文件夹了,到了客户打开里面竟然是空的,还好没有清空回收站,才恢复了,而且当时我没有声张,其实这个没啥,想太多了,那时是可以停下去拿到最新的包,不能去拿没有把握的包去部署,这次是幸运恢复的是最新包,万一错了,那时间成本可能就划不来了。下次不能在再这样了
- win7中打的包在2003,xp上不能使用,考虑用go来编译一个客户端。
8.21
- go的交叉编译是一个很吊的东西,解决可很多的依赖,用go来编译安装包,依赖文件不像py那样需要把整个py环境打进去,而且不存在win7打出的包xp和2003不能使用的情况,go编译出来的包,兼容性很强,跨平台使用不成问题,
- fping在windows平台和linux平台中参数是不一样的,显示的结果也是不一样的,在go中调用命令拿到的返回结果跟终端显示也是不一样的
- django2.x在url的设置中做了变化,不再使用^ $来配置url,如果要使用正则匹配url,需要使用re_path,而且在path中,内置了几个数据类型来进行url中的正则匹配。默认的就是str,如果要强制定义,使用来正则匹配。
- go中的切片,字符,整形判断概念忘了个差不多,代码全靠百度,
- go程序的参数传入,if判断,swith case语法,编译包的使用及参数调用。
- datetime.datetime.fromtimestampt(时间戳),直接转成的日期对象可以直接和mysql中自动添加datetime对象作比较,不再像原来一样还需要先进行时区的指定。
8.22
- 多使用cache中的数据来处理,在做dco报表的时候,event中的数据已经包含了想要的数据,可以使用tag和分组group来进行分类,在做tag的时候,cache中包含了所有触发器中的tag项,在cache中的显示是一个大列表中包含的tag,
- 每次在变更代码的时候注意备份,备份,备份,当要从备份中回复某个文件的时候,使用cp,不要想当然的使用mv,当某个时候想要整体回迁的时候,你就会发现你忘了mv了哪个文件了,到时候就哭吧。
- 使用zabbix sender发送数据,发出去的都是字符串数据,在zabbix中创建监控项原型的时候只要选择好数据类型,就可以显示了,但是当返回的数据字符串内部包含的浮点型数据,整形就匹配不了了,就得使用浮点型来显示数据了
8.23
- 能从内存中取数据是真的方便,减少查数据库
- 对xls ,xlsx表格分别使用xlrd openpyxl方式可以读取数据,操作数据,
- zabbix的item对主机直接取是可以拿到所有的数据的,包括主机创建的监控项和自动发现中监控项原型映射出来的监控项
- 25号才发现更新的代码还有一处没有完成改变,问题还挺大的,明天去更改下,真的是,以后只要有代码变动就的记下来,不然过些日子就忘的一干二净了,还有每天的工作内容也得开始罗列清单了,脑子并不能记所有的东西
8.26
- 今天碰到一个列表里包含多字典的数据结构,对列表遍历取值,做条件判断,当满足条件的最数据处理,并且从列表中remove删除,但是在打印的时候却没有删除,为啥?
- 突然要接手两个项目,全新的练手,我了个去,亚历山大,表面风平浪静,实际上慌得一批啊
- django的后台关联模型的名称展示需要定义__str__方法,
- 在go中修改文件权限,在windows中是没有啥作用的,linux系列中直接chmod(文件名,权限码 0777),go中有四种读写文件的方法
- 在zabbix汇总的userparamsters中配置的自定义监控项,当要对监控项进行传值 的时候,可以使用
xxx.xxx[*],自定义脚本的执行命令 "$1" "$2" "$3"
, 重启zabbix服务,使用zabbix_get -s 本地ip -k 自定义监控项[参数1,参数2,参数3...]
注意,这里的的参数是不用加""
的 - 今天还听到说类可以不执行init方法直接调用?怎么做?
- django自身就支持原子性,支持事务
- 序列化器是支持自定义返回数据的
- request.post.data()接收到request对象是不能直接添加数据的,可以使用浅拷贝然后就可以想字典一样使用了,然后在serialize指定data的时候使用这个浅拷贝的数据对象
8.27
- zy业务视角大屏和用户视角大屏用的是两个django命令,执行函数生成的cache数据,数据时从oracle库中获取的数据,使用的类似sqlarchmy连接oracle数据库来执行sql语句获取数据。
- 当openpyxl保存文件到指定路径的时候,可以在文件名中直接写成绝对路径或者相对路径,zy的DCO分组发邮件的时候是按组来发送的,给一个组底下所属人员都发邮件,在邮件中的附件需要指定这个excel表格,如果直接使用绝对路径的文件名,发布出去,因为邮件在加附件的时候会把绝对路径中的
/
进行转义,导致附件加不上,邮件发布出去,然后我在绝对路径的文件名字符串之前加了r
,使/不转义、再测就可以发送成功了 - IBM的aix小机,性能介于移动pc和服务器之间,不能使用命令补全,删除这些操作,所以在这里执行任何一个命令都是要非常谨慎的,千万千万要谨慎。另外go中的aix编译有问题。
- 监控中间件的脚本走得就是java的api
8.28
- 客户沟通,不能确定的东西,说回去商量,不能懵。
- 自定报表的更新时间,原来想法是用周期天数去做时间的加减,然后在判断这个时间是否符合条件再执行,后来改成了直接在表中创建一个下次更新时间,直接在每次执行的时候对这个时间进行加周期操作,得到一个未来的事件,然后任务每天取下次更新时间满足的对象来执行, update_time__lte = now;
8.29
- zy的网路连通性检测中,大屏中的数据和网络连通错误数据分别对应的两个缓存,不过存在一个问题,他们的人在添加的时候可能同一个地方添加多2条以上的链路,现行的判断逻辑是两条联络路断就认为是双线终端,所以在作报告的时候构造一个字典对象,以地名为键,值为一个列表,只要有错误,就把运营商的类型加进去,之后再对这个字典进行取值判断列表中元素数量的判断,大于2的就认为是重复的,为1的直接在构造问题的时候就把它添加进去。
- 给ym的部署中给想错了,差点给忘了用go打包,忽然想起来才改掉,go打的包,真香
8.30
- zy的solarwinds设备在新加的时候需要注册模板,只有吧模板添加上,才会在数据库中查到该主机ip,另外对自己的代码要有信心,敢于去质疑他们的问题。
- zabbix的search是模糊查找,只能针对一个,filter是精确查找,可以对于一组元素。