Source code for dwh_auditor.models.result

"""分析結果のデータモデル.

Analyzer 層が Reporter 層に渡す診断結果の型定義です。
"""

from __future__ import annotations

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field

from dwh_auditor.models.job import QueryJob
from dwh_auditor.models.table import TableStorage


[docs] class CostInsight(BaseModel): """高コストクエリの分析結果.""" job: QueryJob = Field(description="対象のクエリジョブ") estimated_cost_usd: float = Field(description="推定コスト (USD)。pricing.tb_scan_usd × スキャン TB 数で算出。") scanned_tb: float = Field(description="スキャンしたデータ量 (TB)")
[docs] class FullScanInsight(BaseModel): """フルスキャンと判定されたクエリの分析結果.""" job: QueryJob = Field(description="対象のクエリジョブ") scanned_gb: float = Field(description="スキャンしたデータ量 (GB)")
[docs] class TableUsageProfile(BaseModel): """テーブルの利用状況プロファイルとゾンビ判定結果.""" table: TableStorage = Field(description="対象のテーブル") is_zombie: bool = Field(description="設定された日数以上未使用(ゾンビ)であるか") last_accessed_at: Optional[datetime] = Field(default=None, description="最後に参照された日時") # noqa: UP045 top_users: list[str] = Field(default_factory=list, description="頻繁にアクセスしているユーザー群") access_count_30d: int = Field(default=0, description="指定期間内のアクセス回数") size_gb: float = Field(description="テーブルの論理ストレージサイズ (GB)")
[docs] class RecurringCostInsight(BaseModel): """バッチやBI等から定常的に実行されている高コストクエリの分析結果.""" query_hash: str = Field(description="BigQuery が発行したクエリハッシュ") query_sample: str = Field(description="代表的なクエリテキスト") execution_count: int = Field(description="期間中の実行回数") total_estimated_usd: float = Field(description="期間中の総推定コスト (USD)") total_scanned_tb: float = Field(description="総スキャン量 (TB)") last_executed_at: datetime = Field(description="最終実行日時")
[docs] class AuditResult(BaseModel): """Analyzer 層が最終的に出力する総合監査結果レポート.""" analyzed_days: int = Field(description="分析対象期間 (日数)") project_id: str = Field(description="分析対象の GCP プロジェクト ID") total_jobs_analyzed: int = Field(description="分析したジョブの総数") total_tables_analyzed: int = Field(description="分析したテーブルの総数") top_expensive_queries: list[CostInsight] = Field( default_factory=list, description="コストが高いアドホッククエリのランキング" ) recurring_expensive_queries: list[RecurringCostInsight] = Field( default_factory=list, description="定常実行の高コストクエリ" ) full_scans: list[FullScanInsight] = Field(default_factory=list, description="フルスキャンと判定されたクエリ一覧") table_profiles: list[TableUsageProfile] = Field( default_factory=list, description="各テーブルの利用状況およびゾンビ判定結果" )