26Y27g5

QK·2026년 7월 27일

차트나 대시보드 표현 시 한글 라벨이 포함되면 폰트 깨짐(한글 폰트 미설치 환경)이나 범례(Legend) 가독성 저하 문제가 발생합니다.

Step 2에서 생성된 한글 상태값(status, cpu_status, mem_status)을 Step 3 진입 시점에 100% 표준 영문 코드명(Enum)으로 일괄 매핑/변환하는 래퍼(Sanitizer) 로직입니다.


1. 상태 라벨 영문 매핑 표 (Standard Enum Mapping)

기존 Step 2 한글 라벨Step 3 표준 영문 라벨의미
💥 OOM장애발생OOM_KilledOOM 사살 발생
🚨 장기유휴_좀비팟Zombie_Pod30분 이상 유휴 좀비 Pod
⚠️ Request부족Insufficient_RequestCPU Request / Throttle 병목
📉 자원과다선점Over_AllocatedCPU/PV 자원 과다 선점
✅ 단명_정상종료Short_Lived5분 미만 정상 종료 Pod
✅ 최적화완료Optimized최적화 완료
⚠️ CPU부족(Throttle)CPU_ThrottledCPU Throttle 발생
📉 CPU과다할당CPU_Over_AllocatedCPU 과다 할당
✅ CPU최적화CPU_OptimizedCPU 최적화 완료
📉 Mem과다할당Mem_Over_AllocatedMemory 과다 할당
✅ Mem최적화Mem_OptimizedMemory 최적화 완료

2. Step 3 영문 정제 및 차트 데이터셋 이식 스니펫

step3 파이프라인 상단에서 Step 2의 Parquet 파일을 읽어올 때 아래 Polars 매핑 구문을 거치도록 설정하면, 차트 visualizer나 대시보드 리포트로 넘어가는 모든 문자열이 영문으로 정제됩니다.

import polars as pl

# Step 3 상태값 영문 치환 딕셔너리
STATUS_MAP_EN = {
    "💥 OOM장애발생": "OOM_Killed",
    "🚨 장기유휴_좀비팟": "Zombie_Pod",
    "⚠️ Request부족": "Insufficient_Request",
    "📉 자원과다선점": "Over_Allocated",
    "✅ 단명_정상종료": "Short_Lived",
    "✅ 최적화완료": "Optimized",
    "⚠️ CPU부족(Throttle)": "CPU_Throttled",
    "📉 CPU과다할당": "CPU_Over_Allocated",
    "✅ CPU최적화": "CPU_Optimized",
    "📉 Mem과다할당": "Mem_Over_Allocated",
    "✅ Mem최적화": "Mem_Optimized",
}

def sanitize_to_english(df: pl.DataFrame) -> pl.DataFrame:
    """
    Step 2에서 넘어온 한글 카테고리/상태 라벨을 차트 표현용 영문 라벨로 일괄 정제
    """
    return df.with_columns([
        # 1. 메인 governance status 영문 변환
        pl.col("status").replace(STATUS_MAP_EN, default=pl.col("status")).alias("status"),
        
        # 2. 서브 cpu_status 영문 변환 (컬럼이 존재할 경우)
        pl.col("cpu_status").replace(STATUS_MAP_EN, default=pl.col("cpu_status")).alias("cpu_status") 
        if "cpu_status" in df.columns else pl.col("status"),
        
        # 3. 서브 mem_status 영문 변환 (컬럼이 존재할 경우)
        pl.col("mem_status").replace(STATUS_MAP_EN, default=pl.col("mem_status")).alias("mem_status") 
        if "mem_status" in df.columns else pl.col("status"),
    ])

# ==========================================
# step3 메인 파이프라인 적용 예시
# ==========================================
# 1. Step 2 데이터 로드
df_step2 = pl.read_parquet("data/merged/COMPUTE/daily_enriched_COMPUTE_20260723.parquet")

# 2. 영문 정제 레이어 적용
df_step3 = sanitize_to_english(df_step2)

# 3. 차트 / 대시보드 집계 생성 예시 (완전 영문화된 범례 생성)
df_chart_summary = df_step3.group_by(["namespace", "status"]).agg([
    pl.len().alias("pod_count"),
    pl.col("cpu_waste_core_hours").sum().round(2).alias("total_cpu_waste_hours"),
    pl.col("mem_waste_gb_hours").sum().round(2).alias("total_mem_waste_gb_hours")
]).sort("total_cpu_waste_hours", descending=True)

print("✅ [Step3 Chart Data Enriched in Pure English]")
print(df_chart_summary.head())

3. Step 2 원천 코드 단에서 미리 영문으로 심는 방안 (선택)

만약 step2_pipeline.py 저장 단계부터 한글을 완전 제거하고 싶으시다면, step2_pipeline.py 내부의 상태 마킹 부분을 아래와 같이 영문으로 직접 교체해 두셔도 됩니다.

# step2_pipeline.py 내부 status 선언부 영문 직결 코드
df_pod = df_pod.with_columns([
    pl.case(
        pl.col("is_oom_killed"), "OOM_Killed",
        pl.col("minutes_running") <= 5, "Short_Lived",
        (pl.col("cpu_usage_max") < 0.05) & (pl.col("minutes_running") >= 30), "Zombie_Pod",
        (pl.col("cpu_shortage_cores") > 0.5) | (pl.col("cpu_throttled_max") > 0.2), "Insufficient_Request",
        (pl.col("cpu_waste_core_hours") > 5.0) | (pl.col("pv_waste_gb_hours") > 30), "Over_Allocated",
        default="Optimized"
    ).alias("status")
])

df_pod = df_pod.with_columns(
    pl.when((pl.col("cpu_shortage_cores") > 0.5) | (pl.col("cpu_throttled_max") > 0.2))
    .then(pl.lit("CPU_Throttled"))
    .when((pl.col("cpu_waste_core_hours") > 5.0) | (pl.col("pv_waste_gb_hours") > 30))
    .then(pl.lit("CPU_Over_Allocated"))
    .otherwise(pl.lit("CPU_Optimized")).alias("cpu_status")
)

df_pod = df_pod.with_columns(
    pl.when(pl.col("is_oom_killed"))
    .then(pl.lit("OOM_Killed"))
    .when(pl.col("mem_waste_gb_hours") > 50)
    .then(pl.lit("Mem_Over_Allocated"))
    .otherwise(pl.lit("Mem_Optimized")).alias("mem_status")
)

이렇게 구성하시면 차트 시각화 엔진(Grafana / Plotly / Matplotlib / Superset)에서 깨짐 없는 순수 영문 범례 및 라벨이 정상적으로 표현됩니다.

profile
engineer

0개의 댓글