データセットステータス取得

コマンドシグネチャ

php artisan dataset:get-status {dataset_id?}

目的

dataset:get-statusコマンドは、TV Python APIにステータス更新をクエリし、コンソールデータベース(gb_console)のデータセットレコードを更新し、ユーザーと管理者に適切な通知をトリガーすることにより、保留中のデータセット生成プロセスを監視します。このコマンドは、データセット処理状態のリアルタイム追跡を確保し、特定視点分析のためのバッチジョブ作成を含む完了ワークフローを処理します。

シーケンス図

ステップ1:コマンド初期化とデータセット取得

sequenceDiagram
    participant System
    participant StatusCommand as dataset:get-status
    participant HistoryRepo as WishlistDatasetHistoryRepository
    participant ConsoleDB[(gb_console.wishlist_dataset_histories)]
    participant Logger
    participant Slack
    
    Note over System,Slack: コマンド初期化(5分毎)
    
    rect rgb(200, 255, 200)
    Note right of System: 正常ケース - コマンド起動
    System->>StatusCommand: コマンド実行
    StatusCommand->>Logger: dataset_idパラメータでコマンド開始をログ
    
    StatusCommand->>HistoryRepo: getPendingAndAnalyzingRecords(dataset_id?)
    HistoryRepo->>ConsoleDB: WHERE status IN ('Pending', 'Analyzing')をクエリ
    Note right of HistoryRepo: 提供された場合はdataset_idでフィルタリング
    ConsoleDB-->>HistoryRepo: Pending/Analyzing状態のデータセットを返す
    HistoryRepo-->>StatusCommand: Pending/Analyzing状態のデータセットを返す
    StatusCommand->>Logger: 見つかったデータセット数をログ
    end
    
    rect rgb(255, 200, 200)
    Note right of System: エラーハンドリング
    rect rgb(255, 230, 230)
    alt データベース接続エラー
        HistoryRepo->>Logger: データベース接続エラーをログ
        HistoryRepo->>Slack: データベースエラー通知を送信
    else 保留中のデータセットなし
        StatusCommand->>Logger: 監視するデータセットがないことをログ
    else 無効なデータセットID
        StatusCommand->>Logger: 無効なdataset_idパラメータをログ
        StatusCommand->>Slack: 無効なパラメータ通知を送信
    end
    end
    end

ステップ2:APIステータス確認

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant AnalyzerAPI as TV Python API
    participant APIService as AnalyzerApiService
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: データセットステータス検証プロセス
    
    rect rgb(200, 255, 200)
    Note right of StatusCommand: 正常ケース - ステータス監視
    
    loop 各保留中データセットに対して
        StatusCommand->>Logger: データセット処理開始をログ
        
        rect rgb(200, 230, 255)
        Note right of StatusCommand: APIステータスリクエスト
        StatusCommand->>APIService: prepareStatusRequest(datasetId)
        APIService->>APIService: validateDatasetId()
        APIService->>APIService: addAuthenticationHeaders()
        APIService-->>StatusCommand: フォーマットされたリクエストを返す
        
        StatusCommand->>AnalyzerAPI: getDatasetDetail(datasetId)
        AnalyzerAPI->>AnalyzerAPI: リクエストを検証しデータセットを取得
        AnalyzerAPI-->>StatusCommand: 現在のステータスと進捗を返す
        StatusCommand->>Logger: ステータス詳細付きでAPIレスポンスをログ
        end
    end
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: エラーハンドリング
    rect rgb(255, 230, 230)
    alt API認証エラー
        AnalyzerAPI->>Logger: 認証失敗をログ
        AnalyzerAPI->>Slack: API認証エラーを送信
        AnalyzerAPI->>StatusCommand: 認証エラーを返す
    else データセットが見つからない
        AnalyzerAPI->>Logger: データセットが見つからないエラーをログ
        AnalyzerAPI->>Slack: データセットが見つからない通知を送信
        AnalyzerAPI->>StatusCommand: 見つからないエラーを返す
    else APIサービスエラー
        AnalyzerAPI->>Logger: レスポンス付きでAPIサービスエラーをログ
        AnalyzerAPI->>Slack: APIサービスエラー通知を送信
        AnalyzerAPI->>StatusCommand: サービスエラーを返す
    else APIタイムアウトエラー
        AnalyzerAPI->>Logger: APIタイムアウトエラーをログ
        AnalyzerAPI->>Slack: タイムアウトエラー通知を送信
        AnalyzerAPI->>StatusCommand: タイムアウトエラーを返す
    end
    end
    end

