차트나 대시보드 표현 시 한글 라벨이 포함되면 폰트 깨짐(한글 폰트 미설치 환경)이나 범례(Legend) 가독성 저하 문제가 발생합니다.
Step 2에서 생성된 한글 상태값(status, cpu_status, mem_status)을 Step 3 진입 시점에 100% 표준 영문 코드명(Enum)으로 일괄 매핑/변환하는 래퍼(Sanitizer) 로직입니다.
| 기존 Step 2 한글 라벨 | Step 3 표준 영문 라벨 | 의미 |
|---|---|---|
💥 OOM장애발생 | OOM_Killed | OOM 사살 발생 |
🚨 장기유휴_좀비팟 | Zombie_Pod | 30분 이상 유휴 좀비 Pod |
⚠️ Request부족 | Insufficient_Request | CPU Request / Throttle 병목 |
📉 자원과다선점 | Over_Allocated | CPU/PV 자원 과다 선점 |
✅ 단명_정상종료 | Short_Lived | 5분 미만 정상 종료 Pod |
✅ 최적화완료 | Optimized | 최적화 완료 |
⚠️ CPU부족(Throttle) | CPU_Throttled | CPU Throttle 발생 |
📉 CPU과다할당 | CPU_Over_Allocated | CPU 과다 할당 |
✅ CPU최적화 | CPU_Optimized | CPU 최적화 완료 |
📉 Mem과다할당 | Mem_Over_Allocated | Memory 과다 할당 |
✅ Mem최적화 | Mem_Optimized | Memory 최적화 완료 |
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())
만약 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)에서 깨짐 없는 순수 영문 범례 및 라벨이 정상적으로 표현됩니다.