Parasoft DTP(以降、DTP)は、JtestやdotTESTなどの静的解析結果を管理し、品質と効率を向上させるための重要なツールです。このツールは、静的解析や単体テストの結果を見える化し、プロジェクト全体で共有するためのレポート機能を提供します。Webブラウザーからアクセスすれば、統計情報や問題の詳細をリアルタイムに確認・共有できます。
ただし、DTPのサービスが途中で停止した場合、その問題に気づくまで時間がかかることがあります。これにより、システムの品質や効率が低下する恐れがあります。したがって、DTPのサービスを監視し、停止や問題を早期に発見することが重要です。
では、DTPのパフォーマンスや稼働状況を把握し、運用の安定性を向上させるためには、どのように監視すれば良いのでしょうか?今回は、その方法とメリットについて探ってみたいと思います。
ソースコードの品質向上を実現します。
目次
使用ツールと構成
今回は、DTPの監視を実現するために、以下のオープンソースツールを利用します。
- Prometheus(v2.53.2):強力な監視システムとして、時系列データの収集と保存を行います。
- Alertmanager(v0.27.0):Prometheusと連携し、アラートの管理と通知を行います。
- Blackbox exporter(v0.25.0):外部からの監視を行うためのツールで、HTTP、HTTPS、DNS、TCPなどのプロトコルを監視します。
- その他:docker(v27.0.2)、docker compose(v2.28.1)
以下のような構成で構築してみます。
① blackbox-exporterは、DTPのエンドポイント(xxx.xxx.xxx.xxx:8080、8443、8082、8314)に対して、TCPへのリクエストを送信し、応答を監視します。
② blackbox-exporterの監視状況をPrometheusに提供します。
③ Prometheusは提供された情報を収集・保存し、設定されたアラートを評価します。
④ AlertmanagerはPrometheusで評価された結果を確認します(TCPの応答が正常かどうか等)。
⑤ 応答が正常ではない場合、設定された場所へ通知を行います(今回は管理者のPCに用意したWebhookへ通知を行います。メールやslack等にも通知が可能です)。
⑥ Webhookに通知が届いたら、通知用のPowershellのスクリプトを実行します。
⑦ Powershellのスクリプトで、管理者のPCに通知(バルーンチップを表示)を行います。
設定内容(使い方)
次に、各ツールの設定内容とサービス起動について簡単に紹介します。
以下のフォルダ構成(docker compose)で管理します。
1.compose.yamlの設定:
- 各コンポーネントをDockerコンテナとして実行するためのdocker-compose.ymlファイルを作成します。
# compose.yaml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- './prometheus/prometheus.yml:/etc/prometheus/prometheus.yml'
- './prometheus/alert.rules:/etc/prometheus/alert.rules'
ports:
- "9090:9090"
networks:
- monitoring_network
blackbox-exporter:
image: prom/blackbox-exporter:latest
container_name: blackbox-exporter
ports:
- "9115:9115"
command:
- '--config.file=/config/blackbox.yml'
volumes:
- ./blackbox/blackbox.yml:/config/blackbox.yml
networks:
- monitoring_network
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
volumes:
- './alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml'
ports:
- "9093:9093"
networks:
- monitoring_network
networks:
monitoring_network:
name: monitoring_network
driver: bridge
2.Prometheusの設定:
- Prometheusの設定ファイル(prometheus.yml)を編集し、Blackbox exporterとAlertmanagerを連携させます。
# prometheus.yml
global:
scrape_interval: 15s # ターゲットからメトリクスを取得する間隔を設定(15秒毎にメトリクスを収集)
scrape_configs: # メトリクスを収集対象のターゲットを設定(複数Jobを定義可能)
- job_name: 'blackbox_dtp_tcp' # blackbox用のjobを定義(DTP監視用)
metrics_path: /probe # メトリクスを収集するパス
params:
module: [tcp_connect] # TCP接続を監視するためのモジュールを指定
static_configs:
- targets: # 収集対象のターゲット(xxx.xxx.xxx.xxxはDTP Serverのhostnameに置き換える)
- xxx.xxx.xxx.xxx:8080 # DTP Server
- xxx.xxx.xxx.xxx:8443 # DTP Server SSL Connector
- xxx.xxx.xxx.xxx:8082 # DTP Server Data Collector
- xxx.xxx.xxx.xxx:8314 # DTP Server Extension Designer
relabel_configs:
- source_labels: [__address__] # Prometheusからプローブリクエストのターゲットを渡すための設定
target_label: __param_target
- source_labels: [__param_target] # Prometheusに監視対象を表示するため、instanceラベルを追加
target_label: instance
- target_label: __address__ # Prometheusからプローブリクエストの送信先(Blackbox exporter)を設定
replacement: blackbox-exporter:9115
alerting:
alertmanagers: # Prometheusとalertmanagersを紐づける
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- "alert.rules" # アラートルールの定義ファイルを設定
alert.rules
ファイルを作成し、アラートの条件を設定します。以下は、DTPの監視対象ポートが応答しない場合にアラートを発生させる例です。
# alert.rules
groups:
- name: dtp_tcp_connectivity # アラートルールのグループ名
rules:
- alert: DTP_TCPConnectionFailed # アラート名
expr: probe_success == 0 # アラートの発生条件(監視対象がダウンしている場合)
for: 1m # アラートの発生条件を満たすための時間(1分間、監視対象がダウンしている場合)
labels:
severity: critical # アラートの重要度
annotations:
summary: "DTPサーバー接続失敗" # アラートの概要
description: "Target:{{ $labels.instance }}" # アラートの詳細(ダウンしている監視対象を設定)
Prometheus設定詳細(DockerHub):https://hub.docker.com/r/prom/prometheus
3.Alertmanagerの設定:
- Alertmanagerの設定ファイル(alertmanager.yml)を編集し、アラートのルールを定義します。
# alertmanager.yml
global:
resolve_timeout: 1m # アラートが解決されたとみなすまでのタイムアウト時間(1分)
route:
receiver: webhook-notify # アラートが発生した場合の通知の送り先を設定(receiversのnameを設定)
repeat_interval: 5m # アラートが解決されない場合の通知の通知の再送付間隔(5分)
receivers:
- name: 'webhook-notify'
# 通知の送り先の名前
webhook_configs: # Webhookを使って通知を送るための設定
- url: 'https://xxx.xxx.xxx.xxx:xxxx/5000' # 通知を送信するWebhookのURLを指定(管理者用PCに構築したwebhookのURL)
send_resolved: false # 解決済みのアラートを通知するか設定(false:通知しない)
Alertmanager設定詳細(DockerHub):https://hub.docker.com/r/prom/alertmanager
4.Blackbox exporterの設定:
- Blackbox exporterの設定ファイル(blackbox.yml)を編集し、TCPコネクトモジュールを使用してParasoft DTPの各ポートを監視します。
# blackbox.yml
modules:
tcp_connect: # prometheus.ymlで定義したモジュール名
prober: tcp # TCPプローブの使用を設定
timeout: 5s # プローブがタイムアウトするまでの時間を設定(TCP接続が5秒以内に確立できない場合、失敗)
Blackbox exporter設定詳細(DockerHub):https://hub.docker.com/r/prom/blackbox-exporter
5.設定した各サービスを実行:
- compose.yamlに定義された全てのサービスをバックグラウンドで起動します。
コマンド実行
> cd /opt/monitoring_stack
> docker compose up -d
補足.Alertmanagerの通知を受信するための「Webhook、PowerShellスクリプト」の作成と起動(テスト用)
- Alertmanagerから受信した通知内容をPowerShellスクリプトへ渡すように、Webhook用のPythonスクリプトを作成します。
# webhook_server.py(Python version 3.12.2、Webアプリのフレームワーク:Flaskが必要)
from flask import Flask, request
import subprocess
import json
app = Flask(__name__)
@app.route('/alert', methods=['POST'])
def alert():
data = request.json
alerts = data.get('alerts', [])
if not alerts:
return 'No alerts found', 400
# 最初のアラートのsummaryをタイトルに設定
title = alerts[0]['annotations'].get('summary', '')
# 各アラートのインスタンスをメッセージに追加
message_lines = []
for alert in alerts:
instance = alert['labels'].get('instance', '')
message_lines.append(f"- Target:{instance}")
message = "\n".join(message_lines)
# PowerShellスクリプトを実行し、タイトルとメッセージを渡す(スクリプトのパスを指定)
subprocess.run(["powershell.exe", "-File", "<Path>\\notify.ps1", "-title", title, "-message", message])
return '', 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
- Webhookから取得したメッセージをWindowsのballoontipに表示するように、PowerShellスクリプトを作成します。
# notify.ps1
param (
[string]$title = "no title",
[string]$message = "no message"
)
Add-Type -AssemblyName System.Windows.Forms
# 通知オブジェクトを作成
$notify = New-Object system.windows.forms.notifyicon
$notify.icon = [System.Drawing.SystemIcons]::Error
$notify.visible = $true
# balloontipを表示
$notify.showballoontip(20, $title, $message, [system.windows.forms.tooltipicon]::Error)
# balloontipが表示されるようにSleep
Start-Sleep -Seconds 20
# 通知を非表示
$notify.visible = $false
$notify.dispose()
- Flaskをインストールし、webhook_server.pyを実行します。
PowerShellコマンド実行
Flaskをインストール(Python Webアプリのフレームワーク)
> pip install flask
Pythonスクリプト(webhook_server.py)を実行
> python webhook_server.py
動作確認
各サービスの起動を確認し、DTPが監視できているか確認します。
【DTP正常起動中】Prometheusをブラウザから起動し、Blackbox exporterとAlertmanagerが起動していることを確認します。
- ブラウザからPrometheus(http://xxx.xxx.xxx.xxx:9090)に接続 > メニューのStatus > Targets を選択
Blackbox exporterに定義した、ターゲット4つ(DTP Server)が正常に監視されていることが確認できます。
- メニューのAlerts を選択
Alertが発生していないため、DTPのTCP接続が正常に確立できていることが確認できます。
【DTPダウン中】Alertmanagerから通知されていることを確認します。
- ブラウザからPrometheus(http://xxx.xxx.xxx.xxx:9090)に接続 > メニューのAlertsを選択
DTPのTCP接続に失敗しており、Alertsが発生(State:FIRING)していることが確認できます。
- 管理者用PCの通知を確認
管理者用PCにAlertsが通知されていることが確認できます。
以上で、各サービスが起動し、DTPが監視されていることが確認できました。
まとめ
Parasoft DTPを監視することで、システムのパフォーマンスや稼働状況を確実に把握することができます。これにより、問題が発生した際に迅速に対応できるだけでなく、長期的な運用の安定性も向上させることができます。今回は、Prometheus、Alertmanager、Blackbox exporterを活用してParasoft DTPを監視する方法について紹介しました。特にTCPコネクトを使用して各ポートの稼働状況を監視することで、DTPの運用が一層効率的で信頼性の高いものとなるでしょう。
なお、ここで紹介した方法は一例であり、推奨される公式な方法ではありません。あくまで参考として捉えていただければと思います。この流れを参考にしながら、自分のシステムに最適な監視の仕組みを構築してみてください。