ステップ3:ステータス比較と変更検出

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant HistoryRepo as WishlistDatasetHistoryRepository
    participant LogService as DatasetCreationLogService
    participant ConsoleDB[(gb_console)]
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: ステータス変更検出と検証
    
    rect rgb(200, 255, 200)
    Note right of StatusCommand: 正常ケース - ステータス比較
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: ステータス変更検出
    StatusCommand->>StatusCommand: compareCurrentWithApiStatus()
    StatusCommand->>StatusCommand: validateStatusTransition()
    StatusCommand->>Logger: ステータス比較結果をログ
    
    alt ステータス変更あり
        Note right of StatusCommand: ステータス更新必要
        StatusCommand->>HistoryRepo: transactionBegin()
        StatusCommand->>HistoryRepo: updateDatasetStatus(newStatus)
        HistoryRepo->>ConsoleDB: UPDATE wishlist_dataset_histories SET status
        ConsoleDB-->>HistoryRepo: ステータス更新を確認
        HistoryRepo-->>StatusCommand: ステータス更新を確認
        
        StatusCommand->>LogService: logStatusChangeEvent(dataset, oldStatus, newStatus)
        LogService->>ConsoleDB: INSERT INTO wishlist_dataset_creation_logs
        ConsoleDB-->>LogService: ログレコードIDを返す
        LogService-->>StatusCommand: イベントログ記録を確認
        
        StatusCommand->>Logger: ステータス変更成功をログ
    else ステータス変更なし
        Note right of StatusCommand: ステータス変更なし
        StatusCommand->>StatusCommand: 監視を継続
        StatusCommand->>Logger: ステータス変更が検出されないことをログ
    end
    end
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: エラーハンドリング
    rect rgb(255, 230, 230)
    alt 無効なステータス遷移
        StatusCommand->>Logger: 無効なステータス遷移エラーをログ
        StatusCommand->>Slack: ステータス検証エラー通知を送信
    else データベース更新エラー
        StatusCommand->>Logger: データベース更新エラーをログ
        StatusCommand->>HistoryRepo: transactionRollback()
        StatusCommand->>Slack: データベースエラー通知を送信
    else ログ作成エラー
        StatusCommand->>Logger: イベントログ記録エラーをログ
        StatusCommand->>Slack: ログ記録エラー通知を送信
    end
    end
    end

