ViciDial「Campaign Has No Dialable Leads」— リストとホッパーのトラブルシューティング

ダイヤル可能リードなしエラーの根本原因を把握し、体系的なリスト検証、ホッパー設定、データベースのトラブルシューティングを通じてキャンペーンの生産性を完全に回復させる。

前提条件

トラブルシューティングの前に、以下を確保してください:

  • sudo 権限を持つ ViciDial サーバーへの SSH アクセス
  • /vicidial/admin.php にある ViciDial ウェブ管理パネルへのアクセス
  • asterisk データベースへの MySQL/MariaDB コマンドラインアクセス
  • ViciDial キャンペーン構造(リスト、ダイヤラー、エージェント)の基本理解
  • Asterisk プロセスを確認するための root または asterisk-user 権限
  • ViciDial データベースと設定ファイルの最近のバックアップ
  • 検証用の既知のリード数を持つテストキャンペーン

「Campaign Has No Dialable Leads」エラーは通常、以下の場合に発生します:

  • ダイヤラーが通話を開始しようとするが、ホッパーキューが空である
  • リードリストのすべてのレコードが使い果たされたか、ダイヤル不可とマークされている
  • リスト設定がキャンペーン設定と競合している
  • ViciDial とダイヤラー間のデータベース接続が切断されている
  • リードフィルタリングルールがダイヤル可能プールからすべてのレコードを除外している

ViciDial リストアーキテクチャの理解

ViciDial におけるリードのライフサイクル

ViciDial のすべてのリードは、ダイヤル可能性を決定するステータス状態を通過します。リードは、キャンペーンとリスト設定に基づく特定の基準に一致する場合に「ダイヤル可能」と見なされます。

リードステータス状態:

  • NEW — 新しいリード、未連絡
  • QUEUE — ダイヤル予定
  • CALL — 現在ダイヤル中
  • LEFT MESSAGE — ボイスメールが残された
  • CALLED — 連絡されたが完了していない
  • XFER — 別の部門に転送された
  • XFER SEND — 転送保留中
  • INCALL — 進行中の通話
  • CBHOLD — コールバック保留ステータス
  • CBSCHED — コールバック予定
  • DNCC — Do Not Call Compiled
  • DNCL — Do Not Call List

vicidial_list テーブルの status フィールドは、リードが再ダイヤル可能かどうかを制御します。ほとんどのキャンペーンは、使い果たされたリードの無限再ダイヤルを防ぐために最大ダイヤル回数制限を設定しています。

ホッパーメカニズム

ViciDial ホッパーは、利用可能なダイヤラーにリードを供給するリアルタイムキューです。以下の方法で動作します:

  1. Query: ダイヤラーがキャンペーン基準に一致する次の利用可能なリードを要求する
  2. Fetch: システムがフィルターに基づいて vicidial_list からレコードを取得する
  3. Lock: 重複ダイヤルを防ぐためにリードを QUEUE とマークする
  4. Deliver: リードをダイヤラーにプッシュして通話試行を行う
  5. Release: 結果後、リードに新しいステータスとダイヤル回数が更新される

ホッパーがゼロ結果を返す場合、キャンペーンにはダイヤル可能なリードがありません。

前提条件検証チェックリスト

ViciDial インストールの確認

# ViciDial デーモンステータスの確認
systemctl status vicidial

# Asterisk の実行確認
asterisk -rx "core show version"

# MySQL/MariaDB 接続確認
mysql -u cron -p -h localhost asterisk -e "SELECT VERSION();"

Enter fullscreen mode Exit fullscreen mode

データベース接続の確認

# asterisk データベースアクセスのテスト
mysql -u root -p -e "SELECT * FROM asterisk.vicidial LIMIT 1;"

# vicidial_list テーブルの存在確認
mysql -u root -p asterisk -e "DESCRIBE vicidial_list;"

Enter fullscreen mode Exit fullscreen mode

ViciDial コアファイルの確認

# ViciDial 管理パスの確認
ls -la /var/www/html/vicidial/admin.php

# CLI ツールの確認
ls -la /usr/share/astguiclient/

Enter fullscreen mode Exit fullscreen mode

これらのコマンドのいずれかが失敗した場合は、トラブルシューティングを進める前にインストールの問題に対処してください。

体系的なトラブルシューティングプロセス

ステップ 1: リードリストの存在とレコード数の確認

