penNMS 体系结构
将 图 1作为参考,可以在供参考的组成与 OpenNMS 体系结构之间作具体的比较。图 2 显示了构成 OpenNMS 的各组件。
图 2. OpenNMS 的组件

在后端这一层,OpenNMS 使用 PostgreSQL作为它的 RDBMS。在前端这一层,它使用 Apache Jakarta Tomcat免费的 JSP 和 servlet 技术来提供灵活的可定制的用户界面。也可用以前基于 Perl 的用户界面。有几个管理实用程序是用 UNIX shell 脚本和 Perl 编写的。OpenNMS 使用一套与 图 1 中的监控、管理和控制组件相对应的并发 Java 任务来提供该功能。在图 2 中用圆圈表示的就是这些并发任务。
OpenNMS 守护程序:并发管理任务
OpenNMS 的监控、控制和数据收集特性是由一组称为守护程序(BSD UNIX 约定)的并发任务来处理的。表 1 统计了这些并发管理任务,图 2 中也描述了这些任务。
表 1. OpenNMS 中的并发管理任务
| 并发任务 | 守护程序名称 | 描述 |
| 操作守护程序 | actiond | 自动操作执行工具,用于根据入站事件自动操作(工作流)。 |
| 收集守护程序 | collectd | 从受管节点收集数据。 |
| 功能守护程序 | capsd | 对所发现的节点执行功能检查。它通常检查某个接口的端口,看它是否支持已知的服务协议。 |
| DHCP 守护程序 | dhcpd | 为 OpenNMS 提供 DHCP 客户机功能。 |
| 发现守护程序 | discovery | 对受管网络节点进行初始的发现以及持续进行定期发现。 |
| 事件管理器守护程序 | eventd | 管理来自其它并发任务的事件,并将它们存储到 RDBMS |
| 通知守护程序 | notifd | 向用户执行外部通知。 |
| 故障管理器守护程序 | outaged | 合并事件,以为每个受管节点/服务提供持续的历史故障视图。 |
| 轮询器守护程序 | pollerd | 定期轮询受管节点/服务,以决定操作状态。 |
| RTC 管理器守护程序 | rtcd | 实时收集数据,为用户定义的各类受管节点/服务提供可用性信息。 |
| SNMP 陷阱守护程序 | trapd | 处理 SNMP 陷阱(事件)。 |
| 阈值服务守护程序 | threshd | 根据属性值是否达到指定的阈值来监控受管节点/服务。 |
扩展 OpenNMS
在 OpenNMS 前端这一层,使系统适应特定垂直应用程序领域变得非常简单。这要感谢 JSP 技术的灵活性,Java 开发人员可以很容易地定制 OpenNMS 的用户界面。通过组合 JSP 文件和/或 servlet 编码,也可以方便地添加新的 NMS 应用程序逻辑。
OpenNMS 带有健壮的、用于受管设备/服务的 SNMP 支持。SNMP 是目前业界用于可管理设备/服务事实上的标准。该标准使 OpenNMS 可以管理大量在 TCP/IP 网络上存在的设备。
在 SNMP 之外,OpenNMS 还可以检测和管理现在流行的软件服务(FTP、文件服务器和数据库服务器等)。它提供了一套特定于服务的插件(用于协议扫描)和监控程序(用于轮询)来完成这些任务。通过创建新的插件和监控程序,可以扩展 OpenNMS 以检测和监控任何新的设备或服务 ― 包括支持 JMX 的 ClickMeter 应用程序。
创建定制的功能插件
OpenNMS 的发现守护程序( discovery )负责在初始以及以后的执行过程中发现受管网络。一旦 discovery 发现一个节点(通常通过 ICMP ping),它会请能力守护程序( capsd )来确定该节点支持什么服务。通过对指定的协议插件集合进行循环处理,该功能守护程序检查所支持的服务。编写一个定制的协议插件使它适合 OpenNMS 的任何新服务非常简单。所涉及的步骤为:
1. 创建一个实现 org.opennms.netmgt.capsd.Plugin 接口的类。这里特别指出的是,这个接口有三个插件必须实现的方法,请参见表 2:
表 2. 接口 org.opennms.netmgt.capsd.Plugin 的方法
| 方法名称和说明 | 描述 |
String getProtocolName(); | 返回创建这个插件所针对的协议名称。 |
Boolean isProtocolSupported(java.nnet.InetAddress address); boolean isProtocolSupported(java.nnet.InetAddress address, java.util.Map properties); | 使用所提供的用于传入的参数的特性映射(如果必要的话)来确定所指定的 InetAddress 是否支持该协议。 |
2. 在 /etc/capsd-configuration.xml 文件中创建协议插件定义。在启动期间, capsd 将读取这个文件,以确定使用哪个协议插件。
我们不久将会看到如何编码和配置 OpenNMS 协议插件的详细信息。
创建定制轮询器监控程序
在 OpenNMS 确定了受管节点上的服务之后,它将使用轮询器守护程序( pollerd )来定期轮询受管设备/服务,以确保它们是可操作的。通过对轮询器监控程序“插件”的指定集合进行循环处理, pollerd 对个别服务进行轮询。为了给新协议创建轮询器监控程序,需要:
1. 创建实现 org.opennms.netmgt.poller.ServiceMonitor 接口的类。这里特别指出的是,这个接口有五个监控程序必须实现的方法,请参见表 3:
表 3. 接口 org.opennms.netmgt.poller.ServiceMonitor 的方法
| 方法名称和说明 | 描述 |
void initialize(java.util.Map parameters); void initialize(org.opennms.netmgt.poller.NetworkInterface iface); | 在启动期间,调用第一种形式,使插件在初始化期间有机会禁用自己(通过抛出异常)。每当发现新的、支持该服务的节点,并在第一次调用 poll() 之前,都调用第二种形式。 |
void release(); void release(java.net.NetworkInterface iface); | 在 OpenNMS 关闭期间,调用第一种形式。每当从以后的轮询调度表中除去所发现的、支持该服务的节点时,都调用第二种形式。 |
int poll(java.net.NetworkInterface iface, org.opennms.netmgt.utils.EventProxy eproxy, java.util.Map parameters); | 这是用于确定正在被监控的服务是否仍然可用的方法。它应该返回 ServiceMonitor. SERVICE_AVAILABLE 以表示服务正在运行,否则将返回 ServiceMonitor. SERVICE_UNAVAILABLE 。 |
2. 在 /etc/poller-configuration.xml 文件中创建服务定义和监控程序定义。这是 pollerd 在启动期间将读取的文件,以确定轮询每个服务的间隔时间,以及在操作期间所使用的监控程序“插件”。
我们接下来将为 ClickMeter 创建轮询器监控程序。
使用 OpenNMS 来监控支持 JMX 的 ClickMeter
现在我们知道创建 capsd 插件和 pollerd 监控程序使我们能将 OpenNMS 与支持 JMX 的 ClickMeter 集成在一起。然而,还有一个问题:为什么 OpenNMS 不是以本机方式支持 JMX?
即使在一些流行的商业 NMS 产品中,您会发现同样具有这一普遍趋势 ― 也没有以本机方式支持 JMX。部分原因是由于存在这样的事实:刚出现支持 JMX 的设备和服务,另外 SNMP 的兼容性已足够管理大多数“第三方设备和服务”(它们不是出自 NMS 厂商)。
还有一个重要的原因是,在 NMS 厂商中,JMX 的集成进度相对比较缓慢:即使 1.1 规范已经详细定义了 JMX 工具层和代理层,但就如何跨网络来访问 JMX 代理方面的细节还悬而未决(在写本文时是这样的)。