ステップ4:データセット完了処理

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant BatchJobService as BatchJobViewpointService
    participant NotificationService as DatasetNotificationService
    participant AnalyzerDB[(gb_analyzer.batch_jobs_vps)]
    participant ConsoleDB[(gb_console)]
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: データセット完了処理
    
    rect rgb(200, 255, 200)
    Note right of StatusCommand: 正常ケース - データセット完了
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: バッチジョブ作成
    StatusCommand->>BatchJobService: createBatchJobsIfNeeded(dataset)
    BatchJobService->>BatchJobService: checkViewpointRequirements()
    BatchJobService->>BatchJobService: prepareBatchJobData()
    BatchJobService->>AnalyzerDB: INSERT INTO batch_jobs_vps
    AnalyzerDB-->>BatchJobService: バッチジョブIDを返す
    BatchJobService-->>StatusCommand: バッチジョブ作成を確認
    StatusCommand->>Logger: バッチジョブ作成成功をログ
    end
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: 成功通知
    StatusCommand->>NotificationService: sendSuccessNotification()
    NotificationService->>ConsoleDB: INSERT INTO notifications
    ConsoleDB-->>NotificationService: 通知IDを返す
    NotificationService->>NotificationService: prepareEmailNotification()
    NotificationService-->>StatusCommand: 通知送信を確認
    StatusCommand->>Logger: 成功通知送信をログ
    end
    
    rect rgb(230, 200, 255)
    Note right of StatusCommand: 成功監視
    StatusCommand->>Logger: 統計付きでデータセット完了成功をログ
    StatusCommand->>Slack: データセット完了通知を送信
    end
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: エラーハンドリング
    rect rgb(255, 230, 230)
    alt バッチジョブ作成エラー
        BatchJobService->>Logger: バッチジョブ作成エラーをログ
        BatchJobService->>Slack: バッチジョブエラー通知を送信
        BatchJobService->>StatusCommand: バッチジョブエラーを返す
    else 通知サービスエラー
        NotificationService->>Logger: 通知サービスエラーをログ
        NotificationService->>Slack: 通知エラーアラートを送信
        NotificationService->>StatusCommand: 通知エラーを返す
    end
    end
    end

ステップ5:データセット失敗処理

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant HistoryRepo as WishlistDatasetHistoryRepository
    participant NotificationService as DatasetNotificationService
    participant ConsoleDB[(gb_console)]
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: データセット失敗処理
    
    rect rgb(255, 255, 200)
    Note right of StatusCommand: データセット失敗ステータス
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: エラー情報更新
    StatusCommand->>HistoryRepo: updateErrorMessage(failureReason)
    HistoryRepo->>ConsoleDB: UPDATE wishlist_dataset_histories SET error_message
    ConsoleDB-->>HistoryRepo: エラー更新を確認
    HistoryRepo-->>StatusCommand: エラー更新を確認
    StatusCommand->>Logger: エラーメッセージ更新をログ
    end
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: 失敗通知
    StatusCommand->>NotificationService: sendFailureNotification()
    NotificationService->>ConsoleDB: INSERT INTO notifications (failure type)
    ConsoleDB-->>NotificationService: 通知IDを返す
    NotificationService->>NotificationService: prepareFailureEmail()
    NotificationService-->>StatusCommand: 通知送信を確認
    StatusCommand->>Logger: 失敗通知送信をログ
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: 管理者アラート
    StatusCommand->>Slack: 詳細付きでデータセット失敗アラートを送信
    StatusCommand->>Logger: 管理者失敗通知をログ
    end
    end

ステップ6:リアルタイムブロードキャスト

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant PusherService as Pusher Service
    participant WebSocketClients as Connected Clients
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: リアルタイムステータスブロードキャスト
    
    rect rgb(200, 255, 200)
    Note right of StatusCommand: 正常ケース - リアルタイム更新
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: 完了ブロードキャスト
    StatusCommand->>PusherService: broadcastCompletion()
    PusherService->>PusherService: prepareCompletionEvent()
    PusherService->>WebSocketClients: プライベートチャンネルに完了イベントを送信
    WebSocketClients-->>PusherService: 受信確認
    PusherService-->>StatusCommand: ブロードキャスト送信を確認
    StatusCommand->>Logger: 完了ブロードキャスト成功をログ
    end
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: 失敗ブロードキャスト
    StatusCommand->>PusherService: broadcastFailure()
    PusherService->>PusherService: prepareFailureEvent()
    PusherService->>WebSocketClients: プライベートチャンネルに失敗イベントを送信
    WebSocketClients-->>PusherService: 受信確認
    PusherService-->>StatusCommand: ブロードキャスト送信を確認
    StatusCommand->>Logger: 失敗ブロードキャスト成功をログ
    end
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: エラーハンドリング
    rect rgb(255, 230, 230)
    alt Pusherサービスエラー
        PusherService->>Logger: Pusherサービスエラーをログ
        PusherService->>StatusCommand: データベースのみの通知にフォールバック
        PusherService->>Slack: Pusherエラー通知を送信
    else WebSocket接続エラー
        PusherService->>Logger: WebSocket接続エラーをログ
        PusherService->>StatusCommand: 部分的配信で継続
    end
    end
    end