最も基本的な確認から始めます—リストに実際にリードが含まれているか?

# MySQL にログイン
mysql -u root -p asterisk

# リストサマリーの確認
SELECT list_id, list_name, active, list_size, 
       COUNT(*) as record_count 
FROM vicidial_lists 
LEFT JOIN vicidial_list ON vicidial_lists.list_id = vicidial_list.list_id
WHERE list_id = 'YOUR_LIST_ID'
GROUP BY list_id;

Enter fullscreen mode Exit fullscreen mode

期待される出力: record_count は 0 より大きく、list_size と一致する必要があります。

record_count が 0 の場合、リストがインポートされていません。以下を確認してください:

# ViciDial ウェブ管理でインポートログを確認: Admin > Import Lists
# またはコマンドラインインポートツールを確認:
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl --list-id YOUR_LIST_ID

# ViciDial ロードキューの確認
SELECT * FROM vicidial_list_queue LIMIT 5;

Enter fullscreen mode Exit fullscreen mode

ステップ 2: リードステータス分布の確認

「ダイヤル可能なリードなし」の最も一般的な原因は、すべてのリードが連絡済みで、ステータスが再ダイヤルを許可していないことです。

-- リストのステータス内訳を確認
SELECT list_id, status, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
GROUP BY list_id, status 
ORDER BY count DESC;

Enter fullscreen mode Exit fullscreen mode

期待される出力例:

+----------+--------+-------+
| list_id  | status | count |
+----------+--------+-------+
| LIST-001 | CALLED |  4850 |
| LIST-001 | NEW    |   150 |
| LIST-001 | QUEUE  |    12 |
+----------+--------+-------+

Enter fullscreen mode Exit fullscreen mode

NEW 数が非常に少ないかゼロの場合: リードが使い果たされたか、正しいステータスでインポートされていません。リセットまたは再インポートが必要です。

すべてのリードを NEW ステータスにリセット:

UPDATE vicidial_list 
SET status = 'NEW', 
    dial_count = 0, 
    last_call_time = NULL 
WHERE list_id = 'YOUR_LIST_ID' 
LIMIT 10000;

-- 更新の確認
SELECT COUNT(*) FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' AND status = 'NEW';

Enter fullscreen mode Exit fullscreen mode

ステップ 3: キャンペーン設定の検証

キャンペーン設定は、どのリードがダイヤル可能と見なされるかを直接制御します。

# ViciDial ウェブインターフェースにアクセス
# ナビゲート: Admin > Campaigns > [Your Campaign]
# または直接クエリ:

mysql -u root -p asterisk -e "SELECT * FROM vicidial_campaigns WHERE campaign_id = 'YOUR_CAMPAIGN' \G"

Enter fullscreen mode Exit fullscreen mode

確認すべき主要フィールド:

SELECT campaign_id, 
       active, 
       dial_method, 
       list_id, 
       max_dial_count,
       auto_dial_level, 
       lead_filter_id, 
       campaign_script_id, 
       calls_in_queue_limit
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

重要なフィールド:

Field Expected Value Issues
active Y If N, campaign is disabled
dial_method ADAPT or MANUAL Wrong method blocks dialing
list_id Your list ID Blank or wrong list blocks dialing
max_dial_count Usually 3-5 Too low exhausts leads quickly
auto_dial_level 1-9 0 disables auto-dialing lead_filter_id Usually empty Filters can exclude all leads

ステップ 4: リスト設定の確認

# ウェブ管理経由: Admin > Lead Lists > [Your List]
# または MySQL 経由:

mysql -u root -p asterisk -e "SELECT * FROM vicidial_lists WHERE list_id = 'YOUR_LIST_ID' \G"

Enter fullscreen mode Exit fullscreen mode

重要なフィールド:

SELECT list_id, list_name, active, list_size, 
       project_area, script_id, lead_filter_id, 
       campaign_id_string 
FROM vicidial_lists 
WHERE list_id = 'YOUR_LIST_ID';

Enter fullscreen mode Exit fullscreen mode

リストがアクティブとマークされているか確認:

UPDATE vicidial_lists 
SET active = 'Y' 
WHERE list_id = 'YOUR_LIST_ID';

Enter fullscreen mode Exit fullscreen mode

ステップ 5: リアルタイムでのホッパーキュー確認

