26Y19a7

Young-Kyoo Kim·7일 전

현재 우리 데이터 레이크하우스 스택(K8s, Cilium, AIStor, Keycloak, StarRocks, Spark)의 특성을 고려할 때, 데이터 파이프라인에서 연산은 해두었지만 아직 시각화하지 않은 3가지 고부가가치 SRE 지표 차트를 추가하면 진단 리포트의 완성도를 극대화할 수 있습니다.

특히 이 차트들은 사내 LLM(step5)이 리포트를 작성할 때 "인프라 전이 오버헤드"를 시각적으로 증명하는 강력한 증거 자료가 됩니다.


💡 추가하면 SRE 관점에서 대단히 유용한 차트 3종

  1. Chart 24: Keycloak 인증 밀도 타임라인 스파이크 (feat_auth_density_p95)
  • 용도: Airflow DAG가 아침에 폭발하거나 Spark 잡이 대규모로 생성될 때 발생하는 "토큰 검증 폭풍(Token Storm)" 현상을 시각화합니다. 특정 시간대에 인증 부하를 유발하는 주범 워크로드를 저격할 수 있습니다.
  1. Chart 25: Cilium CNI eBPF 패킷 드롭 에러 누적 차트 (net_drop_errors_total)
  • 용도: 워크로드별 커널 레이어 패킷 드롭 상태를 바 차트로 보여줍니다. 네트워크 폴리시(Network Policy) 블록이나 eBPF Map 용량 한계로 인한 미스터리한 네트워크 유실을 즉시 판독합니다.
  1. Chart 26: OOM 타격 반경 vs 메모리 오버커밋 상관관계 산점도 (oom_strike_sum)
  • 용도: X축(Limit/Request 비율), Y축(메모리 활용률) 상에서 OOM Strike 카운트를 버블 크기(Size)로 표현합니다. 어떤 워크로드가 위험천만한 자원 오버커밋 상태에서 OOM 킬러의 타겟이 되고 있는지 한눈에 보여줍니다.

💻 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 수정 없이도 엑셀 리포트 마지막 페이지에 이 유용한 지표들이 이쁘게 박혀 나오게 됩니다.

0개의 댓글