ステップ7:トランザクション管理とコマンド完了

sequenceDiagram
    participant StatusCommand as dataset:get-status
    participant HistoryRepo as WishlistDatasetHistoryRepository
    participant System
    participant Logger
    participant Slack
    
    Note over StatusCommand,Slack: トランザクション管理とコマンド完了
    
    rect rgb(200, 255, 200)
    Note right of StatusCommand: 正常ケース - 正常完了
    
    rect rgb(200, 230, 255)
    Note right of StatusCommand: トランザクションコミット
    StatusCommand->>HistoryRepo: transactionCommit()
    HistoryRepo->>HistoryRepo: 保留中の変更をすべてコミット
    HistoryRepo-->>StatusCommand: トランザクションコミットを確認
    StatusCommand->>Logger: トランザクションコミット成功をログ
    end
    
    rect rgb(230, 200, 255)
    Note right of StatusCommand: コマンドサマリー
    StatusCommand->>Logger: 全体統計付きでコマンド完了をログ
    StatusCommand->>Logger: 処理されたデータセットの合計とステータス変更をログ
    StatusCommand->>Logger: 実行時間とパフォーマンスメトリクスをログ
    StatusCommand->>Slack: メトリクス付きで監視サマリーを送信
    end
    end
    
    rect rgb(255, 200, 200)
    Note right of StatusCommand: エラーハンドリングと回復
    rect rgb(255, 230, 230)
    alt トランザクションロールバックが必要
        StatusCommand->>HistoryRepo: transactionRollback()
        HistoryRepo->>HistoryRepo: 保留中の変更をすべてロールバック
        HistoryRepo-->>StatusCommand: トランザクションのロールバックを確認
        StatusCommand->>Logger: 理由付きでトランザクションロールバックをログ
        StatusCommand->>Slack: トランザクションロールバックアラートを送信
    else APIエラー回復
        StatusCommand->>Logger: リトライ情報付きでAPIエラー詳細をログ
        StatusCommand->>Slack: 解決手順付きでAPIエラーアラートを送信
    else データベースエラー回復
        StatusCommand->>Logger: データベースエラー詳細をログ
        StatusCommand->>Slack: データベースエラー通知を送信
    else 重大なシステムエラー
        StatusCommand->>Logger: 重大なシステムエラーをログ
        StatusCommand->>Slack: 重大なエラーアラートを送信
        StatusCommand->>System: 以降の処理を停止
    end
    end
    end

詳細

パラメータ

  • {dataset_id?}: 特定のデータセットのステータスを確認するためのオプションパラメータ
    • 提供されると、指定されたデータセットのステータスのみが確認されます
    • 省略された場合、すべての保留中および分析中のデータセットが処理されます
    • wishlist_dataset_historiesテーブルからの有効なデータセットIDである必要があります
    • 特定のデータセット問題のデバッグや手動ステータスチェックに役立ちます

頻度

  • スケジュール実行: 5分毎
    • Laravelのスケジューラを使用してroutes/console.phpで設定
    • 例: Schedule::command('dataset:get-status')->everyFiveMinutes();
  • 手動実行: 特定のデータセット用に手動でトリガー可能
    • 即時ステータスチェックやトラブルシューティングに使用

依存関係

データベース依存関係:

  • データセット履歴レコード用のコンソールデータベース(gb_console)接続
  • アトミックステータス更新のためのトランザクションサポート
  • データセット履歴とウィッシュリスト間の適切な外部キー関係

外部サービス依存関係:

  • ステータスクエリ用のTV Python APIサービスの可用性
  • 環境変数で設定された有効なAPI認証情報
  • APIサービスへのネットワーク接続
  • データセット詳細取得用のAPIエンドポイント互換性

