Prometheus/Grafana 시니어 기술면접
새 면접Q. 일일 활성 사용자 1억 명 규모의 글로벌 서비스에서 Prometheus 기반 모니터링 시스템을 설계해야 합니다. Federation, Thanos, Cortex 등 여러 솔루션 중 어떤 아키텍처를 선택하시겠습니까? 각 솔루션의 장단점과 선택 기준을 설명해주세요.
데이터 보관 기간, 쿼리 성능, 운영 복잡도, 비용 측면에서 각 솔루션의 특성을 비교해보세요.
Thanos를 선택하겠습니다. Thanos는 오브젝트 스토리지(S3 등)를 활용해 장기 데이터 보관이 저렴하고, 글로벌 쿼리 기능으로 여러 리전의 메트릭을 통합 조회할 수 있습니다. Federation은 계층적 구조로 단순하지만 중앙 서버가 병목이 되고, Cortex는 멀티테넌시가 강력하지만 운영 복잡도가 높습니다. 1억 사용자 규모에서는 리전별 Prometheus + Thanos Sidecar 구조로 로컬 쿼리는 빠르게 처리하고, 글로벌 뷰는 Thanos Querier로 제공하는 것이 비용 대비 효율적입니다. Compactor와 Store Gateway를 통해 downsampling과 장기 보관을 자동화할 수 있어 운영 부담도 적습니다.
- • Thanos는 오브젝트 스토리지 기반으로 장기 보관 비용이 저렴함
- • 글로벌 쿼리 기능으로 여러 리전 메트릭 통합 조회 가능
- • 리전별 Prometheus + Sidecar 구조로 로컬/글로벌 쿼리 분리
- • Compactor를 통한 자동 downsampling과 데이터 압축
대규모 MSA 환경에서 수백 개의 서비스 메트릭을 수집하고 장기 보관하면서도 쿼리 성능을 유지해야 할 때 아키텍처 선택이 중요합니다.
Thanos Compactor의 downsampling 전략을 어떻게 설정하시겠습니까? 5분, 1시간 단위 등 샘플링 간격을 결정하는 기준은 무엇인가요?
Q. 프로덕션 환경에서 Prometheus의 메모리 사용량이 급증하여 OOM Killer에 의해 주기적으로 재시작되는 상황입니다. 시계열 데이터는 약 1천만 개이고, scrape interval은 15초입니다. 어떤 순서로 원인을 진단하고 해결하시겠습니까?
cardinality 폭발, retention 설정, 쿼리 패턴, chunk 크기 등 여러 원인을 체계적으로 점검해야 합니다.
먼저 /metrics 엔드포인트에서 prometheus_tsdb_symbol_table_size_bytes, prometheus_tsdb_head_series 등을 확인해 시계열 증가 추이를 파악합니다. Cardinality 폭발이 의심되면 promtool tsdb analyze로 높은 cardinality를 가진 레이블을 식별합니다. 특히 user_id, request_id 같은 무한 증가 레이블이 있는지 확인하고, relabel_configs로 제거하거나 recording rule로 집계합니다. Retention 기간이 과도하면 --storage.tsdb.retention.time을 조정하고, 쿼리 패턴 문제라면 Grafana 대시보드의 무거운 쿼리를 최적화합니다. WAL 크기도 확인해 --storage.tsdb.wal-compression을 활성화하고, 필요시 샤딩이나 Federation으로 부하를 분산시킵니다.
- • prometheus_tsdb_head_series 등 내부 메트릭으로 시계열 증가 추이 확인
- • promtool tsdb analyze로 높은 cardinality 레이블 식별
- • user_id 같은 무한 증가 레이블을 relabel_configs로 제거
- • retention 기간 조정 및 WAL 압축 활성화
동적으로 생성되는 컨테이너나 파드의 레이블이 시계열 폭발을 일으켜 Prometheus가 불안정해지는 경우가 자주 발생합니다.
relabel_configs의 keep, drop, replace 액션의 차이와 각각 어떤 상황에서 사용하는지 설명해주세요.
Q. Prometheus의 4가지 메트릭 타입(Counter, Gauge, Histogram, Summary)의 차이와 각각의 적절한 사용 사례를 설명해주세요. 특히 Histogram과 Summary의 차이점과 선택 기준은 무엇인가요?
각 타입이 저장하는 데이터 구조와 집계 방식, 그리고 quantile 계산 위치의 차이를 생각해보세요.
Counter는 누적 증가만 가능한 메트릭으로 요청 수, 에러 수 등에 사용하고 rate() 함수로 초당 증가율을 계산합니다. Gauge는 증가/감소가 자유로운 메트릭으로 현재 메모리 사용량, 동시 접속자 수 등에 사용합니다. Histogram은 관측값을 미리 정의된 bucket에 분류해 저장하며, 서버 측에서 quantile을 계산할 수 있어 여러 인스턴스의 데이터를 집계 가능합니다. Summary는 클라이언트 측에서 quantile을 계산해 저장하므로 정확하지만 집계가 불가능합니다. 응답 시간처럼 분포를 알아야 하는 메트릭은 Histogram을 선택하고, 집계가 필요 없고 정확한 quantile이 필요하면 Summary를 사용합니다.
- • Counter는 누적 증가만 가능, rate() 함수로 증가율 계산
- • Gauge는 증가/감소 자유로운 현재값 표현
- • Histogram은 서버 측 quantile 계산으로 집계 가능
- • Summary는 클라이언트 측 quantile 계산으로 정확하지만 집계 불가
API 응답 시간의 P95, P99를 모니터링하고 알람을 설정할 때 Histogram과 Summary 중 적절한 타입을 선택해야 합니다.
Histogram의 bucket 경계값을 어떻게 설정하시겠습니까? 응답 시간 모니터링을 위한 적절한 bucket 설정 예시를 들어주세요.
Q. Grafana 대시보드에서 30일치 데이터를 조회하는 쿼리가 타임아웃되는 상황입니다. 수백 개의 서비스 인스턴스에서 수집한 메트릭을 sum by (service) 로 집계하는 쿼리입니다. 어떤 최적화 방법들을 적용할 수 있나요?
Recording rule, 쿼리 간격 조정, downsampling 등 여러 레이어에서 최적화를 고려해보세요.
Recording rule을 생성해 미리 집계된 메트릭을 저장하고, 대시보드에서는 집계된 메트릭을 조회하도록 수정합니다. 예를 들어 1분마다 sum by (service)를 계산하는 rule을 만들면 쿼리 시 원본 시계열이 아닌 집계 결과만 읽어 성능이 크게 향상됩니다. 대시보드의 resolution을 조정해 30일 범위에서는 1분 단위가 아닌 1시간 단위로 데이터를 요청하도록 설정합니다. Thanos나 VictoriaMetrics를 사용 중이라면 자동 downsampling으로 오래된 데이터는 낮은 해상도로 저장되어 쿼리 성능이 개선됩니다. 쿼리 자체도 불필요한 레이블을 제거하고, sum 대신 avg나 max가 적절한지 검토합니다. 마지막으로 Grafana의 Query caching을 활성화해 동일 쿼리 반복 실행을 방지합니다.
- • Recording rule로 미리 집계된 메트릭 생성
- • 대시보드 resolution 조정으로 장기간 조회 시 샘플링 간격 증가
- • Thanos/VictoriaMetrics의 자동 downsampling 활용
- • Query caching으로 반복 쿼리 성능 개선
월간 리포트나 장기 트렌드 분석 대시보드에서 대량의 시계열 데이터를 효율적으로 조회해야 할 때 필수적인 최적화입니다.
Recording rule의 evaluation interval을 어떻게 설정하시겠습니까? scrape interval과의 관계는 어떻게 고려해야 하나요?
Q. Prometheus의 Pull 모델과 Push 모델의 차이를 설명하고, Prometheus가 Pull 모델을 채택한 이유는 무엇인가요? Push 모델이 필요한 경우는 언제이며 어떻게 구현하나요?
서비스 디스커버리, 네트워크 방화벽, 단기 실행 작업 등의 관점에서 생각해보세요.
Pull 모델은 Prometheus가 주기적으로 타겟에 접근해 메트릭을 수집하는 방식이고, Push 모델은 애플리케이션이 메트릭을 모니터링 시스템으로 전송하는 방식입니다. Prometheus가 Pull 모델을 채택한 이유는 타겟의 health 상태를 확인할 수 있고, 서비스 디스커버리와 통합이 쉬우며, 타겟이 과부하 상태일 때 메트릭 수집을 조절할 수 있기 때문입니다. 하지만 배치 작업이나 Lambda 같은 단기 실행 작업은 Prometheus가 scrape하기 전에 종료되므로 Pushgateway를 사용해야 합니다. Pushgateway는 단기 작업의 메트릭을 받아 저장하고, Prometheus가 주기적으로 수집해갑니다. 방화벽으로 Prometheus가 타겟에 접근할 수 없는 경우에도 Pushgateway를 중간 게이트웨이로 활용합니다.
- • Pull 모델은 Prometheus가 타겟을 주기적으로 scrape
- • 타겟 health 확인, 서비스 디스커버리 통합, 부하 조절이 용이
- • 배치 작업 같은 단기 실행 작업은 Pushgateway 사용
- • 방화벽 환경에서도 Pushgateway로 우회 가능
Kubernetes CronJob이나 데이터 파이프라인 배치 작업의 실행 시간과 성공/실패를 모니터링할 때 Pushgateway가 필요합니다.
Pushgateway 사용 시 주의해야 할 점은 무엇인가요? 특히 레이블 충돌이나 stale 메트릭 문제를 어떻게 방지하나요?
Q. Prometheus와 Grafana를 프로덕션 환경에서 안전하게 운영하기 위한 보안 설정에는 어떤 것들이 있나요? 인증, 인가, 네트워크 격리, 데이터 암호화 측면에서 설명해주세요.
Basic Auth, OAuth, TLS, RBAC, 네트워크 정책 등 여러 보안 레이어를 고려하세요.
Prometheus는 기본적으로 인증 기능이 없으므로 nginx나 OAuth2 Proxy를 앞단에 두어 인증을 구현하거나, Prometheus 자체의 Basic Auth를 활성화합니다. Grafana는 LDAP, OAuth, SAML 등 다양한 인증 방식을 지원하며, 팀별로 폴더와 대시보드 권한을 분리하는 RBAC을 설정합니다. 메트릭 수집 시 TLS를 활성화해 전송 구간을 암호화하고, Grafana-Prometheus 간 통신도 HTTPS로 설정합니다. Kubernetes 환경에서는 Network Policy로 Prometheus가 필요한 Pod에만 접근하도록 제한하고, 민감한 메트릭(비밀번호, API 키)이 노출되지 않도록 relabel_configs에서 제거합니다. Grafana의 API 키는 최소 권한 원칙으로 생성하고 정기적으로 rotate합니다.
- • Prometheus는 OAuth2 Proxy나 Basic Auth로 인증 구현
- • Grafana는 LDAP/OAuth 인증 및 RBAC으로 권한 분리
- • TLS로 메트릭 수집 및 Grafana-Prometheus 통신 암호화
- • Network Policy로 네트워크 접근 제한, 민감 메트릭 제거
내부 모니터링 시스템이 외부에 노출되어 공격자가 인프라 정보를 수집하거나 DoS 공격을 시도하는 것을 방지해야 합니다.
Grafana에서 외부 사용자에게 대시보드를 공유해야 할 때 어떤 방식을 사용하시겠습니까? Public dashboard, Snapshot, Embedding 중 선택 기준은 무엇인가요?
Q. Prometheus를 Kubernetes 환경에서 운영 중입니다. Prometheus 자체의 고가용성(HA)을 어떻게 구성하시겠습니까? 데이터 일관성, 알림 중복, 쿼리 라우팅 측면에서 설명해주세요.
동일 설정의 Prometheus 인스턴스를 여러 개 띄우는 방식과 알림 중복 제거를 고려하세요.
동일한 설정의 Prometheus 인스턴스를 2개 이상 배포하고, 각각 독립적으로 동일한 타겟을 scrape하도록 구성합니다. StatefulSet으로 배포하고 각 인스턴스는 로컬 스토리지에 데이터를 저장합니다. Alertmanager를 클러스터 모드로 구성하고, Prometheus의 알림 설정에서 external_labels로 replica 레이블을 추가해 Alertmanager가 중복 알림을 제거하도록 합니다. 쿼리는 Thanos Query나 Promxy 같은 쿼리 레이어를 앞단에 두어 여러 Prometheus를 통합 조회하고, deduplication을 수행합니다. Grafana는 로드밸런서를 통해 여러 Prometheus에 분산 쿼리하거나, Thanos Query를 단일 데이터소스로 설정합니다. 한 인스턴스가 다운되어도 다른 인스턴스가 메트릭을 수집하므로 데이터 손실을 최소화할 수 있습니다.
- • 동일 설정의 Prometheus 인스턴스 2개 이상 독립 배포
- • Alertmanager 클러스터 모드로 external_labels 기반 중복 제거
- • Thanos Query나 Promxy로 쿼리 통합 및 deduplication
- • StatefulSet과 로컬 스토리지로 각 인스턴스 독립 운영
Prometheus 인스턴스가 다운되었을 때 메트릭 수집과 알림이 중단되지 않도록 고가용성 구성이 필수적입니다.
Prometheus의 로컬 스토리지 대신 원격 스토리지(Remote Write)를 사용하는 경우의 장단점은 무엇인가요?
Q. Prometheus의 TSDB(Time Series Database)는 어떤 구조로 데이터를 저장하며, 시계열 데이터에 최적화된 이유는 무엇인가요? Block, Chunk, WAL의 역할을 설명해주세요.
시간 기반 파티셔닝, 압축, 불변성 등 시계열 데이터의 특성을 생각해보세요.
Prometheus TSDB는 시간 기반으로 Block을 생성하고, 각 Block은 2시간 단위의 압축된 시계열 데이터를 포함합니다. Chunk는 개별 시계열의 샘플을 압축해 저장하는 단위로, XOR 기반 압축으로 높은 압축률을 달성합니다. WAL(Write-Ahead Log)은 새로 수집된 데이터를 먼저 기록해 장애 시 데이터 복구를 가능하게 합니다. Block은 불변(immutable) 구조로, 한번 생성되면 수정되지 않아 동시성 제어가 간단하고 캐싱이 효율적입니다. 오래된 Block은 Compaction 과정을 거쳐 더 큰 Block으로 병합되며, retention 기간이 지나면 삭제됩니다. 이러한 구조는 시계열 데이터의 시간 순서 삽입, 범위 쿼리, 압축 특성에 최적화되어 있습니다.
- • Block은 2시간 단위의 불변 시계열 데이터 저장 단위
- • Chunk는 XOR 압축으로 개별 시계열 샘플을 효율적으로 저장
- • WAL은 장애 복구를 위한 Write-Ahead Log
- • Compaction으로 오래된 Block 병합 및 retention 관리
시계열 데이터의 효율적인 저장과 빠른 범위 쿼리를 위해 TSDB의 내부 구조를 이해하고 튜닝해야 합니다.
TSDB의 Compaction 과정에서 성능 저하가 발생할 수 있습니다. 이를 최소화하기 위한 방법은 무엇인가요?
Q. 기존에 운영 중이던 모니터링 시스템을 Prometheus/Grafana로 전환하는 프로젝트를 리드한 경험이 있다면 공유해주세요. 팀원들의 반대나 저항이 있었다면 어떻게 설득하고 협업했나요?
상황(Situation), 과제(Task), 행동(Action), 결과(Result) 순서로 구체적인 경험을 이야기하세요.
STAR 방식으로 답변을 구성하세요. Situation: 어떤 모니터링 시스템을 사용하고 있었고, 왜 전환이 필요했는지 배경을 설명합니다. Task: 전환 프로젝트에서 본인의 역할과 목표를 명확히 합니다. Action: 팀원들의 우려사항(학습 곡선, 기존 대시보드 마이그레이션 등)을 어떻게 파악하고, PoC를 통해 효과를 입증했는지, 교육과 문서화를 어떻게 진행했는지 구체적으로 설명합니다. 점진적 마이그레이션 전략, 롤백 플랜 등 리스크 관리 방법도 포함하세요. Result: 전환 후 달성한 정량적 성과(쿼리 성능 개선, 비용 절감 등)와 팀의 만족도 변화를 이야기합니다. 이 과정에서 배운 점과 다음에는 어떻게 개선할지도 언급하면 좋습니다.
- • STAR 방식으로 구조화된 답변 구성
- • 팀원들의 우려사항을 경청하고 PoC로 효과 입증
- • 점진적 마이그레이션과 교육/문서화로 저항 최소화
- • 정량적 성과와 배운 점을 구체적으로 공유
레거시 시스템을 현대적인 기술 스택으로 전환할 때 기술적 역량뿐 아니라 팀을 이끄는 소프트 스킬이 중요합니다.
만약 프로젝트가 예상보다 길어져 일정이 지연되었다면 어떻게 대응하셨나요? 우선순위를 어떻게 조정하셨습니까?
Q. Prometheus의 Recording Rule과 Alerting Rule을 테스트하는 방법을 설명해주세요. CI/CD 파이프라인에 어떻게 통합할 수 있나요?
promtool을 활용한 정적 검증과 유닛 테스트 방법을 생각해보세요.
promtool을 사용해 Recording Rule과 Alerting Rule의 문법을 검증하고, 유닛 테스트를 작성합니다. promtool check rules 명령으로 YAML 파일의 문법 오류를 탐지하고, promtool test rules 명령으로 테스트 케이스를 실행합니다. 테스트 파일에는 입력 시계열 데이터와 예상되는 알림 또는 Recording Rule 결과를 정의합니다. CI/CD 파이프라인에서는 PR 단계에서 promtool check와 test를 실행해 규칙 변경이 기존 동작을 깨뜨리지 않는지 검증합니다. GitOps 방식으로 규칙을 관리하면 코드 리뷰를 거쳐 승인된 변경만 프로덕션에 배포되도록 할 수 있습니다. Alertmanager의 라우팅 규칙도 amtool을 사용해 유사하게 검증합니다.
- • promtool check rules로 문법 검증
- • promtool test rules로 입력/출력 기반 유닛 테스트
- • CI/CD 파이프라인에서 PR 단계에 자동 테스트 통합
- • GitOps로 코드 리뷰 후 승인된 변경만 배포
잘못된 알림 규칙이 프로덕션에 배포되어 false positive 알림이 폭증하거나 critical 알림을 놓치는 것을 방지해야 합니다.
Alerting Rule의 임계값을 어떻게 결정하시나요? 과도한 알림을 방지하기 위한 전략은 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!