ホッパーはダイヤル直前にリードがステージングされる場所です。ホッパーが入力されているか確認します:

-- アクティブなホッパーエントリの確認
SELECT campaign_id, count(*) as hopper_count 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
GROUP BY campaign_id;

-- サンプルホッパーレコードの表示
SELECT hopper_id, campaign_id, status, priority, dialable_status 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
LIMIT 10;

Enter fullscreen mode Exit fullscreen mode

ホッパーが空の場合: ダイヤラーがキャンペーン基準に一致するリードを見つけられません。

ホッパーの手動投入(テスト用):

# ViciDial CLI ツールを使用してホッパーをロード
/usr/share/astguiclient/VICIDIAL_hopper_loader.pl --campaign-id YOUR_CAMPAIGN --queue-size 100

Enter fullscreen mode Exit fullscreen mode

Asterisk ログでホッパーロード出力を確認:

tail -50 /var/log/asterisk/messages | grep -i hopper

Enter fullscreen mode Exit fullscreen mode

ステップ 6: ダイヤラーグループ設定の検証

ダイヤラーはグループに割り当てられます。キャンペーンのダイヤラーグループがリストにアクセスできるか確認します。

-- キャンペーンのダイヤラーグループを確認
SELECT campaign_id, dialer_group_id 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- ダイヤラーグループメンバーの確認
SELECT dialier_id, dialer_group, active, server_ip, count_attempt_leads 
FROM vicidial_dialiers 
WHERE dialer_group = 'YOUR_DIALER_GROUP' 
AND active = 'Y';

Enter fullscreen mode Exit fullscreen mode

各ダイヤラーについて、到達可能であることを確認:

# ダイヤラー接続のテスト
asterisk -rx "sip show peers" | grep "YOUR_DIALER"

# ViciDial ログでダイヤラーステータスを確認
tail -100 /var/log/asterisk/messages | grep -i "dialier"

Enter fullscreen mode Exit fullscreen mode

ステップ 7: リードフィルタルールの確認

リードフィルターは、ダイヤル可能性からすべてのレコードをサイレントに除外する可能性があります。

-- キャンペーンに割り当てられたフィルターを特定
SELECT lead_filter_id FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- フィルタルールの表示
SELECT lead_filter_id, filter_name, filter_type, filter_label 
FROM vicidial_lead_filters 
WHERE lead_filter_id IN (
  SELECT lead_filter_id FROM vicidial_campaigns 
  WHERE campaign_id = 'YOUR_CAMPAIGN'
);

-- フィルター基準の確認
SELECT * FROM vicidial_lead_filter_rules 
WHERE lead_filter_id = 'YOUR_FILTER_ID';

Enter fullscreen mode Exit fullscreen mode

テストのため一時的にフィルターを無効化:

UPDATE vicidial_campaigns 
SET lead_filter_id = '' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- ウェブ管理でキャンペーンを再起動

Enter fullscreen mode Exit fullscreen mode

フィルターを削除した後にリードがダイヤル可能になった場合、フィルタルールが原因です。フィルター基準を確認して修正してください。

ステップ 8: ダイヤル回数と最大ダイヤル回数の確認

各リードには dial_count フィールドがあります。これが max_dial_count 以上になった場合、ダイヤル不可になります。

-- ダイヤル回数分布の確認
SELECT list_id, dial_count, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
GROUP BY dial_count 
ORDER BY dial_count DESC;

-- キャンペーンの max_dial_count の確認
SELECT campaign_id, max_dial_count 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

すべてのリードの dial_count >= max_dial_count の場合:

-- ダイヤル回数のリセット
UPDATE vicidial_list 
SET dial_count = 0 
WHERE list_id = 'YOUR_LIST_ID';

-- またはキャンペーンの max_dial_count を増加
UPDATE vicidial_campaigns 
SET max_dial_count = 10 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

一般的な原因と具体的な解決策

原因 1: リストがキャンペーンにリンクされていない

-- キャンペーンが正しいリストを指しているか確認
SELECT campaign_id, list_id, list_id_string, dial_method 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- 修正: キャンペーンを正しいリストを使用するように更新
UPDATE vicidial_campaigns 
SET list_id = 'YOUR_LIST_ID', 
    list_id_string = 'YOUR_LIST_ID' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

原因 2: キャンペーンが一時停止またはオートダイヤル無効