システム依存関係:

  • 有効なデータセットIDを持つwishlist_dataset_historiesの既存のデータセットレコード
  • API状態値と内部状態列挙型の間の適切な列挙マッピング
  • ユーザーアラート用の通知サービス設定
  • リアルタイム更新用のPusherサービス設定

出力

テーブル

データセットステータス監視コマンドは複数のデータベーステーブルと相互作用します。完全なデータベーススキーマとテーブル関係については、データベーススキーマセクションを参照してください。

主要出力テーブル:

  • wishlist_dataset_histories: データセットステータスとエラーメッセージを更新
  • wishlist_dataset_creation_logs: すべてのステータス変更イベントをログ
  • wishlist_to_groups: 完了したデータセットの手動リクエストフラグを更新

コマンド固有の操作:

  • 更新: データセットステータス遷移(Pending → Analyzing → Complete/Failed)
  • ログ: タイムスタンプ付きでwishlist_dataset_creation_logsにステータス変更イベントをログ
  • 作成: 視点分析を必要とする完了したデータセット用のバッチジョブレコードを作成

サービス

TV Python API:

  • ステータス取得用のデータセット詳細エンドポイント
  • 現在の処理ステータスと進捗情報を返す
  • 失敗したデータセット処理のエラー詳細を提供

通知サービス:

  • 完了/失敗用のDatasetNotificationクラスを介したアプリ内通知
  • データセット処理更新用のメール通知
  • 管理者向けのDatasetSlackChannelを介したSlackアラート
  • 接続されたクライアントとダッシュボード用のPusherを介したリアルタイム更新

リポジトリサービス:

  • WishlistDatasetHistoryRepositoryInterface: ステータス更新とトランザクション管理
  • DatasetCreationLogService: ステータス変更詳細によるイベントログ記録
  • BatchJobViewpointService: 完了したデータセット用のバッチジョブ作成
  • DatasetNotificationService: マルチチャンネル通知オーケストレーション

バックグラウンドジョブサービス:

  • CancelCrawlerScheduleOnceJob: 手動トレーニングスケジュールのクリーンアップ
  • 特定視点処理用のバッチジョブ作成
  • 非同期通知配信用のキュー管理

エラーハンドリング

ログ

システムはステータス監視の問題をトラブルシューティングするための包括的なログを生成します:

API通信エラー:

  • 完全なエラーレスポンス詳細とステータスコード付きの失敗したAPIリクエスト
  • リトライ試行情報とAPIエンドポイント詳細付きのタイムアウトエラー
  • 認証情報検証提案付きの認証失敗
  • バックオフ戦略推奨付きのレート制限エラー

ステータス処理エラー:

  • APIレスポンス検証詳細付きの無効なステータス値
  • APIと内部列挙値間のステータスマッピングエラー
  • ロールバック情報と影響を受けたレコード付きのデータベーストランザクション失敗
  • サービス固有のエラーコード付きの通知配信失敗

ログの場所:

  • コンテキスト的なデータセット情報を持つアプリケーションログ: storage/logs/laravel.log
  • 実行統計とAPIレスポンス時間を持つコマンド固有のログ
  • デバッグ用の完全なスタックトレースとAPIリクエスト/レスポンス詳細を持つエラーログ

Slack

自動Slack通知は運用監視のためにDatasetSlackChannelを介して送信されます:

成功通知:

  • 処理統計とタイミングを持つステータス監視完了
  • ウィッシュリスト詳細と処理時間を持つデータセット完了通知
  • 成功/失敗カウントとパフォーマンスメトリクスを持つバッチ処理サマリー

エラー通知:

  • エラーコードと提案された解決手順を持つAPI通信失敗
  • 影響を受けたデータセット詳細とロールバック情報を持つデータベース操作失敗
  • データ検証推奨付きのステータス不整合アラート
  • 即時管理者注意を必要とする重大なシステムエラー

通知形式:

  • 運用追跡用のコマンド名と実行タイムスタンプ
  • インシデント優先順位付けのためのエラータイプと重大度レベル
  • 調査用の影響を受けたデータセットIDとウィッシュリストグループ
  • 提案されたトラブルシューティング手順とドキュメント参照

