WebSphere Message Broker 中的自动 SNMP 警报

因为消息流通常包含业务关键型功能,所以管理员需要在流执行期间接收即时的错误通知。本文介绍如何增强消息流监控,以便自动向管理控制台发送 Simple Network Management Protocol (SNMP) 警报,从而改进企业的错误通知和错误响应流程。

Aloak Kapoor, 应用程序架构师,IBM Global Business Services, IBM

Aloak Kapoor 是 IBM Global Business Services 的一名应用程序架构师。他在大型企业系统的设计和开发方面具有多年的从业经验,并且拥有计算机科学的学士学位和硕士学位。您可以通过 aloak@ca.ibm.com 联系 Aloak。



Bobbee Broderick, 解决方案专家,IBM Software Services for WebSphere, IBM

Bobbee Broderick 是 IBM Software Services for WebSphere (ISSW) 的一名 Application Integration and Middleware (AIM) 解决方案专家。他的职责包括为 WebSphere Message Broker 和 WebSphere MQ(包括 WebSphere MQ FTE 和 WebSphere MQ AMS)架构、设计和开发客户互动。他目前是 WebSphere MQ 的 ISSW 技术主管。您可以通过 rkbroder@us.ibm.com 联系 Bobbee。



2013 年 1 月 21 日

简介

在 WebSphere Message Broker 中,当出现问题时,消息流能够使用内置功能发送通知。例如,SMTP 节点能够发送电子邮件通知,File Output 节点能够将问题记录到文件中。很多情况下,问题通知的一个更好的做法是直接将 SNMP 警报发送到现有的管理控制台。大中型企业通常拥有系统和网络管理控制台,负责监控关键 IT 组件的健康和性能。直接向管理控制台发送通知有几个优点:

  • 实时性。将问题通知发送到集中的监控位置
  • 更快速的响应。因为通知被发送到现有的(可能是经过优化的)控制台
  • 降低成本。因为不需要实现和学习新的软件和流程
  • 减少测试

本文介绍如何配置消息流,以便实时地将 SNMP 警报发送到管理控制台。下一节介绍本文中将会使用的业务场景,包括基本的消息流。然后本文将会介绍如何向消息流添加自动 SNMP 警报,以及如何在开发环境测试警报功能。结尾总结了出现的概念,并对如何扩展本文中的功能提供了一些思路。

术语注释

本文中交替使用术语 SNMP 警报SNMP 陷阱,表示 SNMP 协议中内置的通知消息。

先决条件

一个安装了以下组件的 Microsoft Windows 开发环境:

  • WebSphere Message Broker V7(包含 Message Broker Explorer)
  • WebSphere MQ(很多版本与 WebSphere Message Broker 兼容)
  • WebSphere Message Broker Support Pac IAM3 (log4j)。熟悉 log4j(流行的 Java 日志框架)会有所帮助,但这并不是必需的。
  • 熟悉 WebSphere MQ 和 WebSphere Message Broker 开发
  • 无需事先具有 SNMP 协议和特定管理控制台方面的经验

场景:具有潜在故障点的消息流

为了演示 WebSphere Message Broker 中自动 SNMP 警报的概念,本文中假设有一个虚构的名为 ABC Company 的零售公司,它使用消息流处理订单。消息流从输入队列检索产品订单,调用一个外部的库存系统,然后将完成的订单消息放入另一个队列:

图 1. ABC Company 的订单处理
ABC Company 的订单处理

要为此场景设置本地开发环境,需完成以下步骤:

  1. 定位一个现有的本地代理,您已经为该代理设置了 log4j SupportPac。
  2. 在该代理的队列管理器上创建两个名为 ABC.ORDERSABC.PROCESSED_ORDERS 的本地队列。
  3. 在本文底部 下载 并导入消息流项目 CompanyABC_OrderProcessing_MFP

依赖项:对外部系统的调用

仔细查看刚才导入的消息流。第一个和第三个节点在 MQ 队列上执行简单的 get 和 put 操作。Compute 节点包含关键功能,即调用外部库存系统,这是消息队列中的一个潜在故障点,因为外部系统可能会出问题,或者到外部系统的通信链接会失败。清单 1 展示了 Compute 节点的 Extended Structure Query Language (ESQL) 代码。

