powershell - 使用 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
}
}
希望这里有人可以在如何解决这个问题上给我一个正确的方向。
解决方案
我不认为这是一个好方法。使用 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();
}
推荐阅读
- c++ - C++:从派生类调用受保护的基类构造函数
- python - 根据python字典中的值添加新标签列
- php - 为什么我的 SQL 语法错误为未定义索引
- java - 如何在 python:3.8-slim-buster 基础映像中使用 dockerfile 安装 java 8
- robotframework - Roboframework 用户关键字可以包含正则表达式吗?
- mysql - 无法连接到 MYSQL docker 容器
- javascript - 返回 data-football 属性名
- android - Android Google Drive API 切换帐户文件未找到错误
- html - 如何在css中并排设置图像和信息
- python - 提取子字符串并隐藏到新列中的浮点数