トラブルシューティング

データを確認

保留中データセットの検証:

-- ステータス更新を待っているデータセットを確認
SELECT wdh.id, wdh.dataset_id, wdh.status, wdh.created_at, wdh.updated_at,
       wtg.name as wishlist_name, wtg.training_schedule
FROM wishlist_dataset_histories wdh
JOIN wishlist_to_groups wtg ON wdh.wishlist_to_group_id = wtg.id
WHERE wdh.status IN ('Pending', 'Analyzing')
ORDER BY wdh.updated_at ASC;

停滞しているデータセットの確認:

-- 処理に停滞しているデータセットを見つける(2時間以上経過)
SELECT wdh.id, wdh.dataset_id, wdh.status, wdh.updated_at,
       TIMESTAMPDIFF(MINUTE, wdh.updated_at, NOW()) as minutes_stuck,
       wtg.name as wishlist_name
FROM wishlist_dataset_histories wdh
JOIN wishlist_to_groups wtg ON wdh.wishlist_to_group_id = wtg.id
WHERE wdh.status IN ('Pending', 'Analyzing')
AND wdh.updated_at < DATE_SUB(NOW(), INTERVAL 2 HOUR)
ORDER BY wdh.updated_at ASC;

最近のステータス変更の確認:

-- 最近のステータス変更イベントを確認
SELECT wdcl.*, wtg.name as wishlist_name, wdh.dataset_id
FROM wishlist_dataset_creation_logs wdcl
JOIN wishlist_to_groups wtg ON wdcl.wishlist_to_group_id = wtg.id
JOIN wishlist_dataset_histories wdh ON wdcl.wishlist_dataset_history_id = wdh.id
WHERE wdcl.event_type = 'Status Update'
AND wdcl.created_at > DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY wdcl.created_at DESC LIMIT 20;

ログを確認

アプリケーションログ:

# 最近のdataset:get-statusコマンドログを確認
tail -f storage/logs/laravel.log | grep -E "dataset:get-status"

# API通信ログを確認
grep "AnalyzerApiService.*dataset.*detail" storage/logs/laravel.log | tail -20

# ステータス変更ログを確認
grep "Dataset status changed" storage/logs/laravel.log | tail -10

# エラーパターンを確認
grep -E "(ERROR|CRITICAL)" storage/logs/laravel.log | grep "dataset:get-status" | tail -10

データベースログ:

-- 失敗したステータス更新試行を確認
SELECT wdcl.*, wtg.name as wishlist_name
FROM wishlist_dataset_creation_logs wdcl
JOIN wishlist_to_groups wtg ON wdcl.wishlist_to_group_id = wtg.id
WHERE wdcl.event_type = 'Failure'
AND wdcl.message LIKE '%status%'
AND wdcl.created_at > DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY wdcl.created_at DESC;

-- エラーメッセージ付きのデータセットを確認
SELECT wdh.id, wdh.dataset_id, wdh.error_message, wdh.updated_at,
       wtg.name as wishlist_name
FROM wishlist_dataset_histories wdh
JOIN wishlist_to_groups wtg ON wdh.wishlist_to_group_id = wtg.id
WHERE wdh.error_message IS NOT NULL
AND wdh.updated_at > DATE_SUB(NOW(), INTERVAL 1 DAY);

APIレスポンス検証:

# データセット詳細エンドポイントをテスト
curl -X GET "https://api.analyzer.example.com/datasets/DATASET_ID" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

# APIレート制限を確認
curl -I "https://api.analyzer.example.com/datasets" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

パフォーマンス監視:

  • パフォーマンス低下について命令実行時間を監視
  • APIレスポンス時間とタイムアウト設定を確認
  • 大規模バッチのデータベーストランザクションパフォーマンスを検証
  • 通知配信時間とキュー処理を確認
  • リアルタイム更新用のPusherサービスパフォーマンスを監視