清单 1. 用于调用外部库存系统的代码
CREATE COMPUTE MODULE processOrder_CallInventorySystem
    CREATE FUNCTION Main() RETURNS BOOLEAN
    BEGIN

        DECLARE ResultOfInventoryUpdate BOOLEAN;
        SET ResultOfInventoryUpdate = UpdateInventorySystem(InputRoot);
        IF (ResultOfInventoryUpdate) THEN
            SET OutputRoot = InputRoot;
            RETURN TRUE;
        ELSE
            DECLARE ErrorMsg CHARACTER 'Cannot communicate with inventory system';
            THROW USER EXCEPTION CATALOG 'BIPv700' MESSAGE 2951 VALUES(ErrorMsg);
        END IF;
     END;

     --Simulates an update call to an external inventory system.  
     --Returns false if link to external system is down, and true otherwise. 
     CREATE FUNCTION UpdateInventorySystem(IN element REFERENCE) RETURNS BOOLEAN 
     BEGIN
	
         RETURN TRUE;

     END;

END MODULE;

为了简便起见,代码中使用 UpdateInventorySystem 函数来调用外部库存系统。实际上,该函数会包含用来与数据库通信的实际代码或者单独的应用程序。本例中的代码使用返回值 TRUE 来模拟对外部系统的成功调用,用 FALSE 来模拟失败。

添加 SNMP 警报

为了管理外部库存系统的潜在故障,您现在要向消息流添加自动 SNMP 警报,这将使用到 log4j 日志框架。在 log4j 框架中,您通过创建一个 logger 并为消息关联一个 appender(目的地),将消息记录到目的地。logger 将达到或超出其确定的日志级别的消息记录到 appender。要启用 SNMP 陷阱的输出,关键步骤是在 log4j 中配置 SNMP appender。

SNMP appender 将其接收到的日志消息转换成 SNMP 陷阱,并转发到 SNMP 监听器。log4j 的 SNMP appender 的实现已经存在,所以您无需从头开始创建 appender。下一节介绍如何创建一个 log4j 配置文件,该配置文件用于设置 logger 和 appender。

创建 log4j 配置文件

  1. 创建一个新的空白的 XML 文件,将它命名为 log4jConfig.xml
  2. 将该文件放置在代理的类路径(例如 <Broker Install Dir>\classes)。此外,像 log4j SupportPac 的指南中描述的那样,将 log4j.dtd 文件也放置在这个位置。log4j.dtd 文件与 log4j SupportPac 下载捆绑在一起。
  3. 将以下 XML 内容添加到 log4jConfig.xml 文件:
    清单 2. log4j 配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    
        <appender name="TRAP_LOG" class="org.apache.log4j.ext.SNMPTrapAppender">
            <param name="ImplementationClassName" 
                      value="org.apache.log4j.ext.JoeSNMPTrapSender"></param>
            <param name="ManagementHost" value="127.0.0.1"></param>
            <param name="ManagementHostTrapListenPort" value="162"></param>
            <param name="EnterpriseOID" value="1.3.6.1.4.1.24.0"></param>
            <param name="LocalIPAddress" value="127.0.0.1"></param>
            <param name="LocalTrapSendPort" value="161"></param>
            <param name="GenericTrapType" value="6"></param>
            <param name="SpecificTrapType" value="12345678"></param>
            <param name="CommunityString" value="public"></param>
            <param name="ForwardStackTraceWithTrap" value="true"></param>
            <param name="Threshold" value="WARN"></param>
            <param name="ApplicationTrapOID" 
                      value="1.3.6.1.4.1.24.12.10.22.64"></param>
            <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" 
                        value="%d{ISO8601} %-5p [%-10t] %m%n"></param>
            </layout>
        </appender>
    
        <logger name="abcLogger">
            <level value="WARN"/>
            <appender-ref ref="TRAP_LOG" />
        </logger>
    
        <root>
        </root>
    
    </log4j:configuration>
  4. 保存 log4jConfig.xml 文件。
  5. 该文件指定了一个名为 TRAP_LOG 的 log4j appender:
    <appender name="TRAP_LOG" class="org.apache.log4j.ext.SNMPTrapAppender">

    该 appender 引用了一个名为 SNMPTrapAppender 的外部类,这是一个 SNMP appender 的开源实现,在 Apache 2.0 许可下可用。本节其余部分假设您使用的是 SNMPTrapAppender,但是只要您愿意,也可以指定一个替代的 log4j SNMP appender 实现类。
  6. 下载 SNMPTrapAppender JAR 文件
  7. <Broker Workpath>/shared-classes 中保存 SNMPTrapAppender JAR 文件。
  8. 再来看一下 log4j appender 配置,尤其是名为 ImplementationClassName 的参数:
            <param name="ImplementationClassName" 
                      value="org.apache.log4j.ext.JoeSNMPTrapSender"></param>
    SNMPTrapAppender 依赖于一个单独的代码库来实际发送 SNMP 陷阱。ImplementationClassName 参数指定用于该目的的库:joeSNMPTrapSender,这是一个在 GNU LGPL 许可 V2.1 或其更高版本下可用的开源库。
  9. 下载 V0.3.4 版本的 joeSNMP 库
  10. 解压下载的文件并提取 joeSNMP.jar,可以在 output/lib 目录找到它,或者通过运行下载文件所提供的构建脚本来生成它。
  11. joeSNMP.jar 放置在 <Broker Workpath>/shared-classes 中。
  12. 观察 log4j appender 配置中的另外两个参数元素:ManagementHostManagementHostTrapListenPort。这两个参数指定了将会接收陷阱消息的 SNMP 监听器的 IP 地址和端口号。您可以将这些值保留为默认值,但是您可能需要根据每个环境中 SNMP 监听器的地址和端口号为不同的应用程序环境更改这些值。
  13. 再来看为 TRAP_LOG appender 指定的其余 param 元素。其余大多数值都与 SNMP 陷阱消息的格式及内容相关。它们已经被设置为合理的默认值,但是您可以根据需要更改它们,以定制您的 SNMP 陷阱。
  14. 在 appender 下面已经定义了一个简单的 logger,它在 WARN 或更高级别将所有日志消息输出到 TRAP_LOG appender:
        <logger name="abcLogger">
            <level value="WARN"/>
            <appender-ref ref="TRAP_LOG" />
        </logger>