-- キャンペーンのアクティブステータスとオートダイヤルレベルを確認
SELECT campaign_id, active, auto_dial_level, campaign_status 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- キャンペーンの再起動
UPDATE vicidial_campaigns 
SET active = 'Y', 
    auto_dial_level = 4, 
    campaign_status = 'ACTIVE' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

その後 ViciDial を再起動:

systemctl restart vicidial

Enter fullscreen mode Exit fullscreen mode

原因 3: すべてのリードが Do Not Call とマークされている

-- DNCC (Do Not Call Compiled) ステータスの確認
SELECT list_id, status, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
AND status IN ('DNCC', 'DNCL') 
GROUP BY status;

-- DNCC マークのクリア(リストが誤ってフラグ付けされた場合)
UPDATE vicidial_list 
SET status = 'NEW' 
WHERE list_id = 'YOUR_LIST_ID' 
AND status = 'DNCC';

Enter fullscreen mode Exit fullscreen mode

原因 4: Asterisk-ViciDial 通信が切断されている

Asterisk が ViciDial リクエストに応答しているか確認:

# Asterisk プロセスの確認
ps aux | grep asterisk | grep -v grep

# Asterisk の再起動
systemctl restart asterisk

# SIP 接続の確認
asterisk -rx "sip show peers"

# Asterisk ログの表示
tail -100 /var/log/asterisk/messages

Enter fullscreen mode Exit fullscreen mode

原因 5: データベースの破損またはロック

# ロックされたテーブルの確認
mysql -u root -p asterisk -e "SHOW OPEN TABLES WHERE In_use > 0;"

# ロックされた場合 MySQL を再起動
systemctl restart mariadb

# vicidial_list テーブルの整合性確認
mysql -u root -p asterisk -e "CHECK TABLE vicidial_list;"

# 破損した場合の修復
mysql -u root -p asterisk -e "REPAIR TABLE vicidial_list;"

Enter fullscreen mode Exit fullscreen mode

高度な設定例

完全なホッパーロードスクリプト

/usr/local/bin/load_hopper.sh を作成:

#!/bin/bash

CAMPAIGN_ID="$1"
QUEUE_SIZE="$2"

if [ -z "$CAMPAIGN_ID" ] || [ -z "$QUEUE_SIZE" ]; then
    echo "Usage: $0 <CAMPAIGN_ID> <QUEUE_SIZE>"
    exit 1
fi

# Perl CLI を使用してホッパーをロード
/usr/share/astguiclient/VICIDIAL_hopper_loader.pl \
    --campaign-id "$CAMPAIGN_ID" \
    --queue-size "$QUEUE_SIZE" \
    --priority 5 \
    --dialable-status READY

# ホッパーがロードされたか確認
HOPPER_COUNT=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='$CAMPAIGN_ID';")

echo "Hopper loaded: $HOPPER_COUNT records"

# イベントのログ記録
echo "$(date): Hopper loaded for $CAMPAIGN_ID with $HOPPER_COUNT records" \
    >> /var/log/vicidial_hopper.log

Enter fullscreen mode Exit fullscreen mode

使用方法:

chmod +x /usr/local/bin/load_hopper.sh
/usr/local/bin/load_hopper.sh YOUR_CAMPAIGN 500

Enter fullscreen mode Exit fullscreen mode

ステータス検証付きリストインポート

新しいリストをインポートする際は、正しいステータス割り当てを確保します:

#!/bin/bash
# Script: import_list_with_validation.sh

LIST_FILE="$1"
LIST_ID="$2"
CAMPAIGN_ID="$3"

# ViciDial インポーターを使用してリストをインポート
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl \
    --list-id "$LIST_ID" \
    --list-file "$LIST_FILE" \
    --delete-duplicates YES \
    --ignore-blank-phone YES

# インポートの検証
TOTAL=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_list WHERE list_id='$LIST_ID';")

NEW_COUNT=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_list WHERE list_id='$LIST_ID' AND status='NEW';")

echo "List $LIST_ID imported with $TOTAL total records, $NEW_COUNT in NEW status"

# キャンペーンがリンクされているか確認
mysql -u root -p'PASSWORD' asterisk -e \
    "UPDATE vicidial_campaigns SET list_id='$LIST_ID' WHERE campaign_id='$CAMPAIGN_ID';"

echo "Campaign $CAMPAIGN_ID linked to list $LIST_ID"

