首页 > 解决方案 > 使用 PowerShell 解析 IBM MQ 报告以格式化 Prometheus 可以使用

问题描述

我正在为 Prometheus 做 POC,我们希望从中获取指标的其中一件事是运行在 W2012R2 上的 IBM MQ 服务器。IBM MQ 有一个 Prometheus 导出器,但它适用于 Linux,不适用于 Windows。

我们确实可以选择安排报告以将数据写入文件,但是该文件的输出对于 Prometheus 来说是无用的,因此必须重新格式化该文档。

我一直在思考如何使用 PowerShell 来实现这一目标,但由于我缺乏使用 PowerShell 的脚本编写经验,我决定在这里寻求帮助。

你们知道如何更改此布局中的报告:

5724-H72 (C) Copyright IBM Corp. 1994, 2015.
Starting MQSC for queue manager QMGR.


     1 : DISPLAY CHSTATUS(*) 

AMQ8450: Display Channel Status details.
   CHANNEL(QMGR.HOSTNAME.R1)               CHLTYPE(RCVR)
   CONNAME(10.10.10.10)                    CURRENT
   RQMNAME(QMGR)                           STATUS(RUNNING)
   SUBSTATE(RECEIVE)                    
AMQ8450: Display Channel Status details.
   CHANNEL(QMGR.HOSTNAME.R3)               CHLTYPE(RCVR)
   CONNAME(10.10.10.10)                    CURRENT
   STATUS(RUNNING)                         SUBSTATE(RECEIVE)

看起来像这样的东西:

status{channel="QMGR.HOSTNAME.R1", chltype="rcvr", conname="10.10.10.10", rqmname="QMGR"} running
substate{channel="QMGR.HOSTNAME.R1", chltype="rcvr", conname="10.10.10.10", rqmname="QMGR"} receive
status{channel="QMGR.HOSTNAME.R3", chltype="rcvr", conname="10.10.10.10"} running
substate{channel="QMGR.HOSTNAME.R3", chltype="rcvr", conname="10.10.10.10"} receive

到目前为止,这就是我想出的,我猜不是很漂亮,但它似乎是朝着正确方向迈出的一步......

$Contents = Get-Content ".\CHSTATUS.txt" | select -Skip 5 
foreach($Line in $Contents) {
    foreach($channel in [Regex]::Matches($Line, '(?<=CHANNEL\()(.*?)(?=\))')) {}
    foreach($chltype in [Regex]::Matches($Line, '(?<=CHLTYPE\()(.*?)(?=\))')) {}
    foreach($conname in [Regex]::Matches($Line, '(?<=CONNAME\()(.*?)(?=\))')) {}
    foreach($status in [Regex]::Matches($Line, '(?<=STATUS\()(.*?)(?=\))')) {}
    foreach($substate in [Regex]::Matches($Line, '(?<=SUBSTATE\()(.*?)(?=\))')) {
    Write-Host "status{channel=""$channel"", chltype=""$chltype"", conname=""$conname""}" $status 
    Write-Host "substate{channel=""$channel"", chltype=""$chltype"", conname=""$conname""}" $substate
    }
}

希望这里有人可以在如何解决这个问题上给我一个正确的方向。

标签: powershellibm-mqprometheus

解决方案


我不认为这是一个好方法。使用 Java/PCF 并以您想要的格式输出数据会简单得多。

我发布了一个简单的(功能齐全的)MQ/PCF/Java 程序,名为:MQListChannelStatus01

只需将参数更新为:

request.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_ATTRS,
                     new int []
                     {
                        CMQCFC.MQCACH_CHANNEL_NAME,
                        CMQCFC.MQCACH_CONNECTION_NAME,
                        CMQCFC.MQIACH_CHANNEL_STATUS,
                        CMQCFC.MQIACH_CHANNEL_SUBSTATE,
                        CMQC.MQCA_REMOTE_Q_MGR_NAME
                     } );

您需要注意的是,您将获得所有正在运行、尝试运行等的通道的信息。因此,“MQCA_REMOTE_Q_MGR_NAME”并非对所有通道类型都有效。

您将需要在“for 循环”中执行以下操作:

int chlType = responses[i].getIntParameterValue(CMQCFC.MQIACH_CHANNEL_TYPE);

String remoteQMName ="";
if (chlType == CMQXC.MQCHT_RECEIVER)
{
   remoteQMName = responses[i].getStringParameterValue(CMQC.MQCA_REMOTE_Q_MGR_NAME);
   if (remoteQMName != null)
      remoteQMName = remoteQMName.trim();
}

推荐阅读