データセットステータス取得
コマンドシグネチャ
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();
- Laravelのスケジューラを使用して
- 手動実行: 特定のデータセット用に手動でトリガー可能
- 即時ステータスチェックやトラブルシューティングに使用
依存関係
データベース依存関係:
- データセット履歴レコード用のコンソールデータベース(
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サービスパフォーマンスを監視