Enter fullscreen mode Exit fullscreen mode

キャンペーンダイアグノスティックスクリプト

/usr/local/bin/diagnose_campaign.sh を作成:

#!/bin/bash
# Complete campaign diagnostics

CAMPAIGN_ID="$1"
DB_USER="root"
DB_PASS="your_password"
DB_NAME="asterisk"

echo "=== ViciDial Campaign Diagnostics ==="
echo "Campaign: $CAMPAIGN_ID"
echo "Time: $(date)"
echo ""

# 1. Campaign status
echo "--- CAMPAIGN STATUS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT campaign_id, campaign_name, active, auto_dial_level, 
            dial_method, list_id, max_dial_count, dialer_group_id 
     FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';"

# 2. List statistics
echo ""
echo "--- LEAD LIST STATUS ---"
LIST_ID=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -N -e \
    "SELECT list_id FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';")

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT list_id, status, COUNT(*) as count FROM vicidial_list 
     WHERE list_id='$LIST_ID' GROUP BY status ORDER BY count DESC;"

# 3. Hopper status
echo ""
echo "--- HOPPER STATUS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT campaign_id, COUNT(*) as hopper_count FROM vicidial_hopper 
     WHERE campaign_id='$CAMPAIGN_ID' GROUP BY campaign_id;"

# 4. Dialer status
echo ""
echo "--- DIALER STATUS ---"
DIALER_GROUP=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -N -e \
    "SELECT dialer_group_id FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';")

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT dialier_id, dialer_group, active, server_ip FROM vicidial_dialiers 
     WHERE dialer_group='$DIALER_GROUP';"

# 5. Active calls
echo ""
echo "--- ACTIVE CALLS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT COUNT(*) as active_calls FROM vicidial_log 
     WHERE campaign_id='$CAMPAIGN_ID' AND call_date >= DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
     AND end_epoch = 0;"

# 6. Asterisk SIP peers
echo ""
echo "--- ASTERISK SIP PEERS ---"
asterisk -rx "sip show peers" | head -5

echo ""
echo "=== END DIAGNOSTICS ==="

Enter fullscreen mode Exit fullscreen mode

使用方法:

chmod +x /usr/local/bin/diagnose_campaign.sh
/usr/local/bin/diagnose_campaign.sh YOUR_CAMPAIGN

Enter fullscreen mode Exit fullscreen mode

トラブルシューティングチェックリスト

Issue Diagnostic Command Fix
No leads in list SELECT COUNT(*) FROM vicidial_list WHERE list_id='LIST_ID'; Re-import list
All leads exhausted SELECT status, COUNT(*) FROM vicidial_list WHERE list_id='LIST_ID' GROUP BY status; Reset status to NEW
Campaign not linked to list SELECT list_id FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; Update campaign list_id
Hopper empty SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='CAMP_ID'; Run hopper loader script
Campaign paused SELECT active FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; Set active='Y'
Dial count exceeded SELECT dial_count FROM vicidial_list WHERE list_id='LIST_ID' GROUP BY dial_count; Reset dial_count or increase max_dial_count
Filter blocking leads SELECT lead_filter_id FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; Remove or fix filter
Asterisk down systemctl status asterisk systemctl restart asterisk
Database locked SHOW OPEN TABLES WHERE In_use > 0; systemctl restart mariadb
Dialer group offline SELECT active FROM vicidial_dialiers WHERE dialer_group='GROUP'; Check dialer connectivity

Asterisk CLI 検証

データベースの問題を修正したら、Asterisk が通信できることを確認します:

# Asterisk の実行確認
asterisk -rx "core show version"

# SIP 登録の監視
asterisk -rx "sip show peers"

# アクティブな通話の監視
asterisk -rx "core show calls"

# チャネルアクティビティの監視
asterisk -rx "core show channels"

# ViciDial キューの確認
asterisk -rx "queue show"

# 通話統計の表示
asterisk -rx "core show stats"

# リアルタイム監視(コンソールにアタッチ)
asterisk -r
# Then type: dialplan show vicidial-set-agent-status (or relevant context)

Enter fullscreen mode Exit fullscreen mode

ViciDial 再起動手順

設定変更後、ViciDial と Asterisk を適切に再起動します:

# ViciDial サービスの停止
systemctl stop vicidial
systemctl stop asterisk

