作者微博:http://weibo.com/tianchunfeng

CloudStack 4.2 版本发布在即,相信不久后对 4.2 版本新功能(共有13个)的介绍会逐渐多起来。因为无论是从架构底层的重构还从构建更灵活的IAAS功能上,CloudStack又上了一个新台阶。在这诸多的更新中,我想介绍一下CloudStack对事件机制的增强,使用SNMP协议对CloudStack进行监控。可能这个改进比较小,或者对SNMP机制的支持还不够彻底,以至于4.2版本的ChangeLog里都没有提及它。毕竟对云平台运维的监控无论怎么强调其重要性都不过分,多一个监控视角就多一分运维保障。

在CloudStack 4.2之前的版本中事件/警告是在CloudStack内部完成生产和消费的,通过CloudStack Dashboard 和 Events菜单查看(如下图)。由于功能耦合度太高,不能把事件输出到CloudStack以外第三方监控系统中。在CloudStack支持插件机制后,与第三方监控系统的集成就能很方便实现了,目前CloudStack默认实现事件对SNMP和Syslog的输出。

CloudStack DashBoard

SNMP基础原理介绍:

SNMP(Simple Network Management Protocol的简称)是Internet协议家族的标准成员,工作在TCP/IP模型的应用层。几乎所有的主流监控软件(Zenoss,Cacti)都内置了对SNMP的支持,国内做监控服务很好的监控宝甚至提供了在线SNMP测试:http://www.jiankongbao.com/labs/snmp 。

一个SNMP管理系统的有以下必备组件(如下图):

1、被监控管理的设备;
2、SNMP Agent  运行在被监控设备上的代理软件;
SNMP Agent 使用UPD协议在161端口上接收请求。
3、SNMP Manager 运行在管理服务设备上的软件:
Network management system (NMS)
SNMP manager可以使用任意端口向Agent发出请求。SNMP Manager使用162端口接收请求。

SNMP监控网络中各角色的通信方式如下(如下图):

1、Manager可以对Agent发起:GET/SET请求(读/写)
2、Agent可以对Manager发起:  GET/SET请求
3、Agent可以对Manager发起:Trap请求 (异步方式)

以上三种通信方式有不同的使用场景。

在日常运维监控系统中一般使用SNMP的GET(读)请求了解被监控方的内部运行数据,也就是第一种通信方式中的GET请求,由监控系统把数据Pull拉过来。其实也可以使用第二/三种通讯方式,由被监控方主动把数据Push推到管理服务器中。

CloudStack使用SNMP向监控系统提供事件类非连续的字符消息事件,最合适的通信方式是使用第三种Trap方式,当有事件发生时主动把事件Push推到外部第三方监控系统中。

由于被管理设备种类繁多,每个设备可以有不同的被管理对象,并且生产设备是一种市场行为,这导致SNMP协议本身不可能预先指定被管理设备对象的识别代码。因此SNMP把设备识别的标准定义工作外包给了第三方机构IETF和IEEE 。这就是MIB数据库(management information base)。

MIB是树状结构组成的,在最末端的叶子节点是OID( object identifiers ),每一个OID对应唯一的变量名。SNMP网络中的管理方和被管理方就是靠这些唯一的变量名进行交换数据的。既然MIB是一个数据库,自然可以对预先指定的被管理对象进行浏览,查询。推荐给大家一个工具:snmpB http://sourceforge.net/projects/snmpb/ 。

CloudStack使用的MIB分支是:1.3.6.1.4.1.18060.15 ,其中 18060 是分配给apache的代码,15是分配给CloudStack的根代码,所有CloudStack的SNMP OID代码都在1.3.6.1.4.1.18060.15 分支下 。

CloudStack中Trap事件的SNMP映射定义:

在CloudStack发送的事件消息中每个Trap消息都包含以下共同的数据:

  1. message
  2. podId
  3. dataCenterId
  4. clusterId
  5. generationTime

