Commit 3e7bde97 authored by Waleed Akbar's avatar Waleed Akbar
Browse files

feat: Update SLA policy and InfluxDB fetcher to use...

feat: Update SLA policy and InfluxDB fetcher to use "forecast_sample_interval_sec" and "forecast_sample_count".
parent d18cfa85
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -33,15 +33,15 @@ class SLAPolicyConfig:
        bandwidth_utilization_threshold_pct: Maximum acceptable bandwidth
            utilization as a percentage (0-100).
        time_window_seconds: Time window in seconds for data analysis.
        sample_interval_sec: Sampling interval in seconds for data collection.
        sample_count: Minimum number of samples to fetch from database.
        forecast_sample_interval_sec: Sampling interval in seconds for data collection.
        forecast_sample_count: Minimum number of samples to fetch from database.
    """
    simap_id: str
    latency_threshold_ms: float|None
    bandwidth_utilization: float|None
    time_window_seconds: int
    sample_interval_sec: int
    sample_count: int
    forecast_sample_interval_sec: int
    forecast_sample_count: int

    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> SLAPolicyConfig:
@@ -68,16 +68,16 @@ class SLAPolicyConfig:
            latency_threshold_ms = float(metrics['latency_threshold_ms'])
            bandwidth_threshold  = float(metrics.get('bandwidth_utilization', 0.0))
            time_window          = int(data['history_window_size_sec'])
            sample_interval      = int(data['sample_interval_sec'])
            sample_count         = int(data['sample_count'])
            sample_interval      = int(data['forecast_sample_interval_sec'])
            forecast_sample_count         = int(data['forecast_sample_count'])
            
            return cls(
                simap_id              = simap_id,
                latency_threshold_ms  = latency_threshold_ms,
                bandwidth_utilization = bandwidth_threshold,
                time_window_seconds   = time_window,
                sample_interval_sec   = sample_interval,
                sample_count          = sample_count
                forecast_sample_interval_sec   = sample_interval,
                forecast_sample_count          = forecast_sample_count
            )
        except KeyError as e:
            raise KeyError(f"Missing required field: {e.args[0]}") from e
+6 −6
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ class InfluxDBFetcher:
        ensures resilience against transient failures.
        
        If the initial query returns fewer samples than required by 
        sla_policy.sample_count, the method will automatically fetch 
        sla_policy.forecast_sample_count, the method will automatically fetch 
        older data with an extended time window until the required 
        sample count is met or max attempts are reached.

@@ -185,7 +185,7 @@ class InfluxDBFetcher:
        LOGGER.debug(
            f"Fetching performance data for simap_id={sla_policy.simap_id}, "
            f"time_window={sla_policy.time_window_seconds}s, "
            f"required_samples={sla_policy.sample_count}"
            f"required_samples={sla_policy.forecast_sample_count}"
        )
        
        try:
@@ -213,11 +213,11 @@ class InfluxDBFetcher:
                
                LOGGER.info(
                    f"Attempt {attempt}: Fetched {samples_fetched} samples "
                    f"(required: {sla_policy.sample_count})"
                    f"(required: {sla_policy.forecast_sample_count})"
                )
                
                # Check if we have enough samples
                if samples_fetched >= sla_policy.sample_count:
                if samples_fetched >= sla_policy.forecast_sample_count:
                    LOGGER.info(f"Required samples met")
                    break
                
@@ -227,7 +227,7 @@ class InfluxDBFetcher:
                        # Calculate required time window based on sample density
                        # Formula: new_window = current_window * (required_samples / fetched_samples) * 1.2
                        # The 1.2 factor adds 20% buffer to account for non-uniform data distribution
                        ratio               = sla_policy.sample_count / samples_fetched
                        ratio               = sla_policy.forecast_sample_count / samples_fetched
                        current_time_window = int(current_time_window * ratio * 1.2)
                        LOGGER.debug(f"Extending time window to {current_time_window}s(ratio: {ratio:.2f})")
                    else:
@@ -239,7 +239,7 @@ class InfluxDBFetcher:
                else:
                    LOGGER.warning(
                        f"Max attempts reached. Returning {samples_fetched} samples "
                        f"(required: {sla_policy.sample_count})"
                        f"(required: {sla_policy.forecast_sample_count})"
                    )
                    break
            
+3 −3
Original line number Diff line number Diff line
@@ -122,8 +122,8 @@ def test_analyze_endpoint(ai_engine_server):
            "bandwidth_utilization": 0.0
        },
        "history_window_size_sec":      600,
        "sample_interval_sec":     5,
        "sample_count":            120,
        "forecast_sample_interval_sec": 5,
        "forecast_sample_count":        120,
    }

    LOGGER.info(f"Sending analyze request with payload: {payload}")