DTPの監視を試みる:OSSを活用した手法

Parasoft DTP(以降、DTP)は、JtestやdotTESTなどの静的解析結果を管理し、品質と効率を向上させるための重要なツールです。このツールは、静的解析や単体テストの結果を見える化し、プロジェクト全体で共有するためのレポート機能を提供します。Webブラウザーからアクセスすれば、統計情報や問題の詳細をリアルタイムに確認・共有できます。

ただし、DTPのサービスが途中で停止した場合、その問題に気づくまで時間がかかることがあります。これにより、システムの品質や効率が低下する恐れがあります。したがって、DTPのサービスを監視し、停止や問題を早期に発見することが重要です。

では、DTPのパフォーマンスや稼働状況を把握し、運用の安定性を向上させるためには、どのように監視すれば良いのでしょうか?今回は、その方法とメリットについて探ってみたいと思います。

 

Parasoft Jtest(Java用)とdotTEST(C#、VB.NET用)は、コードに潜むさまざまなセキュリティ脆弱性を早期発見
ソースコードの品質向上を実現します。

>> Parasoft Jtest の詳細はこちら <<


>> Parasoft dotTEST の詳細はこちら <<

 

今回は、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の運用が一層効率的で信頼性の高いものとなるでしょう。

なお、ここで紹介した方法は一例であり、推奨される公式な方法ではありません。あくまで参考として捉えていただければと思います。この流れを参考にしながら、自分のシステムに最適な監視の仕組みを構築してみてください。

Top