forecast-operational-metrics
정보
이 스킬은 Prophet 또는 statsmodels를 사용하여 CPU 및 메모리와 같은 인프라 및 애플리케이션 메트릭을 예측하여 용량 계획 및 비용 최적화를 지원합니다. Grafana에서 예측 결과를 시각화하고, 예상되는 자원 고갈에 대한 경고를 설정할 수 있습니다. 하드웨어 조달 계획 수립, 클라우드 지출 최적화, 또는 예측된 부하를 기반으로 사전적 확장 정책을 수립할 때 사용하십시오.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/forecast-operational-metricsClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
預運指
用 Prophet 或 statsmodels 預基設與應指以謀容、優費、主擴。
詳見 Extended Examples 全配置與模板。
用時
- 須預基設容需(CPU、記憶、盤、網)
- 為下季謀硬/雲資購
- 欲預費勢以優雲支
- 須按預載設主擴策
- 為事預用戶流
- 為備謀預庫儲長
- 為速限配估 API 用
入
- 必要:歷時序指(最少三至十二月)
- 必要:指類(CPU、記、請/秒、費等)
- 必要:預程(日、週、或月前)
- 可選:知未來事(部署、市宣、假)
- 可選:季信(日、週、年模)
- 可選:外回歸(如市支、用戶註)
法
第一步:設環並載數
裝預庫並備時序數。
# Create virtual environment
python -m venv venv
source venv/bin/activate
# Install forecasting libraries
pip install prophet statsmodels pandas numpy
pip install plotly matplotlib seaborn
pip install prometheus-api-client influxdb-client
pip install grafana-api
以 MetricsLoader 載並備數:
# forecasting/data_loader.py (abbreviated)
import pandas as pd
from datetime import datetime, timedelta
class MetricsLoader:
def load_from_prometheus(self, query: str, lookback_days: int = 90, step: str = "1h"):
"""Load historical metrics from Prometheus."""
# ... implementation (see EXAMPLES.md for complete code)
def resample_and_aggregate(self, df: pd.DataFrame, freq: str = "1H"):
"""Resample time series to regular intervals."""
# ... implementation (see EXAMPLES.md)
# Example usage
loader = MetricsLoader(prometheus_url="http://prometheus:9090")
df = loader.load_from_prometheus(
query='avg(rate(container_cpu_usage_seconds_total[5m]))',
lookback_days=90,
)
df_daily = loader.resample_and_aggregate(df, freq="1D")
見 EXAMPLES.md Step 1 全 MetricsLoader。
得: 時序數以正隔載,缺值填,可預。
敗則: 若數有隙,用前填或插值;確回看期有足數(薦 90+ 日);驗時戳時區一致;察可歪預之異(>5 sigma)。
第二步:施 Prophet 預
用 Facebook Prophet 作自動季察與預。
# forecasting/prophet_forecaster.py (abbreviated)
from prophet import Prophet
class ProphetForecaster:
def __init__(self, growth: str = "linear", seasonality_mode: str = "multiplicative"):
self.growth = growth
self.prophet_params = {
"growth": growth,
"seasonality_mode": seasonality_mode,
# ... additional parameters (see EXAMPLES.md)
}
def fit(self, df: pd.DataFrame, regressors=None, holidays=None):
"""Train Prophet model on historical data."""
# ... implementation (see EXAMPLES.md)
def forecast(self, periods: int, freq: str = "D"):
"""Generate forecast for future periods."""
# ... implementation (see EXAMPLES.md)
# Example usage
forecaster = ProphetForecaster(growth="linear", seasonality_mode="multiplicative")
forecaster.fit(df_daily)
forecast = forecaster.forecast(periods=30, freq="D")
forecaster.plot_forecast(forecast, save_path="results/cpu_forecast.png")
見 EXAMPLES.md Step 2 全 ProphetForecaster。
得: 三十日以上預附可信區,季模於部圖捕,交叉驗證 MAPE < 15%。
敗則: 若預不實,試異長模(線對邏);若缺季,調 seasonality_mode;若準差(<70% MAPE),加更多史數或外回歸;察數質。
第三步:施 ARIMA/SARIMAX 預(替)
用 statsmodels 作傳時序預。
# forecasting/arima_forecaster.py (abbreviated)
from statsmodels.tsa.statespace.sarimax import SARIMAX
class ARIMAForecaster:
def __init__(self, order: tuple = (1, 1, 1), seasonal_order: tuple = (1, 1, 1, 7)):
self.order = order
self.seasonal_order = seasonal_order
def fit(self, df: pd.DataFrame, exog=None):
"""Train SARIMAX model."""
series = df.set_index("timestamp")["value"]
self.model = SARIMAX(series, exog=exog, order=self.order, seasonal_order=self.seasonal_order)
self.fitted_model = self.model.fit(disp=False)
# ... implementation (see EXAMPLES.md)
def forecast(self, steps: int, exog_future=None):
"""Generate forecast for future periods."""
# ... implementation (see EXAMPLES.md)
# Auto-select parameters
best_order, best_seasonal = auto_arima(series, seasonal=True)
forecaster = ARIMAForecaster(order=best_order, seasonal_order=best_seasonal)
forecaster.fit(df_hourly)
forecast = forecaster.forecast(steps=168) # 7 days
見 EXAMPLES.md Step 3 全 ARIMAForecaster 與 auto_arima。
得: ARIMA 模以最佳參擬,預生附可信區,診圖示殘為白噪。
敗則: 若模不收斂,簡參(減 p、q、P、Q);若預勢誤,察差分階(d、D);若殘非白噪,加更多 AR/MA 項;確序長 >2x 季期。
第四步:識容閾與警
析預以測資何時竭。
# forecasting/capacity_planning.py (abbreviated)
from datetime import datetime
class CapacityPlanner:
def __init__(self, capacity_limit: float, warning_threshold: float = 0.8):
self.capacity_limit = capacity_limit
self.warning_threshold = warning_threshold
def find_exhaustion_date(self, forecast: pd.DataFrame):
"""Find when forecast exceeds capacity limit."""
exceeded = forecast[forecast["yhat"] >= self.capacity_limit]
# ... implementation (see EXAMPLES.md)
def generate_capacity_report(self, forecast: pd.DataFrame):
"""Generate comprehensive capacity planning report."""
# ... implementation (see EXAMPLES.md)
# Example usage
planner = CapacityPlanner(capacity_limit=1000, warning_threshold=0.8)
report = planner.generate_capacity_report(forecast)
print(f"Warning Date: {report['warning_date']}")
print(f"Exhaustion Date: {report['exhaustion_date']}")
recommendation = planner.recommend_scaling_action(report)
見 EXAMPLES.md Step 4 全 CapacityPlanner。
得: 報示容限何時達,薦附急級,長率算。
敗則: 若竭日不實,驗 capacity_limit 正;若長率過高,察史數異;於熟系考非線長模。
第五步:於 Grafana 視預
推預數至 Grafana 供實時監。
# forecasting/grafana_integration.py (abbreviated)
import requests
class GrafanaForecaster:
def __init__(self, grafana_url: str, api_key: str, dashboard_uid: str = None):
self.grafana_url = grafana_url.rstrip("/")
self.api_key = api_key
self.dashboard_uid = dashboard_uid
def create_annotation(self, text: str, tags: list, time: datetime = None):
"""Create annotation in Grafana for forecast events."""
# ... implementation (see EXAMPLES.md)
def create_capacity_alert_annotation(self, capacity_report: dict):
"""Create Grafana annotation for capacity warnings."""
# ... implementation (see EXAMPLES.md)
# Export to CSV for Grafana datasource
def export_forecast_to_csv(forecast: pd.DataFrame, output_path: str):
"""Export forecast in format compatible with Grafana CSV datasource."""
# ... implementation (see EXAMPLES.md)
# Example usage
grafana = GrafanaForecaster(
grafana_url="http://grafana:3000",
api_key="YOUR_API_KEY",
dashboard_uid="your-dashboard-uid",
)
grafana.create_capacity_alert_annotation(report)
export_forecast_to_csv(forecast, "grafana/forecasts/cpu_forecast.csv")
見 EXAMPLES.md Step 5 全 GrafanaForecaster。
得: 預注現於 Grafana 面板,容警為豎標,預數可經 CSV 源達。
敗則: 驗 Grafana API 鑰有正權;察面板 UID 正;確時戳於注為毫秒;接前以 curl 試 API。
第六步:自動預生
設定時業常規生預。
# forecasting/scheduler.py (abbreviated)
import schedule
import time
def generate_daily_forecast():
"""Generate forecast for all monitored metrics."""
logger.info("Starting daily forecast generation")
metrics_config = [
{"name": "cpu_usage", "query": "...", "capacity_limit": 0.8, "forecast_days": 30},
{"name": "memory_usage", "query": "...", "capacity_limit": 32, "forecast_days": 30},
{"name": "disk_usage", "query": "...", "capacity_limit": 500, "forecast_days": 90},
]
loader = MetricsLoader(prometheus_url="http://prometheus:9090")
for metric_config in metrics_config:
df = loader.load_from_prometheus(query=metric_config["query"], lookback_days=90)
forecaster = ProphetForecaster()
forecaster.fit(df)
forecast = forecaster.forecast(periods=metric_config["forecast_days"])
planner = CapacityPlanner(capacity_limit=metric_config["capacity_limit"])
report = planner.generate_capacity_report(forecast)
export_forecast_to_csv(forecast, f"grafana/forecasts/{metric_config['name']}_forecast.csv")
# ... (see EXAMPLES.md for complete implementation)
# Schedule daily at 2 AM
schedule.every().day.at("02:00").do(generate_daily_forecast)
while True:
schedule.run_pending()
time.sleep(60)
見 EXAMPLES.md Step 6 全調度。
得: 諸指預日生,容報記,CSV 出供 Grafana,重容警發。
敗則: 驗調度程續運(用 systemd/supervisor);察 Prometheus 通;確預出盤空足;於暫敗施重試邏;於調度本設監。
驗
- 史數載附 90+ 日連指
- Prophet 預於部圖捕日/週季
- 預可信區驗時含 85-95% 實值
- 於知景容竭日算正
- ARIMA 殘於診圖現如白噪
- Grafana 注現於預警/竭日
- 自動預日運無手涉
- 驗集預準(MAPE)< 15%
陷
- 史數不足:可靠季察需三至十二月;勿以 <60 日預
- 略知事:假、部署、市宣歪預;加為外回歸或假
- 長程預過信:30-90 日後準衰;為向導,非確預
- 靜容限:基設隨時易;加資時更 capacity_limit
- 異值預:訓數之異傳入預;清數或用穩法
- 不更模:系改後預陳;週訓或於大架改後重訓
- 略可信區:點預誤導;恆用下/上界供謀
- 誤季期:時數用日、日數用週;失配致差預
參
detect-anomalies-aiops- 異察補預以主監plan-capacity- 基設容謀流build-grafana-dashboards- 視預與容勢
GitHub 저장소
연관 스킬
executing-plans
디자인executing-plans 스킬은 검토 체크포인트가 포함된 통제된 배치로 실행할 완전한 구현 계획이 있을 때 사용합니다. 이 스킬은 계획을 불러와 비판적으로 검토한 후, 소규모 배치(기본값 3개 작업)로 작업을 실행하면서 각 배치 사이에 진행 상황을 아키텍트 검토를 위해 보고합니다. 이를 통해 내재된 품질 관리 체크포인트를 갖춘 체계적인 구현이 보장됩니다.
requesting-code-review
디자인이 스킬은 코드 변경 사항을 요구 사항에 따라 분석하기 위해 코드 리뷰어 하위 에이전트를 호출합니다. 작업 완료 후, 주요 기능 구현 후, 또는 메인 브랜치에 병합하기 전에 사용해야 합니다. 이 리뷰는 현재 구현체와 원래 계획을 비교하여 문제를 조기에 발견하는 데 도움이 됩니다.
connect-mcp-server
디자인이 스킬은 개발자들이 HTTP, stdio 또는 SSE 전송 방식을 통해 MCP 서버를 Claude Code에 연결하는 포괄적인 가이드를 제공합니다. GitHub, Notion 및 사용자 정의 API와 같은 외부 서비스를 통합하기 위한 설치, 구성, 인증 및 보안을 다룹니다. MCP 통합 설정, 외부 도구 구성 또는 Claude의 모델 컨텍스트 프로토콜 작업 시 활용하세요.
web-cli-teleport
디자인이 스킬은 작업 분석을 기반으로 개발자가 Claude Code 웹 인터페이스와 CLI 인터페이스 중 선택할 수 있도록 돕고, 두 환경 간 원활한 세션 텔레포트를 가능하게 합니다. 웹, CLI 또는 모바일 환경 전환 시 세션 상태와 컨텍스트를 관리하여 워크플로를 최적화합니다. 다양한 단계에서 서로 다른 도구가 필요한 복잡한 프로젝트에 사용하세요.
