현재 우리 데이터 레이크하우스 스택(K8s, Cilium, AIStor, Keycloak, StarRocks, Spark)의 특성을 고려할 때, 데이터 파이프라인에서 연산은 해두었지만 아직 시각화하지 않은 3가지 고부가가치 SRE 지표 차트를 추가하면 진단 리포트의 완성도를 극대화할 수 있습니다.
특히 이 차트들은 사내 LLM(step5)이 리포트를 작성할 때 "인프라 전이 오버헤드"를 시각적으로 증명하는 강력한 증거 자료가 됩니다.
feat_auth_density_p95)net_drop_errors_total)oom_strike_sum)step3_analytics.py 맨 아래에 추가할 코드 컴포넌트step3_analytics.py 파일의 메인 루틴 맨 하단(즉, chart23 블록 바로 아래)에 다음 코드를 삽입하세요. 전체 차트 수가 증가함에 따라 로그 출력 분모도 [23/26] 형태로 자동 동기화되도록 정렬했습니다.
# ─── 🚀 [SRE 심층 확장 차트 블록: 24, 25, 26번 컴포넌트 엔진 인젝션] ───
print("⏳ [23/26] Rendering chart24_keycloak_auth_density_spikes...")
out24 = PLOT_DIR / "chart24_keycloak_auth_density_spikes.png"
if "feat_auth_density_p95" in df_pod.columns and not check_and_handle_empty(df_pod, out24, "chart24_keycloak_auth_density_spikes"):
plt.figure(figsize=(12, 5))
# OIDC 인증 토큰 검증 밀도 시계열 변동성 마킹
sns.lineplot(data=df_pod, x="date", y="feat_auth_density_p95", hue="workload_type", marker="X", linewidth=1.5)
plt.title("Keycloak OIDC Authentication Density Spikes Timeline")
plt.xlabel("Date (KST)")
plt.ylabel("Auth Density Coefficient (Validations / Sec)")
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', title="Workload Type")
plt.tight_layout()
plt.savefig(out24, dpi=100, bbox_inches='tight')
plt.close()
print("⏳ [24/26] Rendering chart25_cilium_net_drops_by_workload...")
out25 = PLOT_DIR / "chart25_cilium_net_drops_by_workload.png"
if "net_drop_errors_total" in df_pod.columns and not check_and_handle_empty(df_pod, out25, "chart25_cilium_net_drops_by_workload"):
plt.figure(figsize=(11, 5))
# Cilium CNI 커널 단 패킷 드롭 유실 총량 집계
df_net_drop = df_pod.groupby("workload_type")["net_drop_errors_total"].sum().reset_index().sort_values("net_drop_errors_total", ascending=False)
sns.barplot(data=df_net_drop, x="workload_type", y="net_drop_errors_total", palette="Reds_r")
plt.xticks(rotation=30, ha="right")
plt.title("Total Cilium CNI eBPF Packet Drop Errors by Workload Type")
plt.xlabel("Workload Type")
plt.ylabel("Cumulative Packet Drops (Count)")
plt.tight_layout()
plt.savefig(out25, dpi=100, bbox_inches='tight')
plt.close()
print("⏳ [25/26] Rendering chart26_oom_blast_radius_vs_overcommit...")
out26 = PLOT_DIR / "chart26_oom_blast_radius_vs_overcommit.png"
if "oom_strike_sum" in df_pod.columns and not check_and_handle_empty(df_pod, out26, "chart26_oom_blast_radius_vs_overcommit"):
plt.figure(figsize=(10, 6))
# 자원 설정 마진(X), 실효 활용률(Y), OOM 사살 빈도(Size) 3차원 입체 투영
sns.scatterplot(
data=df_pod.head(5000),
x="lim_req_ratio",
y="mem_util",
size="oom_strike_sum",
hue="workload_type",
sizes=(30, 800),
alpha=0.6,
palette="deep"
)
plt.title("OOM Strike Blast Radius vs Overcommit Ratio & Memory Utilization")
plt.xlabel("Memory Limit / Request Ratio (Overcommit Margin)")
plt.ylabel("P95 Actual Memory WorkingSet Utilization (%)")
plt.axhline(90, color="crimson", linestyle="--", alpha=0.5, label="High Risk Boundary (90%)")
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left')
plt.tight_layout()
plt.savefig(out26, dpi=100, bbox_inches='tight')
plt.close()
# 기존 메인 루틴의 최종 마감 프린트 넘버링 수정 보정
print(f"\n🏁 === [Step3 Success] All 26 charts generated cleanly in English under ./data/output/plots/{cluster_target} ===")
step5_llm_diagnoser 연계: 프롬프트 본문 내부의 "Keycloak 인증 폭풍" 및 "Cilium 패킷 드롭" 가이드라인과 이 차트들의 데이터가 완벽히 동기화되므로, 사내 LLM이 훨씬 더 정교하고 숫자에 기반한 원인 분석을 도출해 냅니다.step6_excel_builder 자동 연동: step6는 코드 특성상 used_ids에 등록되지 않은 나머지 차트들을 8. 추가차트모음 시트에 자동으로 바둑판 배열로 채워 넣도록 안전 장치가 이미 짜여 있습니다. 따라서 step3에 코드만 추가해 주면 별도의 step6 수정 없이도 엑셀 리포트 마지막 페이지에 이 유용한 지표들이 이쁘게 박혀 나오게 됩니다.