OpenNMS提供了一个工具mib2opennms用于将snmp trap的定义转换为OpenNMS中的事件。eventconf.xml文件定义了OpenNMS中的内部事件及外部事件(snmp trap),而且这些事件定义的顺序也至关重要,因为当在通过snmp trap做事件匹配时,只会触发第一个满足匹配条件的事件。所以对于一个给的的snmp trap,如果需要针对不同的variable binding取值做过滤,就需要定义多个事件,这样就会导致eventconf.xml文件迅速膨胀,为了更好的维护该文件,又引入了元素,该元素用于包含其他事件定义文件,通过这种方式,就可以将一部分事件的定义转移到其他文件中,从而为eventconf.xml文件“减负”。例如:

 

   
   
   
   
  1. <event-file>/opt/OpenNMS/etc/events/3Com.events.xmlevent-file> 
  2. <event-file>/opt/OpenNMS/etc/events/APC.events.xmlevent-file> 
  3. <event-file>/opt/OpenNMS/etc/events/Brocade.events.xmlevent-file> 
  4. <event-file>/opt/OpenNMS/etc/events/CIM.events.xmlevent-file> 
  5. <event-file>/opt/OpenNMS/etc/events/Cisco.events.xmlevent-file> 
  6. <event-file>/opt/OpenNMS/etc/events/Fore.events.xmlevent-file> 
  7. <event-file>/opt/OpenNMS/etc/events/HP.events.xmlevent-file> 
  8. <event-file>/opt/OpenNMS/etc/events/Intel.events.xmlevent-file> 
  9. <event-file>/opt/OpenNMS/etc/events/Microsoft.events.xmlevent-file> 
  10. <event-file>/opt/OpenNMS/etc/events/Novell.events.xmlevent-file> 
  11. <event-file>/opt/OpenNMS/etc/events/Oracle.events.xmlevent-file> 
  12. <event-file>/opt/OpenNMS/etc/events/SonicWall.events.xmlevent-file> 
  13. <event-file>/opt/OpenNMS/etc/events/Xerox.events.xmlevent-file> 
  14. <event-file>/opt/OpenNMS/etc/events/Standard.events.xmlevent-file> 

这些被包含的文件必须以元素为根元素,在这之间加入元素用于定义事件,定义方法与eventconf.xml文件中相同。所有的snmp trap对应的事件都按厂家放在一个文件中,并且在OpenNMS启动过程中按顺序依次加载,所以这些文件被加载的顺序,即被包含的顺序也非常重要。通过这种方式,就可以有效的将所有外部事件分离出去,而在eventconf.xml文件中只需要保存OpenNMS的内部事件即可,而且这些事件先于外部事件被加载。在eventconf.xml文件的最后,是包含通用的默认事件,它总是放在最后被加载。

这里有几个提示:

  • 由于系统在匹配事件时,是会顺序扫描所有的事件,所以尽可能去掉那些你不会用到的事件,包括文件
  • 如果你需要对某个事件文件做定制,例如,对3Com.events.xml文件做定制,可以先拷贝3Com.events.xml文件至my.3Com.events.xml文件,然后在该文件中做修改,并且将该文件先于3Com.events.xml文件包含至eventconf.xml文件。这样在未来,当默认的3Com.events.xml文件需要修改时,你的工作会很轻松。

例如,如果我们要去掉rtc的登录事件,既不显示该事件,也不保存该事件,我们可以将如下事件定义添加至eventconf.xml文件,注意,它的顺序要在uei.opennms.org/internal/authentication/successfulLogin事件之前:

 

   
   
   
   
  1. <event> 
  2.    <mask> 
  3.      <maskelement> 
  4.        <mename>ueimename> 
  5.        <mevalue>uei.opennms.org/internal/authentication/successfulLoginmevalue> 
  6.      maskelement> 
  7.      <varbind> 
  8.        <vbnumber>1vbnumber> 
  9.        <vbvalue>rtcvbvalue> 
  10.      varbind> 
  11.    mask> 
  12.    <uei>uei.opennms.org/internal/authentication/successfulLoginuei> 
  13.    <event-label>OpenNMS-defined internal event: a user has successfully authentication to the WebUIevent-label> 
  14.    <descr> 
  15.      This event is sent by the WebUI when user rtc has successfully authenticated 
  16.    descr> 
  17.    <logmsg dest='donotpersist'> 
  18.      OpenNMS user %parm[user]% has logged in from %parm[ip]%. 
  19.    logmsg> 
  20.    <severity>Normalseverity> 
  21.  event> 

 这样,我们就能够有效的屏蔽掉rtc成功的登录事件。

为了使对eventconf.xml文件的修改能够立即生效,其实不需要重启OpenNMS,只需要通过OpenNMS提供的send-event.pl脚本发送uei.opennms.org/internal/eventsConfigChange事件即可通知OpenNMS,告知其eventconf.xml文件改变了需要重新加载。另外OpenNMS还提供了send-trap.pl用于发送snmp trap。

可以直接在数据库中查看事件,特别是可以通过执行SELECT eventparms FROM events WHERE eventid=204;来查看事件所对应的参数,例如:

 

   
   
   
   
  1. SELECT eventparms FROM events WHERE eventid=204
  2.  
  3.                                                         eventparms 
  4. --------------------------------------------------------------------------------------------------------------------------- 
  5.  ds=http(string,text);value=11.75(string,text);threshold=100.0(string,text);trigger=3(string,text);rearm=50.0(string,text) 
  6. (1 row) 

这例表示了一个highThresholdRearmed 事件的所有参数,它们也可以用于事件过滤。由于事件很多,所以很容易导致数据库膨胀,所以对于不再有用的事件可以进行删除,然而由于在数据库的故障表及通知表中可能会有外键依赖于事件表,所以只能删除那些没有外键依赖约束的事件,可以通过如下SQL语句来实现:

 

   
   
   
   
  1. DELETE FROM events WHERE eventid NOT IN (SELECT 
  2. svclosteventid FROM 
  3. outages) AND eventid NOT IN (SELECT 
  4. svcregainedeventid FROM outages); 

至此,OpenNMS的事件介绍就全部结束了,后续将继续介绍OpenNMS的通知机制。