首页 > 代码库 > 交换机监控
交换机监控
交换机需要采集的指标项包括:电源、端口状态、端口映射(物理端口&逻辑端口)、温度、内存、cpu(最大cpu、平均cpu)、端口出入流量(需要计算峰值流量)、端口带宽使用率等,其中分品牌采集不同的指标,主要有四个品牌,brocade、blade、vdx、huawei,分别采集不同的指标,其中brocade全部指标都有采集到。采集维度是1分钟。本文主要介绍交换机监控系统后台逻辑。
监控指标主要是带宽使用率、流量波动值(波动比)、cpu使用率、内存使用率、温度、端口状态(up->down)、端口衰减,同时需要统计各个ope(运营商)的流量峰值和流量总和。
公司的交换机大概有120多台,登记于CMDB,信息包括ip、名称、带宽信息、负责人、固执编号、品牌型号、端口总数、价格、购买日期、质保年限、IDC机房、机架、体积U数、上架时间、状态、相应级别、备注。我们系统需要的信息主要是ip、名称(告警信息展示)、负责人(主要为基础运维组)、品牌型号、带宽信息(包含ope和对应的物理端口登记、带宽)。
了解完交换机的大概之后就是程序了。程序的架构逻辑也很简单,使用snmp v2采集信息:首先配置好采集客户端的路由和snmp配置,然后从CMDB获取交换机信息,接着就是采集、上报、展示、解析告警了。配置路由主要由基础运维配置后提供,需要什么客户端直接报给他们,他们帮忙配好即可。以下是程序的架构:
考虑到容灾和方便横向扩展,所以增加了一个ip调度中心,将CMDB的ip随机分配到各个采集agent中,采集agent分布在不同机房,一旦机房不可用则可以根据调度中心将ip分配到其他机房,而如果想横向扩展则可以增加agent,配置好snmp环境和路由,修改调度中心配置即可。
后台程序主要分为三个部分:ip调度中心、采集客户端、解析告警。
一、ip调度中心
由于调度中心实现功能比较简单,只是根据客户端随机分配相同数量ip给采集器。所以我没有专门写一个c/s程序,只是简单写一个公用接口,挂在开放接口【运维监控系列文章会介绍】名下,由各个采集器去调用。
调度中心配置包含所有的采集器ip,一旦有采集器调用,则会去CMDB获取交换机信息,然后平均分配给各个采集器,因为从CMDB获取的信息是固定顺序的,所以每次分配给各个采集器也是固定的ip列表,如果CMDB增加了ip,则一般会被分配到最后一个采集器上,不会漏掉。很容易看出,这其实不是随机算法。(其实是懒,要写到真正随机只能写一个c/s程序,由服务端产生随机数,一次随机分配到各个客户端。而不是由客户端去调用接口,每个客户端都需要调用一次,一旦同时调用,服务端就无法准确分配)。如果增加了采集器,则只需要在配置agentList里面添加多该采集器ip即可。代码如下(sql语句部分字段被我修改了):
1 def getConf(db): 2 retInfo = {} 3 sql = ("select id, ip, model, width, name from " 4 "switchConf where currentStatus=3 and ip > 0 " 5 "order by id asc") 6 code, count, errMsg = db.doSql(sql) 7 if 0 != code: 8 return retInfo 9 10 info = {} 11 ipList = [] 12 res = db.getRet() 13 for each in res: 14 ip = int(each[1]) 15 brand = each[2].strip() 16 bw = each[3] 17 name = each[4].strip() 18 if ip in info: # 过滤重复的交换机ip 19 continue 20 ipList.append(ip) # 顺序插入list 21 info[ip] = dict(brand=brand, bandWidth=bw, name=name) 22 23 agentNums = len(agentList) 24 ipNums = len(ipList) 25 step = ipNums / agentNums 26 start = 0 27 for index in range(agentNums): 28 agent = agentList[index] 29 retInfo[agent] = {} 30 if index == agentNums - 1: # 最后一个break 31 break 32 stop = start + step 33 for i in range(start, stop): # 按顺序获取前面的ip列表 34 ip = ipList[i] 35 retInfo[agent][ip] = info[ip] 36 start += step 37 for i in range(start, ipNums): # 获取剩下的所有ip 38 ip = ipList[i] 39 retInfo[agent][ip] = info[ip] 40 41 return retInfo
二、采集程序
三、解析告警
四、展示
原创文章,请勿转载。知识交流讨论请加qq:1130010617。谢谢合作。
交换机监控