在CloudStack 4.2中共定义了如下trap消息:(所有数据都以全局配置阈值为基准)

  1. availableMemory : 可用内存
  2. availableCpu :  未分配的cpu
  3. availableStorage :  可用存储
  4. remainingStorageAllocated : 保留的未分配存储
  5. unallocatedVirtualNetworkpublicIp : 未分配的public IP数量
  6. unallocatedPrivateIp :未分配的私有IP数量
  7. availableSecondaryStorage : 二级存储中可用量
  8. host : 与主机相关的警告
  9. userVmState : 用户虚拟机异常停止
  10. domainRouterVmState : Domain Router 虚拟机异常停止
  11. consoleProxyVmState : CPVM异常停止
  12. routingConnection : 与默认路由的链接丢失
  13. storageIssueSystemVms : 系统虚拟机中存储有问题
  14. usageServerStatus : usage server未运行
  15. managmentNode : 管理网络CIDR没有配置
  16. domainRouterMigrate : Domain Router 虚拟机迁移不成功
  17. consoleProxyMigrate : CPVM迁移不成功
  18. userVmMigrate  : 用户虚拟机迁移不成功
  19. unallocatedVlan : 未分配的VLan数
  20. ssvmStopped : SSVM异常停止
  21. usageServerResult :  Usage job failed
  22. storageDelete : 删除存储池失败
  23. updateResourceCount : 更新资源计数失败
  24. usageSanityResult : 使用合理性检查
  25. unallocatedDirectAttachedPublicIp :未分配的共享网络IP数
  26. unallocatedLocalStorage : 剩余的未分配本地存储
  27. resourceLimitExceeded : 超过限制的资源数

以availableMemory为例,SNMP OID的原始消息描述如下:

availableMemory NOTIFICATION-TYPE
OBJECTS {
dataCenterId,
podId,
clusterId,
message,
generationTime
}
STATUS current
DESCRIPTION
“Available Memory below configured threshold”
::= { csAlertTraps 1 }

详情查看:https://cwiki.apache.org/confluence/download/attachments/30747160/CS-ROOT-MIB.mib?version=1&modificationDate=1362442825000

CloudStack SNMP 事件机制的设计需求(原文):

-          生成可被外部监控系统识别的SNMP traps,外部设备包括SCOM/OpenView等 。
-          生成的traps要兼容SNMP v1、v2,优先支持v2。
-          提供必须需的MIB信息
-          能够指定trap消息发送的接收方,即trap listener。
-          traps消息包含事件严重级别和SNMP 警告的条件实体。
-          可指定多大20个外部traps listener 。
-          支持根据事件严重级别,配置相应的traps listener。
-          支持通过api进行注册traps listener和警告类型。

CloudStack中cloud-plugin-snmp-alerts项目介绍:

eclipse中项目名称:cloud-plugin-snmp-alerts

代码文件路径:[GITDIR]/cloudstack/plugins/alert-handlers/snmp-alerts/

SNMP相关类:

  • SnmpHelper
  • CsSnmpConstants
  • SnmpEnhancedPatternLayout
  • SnmpTrapInfo
  • SnmpTrapAppender

以上五个Java类的关系是:

1、根据log4j中appender的配置,由SnmpTrapAppender 接收Log4j的LoggingEvent日志事件;
2、根据SnmpEnhancedPatternLayout的描述转换成SNMP需要的SnmpTrapInfo格式;
3、使用SnmpHelper发送给外部的SNMP Manager;
4、CsSnmpConstants是辅助类,提供静态的MIB OID配置信息;

CloudStack中的事件输出是由日志驱动的,对log4j日志文件的修改如下:
文件名:log4j-cloud.xml
修改内容:
<appender name=”SNMP”c2 c12″ style=”font-size: 12pt; font-weight: bold;”>SnmpTrapAppender”>
<param name=”Threshold” value=”WARN”/>
<param name=”SnmpManagerIpAddresses” value=”"/>
<param name=”SnmpManagerPorts” value=”"/>
<param name=”SnmpManagerCommunities” value=”"/>
<layoutc2 c12″ style=”font-size: 12pt; font-weight: bold;”>SnmpEnhancedPatternLayout”>
<param name=”PairDelimeter” value=”//”/>
<param name=”KeyValueDelimeter” value=”::”/>
</layout>
</appender>