创建 log4j 节点

要在消息流中完全启用 SNMP 警报,可以将 log4j 节点拖放到流中,并将它的输入终端连接到 Compute 节点的故障终端,如下所示:

图 2. 带有 SNMP 警报的消息流
带有 SNMP 警报的消息流

表 1 指定必须在 log4j 节点上设置的属性:

表 1. log4j 节点属性
属性名属性值
Log4j Config File您在前一节中创建的配置文件的位置,例如:
C:\Program Files\IBM\MQSI\7.0\classes\log4jConfig.xml
Log LevelWARN
Log TextError communicating with external inventory system.
Logger NameabcLogger

请注意,您已经设置了 log4j 节点,每当 Compute 节点上出现未处理的错误或故障时,它就会记录 WARN 级别消息。另外,由于您从配置文件设置了 log4j 节点,使之记录到 abcLogger,所以您为该 logger 指定的所有 appender 都会自动接收日志消息。因此,每当 Compute 节点上出现故障或错误时,就会调用 SNMP appender。

在开发环境测试 SNMP 功能

从开发环境测试警报功能存在一个困难,因为对系统和网络管理控制台的访问在开发时可能是不可用的。要解决这一限制,可下载一个单独的 SNMP 陷阱监听器应用程序,并将它配置为在本地开发机器上接收陷阱。本文使用是 Net-SNMP 应用程序套件一部分的 SNMP 陷阱守护进程。按照以下步骤在本地机器上设置监听器。

设置本地 SNMP 监听器

  1. 进入 Net-SNMP 项目主页,审查许可协议,并下载最新版的二进制文件。本节其余部分假设您使用的是 Net-SNMP V5.6.1.1。
  2. 运行 Net-SNMP 的可执行设置文件。
  3. 仅选择安装 Net-SNMP Trap Service 组件。
  4. 在开发机器上选择安装路径并完成安装。
  5. 为 SNMP 陷阱守护进程创建一个将包含定制配置信息的空文件,并将以下文本添加到该文件:disableAuthorization yes。将文件命名为 snmp.conf,并保存在上一步您指定的 Net-SNMP 安装目录的 bin 子目录中。默认情况下,Net-SNMP 只接收来自已授权用户的 SNMP 陷阱。由于该工具在开发机器上用于简单测试,所以您在这一步创建的配置文件允许任何用户将陷阱发送给本地监听器。一旦完成开发测试,您就必须停止 SNMP 监听器,防止未授权用户向它发送陷阱。
  6. 打开命令提示符并导航到 install_dir/bin,其中 install_dir 是您为 Net-SNMP 选择的安装目录。
  7. 利用以下命令行选项运行 SNMP 陷阱守护进程:忽略默认的配置文件,使用您在本节创建的定制配置文件,并将输出记录到标准输出:
    snmptrapd.exe -C -c snmp.conf -Lo
  8. 此时 SNMP 陷阱守护进程会运行。忽略关于缺失 MIB 文件的警告,因为您只是将守护进程用于简单测试目的。守护进程在默认的端口 162 上监听陷阱。为了让 SNMP 陷阱守护进程打开和监听端口,您可能需要获得机器上的管理员特权。
  9. 如果您在尝试启动 SNMP 陷阱守护进程时遇到任何错误,请参见文件 install_dir/docs/Net-SNMP.chmsnmptrapd 服务器的帮助文档。

