26Y01c2

Young-Kyoo Kim·약 14시간 전
"""
config.py — FinOps 파이프라인 전사 통합 환경설정 및 정규식 일원화 엔진
"""
import os
import re
from pathlib import Path

# ─── 🌐 OS 환경변수 중앙 통제 및 Fallback 주입 ───
os.environ.setdefault("MINIO_ENDPOINT", "http://minio-service.internal.zone:9000")
os.environ.setdefault("MINIO_ACCESS_KEY", "admin")
os.environ.setdefault("MINIO_SECRET_KEY", "password")
os.environ.setdefault("MINIO_RAW_BUCKET", "devops-test")
os.environ.setdefault("MINIO_REPORT_BUCKET", "devops-test")

# ─── 📂 프로젝트 상대 경로 표준화 및 디렉토리 트리 선언 ───
BASE_DATA_DIR = Path("./data")
RAW_DIR       = BASE_DATA_DIR / "raw"
MERGED_DIR    = BASE_DATA_DIR / "merged"
OUT_DIR       = BASE_DATA_DIR / "output"
PLOT_DIR      = OUT_DIR / "plots"

# 디렉토리 계층 구조 자동 생성 보장
RAW_DIR.mkdir(parents=True, exist_ok=True)
MERGED_DIR.mkdir(parents=True, exist_ok=True)
OUT_DIR.mkdir(parents=True, exist_ok=True)
PLOT_DIR.mkdir(parents=True, exist_ok=True)

# ─── 💾 사내 클러스터별 노드 호스트네임 정규식 패턴 매트릭스 ───
CLUSTER_NODE_PATTERNS = {
    "COMPUTE": r"^(name1wk\d+|icdlh-prod-wk\d+|stg-lh-wk\d+)",
    "STORAGE": r"^(minio-storage-node\d+|aistor-prod-wk\d+|lake-pool-\d+)"
}

# ─── 🎯 [개정 핵심] 명명 규칙 전면 개편 (cluster_type ➡️ cluster 격상) ───
def classify_node_infrastructure(node_name):
    """
    상단의 CLUSTER_NODE_PATTERNS 정규식을 사용하여 
    1선 클러스터 속성(cluster)과 2선 워크로드 도메인(workload_domain)을 역추적합니다.
    """
    n = str(node_name)
    
    if re.search(CLUSTER_NODE_PATTERNS["STORAGE"], n, re.IGNORECASE):
        return "STORAGE", "prod-storage-domain"
    elif re.search(CLUSTER_NODE_PATTERNS["COMPUTE"], n, re.IGNORECASE):
        return "COMPUTE", "prod-compute-domain"
    else:
        return "COMPUTE", "unclassified-domain"

# 🧮 11대 핵심 FinOps 메트릭 쿼리 생성기
def get_finops_promql_queries(selector):
    pv_selector = selector.replace('container!="", ', '').replace(', container!=""', '')
    return {
        "cpu_request":   f'kube_pod_container_resource_requests{selector.replace("container!=", "resource=\"cpu\", container!=")}',
        "cpu_limit":     f'kube_pod_container_resource_limits{selector.replace("container!=", "resource=\"cpu\", container!=")}',
        "cpu_usage":     f'rate(container_cpu_usage_seconds_total{selector}[1m])',
        "cpu_throttled": f'rate(container_cpu_cfs_throttled_periods_total{selector}[1m])',
        "mem_request":   f'kube_pod_container_resource_requests{selector.replace("container!=", "resource=\"memory\", container!=")}',
        "mem_limit":     f'kube_pod_container_resource_limits{selector.replace("container!=", "resource=\"memory\", container!=")}',
        "mem_usage":     f'container_memory_working_set_bytes{selector}',
        "mem_rss":       f'container_memory_rss{selector}',
        "oom_event":     f'kube_pod_container_status_terminated_reason{selector.replace("container!=", "reason=\"OOMKilled\", container!=")}',
        "pv_capacity":   f'kubelet_volume_stats_capacity_bytes{pv_selector}',
        "pv_used":       f'kubelet_volume_stats_used_bytes{pv_selector}'
    }

def get_workload_type(pod_name):
    p = str(pod_name).lower()
    if "spark" in p or "-exec-" in p or "-driver" in p:
        if "executor" in p or "-exec-" in p: return "SPARK_EXECUTOR"
        if "driver" in p or "-driver" in p: return "SPARK_DRIVER"
        return "SPARK_SYSTEM"
    if "airflow" in p or "statsd" in p:
        if "worker" in p: return "AIRFLOW_WORKER"
        if "scheduler" in p: return "AIRFLOW_SCHEDULER"
        return "AIRFLOW_SYSTEM"
    if "minio" in p or "aistor" in p or "lake-pool" in p: return "MINIO_STORAGE"
    return "GENERAL_APPS"
    

0개의 댓글