本文从SNMP运行原理的角度介绍了CloudStack使用SNMP把事件输出到第三方外部监控系统的集成方法。希望能对关心CloudStack运维关心的朋友有所帮助。下一篇将介绍SNMP监控的实例演示。

本文首发:CloudStack-china中国社区

CloudStack 4.2 新功能:集成SNMP进行系统监控(原理篇)的更多相关文章

  1. unity5.0新功能-布料、动画系统

    原作者:只待苍霞 这一章讲一下布料系统, 这次的布料系统有很大的改良.Unity4中, 需要对SkinnedMeshRenderer使用SkinnedCloth, 或者对Cloth Renderer使 ...

  2. ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统

    Zabbix5以来的新版本与以前的版本除UI界面变化较大外,在很多功能上也有许多亮点,我这里计划安排1个系列来和大家交流一些新功能的使用,这是第一篇:使用Webhook将告警主动推送至第三方系统. 首 ...

  3. Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...

  4. 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  5. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  6. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

  7. SQLSERVER2014中的新功能

    SQLSERVER2014中的新功能 转载自:http://blog.csdn.net/maco_wang/article/details/22701087 博客人物:maco_wang SQLSER ...

  8. PostgreSQL9.6新功能

    PostgreSQL是世界上最先进的开源数据库,9.6最新版本由PostgreSQL全球开发者今天发布. 此版本将允许用户纵向扩展(scale-up)和横向扩展(scale-out)来提高数据库的查询 ...

  9. SCVMM之Windows Server2012 R2新功能

    在Windows Server 2012 R2中可以通过使用共享的虚拟硬盘VHDX文件的方法来模拟IP SAN,来为虚拟机创建群集提供共享存储.这样为虚拟机创建群集时就不用再像以前一样通过使用软件模拟 ...

随机推荐

  1. Qt 错误: 无法运行 release 下的可执行文件

        学习Qt有一点时间了,但之前都是在debug版本下进行编译运行,偶然切换到release版本下,却出现了如下错误: 错误提示:   This application failed to sta ...

  2. QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  3. JNI_Java Native Interface

    一.简介 Java Native Interface(JNI),java与c/c++交互的接口,下面是一个简单是示例. javah 可以生成native方法对应的头文件,javap 可以查看方法或者属 ...

  4. ListView上拉刷新和分页加载完整的Dome

    很多人工作的过程中都会碰到ListView下拉刷新和分页加载,然后大多数公司都已经把框架写好了,大家直接用就可以了,有些人一直对这个事情处于迷茫状态,为了让大家对上拉刷新和分页加载有一个比较全面的认识 ...

  5. Cocos2dx项目移植Android平台

    链接地址:http://blog.csdn.net/iuncle/article/details/24772183 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.Classes目录下存放. ...

  6. VMware Workstation9安装Mac OS X10.9系统

    链接地址:http://jingyan.baidu.com/article/aa6a2c142cef740d4c19c426.html VMware Workstation9.0安装Mac OS X1 ...

  7. c语言指针数组与数组指针

    一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...

  8. java Hastable使用

    jdk:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Hashtable.html Hashtable numbers = new Ha ...

  9. FLUSH TABLES WITH READ LOCK 锁全局

    [root@wx03 ~]# cat a3.sh mysql -uroot -p1234567<<eof use scan; FLUSH TABLES WITH READ LOCK; sy ...

  10. [产值分析]生产部KPI考核之产值分析

    接到新任务:设计统计电子和磁电公司生产部产值分析报表. 眼下状况: 1.电子公司:取最新单位价格*入库数量 2.磁电公司:取最低价格*入库数量(实际取价的时候又没有取到最低价) 假设计算出来的结果和財 ...