测试 SNMP 警报

既然本地 SNMP 监听器已经配置好并运行在开发机器上,您就可以通过导致消息流中的 Compute 节点抛出一个异常来测试警报功能了。回想一下上一节 “依赖项:对外部系统的调用”,Compute 节点被配置为每当 UpdateInventorySystem 函数返回 false 时就抛出一个异常。要测试消息流,可执行以下操作:

  1. 更改 UpdateInventorySystem 函数中的代码,以便返回 FALSE
  2. 保存消息流项目。
  3. 停止并重启将运行消息流的目标代理,确保该代理获得前面步骤放置在其类路径中的新文件。
  4. 生成一个包含消息流的新 BAR 文件,并将它部署到目标代理上的执行组。
  5. 使用 MQ Explorer,在 ABC.ORDERS 队列上放置一个测试消息。
  6. 您应该在 SNMP 陷阱守护进程命令控制台看到出现一条消息,指出 SNMP 陷阱消息是由代理发送的,并被本地 SNMP 监听器捕捉。在这里,所有步骤都已成功完成,SNMP 警报已在消息流中启用。
  7. 如果未在 SNMP 陷阱守护进程中看到出现消息,那么在涉及到大量组件时,存在几种可能的原因。完成以下任务,以便找出问题:
    1. 以调试模式运行消息流,并确保流执行到达 log4j 节点的输入终端。检查没有错误是由 log4j 节点抛出的。
    2. 如果输入消息似乎被 log4j 节点正确使用,那么请检查 log4j 节点生成的日志中的任何错误或警告。该节点的日志文件可在
      <Broker Workpath>\components\BrokerName\BrokerID\console.txt 处找到。
    3. 确保 WARN 已经指定为:logger 的 level 子元素的值、appender 的 Threshold 参数的值和 log4j 节点的 LogLevel 属性的值。
    4. 查看 IAM3 log4j 支持包 的安装指南,并确保必要的 JAR 文件已经放置在正确的目录。还要确保运行 Message Broker 服务的用户帐户对这些文件具有访问读取权限。
    5. 停止并重启 Message Broker 服务。将一条新的测试消息放入 ABC.ORDERS 队列,并检查消息是否出现在 SNMP 陷阱守护进程中。
    6. 如果没有消息出现在 SNMP 陷阱守护进程中,那么在 Windows Event Log 中检查是否存在由 Message Broker 触发的任何错误或警告。

该测试练习了您创建的 SNMP 配置中的所有元素。输入队列中的测试消息在 Compute 节点中抛出一个异常,这由您设置的 logger 发送的 log4j 消息触发。logger 被配置为具有一个 SNMP appender,后者将日志消息转换成 SNMP 陷阱,并将该陷阱发送到开发环境中的 SNMP 监听器。

结束语

本文介绍了如何配置 WebSphere Message Broker,以便实时地发送 SNMP 警报。首先是创建一个简单的消息流,该消息流在与外部系统通信期间具有一个潜在的故障点。然后是构造一个 log4j 配置文件(在该文件中,log4j logger 发送消息到 SNMP appender),并下载一个 log4j SNMP appender 类和一个 SNMP 发送子系统。接下来,使用一个来自 Message Broker SupportPac 的 log4j 节点,通过在每次消息流联系外部系统失败时从配置文件调用 log4j logger,将所有这一切联系在一起。最后,为了在开发环境中测试该功能,在本地机器上安装并配置了一个 SNMP 监听器。

有几种有趣的方式可以扩展本文中的思想。例如,通过在出现错误时解析异常树,提取根异常消息,然后将该消息存储在 Message Broker Environment 树中,可以让 SNMP 警报中生成的日志消息变为动态的。然后 log4j 节点可以将其 log text 属性指向 Environment 树中的变量值。

另一种有用的技术是将多种类型的 log4j appender 关联到单个 logger,并配置每个 appender,使之具有不同的严重性阈值。SNMP appender 仅在处于最高严重性级别时才能触发,只在出现严重错误时才向管理员发送 SNMP 警报,出现小问题或日常问题时不发送。


下载

描述名字大小
代码样例CompanyABC_OrderProcessing_MFP.zipNN KB

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=855794
ArticleTitle=WebSphere Message Broker 中的自动 SNMP 警报
publish-date=01212013