1. この章について
この記事は、IBM MQに関するハンズオン資料シリーズの一部です。
まだ「はじめに」の記事をご覧になっていない方は、まずそちらからご確認ください。
本ハンズオンはこの章のみの内容で独立して実施可能ですが、より詳細な理解を得たい場合は初級編から進めることを推奨します。
この章の位置付け
この章では、RHEL上のPodmanで動くIBM MQとIBM WebSphere Libertyを、Instanaで監視します。
- このハンズオンによってできるようになること
- RHEL上でIBM MQとWebSphere Libertyを動作させる
- Instanaを使ってMQのメトリクスを収集・監視する
- このハンズオンの目的
- APMツール(Instana)によって、MQをどのように監視することができるかを知る
- 対象者の前提条件
- IBM MQの基礎を知っていること
- Linuxの基本操作が可能なこと
前提となる環境
本資料では、以下の内容を前提の環境としています。
このハンズオンでは、Instanaのライセンスが必要となります。
本ハンズオンではIBM Cloud上のRHELを使用してIBM MQやLibertyを動作させますが、これらはmacやWindowsのローカルPCからも実行は可能です。
(ただし動作検証は行なっておりません。適宜読み替えながら手順を実行してください。)
| 本資料の環境 | バージョン |
|---|---|
| Red Hat Enterprise Linux (IBM Cloud) | release 9.6、ディスク300GB, 4vCPU 16GB |
| Instana (SaaS) | Release 1.0.310 |
また、手順の中で以下のツールをインストールして使用します。
| 本資料の環境 | バージョン |
|---|---|
| Podman | version 5.4.0 |
| git | version 2.47.3 |
| Apache Maven | 3.6.3 (Red Hat 3.6.3-22) |
2. ハンズオンの全体像
3. 環境へのアクセスとツールのインストール
以下のコマンドで、ポートフォワーディングを行いながらRHELのVMに接続します。
ssh -i <IDENTITY_FILE> -p <SSH_PORT> \
-L 9080:localhost:9080 -L 9445:localhost:9445 \
<Username>@<Public IP>
パッケージの更新を行います。
sudo yum check-update
sudo yum update -y
Podman のインストールを行います。
sudo dnf install -y podman
podman --version
Gitをインストールします。
sudo dnf install -y git
git --version
Mavenをインストールします。
sudo dnf install -y maven
mvn -version
4. MQのセットアップ
まずはコンテナ間でメッセージのやり取りを行うために、カスタムネットワークを作成します。
podman network create mq-network
IBM MQ イメージの取得を行います。
podman pull icr.io/ibm-messaging/mq:latest
取得したイメージを確認します。
podman images
例:
[itzuser@itzvsi-691000cdb4-4mkdcu5q ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
icr.io/ibm-messaging/mq latest 8d9977e72b3f 2 weeks ago 967 MB
QM1を作成します。
<your-image-id> にはmqのイメージIDを使用します。(上記例であれば8d9977e72b3f)
podman run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --volume qm1data:/mnt/mqm --publish 1414:1414 --publish 9443:9443 --detach --env MQ_APP_USER=app --env MQ_APP_PASSWORD=passw0rd --env MQ_ADMIN_USER=admin --env MQ_ADMIN_PASSWORD=passw0rd --name QM1 --network mq-network <your-image-id>
QM2を作成します。
podman run --env LICENSE=accept --env MQ_QMGR_NAME=QM2 --volume qm2data:/mnt/mqm --publish 1415:1414 --publish 9444:9443 --detach --env MQ_APP_USER=app --env MQ_APP_PASSWORD=passw0rd --env MQ_ADMIN_USER=admin --env MQ_ADMIN_PASSWORD=passw0rd --name QM2 --network mq-network <your-image-id>
コンテナの稼働状況を確認します。
podman ps
例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1c6349f4b45 icr.io/ibm-messaging/mq:latest 46 seconds ago Up 46 seconds 0.0.0.0:1414->1414/tcp, 0.0.0.0:9443->9443/tcp, 9157/tcp, 9415/tcp QM1
199c5ebbfd04 icr.io/ibm-messaging/mq:latest 11 seconds ago Up 12 seconds 0.0.0.0:1415->1414/tcp, 0.0.0.0:9444->9443/tcp, 9157/tcp, 9415/tcp QM2
QM1の各種設定
QM1のコンテナにログインします。
podman exec -it QM1 bash
QM1のキューマネージャーに対して設定を行うため、runmqsc コマンドで対話モードに入ります。
runmqsc
対話モードに入ったら、QM2上のキューを参照するためのリモートキューREMOTE.Q.1 を作成します。
define qremote(REMOTE.Q.1) rname(DEV.QUEUE.2) rqmname(QM2) xmitq(TRANS.Q.1)
次に、QM1でTRANS.Q.1という名前のトランスミッションキューを作成します。
以下のコマンドを実行してください。
define qlocal(TRANS.Q.1) usage(xmitq)
QM1toQM2というチャネルの定義をQM1側で行います。
以下のコマンドを実行してください。
define channel(QM1toQM2) chltype(SDR) conname('QM2(1414)') xmitq(TRANS.Q.1)
作成したチャンネルを確認します。
display channel(QM1toQM2)
以下のようにチャネルの設定が表示されることを確認してください。
AMQ8414I: Display Channel details.
CHANNEL(QM1TOQM2) CHLTYPE(SDR)
ALTDATE(2025-11-26) ALTTIME(00.35.42)
BATCHHB(0) BATCHINT(0)
BATCHLIM(5000) BATCHSZ(50)
CERTLABL( ) COMPHDR(NONE)
COMPMSG(NONE) CONNAME(QM2(1414))
CONVERT(NO) DESCR( )
DISCINT(6000) HBINT(300)
KAINT(AUTO) LOCLADDR( )
LONGRTY(999999999) LONGTMR(1200)
MAXMSGL(4194304) MCANAME( )
MCATYPE(PROCESS) MCAUSER( )
MODENAME( ) MONCHL(QMGR)
MSGDATA( ) MSGEXIT( )
NPMSPEED(FAST) PASSWORD( )
PROPCTL(COMPAT) RCVDATA( )
RCVEXIT( ) RESETSEQ(NO)
SCYDATA( ) SCYEXIT( )
SENDDATA( ) SENDEXIT( )
SEQWRAP(999999999) SHORTRTY(10)
SHORTTMR(60) SSLCIPH( )
SSLPEER( ) STATCHL(QMGR)
TPNAME( ) TRPTYPE(TCP)
USEDLQ(YES) USERID( )
XMITQ(TRANS.Q.1)
認証や権限に関連するコマンドを実行します。複数行をまとめて入力可能です。
本番環境では、通信のセキュリティを確保するためTLS(SSL)による暗号化を必ず設定してください。
本手順はハンズオン目的のため、TLSを使用しない簡易設定となっています。
* --- 認証方式(今回は簡易設定のまま) ---
ALTER AUTHINFO(DEV.AUTHINFO) AUTHTYPE(IDPWOS) CHCKCLNT(NONE)
REFRESH SECURITY TYPE(CONNAUTH)
* --- アプリ用チャネル(DEV.APP.SVRCONN) ---
* アプリケーションはこのチャネルを利用し、MQ ユーザー app として動作する
ALTER CHANNEL('DEV.APP.SVRCONN') CHLTYPE(SVRCONN) MCAUSER('app')
* 任意の IP から DEV.APP.SVRCONN への接続を許可し、MCAUSER を使用
SET CHLAUTH('DEV.APP.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) ACTION(REPLACE)
* --- Instana 用チャネル(INSTANA.SVRCONN) ---
* Instana はこのチャネルのみを利用し、MQ ユーザー instana として動作する
DEFINE CHANNEL('INSTANA.SVRCONN') CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('instana')
SET CHLAUTH('INSTANA.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) ACTION(REPLACE)
* --- QMGR への基本接続権限 ---
SET AUTHREC OBJTYPE(QMGR) PRINCIPAL('app') AUTHADD(CONNECT)
* --- アプリが利用するキューの権限 ---
SET AUTHREC PROFILE('REMOTE.Q.1') PRINCIPAL('app') OBJTYPE(QUEUE) +
AUTHADD(PUT, INQ, DSP)
SET AUTHREC PROFILE('TRANS.Q.1') PRINCIPAL('app') OBJTYPE(QUEUE) +
AUTHADD(PUT, GET, INQ, DSP)
SET AUTHREC PROFILE('DEV.QUEUE.1') PRINCIPAL('app') OBJTYPE(QUEUE) +
AUTHADD(PUT, GET, BROWSE, INQ, DSP)
* --- QMGR への基本接続権限 ---
SET AUTHREC PRINCIPAL('instana') OBJTYPE(QMGR) +
AUTHADD(CONNECT, INQ, DSP)
* --- PCF コマンド実行用(SYSTEM.ADMIN.COMMAND.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.COMMAND.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(PUT, INQ, DSP, CHG)
* --- 応答メッセージ用の動的キュー(SYSTEM.DEFAULT.MODEL.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.DEFAULT.MODEL.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, DSP)
* --- 統計キュー(SYSTEM.ADMIN.STATISTICS.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.STATISTICS.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
* --- イベントキュー ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.QMGR.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
SET AUTHREC PROFILE('SYSTEM.ADMIN.PERFM.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
SET AUTHREC PROFILE('SYSTEM.ADMIN.CHANNEL.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
* --- 各種オブジェクトへの参照系権限(読み取り専用) ---
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(QUEUE) AUTHADD(DSP, INQ)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CHANNEL) AUTHADD(DSP)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(LISTENER) AUTHADD(DSP)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(TOPIC) AUTHADD(DSP)
* SYSTEM.* キュー全体に DSP/CHG/GET を許可
SET AUTHREC PROFILE('SYSTEM.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* (今回は TRANS.Q.1 に CHG を追加)
SET AUTHREC PROFILE('TRANS.Q.1') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, CHG, GET, INQ)
* CLNTCONN オブジェクトの表示を許可(SYSTEM.DEF.CLNTCONN など)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CLNTCONN) +
AUTHADD(DSP)
* ユーザー定義キュー(DEV.*)にも統計リセット等ができるようにする
SET AUTHREC PROFILE('DEV.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* システム系キュー全体(SYSTEM.**)にも統計リセット等を許可
SET AUTHREC PROFILE('SYSTEM.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* CLNTCONN オブジェクトの表示(SYSTEM.DEF.CLNTCONN など)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CLNTCONN) +
AUTHADD(DSP)
* --- 統計・監視の有効化(QMGRレベル) ---
ALTER QMGR STATQ(ON)
ALTER QMGR STATMQI(ON)
ALTER QMGR MONQ(MEDIUM)
ALTER QMGR MONCHL(MEDIUM)
ALTER QMGR STATINT(60)
REFRESH SECURITY TYPE(AUTHSERV)
対話モードを終了します。endと入力してEnterを押してください。
この際、No commands have a syntax error.と表示されることを確認してください。
QM1のコンテナから抜けます。
exit
QM2の各種設定
次に、QM2側で設定を行なっていきます。
QM2のコンテナに入ります。
podman exec -it QM2 bash
QM2の対話モードに入ります。
runmqsc
以下のコマンドを実行して、QM1toQM2の受信側の設定を行います。
define channel(QM1toQM2) chltype(RCVR)
次に、以下のコマンドを実行します。
SET CHLAUTH(QM1toQM2) TYPE(ADDRESSMAP) ADDRESS(*) USERSRC(CHANNEL) ACTION(REPLACE)
このコマンドは、チャネル認証レコードの設定を行なっています。
IPアドレスに基づく認証マッピング(ADDRESSMAP)で、ADDRESS(*) によりすべての IPアドレスからの接続を許可しています。
今回はデモのため全てのアドレスを許可していますが、実際の業務では厳密にセキュリティを設定する必要があります。
以下のコマンドを実行し、設定した項目が反映されていることを確認してください。
display channel(QM1toQM2)
CHLTYPE(RCVR) が表示されることを確認します。
AMQ8414I: Display Channel details.
CHANNEL(QM1TOQM2) CHLTYPE(RCVR)
ALTDATE(2025-07-09) ALTTIME(04.36.20)
BATCHSZ(50) CERTLABL( )
COMPHDR(NONE) COMPMSG(NONE)
DESCR( ) HBINT(300)
KAINT(AUTO) MAXMSGL(4194304)
MCAUSER( ) MONCHL(QMGR)
MRDATA( ) MREXIT( )
MRRTY(10) MRTMR(1000)
MSGDATA( ) MSGEXIT( )
NPMSPEED(FAST) PUTAUT(DEF)
RCVDATA( ) RCVEXIT( )
RESETSEQ(NO) SCYDATA( )
SCYEXIT( ) SENDDATA( )
SENDEXIT( ) SEQWRAP(999999999)
SSLCAUTH(REQUIRED) SSLCIPH( )
SSLPEER( ) STATCHL(QMGR)
TRPTYPE(TCP) USEDLQ(YES)
認証や権限に関連するコマンドを実行します。複数行を一気に入力可能です。
(こちらもQM1と同様に、本番環境ではTLS設定を行うことを推奨します。)
* --- 認証方式(今回は簡易設定のまま) ---
ALTER AUTHINFO(DEV.AUTHINFO) AUTHTYPE(IDPWOS) CHCKCLNT(NONE)
REFRESH SECURITY TYPE(CONNAUTH)
* --- アプリ用チャネル(DEV.APP.SVRCONN) ---
* アプリケーションはこのチャネルを利用し、MQ ユーザー app として動作する
ALTER CHANNEL('DEV.APP.SVRCONN') CHLTYPE(SVRCONN) MCAUSER('app')
* 任意の IP から DEV.APP.SVRCONN への接続を許可し、MCAUSER を使用
SET CHLAUTH('DEV.APP.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) ACTION(REPLACE)
* --- Instana 用チャネル(INSTANA.SVRCONN) ---
* Instana はこのチャネルのみを利用し、MQ ユーザー instana として動作する
DEFINE CHANNEL('INSTANA.SVRCONN') CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('instana')
SET CHLAUTH('INSTANA.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) ACTION(REPLACE)
* --- QMGR への基本接続権限 ---
SET AUTHREC OBJTYPE(QMGR) PRINCIPAL('app') AUTHADD(CONNECT)
* --- QMGR への基本接続権限 ---
SET AUTHREC PRINCIPAL('instana') OBJTYPE(QMGR) +
AUTHADD(CONNECT, INQ, DSP)
* --- PCF コマンド実行用(SYSTEM.ADMIN.COMMAND.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.COMMAND.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(PUT, INQ, DSP, CHG)
* --- 応答メッセージ用の動的キュー(SYSTEM.DEFAULT.MODEL.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.DEFAULT.MODEL.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, DSP)
* --- 統計キュー(SYSTEM.ADMIN.STATISTICS.QUEUE) ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.STATISTICS.QUEUE') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
* --- イベントキュー ---
SET AUTHREC PROFILE('SYSTEM.ADMIN.QMGR.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
SET AUTHREC PROFILE('SYSTEM.ADMIN.PERFM.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
SET AUTHREC PROFILE('SYSTEM.ADMIN.CHANNEL.EVENT') PRINCIPAL('instana') +
OBJTYPE(QUEUE) AUTHADD(GET, INQ, DSP, CHG)
* --- 各種オブジェクトへの参照系権限(読み取り専用) ---
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(QUEUE) AUTHADD(DSP, INQ)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CHANNEL) AUTHADD(DSP)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(LISTENER) AUTHADD(DSP)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(TOPIC) AUTHADD(DSP)
* SYSTEM.* キュー全体に DSP/CHG/GET を許可
SET AUTHREC PROFILE('SYSTEM.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* CLNTCONN オブジェクトの表示を許可(SYSTEM.DEF.CLNTCONN など)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CLNTCONN) +
AUTHADD(DSP)
* ユーザー定義キュー(DEV.*)にも統計リセット等ができるようにする
SET AUTHREC PROFILE('DEV.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* システム系キュー全体(SYSTEM.**)にも統計リセット等を許可
SET AUTHREC PROFILE('SYSTEM.**') PRINCIPAL('instana') OBJTYPE(QUEUE) +
AUTHADD(DSP, INQ, GET, CHG)
* CLNTCONN オブジェクトの表示(SYSTEM.DEF.CLNTCONN など)
SET AUTHREC PROFILE('**') PRINCIPAL('instana') OBJTYPE(CLNTCONN) +
AUTHADD(DSP)
* --- 統計・監視の有効化(QMGRレベル) ---
ALTER QMGR STATQ(ON)
ALTER QMGR STATMQI(ON)
ALTER QMGR MONQ(MEDIUM)
ALTER QMGR MONCHL(MEDIUM)
ALTER QMGR STATINT(60)
REFRESH SECURITY TYPE(AUTHSERV)
No commands have a syntax error.と表示されることを確認します。
対話モードを終了します。endと入力してEnterを押してください。
QM2のコンテナから抜けます。
exit
QM1 でチャネルを開始
QM1のコンテナに入ります。再度、先ほどのPodに戻ります。
podman exec -it QM1 bash
QM1の対話モードに入ります。
runmqsc
チャネルQM1toQM2を起動します。
start channel(QM1toQM2)
チャネルの現在の状態を表示します。
display chstatus(QM1toQM2)
以下のように、STATUS(RUNNING)となっていることを確認してください。
AMQ8417I: Display Channel Status details.
CHANNEL(QM1TOQM2) CHLTYPE(SDR)
CONNAME(10.89.0.24(1414)) CURRENT
RQMNAME(QM2) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(TRANS.Q.1)
対話モードを終了します。endと入力してEnterを押してください。
QM1のコンテナから抜けます。
exit
5. Libertyアプリケーションのデプロイと操作
ホームディレクトリに(移動していない場合は)移動します。
cd ~
作成済みのLibertyアプリケーションをcloneします。
git clone https://github.com/ktgrryt/mqapp-jms
取得したアプリケーションのディレクトリに移動します。
cd mqapp-jms
Mavenでパッケージングを実行します。
mvn package
BUILD SUCCESS が表示されたら成功です。
PodmanでLibertyアプリのイメージをビルドします。
podman build . --platform linux/x86_64 -t mqapp:1
作成したイメージを確認します。
podman images
例:
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/mqapp 1 1a0dbf4b312b About an hour ago 972 MB
icr.io/appcafe/open-liberty kernel-slim-java17-openj9-ubi b310bb17f7b2 7 days ago 756 MB
icr.io/ibm-messaging/mq latest 8d9977e72b3f 2 weeks ago 967 MB
Libertyアプリをコンテナで起動します。
podman run --name mqapp -d -p 9080:9080 -p 9445:9445 --network mq-network mqapp:1
ポートフォワーディングにより、以下のURLからVM上のLibertyアプリにアクセス可能です。
Libertyアプリからキューマネージャーに対してメッセージが送受信できることを確認してみましょう。
送信先キューがローカルキューになっていることを確認して、適当なメッセージを入力して送信ボタンをクリックします。
受信するキューがローカルキューになっていることを確認し、受信ボタンをクリックします。
先ほど送信したキューが問題なく受信できていることを確認します。

次に、送信先キューをリモートキューに変更して、適当なメッセージを送信します。
問題なくメッセージが送信されることを確認してください。
何度かメッセージを送受信して、MQの挙動を確認します。
ローカルキューにメッセージが0件の状態で受信しようとした場合は、エラーが表示されるようになっています。
6. Instanaの導入と設定
次に、RHELの環境にInstanaエージェントの導入を行います。
Instanaにアクセスし、左のメニューからエージェントとコレクターをクリックします。
linuxで検索し、One-linerを選択します。
(macまたはwindowsで実施している場合は、読み替えてください。)
「インストールしてサービスとして開始(SystemD ベースのシステムでのみサポート)」にチェックを入れて、コマンドをコピーします。
コマンドを実行し、適宜yを押します。
Instanaエージェントの設定ファイル configuration.yaml にIBM MQプラグインの設定を追加します。
sudo vi /opt/instana/agent/etc/instana/configuration.yaml
以下の項目を追記してください。
com.instana.plugin.ibmmq:
enabled: true
poll_rate: 60
queueManagers:
QM1:
host: "127.0.0.1"
port: "1414"
channel: "INSTANA.SVRCONN"
username: "instana"
QM2:
host: "127.0.0.1"
port: "1415"
channel: "INSTANA.SVRCONN"
username: "instana"
com.instana.tracing:
ibm-mq:
trace-correlation: true
設定を反映させるため、Libertyのpodを再起動します。
podman stop mqapp
podman start mqapp
7. InstanaによるMQとLibertyの監視
Libertyアプリ上で以下の操作を行います。
- エラーが表示されるまで受信ボタンを押す
- ローカルキューに適当なメッセージを5つ送信する
- リモートキューにも適当なメッセージを1つ送信する
その後、Instanaにアクセスして、インフラストラクチャーの画面に移動します。
ホスト名を入力して、出てきた図形をクリックします。
この際、画面右上の時間設定が「過去1時間」など直近のものになっているか確認してください。

下にスクロールし、IBM MQキュー・マネージャーからQM1をクリックし、QM1のダッシュボードを開きます。
このページで、QM1から取得されるデータを確認してみましょう。

キュー数から現在の深さの列をクリックし、↓になるようにソートすると、DEV.QUEUE.1の現在の深さに先ほど送信したメッセージ数が反映されていることが確認できます。

DEV.QUEUE.1をクリックすると以下の画面に遷移し、滞留しているメッセージの経過時刻など、このキューから取得できる情報を確認できます。

次に、インフラストラクチャーの画面からWebSphere Libertyサーバー→WebSphere #defaultServerをクリックし、サービス→DefaultServerをクリックします。

この画面では、Libertyアプリのエラー率、エンドポイントごとの呼び出し時間などが確認できます。
先ほどLibertyアプリで発生させた受信エラーもここから確認できます。

GET/mqappはLibertyアプリへのgetリクエスト、POST/...はそれぞれLibertyアプリからQM1へのメッセージ送信に関するエンドポイントです。

表示された画面でHttp statusが200のバーをクリックし、POST /mqapp/api/sendlocalをクリックします。
呼び出しの画面では、ローカルキューへのメッセージ送信におけるタイムラインが確認できます。

また、WebSphere #defaultServerのダッシュボード画面でフロータブをクリックすると、どのエンドポイントに対してメッセージが流れているか確認できます。

Instanaは、IBM MQから収集したメトリクスに基づいてアラートを発生させることができます。
例えば、キュー内の最古メッセージの経過時間が設定したしきい値を超えていないかを監視し、問題が検知された場合は通知を送ることが可能です。(参考)
8. 分散トレーシングの導入
今回のように、LibertyとMQを使用したアプリでは同期通信と非同期通信が混在しています。
Instanaでは分散トレーシングという仕組みによって、このつながりを1本のTraceに統合することが可能です。
InstanaエージェントとMQが同一ホスト上に存在する場合はこちらの手順で設定が可能ですが、今回の場合はPodmanコンテナ上でMQが動作しているため、いくつか追加の手順が必要となります。
IBM MQ Tracing user exitパッケージの導入
Instanaのライセンスを持っているユーザーで、IBMドキュメントからIBM MQ Tracing user exitパッケージをダウンロードします。
以下のリンクを参照し、アーティファクトリーのアドレスをコピーします。
コピーしたURLとInstanaのエージェントキーを使用して、RHELホスト上にファイルをダウンロードします。
cd ~
curl -u _:<InstanaAgentKey> -O <ArtifactoryURL>
tar.gzファイルがダウンロードされるので、ファイルを解凍します。
gunzip instana-ibmmq-tracing-userexit-*.tar.gz
tar -xvf instana-ibmmq-tracing-userexit-*.tar
展開されたディレクトリに移動し、.tar.gz から.tarに展開します。
cd ~/ibm-mq-tracing-exits-*
gunzip ibm-mq-tracing-exits_xLinux_64bit.tar.gz
展開された .tar が存在するかを確認します。
ls ibm-mq-tracing-exits_xLinux_64bit.tar
QM1/QM2コンテナへファイルをコピーします。
cd ~
podman cp ibm-mq-tracing-exits-*/ibm-mq-tracing-exits_xLinux_64bit.tar QM1:/var/mqm/exits64/
podman cp ibm-mq-tracing-exits-*/ibm-mq-tracing-exits_xLinux_64bit.tar QM2:/var/mqm/exits64/
QM1/QM2で.tarファイルを展開して、元のファイルを削除します。
podman exec QM1 sh -lc '
cd /var/mqm/exits64 && \
tar -xvf ibm-mq-tracing-exits_xLinux_64bit.tar && \
rm ibm-mq-tracing-exits_xLinux_64bit.tar
'
```bash
podman exec QM2 sh -lc '
cd /var/mqm/exits64 && \
tar -xvf ibm-mq-tracing-exits_xLinux_64bit.tar && \
rm ibm-mq-tracing-exits_xLinux_64bit.tar
'
mqtracingexit.conf の編集
コンテナ内にviが入っていないため、ホスト側にファイルを移動してから編集する必要があります。
cd ~
podman cp QM1:/var/mqm/exits64/mqtracingexit.conf ./mqtracingexit_QM1.conf
podman cp QM2:/var/mqm/exits64/mqtracingexit.conf ./mqtracingexit_QM2.conf
これにより、RHELホスト上のカレントディレクトリに以下のファイルがコピーされます。
mqtracingexit_QM1.confmqtracingexit_QM2.conf
QM1向け設定ファイルを編集します。
vi mqtracingexit_QM1.conf
コメントアウトを外して、以下のように設定を書き換えます。
INSTANA_AGENT_HOST="host.containers.internal"
HOST_ALIAS="127.0.0.1"
QM2も同様の設定を行います。
vi mqtracingexit_QM2.conf
コメントアウトを外して以下のように書き換えます。
INSTANA_AGENT_HOST="host.containers.internal"
HOST_ALIAS="127.0.0.1"
設定したファイルをコンテナに戻します。
podman cp mqtracingexit_QM1.conf QM1:/var/mqm/exits64/mqtracingexit.conf
podman cp mqtracingexit_QM2.conf QM2:/var/mqm/exits64/mqtracingexit.conf
MQ API Exit の有効化(mqs.ini)
IBM MQにAPI Exitを登録・有効化します。
先ほどの手順と同様に、ファイルをホストにコピーして編集を行います。
podman cp QM1:/var/mqm/mqs.ini ./mqs.ini.original
cp mqs.ini.original mqs.ini
vi mqs.ini
iniファイルの最後に以下の内容を追加します。
ApiExitCommon:
Sequence=100
Function=EntryPoint
Module=/var/mqm/exits64/mqtracingexit
Name=TracingApiExit
編集した mqs.ini をコンテナ側に戻します。
podman cp mqs.ini QM1:/var/mqm/mqs.ini
QM2でも同様の手順を実行します。
podman cp QM2:/var/mqm/mqs.ini ./mqs.ini.qm2.original
cp mqs.ini.qm2.original mqs.ini.qm2
vi mqs.ini.qm2
iniファイルの最後に以下の内容を追加します。
ApiExitCommon:
Sequence=100
Function=EntryPoint
Module=/var/mqm/exits64/mqtracingexit
Name=TracingApiExit
編集した mqs.ini.qm2 をコンテナ側に戻します。
podman cp mqs.ini.qm2 QM2:/var/mqm/mqs.ini
設定を読ませるために、QM1 / QM2 を再起動します。
podman exec QM1 /opt/mqm/bin/endmqm QM1
podman exec QM1 /opt/mqm/bin/strmqm QM1
podman exec QM2 /opt/mqm/bin/endmqm QM2
podman exec QM2 /opt/mqm/bin/strmqm QM2
設定が完了すると、分散トレーシングによって一連の処理をまとめて確認することができます。
以下のグラフでは、Libertyアプリ上で「送信」ボタンが押されたことでDEV.QUEUE.1に送信されたメッセージが、「受信」ボタンによって表示されるまでの一連の処理にかかった時間が表示されています。
画面右側からは、メッセージに付与されているタグの情報が確認できます。

さらに詳しい情報をお探しの方へ
IBMの最新情報、イベント情報、さらに役立つ資料は、以下のIBM Communityでも発信・格納されています。
最新のトレンドや有益な情報をチェックするために、ぜひご覧ください!
-
WebSphere: IBM Community - WebSphere
WebSphere関連の最新情報やディスカッション、イベント情報、技術資料を公開中!
-
ELM (Engineering Lifecycle Management): IBM Community - ELM
ELMに関する最新のイベント情報、ナレッジ共有、便利なドキュメントをチェック!
-
Integration: IBM Community - Integration
Integrationに関する最新のイベント情報、ナレッジ共有、便利なドキュメントをチェック!