# オプション: ハングプロセスがないか確認
ps aux | grep -E "(asterisk|vicidial)" | grep -v grep

# 残りのプロセスを強制終了
killall -9 asterisk
killall -9 perl

# 正しい順序でサービスを開始
systemctl start mariadb
sleep 5
systemctl start asterisk
sleep 10
systemctl start vicidial

# すべてのサービスが開始されたか確認
systemctl status vicidial asterisk mariadb

# エラーログの確認
tail -50 /var/log/asterisk/messages
tail -50 /var/log/vicidial.log

Enter fullscreen mode Exit fullscreen mode

監視と予防

リアルタイムキャンペーン監視の設定

-- 定期的に実行する監視クエリの作成
-- 空のホッパーを持つキャンペーンの確認

SELECT c.campaign_id, c.campaign_name, 
       COALESCE(COUNT(h.hopper_id), 0) as hopper_count,
       (SELECT COUNT(*) FROM vicidial_list 
        WHERE list_id = c.list_id AND status = 'NEW') as new_leads
FROM vicidial_campaigns c
LEFT JOIN vicidial_hopper h ON c.campaign_id = h.campaign_id
WHERE c.active = 'Y'
GROUP BY c.campaign_id
HAVING hopper_count < 50 OR new_leads = 0;

Enter fullscreen mode Exit fullscreen mode

ViciDial デバッグログの有効化

/etc/asterisk/extensions-vicidial.conf を編集:

[vicidial-set-agent-status]
exten => _X.,1,Set(VERBOSE_PREFIX_3=***VICIDIAL_DEBUG***)
exten => _X.,n,NoOp(Campaign: ${CAMPAIGN_ID} | List: ${LIST_ID} | Lead: ${LEAD_ID})
exten => _X.,n,NoOp(Dialable: ${DIALABLE_STATUS} | Status: ${LEAD_STATUS})

Enter fullscreen mode Exit fullscreen mode

その後 Asterisk CLI で:

asterisk -rx "core set debug 9"
asterisk -rx "core set verbose 9"
asterisk -rx "sip set debug on"

Enter fullscreen mode Exit fullscreen mode

低いホッパー状態のアラート

ホッパーが枯渇した場合にアラートする cron ジョブを作成:

#!/bin/bash
# File: /usr/local/bin/check_hopper_alert.sh

THRESHOLD=100
MAIL="[email protected]"

for CAMPAIGN in $(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT campaign_id FROM vicidial_campaigns WHERE active='Y';"); do

    HOPPER=$(mysql -u root -p'PASSWORD' asterisk -N -e \
        "SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='$CAMPAIGN';")

    if [ "$HOPPER" -lt "$THRESHOLD" ]; then
        echo "WARNING: Campaign $CAMPAIGN hopper count: $HOPPER" | \
            mail -s "ViciDial Hopper Alert: $CAMPAIGN" "$MAIL"
    fi
done

Enter fullscreen mode Exit fullscreen mode

crontab に追加:

*/5 * * * * /usr/local/bin/check_hopper_alert.sh

Enter fullscreen mode Exit fullscreen mode

まとめ

ViciDial の「Campaign Has No Dialable Leads」エラーは、リスト管理、キャンペーン設定、データベース状態にわたる体系的な問題に起因します。以下のトラブルシューティングパスに従ってください:

  1. リードの存在を確認vicidial_list テーブルのレコード数をカウント
  2. リードステータスを確認 — NEW リードが利用可能で、CALLED/DNCC ではないことを確認
  3. キャンペーン設定を検証 — リストリンク、アクティブステータス、オートダイヤル有効を確認
  4. ホッパーを検査 — ダイヤラー用に準備されたエントリがホッパーにあることを確認
  5. フィルターを確認 — リードフィルターがすべてのレコードを除外していないことを確認
  6. ダイヤラーを確認 — ダイヤラーグループがアクティブで接続されていることを確認
  7. Asterisk をテスト — SIP 登録とチャネル可用性を確認
  8. サービスを再起動 — ViciDial、Asterisk、MySQL を正しい順序で再起動

提供された診断スクリプトと SQL クエリを使用して、特定の環境で根本原因を特定してください。ほとんどの問題は、リードステータスを NEW にリセットしたり、キャンペーンをリストに正しくリンクしたり、問題のあるフィルターをクリアすることで解決します。本番システムでは、再発を防ぐために監視スクリプトを実装してください。