테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

관측성(로그·지표·추적)

운영 중인 시스템 안에서 무슨 일이 일어나는지 밖으로 나온 신호만으로 알아내는 능력, 곧 관측성을 정리한다. 로그·지표·추적·프로파일의 쓰임새, OpenTelemetry로 계측하고 traceparent로 추적을 잇는 방법, 지표 종류와 RED·USE, SLO와 오류 예산으로 경보를 거는 계산, 카디널리티와 로깅 습관까지 다룬다.

목차 (13)
  1. 모니터링과 관측성
  2. 네 가지 신호
  3. OpenTelemetry
  4. 분산 추적
  5. 지표 종류
  6. RED와 USE
  7. SLI·SLO·오류 예산
  8. 경보: 다중 창 소진율
  9. 카디널리티
  10. APM 제품
  11. 로깅 습관
  12. 장애 대응: 온콜, 지휘, 포스트모템
  13. 핵심 자료

부하를 일부러 걸어 한계를 재는 방법은 부하 테스트 노트에, 장애에 버티는 구조 설계는 시스템 설계 › 규모 확장에 있다. 관측성은 그 둘이 실제 운영에서 맞는지를 보는 눈이다. 도구 이름은 2026년 10월 기준이다.

모니터링과 관측성

모니터링은 미리 정한 질문 — CPU가 넘쳤나, 오류율이 문턱을 넘었나 — 을 대시보드와 경보로 지켜보는 일이다. 고장 나는 방식을 이미 알 때 잘 맞는다. 마이크로서비스처럼 부품이 많아지면 처음 보는 방식으로 고장 나는 일이 늘어, 미리 만든 대시보드에는 답이 없다. 관측성(observability)은 원래 제어 이론에서 "출력만 보고 내부 상태를 알아낼 수 있는 정도"를 뜻하는 말로, 소프트웨어에서는 코드를 새로 배포하지 않고도 새 질문을 던져 답을 찾을 수 있는 능력을 가리킨다.

모니터링은 미리 정한 질문(CPU, 오류율, 디스크)에 답하고, 관측성은 처음 보는 질문을 지역·버전·추적으로 쪼개 가며 답한다모니터링아는 질문 · 미리 만든 대시보드와 경보CPU가 80%를 넘었나?오류율이 1%를 넘었나?디스크가 차고 있나?관측성모르는 질문 · 풍부한 데이터를 쪼개고 이어 보기왜 어제부터 일부 사용자만 느리지?→ 지역별로 쪼개 보니 한 리전→ 그 안에서 앱 버전 2.3만→ 그 버전의 추적: 새 캐시 미스필요한 것: 높은 카디널리티 속성, 신호 사이 연결
모니터링은 아는 질문에, 관측성은 모르는 질문에 답한다. 관측성은 모니터링을 대신하는 게 아니라 그 위에 쌓인다.

새 질문에 답하려면 데이터가 풍부해야 한다. 요청 하나에 사용자 등급·앱 버전·리전·기능 플래그 같은 속성이 붙어 있어야 쪼개 볼 수 있고, 로그·지표·추적이 같은 ID로 이어져 있어야 한 신호에서 다른 신호로 건너간다.

네 가지 신호

관측 데이터는 흔히 세 기둥 — 로그, 지표, 추적 — 으로 나누고, 최근에는 프로파일을 네 번째로 더한다(OpenTelemetry 신호).

네 가지 신호: 로그는 사건의 기록, 지표는 수치의 시계열, 추적은 요청 하나의 경로와 시간, 프로파일은 함수별 자원 사용이다. 같은 trace_id로 서로를 오간다로그무슨 일이 있었나지표얼마나·얼마나 자주추적요청이 시간 쓴 곳프로파일어느 함수가 CPU를 썼나12:01 INFO 주문됨12:01 WARN 재시도12:02 ERROR 결제mainhandlegcjson같은 trace_id·서비스 이름·시간으로 이어 본다(로그 → 추적 → 프로파일)
네 신호는 답하는 질문이 다르다. 장애 대응은 보통 지표로 '무엇이' 나빠졌는지 보고, 추적으로 '어디서', 로그·프로파일로 '왜'를 찾는다.
  • 로그: 사건 하나하나의 기록. 가장 자세하지만 양이 많아 저장·검색 비용이 가장 크다.
  • 지표(metrics): 일정 간격으로 모은 수치의 시계열. 작고 싸서 오래 보관하고 경보를 걸기 좋지만, 미리 집계한 만큼만 볼 수 있다.
  • 추적(traces): 요청 하나가 여러 서비스를 지나며 각 구간에서 쓴 시간. 분산 시스템에서 "어디가 느린가"에 답한다.
  • 프로파일: 코드의 어느 함수가 CPU·메모리를 썼는지를 표본 추출로 늘 모으는 것(지속 프로파일링). OpenTelemetry는 2024년에 이를 네 번째 신호로 넣겠다고 발표했고, 다른 셋보다 늦게 안정화되고 있다.

OpenTelemetry

OpenTelemetry(OTel)는 신호를 만들고 보내는 방법의 공개 표준과 구현이다. 2019년 추적 표준 둘(OpenTracing, OpenCensus)이 합쳐져 CNCF 프로젝트가 됐다. 핵심은 "계측은 한 번, 저장소는 고르기"다. 예전에는 도구를 바꾸면 계측 코드를 다 바꿔야 했다.

OpenTelemetry 흐름: 앱 코드와 라이브러리가 API를 부르고 SDK가 신호를 모아 OTLP로 Collector에 보낸다. Collector는 받기, 가공(일괄 처리·샘플링·속성 정리), 내보내기를 거쳐 지표·추적·로그 저장소로 보낸다애플리케이션앱 코드·라이브러리OTel API (계측 지점)OTel SDK샘플링·일괄 전송OTLPCollector받기receivers가공processors내보내기exporters에이전트(노드마다) 또는 게이트웨이로 둔다지표 저장소추적 저장소로그 저장소계측은 표준(OTel)으로 한 번, 저장소는 OTLP를 받는 어느 것으로든 바꾼다
OTel의 부품. 라이브러리는 API만 부르고, 실제로 무엇을 어디로 보낼지는 앱이 SDK 설정으로 정한다.
  • API: 스팬을 열고 지표를 기록하는 인터페이스. 라이브러리는 이것만 부르고, SDK가 없으면 아무 일도 하지 않아 부담이 없다.
  • SDK: 샘플링, 일괄 전송, 리소스 속성(service.name 등) 부착을 맡는 구현. 웹 프레임워크·DB 드라이버·HTTP 클라이언트를 자동으로 계측하는 패키지가 많아, 코드 수정 없이 기본 추적이 나온다.
  • OTLP: 신호를 보내는 프로토콜. gRPC(기본 포트 4317)와 HTTP(4318)로 보낸다(명세). 대부분의 오픈소스·상용 백엔드가 OTLP를 직접 받는다.
  • Collector: 받기(receivers)·가공(processors)·내보내기(exporters) 파이프라인을 설정 파일로 짜는 중계기(문서). 민감 속성 지우기, 테일 샘플링, 여러 백엔드로 나눠 보내기를 앱 밖에서 한다. 노드마다 두는 에이전트와 가운데 모으는 게이트웨이를 겹쳐 쓰기도 한다.

분산 추적

추적(trace) 하나는 요청 하나의 전체 경로이고, 그 안의 구간 하나하나가 스팬(span)이다. 스팬은 이름, 시작·끝 시각, 속성, 상태, 그리고 부모 스팬의 ID를 가진다. 이 구조는 구글의 Dapper(2010)에서 왔다. 서비스가 여럿이면 다음 서비스에 "지금 어느 추적의 어느 스팬 안에서 부르는지"를 알려 줘야 하는데, 이것을 문맥 전파라 하고 HTTP에서는 W3C Trace Context의 traceparent 헤더를 쓴다.

문맥 전파 단계 그림: gateway, orders, payments 세 서비스가 같은 trace-id 4bf92f3577b34da6a3ce929d0e0e4736를 이어 쓰고, 부를 때마다 traceparent 헤더의 parent-id 칸에 부르는 쪽 스팬 ID를 넣는다gatewayspana1b2c3d4e5f60718orderspaymentstrace-id 새로 생성: 4bf92f3577b34da6a3ce929d0e0e4736gatewayspana1b2c3d4e5f60718orderspaymentstraceparent:00-4bf92f3577b34da6a3ce929d0e0e4736-a1b2c3d4e5f60718-01강조색: trace-id(끝까지 같음) · 빨간색: parent-id(부르는 쪽 스팬)gatewayspana1b2c3d4e5f60718ordersspan1f2e3d4c5b6a7980parent a1b2c3d4…paymentstraceparent:00-4bf92f3577b34da6a3ce929d0e0e4736-a1b2c3d4e5f60718-01강조색: trace-id(끝까지 같음) · 빨간색: parent-id(부르는 쪽 스팬)gatewayspana1b2c3d4e5f60718ordersspan1f2e3d4c5b6a7980parent a1b2c3d4…paymentstraceparent:00-4bf92f3577b34da6a3ce929d0e0e4736-1f2e3d4c5b6a7980-01강조색: trace-id(끝까지 같음) · 빨간색: parent-id(부르는 쪽 스팬)gatewayspana1b2c3d4e5f60718ordersspan1f2e3d4c5b6a7980parent a1b2c3d4…paymentsspan9a8b7c6d5e4f3021parent 1f2e3d4c…traceparent:00-4bf92f3577b34da6a3ce929d0e0e4736-1f2e3d4c5b6a7980-01강조색: trace-id(끝까지 같음) · 빨간색: parent-id(부르는 쪽 스팬)gatewayspana1b2c3d4e5f60718ordersspan1f2e3d4c5b6a7980parent a1b2c3d4…paymentsspan9a8b7c6d5e4f3021parent 1f2e3d4c…백엔드: trace-id로 모으고 parent로 나무를 세운다
1 / 6

gateway가 요청을 받는다. 들어온 traceparent가 없으니 새 trace-id를 만들고 루트 스팬을 연다.

traceparent 전파. 헤더는 버전-trace-id-parent-id-flags 네 칸이고, 마지막 01은 이 추적을 기록(sampled)한다는 뜻이다. trace-id는 끝까지 같고 parent-id만 홉마다 바뀐다.

모인 스팬을 시간축에 늘어놓으면 폭포 그림이 된다. 부모 스팬의 막대에서 자식이 덮지 않는 빈 구간은 그 서비스 자신이 쓴 시간이다.

추적 폭포 그림: 전체 320ms 요청에서 결제 서비스의 외부 결제사 호출이 142ms로 가장 길다0ms80ms160ms240ms320msgateway GET /checkout320msorders create282msdb SELECT cart62mspayments charge180msPSP 외부 호출142msqueue publish10ms들여쓴 만큼 자식 스팬이다. 빈 구간은 그 서비스 자신의 처리 시간이다.
추적 하나의 폭포 그림. 결제 서비스 안의 외부 결제사 호출이 가장 긴 잎 스팬이다. 숫자는 예시다.
  • flags의 sampled 비트: 첫 서비스가 기록하기로 정하면 01을 실어 보내고, 뒤 서비스들은 이를 따라(부모 기반 샘플링) 추적이 중간에 끊기지 않는다.
  • 큐를 건너는 추적: 메시지 큐에서는 메시지 헤더에 문맥을 싣는다. 소비가 한참 뒤에 일어나면 부모-자식 대신 스팬 링크(link)로 잇는다.
  • tracestate: 벤더별 추가 정보를 싣는 두 번째 헤더. 몰라도 그대로 전달만 하면 된다.

지표 종류

Prometheus와 OTel이 쓰는 지표 종류는 거의 같다. 종류를 잘못 고르면 집계가 틀어진다.

지표의 세 종류: 카운터는 늘기만 하다 재시작 때 0으로 돌아가고, 게이지는 오르내리며, 히스토그램은 응답 시간 1000건을 버킷으로 세어 p50 64ms, p90 313ms, p99 1.58s를 어림한다카운터재시작요청 수·오류 수 → rate()게이지메모리·큐 길이·온도히스토그램501002505001s2.5s버킷 상한(ms·s)과 구간별 개수히스토그램에서 어림한 분위수:p50 ≈ 64msp90 ≈ 313msp99 ≈ 1.58s버킷 안은 고르게 퍼졌다고 보고 선형 보간한다. 버킷 경계를 SLO 문턱에 맞추면 정확해진다.
세 종류의 지표. 히스토그램의 분위수는 저장된 원본이 아니라 버킷 개수에서 보간한 어림값이다.
  • 카운터: 늘기만 하는 누적값(요청 수, 오류 수). 값 자체보다 초당 증가율(rate())을 본다. 프로세스가 재시작하면 0으로 돌아가는데, rate 계산이 이를 알아서 보정한다.
  • 게이지: 오르내리는 현재값(메모리 사용량, 큐 길이, 연결 수). 여러 인스턴스의 값을 더하거나 평균 낼 수 있다.
  • 히스토그램: 값을 버킷별로 센다. 인스턴스 여러 대의 버킷을 더한 뒤 분위수를 구할 수 있다는 것이 핵심이다. 반면 인스턴스마다 미리 계산한 p99(서머리)는 평균을 내면 의미 없는 숫자가 된다. 예의 버킷에서 p99는 1.58초로 어림되는데, 실제 값은 1초~2.5초 버킷 안 어디든 될 수 있다(히스토그램 실무). 버킷을 자동으로 잘게 나누는 지수(native) 히스토그램이 이 오차를 줄인다.

RED와 USE

무엇을 지표로 둘지 정하는 두 가지 점검표가 있다. 서비스에는 RED(Rate·Errors·Duration), 자원에는 USE(Utilization·Saturation·Errors)다.

RED 방법은 서비스마다 요청률·오류·지연을, USE 방법은 자원마다 사용률·포화도·오류를 본다RED — 요청을 받는 서비스마다RRate초당 요청 수EErrors실패한 요청 수(비율)DDuration응답 시간 분포(p50·p99)USE — CPU·메모리·디스크·네트워크마다UUtilization바쁜 시간의 비율SSaturation밀려 기다리는 일(큐)EErrors장치 오류 수
RED는 사용자가 겪는 것을, USE는 기계가 겪는 것을 본다. 서비스가 느린데 USE가 멀쩡하면 원인은 다른 서비스나 잠금 같은 곳에 있다.
  • 구글 SRE 책의 네 가지 황금 신호(지연·트래픽·오류·포화도)는 RED에 포화도를 더한 것과 같다.
  • 포화도는 사용률보다 먼저 문제를 알린다. CPU 사용률 70%라도 실행 대기열이 길면 이미 요청이 기다리고 있다.
  • 지연은 평균이 아니라 분포(p50·p99)로 본다. 평균은 소수의 아주 느린 요청을 가린다. 그리고 실패한 요청의 지연은 따로 본다. 빨리 실패하는 오류가 평균 지연을 좋아 보이게 만든다.

SLI·SLO·오류 예산

SLI(service level indicator)는 사용자 경험을 나타내는 측정값으로, 보통 "좋은 이벤트 ÷ 전체 이벤트"(예: 300ms 안에 성공한 요청의 비율)로 정한다. SLO(objective)는 그 목표치(30일 동안 99.9%), SLA(agreement)는 어겼을 때 보상이 따르는 계약이다(SRE 책). SLO가 100%가 아닌 이유는 남는 몫, 곧 오류 예산을 배포·실험에 쓰기 위해서다.

오류 예산 그래프: SLO 99.9%, 30일이면 예산은 43.2분이다. 소진율 1이면 30일에, 14.4면 약 2.1일 만에 예산을 다 쓴다SLO 99.9% · 30일 → 오류 예산 0.1% = 시간으로 43.2분100%0%남은예산0일10일20일30일예산이 바닥나기까지소진율 1 → 30일소진율 2 → 15일소진율 6 → 5일소진율 14.4 → 50시간소진율 = 실제 오류율 ÷ 허용 오류율. 오류율 0.5%면 0.5 ÷ 0.1 = 5,이대로면 6일 만에 한 달 예산이 바닥난다.
오류 예산이 줄어드는 속도. 소진율은 '지금 속도라면 기간 안에 예산을 몇 번 쓰는가'다.
  • 99.9%·30일의 예산은 시간으로 43.2분, 요청으로는 한 달 10,000,000건 중 10,000건이다. 99.95%면 21.6분, 99%면 7.2시간이다. 9를 하나 늘릴 때마다 예산이 10분의 1이 된다.
  • 소진율(burn rate) = 실제 오류율 ÷ (1 − SLO). 오류율이 0.5%로 이어지면 소진율 5, 곧 6일 만에 한 달 예산이 바닥난다.
  • 예산이 남으면 배포를 서두르고, 바닥나면 기능 배포를 멈추고 안정성에 집중한다는 규칙을 팀이 미리 합의해 두는 것이 SLO의 쓸모다(SRE 워크북).

경보: 다중 창 소진율

"오류율 1% 넘으면 경보" 같은 고정 문턱은 짧은 튐에 밤잠을 깨우거나, 낮은 오류가 오래 이어져 예산을 다 먹는 것을 놓친다. SRE 워크북은 몇 가지 방식을 견준 끝에 예산을 얼마나 빨리 쓰는가로 경보를 거는 다중 창·다중 소진율 방식을 권한다.

다중 창 소진율 경보 표: 1시간에 예산 2%는 소진율 14.4로 호출, 6시간에 5%는 소진율 6으로 호출, 3일에 10%는 소진율 1로 티켓. 긴 창과 그 1/12인 짧은 창이 함께 문턱을 넘어야 울린다예산 소비긴 창짧은 창소진율오류율 문턱바닥까지대응2%1시간5분14.41.44%2일호출(page)5%6시간30분60.60%5일호출(page)10%3일6시간10.10%30일티켓첫 규칙이 울리는 조건 (SLO 99.9%)지난 1시간 오류율 > 1.44%그리고 지난 5분도 같은 문턱을 넘을 때지금짧은 창은 이미 끝난 장애로 계속 울리는 것을 막는다.
워크북의 권장값(30일 SLO 99.9% 기준). 문턱 소진율 = 예산 비율 × 30일 ÷ 긴 창이다.
  • 첫 규칙의 문턱은 0.02 × 720시간 ÷ 1시간 = 14.4이고, 99.9%에서는 오류율 1.44%다. 이 속도가 이어지면 50시간 만에 예산이 바닥나므로 사람을 깨운다(page). 느린 소진은 티켓으로 근무 시간에 본다.
  • 짧은 창(긴 창의 1/12)을 함께 보는 이유는 복구가 빠르게 반영되게 하기 위해서다. 장애가 끝났는데도 1시간 창의 평균이 높아 계속 울리는 일을 막는다.
  • 경보는 원인(CPU, 디스크)이 아니라 증상(사용자가 겪는 SLO 위반)에 건다. 원인 지표는 대시보드에 두고 진단에 쓴다. 울린 경보마다 사람이 할 일이 있어야 하며, 할 일이 없는 경보는 지운다.

카디널리티

지표 저장소는 지표 이름과 레이블 값의 조합 하나하나를 별도 시계열로 저장한다. 그래서 시계열 수는 레이블 값 가짓수의 곱이다. 이 수를 카디널리티라 하며, 지표 비용과 장애의 가장 흔한 원인이다(Prometheus 이름 짓기 지침).

카디널리티 계산: http_requests_total에 method 5, status 4, route 20을 붙이면 시계열 400개, 여기에 user_id 100,000개를 더하면 40,000,000개다http_requests_totalmethod 5×status 4×route 20=400개여기에 user_id를 레이블로 붙이면400 × user_id 100,000=40,000,000개시계열마다 메모리·색인·저장 비용이 든다. 값이 끝없는 것(ID·URL 원문·오류 메시지)은 지표 말고 로그·추적에 둔다.
레이블 하나가 시계열 수를 10만 배로 만든다. 모든 조합이 실제로 나타난다고 본 상한이다.
  • 경로 레이블에는 /users/8812 같은 원문 대신 /users/:id 같은 라우트 틀을 넣는다.
  • 사용자·주문 ID처럼 끝없는 값은 추적의 속성이나 구조화 로그의 필드로 둔다. 추적·로그 저장소는 이런 높은 카디널리티를 다루도록 만들어졌다. 관측성 도구들이 "넓은 이벤트"(속성이 많이 붙은 이벤트)를 강조하는 것도 이 때문이다.
  • 배포 후 시계열 수를 지표로 지켜보고, 새 레이블은 값의 가짓수를 먼저 어림한다.

APM 제품

APM(application performance monitoring)은 추적·지표·로그를 한 화면에서 잇는 제품군을 부르는 이름이다. 도구는 계측·수집·저장 세 층으로 나눠 보면 고르기 쉽다. 아래 이름은 대표적인 것을 순서 없이 늘어놓은 것이며 추천이 아니다.

관측성 도구의 자리: 계측은 OTel SDK·벤더 에이전트·eBPF가, 수집은 OTel Collector·에이전트가 맡고, 저장·분석은 Prometheus·Jaeger·Grafana 계열 같은 오픈소스나 여러 상용·관리형 서비스가 맡는다계측OTel SDK·자동 계측벤더 에이전트eBPF 기반 수집수집·가공OTel Collector벤더 에이전트Fluent Bit 등저장·분석·화면오픈소스(직접 운영)Grafana Loki·Tempo·MimirJaeger · OpenSearchPrometheus상용·관리형Datadog · DynatraceElastic · Grafana CloudHoneycomb · New RelicSplunk · 클라우드 자체 도구
관측성 도구의 층. OTel로 계측해 두면 저장·분석 층은 비교적 쉽게 바꿀 수 있다.
  • 오픈소스 직접 운영: 지표는 Prometheus(장기 보관은 Mimir·Thanos 같은 확장), 추적은 Jaeger·Tempo, 로그는 Loki·OpenSearch, 화면은 Grafana가 흔한 조합이다. 라이선스 비용이 없는 대신 저장소 운영이 일이 된다.
  • 상용·관리형: 설치가 쉽고 신호 연결·이상 탐지 같은 기능이 붙어 있지만, 보통 데이터양·호스트 수에 비례해 과금돼 규모가 커지면 비용이 가파르게 오른다. 클라우드 사업자의 자체 도구는 그 클라우드 자원과 붙이기 쉽다.
  • 어느 쪽이든 고를 때는 OTLP를 그대로 받는지, 데이터 보관 기간과 단가, 높은 카디널리티 질의를 얼마나 빠르게 하는지, 데이터를 다른 곳으로 꺼낼 수 있는지를 본다.

로깅 습관

로그는 사람이 읽을 문장이 아니라 기계가 거를 이벤트로 남긴다. 필드 이름을 OTel의 로그 데이터 모델·시맨틱 규칙에 맞추면 도구를 바꿔도 질의가 그대로 통한다.

같은 사건의 비구조 로그 한 줄과 구조화 로그. 구조화 로그는 시간·심각도·서비스·주문 번호·소요 시간·trace_id가 필드로 나뉘어 있어 검색·집계·추적 연결이 쉽다비구조 로그 — 사람은 읽기 쉽지만 기계는 정규식으로 뜯어야 한다2026-10-30 12:02:11 ERROR payment failed for order 8812 (user 31, 412ms)구조화 로그 — 필드로 거르고 묶고, trace_id로 추적에 잇는다{"time": "2026-10-30T12:02:11.204Z","severity": "ERROR","service.name": "payments","message": "payment failed","order.id": "8812","duration_ms": 412,"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"}
같은 사건의 두 기록. 구조화 로그는 'payments 서비스에서 400ms 넘게 걸린 ERROR'를 정규식 없이 거른다.
  • trace_id를 넣는다: 로그 한 줄에서 그 요청의 추적 전체로 건너갈 수 있다. OTel 로그 연동을 쓰면 현재 스팬의 ID가 자동으로 붙는다.
  • 심각도를 지킨다: ERROR는 사람이 볼 일, WARN은 스스로 회복한 이상, INFO는 상태 변화, DEBUG는 평소에 끈다. 모든 것이 ERROR면 아무것도 ERROR가 아니다.
  • 민감 정보를 남기지 않는다: 비밀번호·토큰·카드 번호·주민번호를 로그에 쓰지 않는다. 로그는 접근 권한이 넓고 오래 남는다. 남겨야 하면 가리거나(마스킹) Collector에서 지운다.
  • 양을 다룬다: 같은 메시지가 초당 수천 번 나오면 표본만 남기고(로그 샘플링) 개수는 지표로 센다. 오래된 로그는 싼 저장소로 옮기고 보관 기간을 정해 지운다.

추적도 모두 남기면 비싸다. 요청이 시작될 때 무작위로 정하는 헤드 샘플링은 싸고 단순하지만 드문 오류 추적까지 같은 비율로 버린다. 요청이 끝난 뒤 추적 전체를 보고 정하는 테일 샘플링은 오류·느린 추적을 모두 남길 수 있는 대신, Collector가 추적이 끝날 때까지 스팬을 메모리에 모아 둬야 한다(샘플링).

초당 1000건 서비스의 하루 추적 수: 모두 저장 86,400,000, 헤드 샘플링 1% 864,000, 테일 샘플링 2,147,040초당 1,000건 · 하루에 남는 추적 수모두 저장86,400,000요청 수에 비례헤드 1%864,000오류 추적도 1%만 남는다테일2,147,040오류·느린 추적은 모두 남는다테일 가정: 오류 0.5%, 1초 넘는 느린 요청 1%, 나머지 1% → 전체의 2.48%를 남긴다
초당 1,000건 서비스에서 하루에 남는 추적 수. 테일 샘플링은 헤드보다 조금 더 남기면서 중요한 추적은 하나도 버리지 않는다. 비율은 가정이다.

예에서 모두 저장하면 하루 86,400,000개, 헤드 1%는 864,000개, 테일은 전체의 2.48%인 2,147,040개다. 샘플링한 추적으로 요청 수를 세면 틀리므로, 개수·비율은 샘플링 전에 지표로 따로 센다.

장애 대응: 온콜, 지휘, 포스트모템

관측성은 경보가 울린 뒤의 대응까지 이어져야 값을 한다. Google SRE 책은 장애 관리의 우선순위를 “피를 멈추고, 서비스를 되살리고, 원인을 찾을 증거를 남긴다” 순서로 적는다(Managing Incidents). 원인을 끝까지 밝히는 것보다 롤백이나 트래픽 우회로 사용자 피해부터 줄이는 것이 먼저이고, 원인 분석은 그다음이다.

  • 역할을 나눈다: 큰 장애에서는 전체 상황을 쥐고 일을 나눠 주는 지휘자(incident commander), 실제로 시스템을 고치는 사람, 바깥에 상황을 알리는 사람을 따로 둔다. 지휘자는 누가 무엇을 했는지 적는 실시간 장애 문서를 유지한다.
  • 절차는 미리: 대응 절차와 연락 경로는 장애 전에 써 두고 연습한다. 경보마다 무엇을 확인하고 무엇을 할지 적은 런북(runbook)을 경보 설명에 링크해 두면 새벽에 깬 당번도 같은 순서로 움직인다.
  • 온콜의 양을 잰다: Google SRE는 SRE 시간의 25% 이하만 온콜에 쓰게 하고, 사건 하나를 처리하고 후속 작업까지 마치는 데 6시간쯤 걸린다고 보아 12시간 당번 한 번에 사건 2건을 상한으로 둔다(Being On-Call). 그보다 자주 울리면 사람을 늘리기 전에 경보와 시스템을 고친다.
  • 비난 없는 포스트모템: 장애 뒤에는 무슨 일이 언제 일어났고, 무엇이 피해를 키웠고, 무엇을 고칠지 글로 남긴다. 사람이나 팀을 탓하지 않고 원인이 된 조건에 집중해야 다음에도 사람들이 실수를 숨기지 않고 말한다. 사용자에게 보인 장애, 데이터 손실, 당번의 수동 개입(롤백, 트래픽 우회), 감시가 장애를 못 잡은 경우처럼 써야 하는 기준을 장애 전에 정해 둔다(Postmortem Culture).

핵심 자료

자료성격한 줄 요지
Dapper, a Large-Scale Distributed Systems Tracing Infrastructure (Sigelman 등)논문(2010)구글의 분산 추적 시스템. 트레이스·스팬·샘플링이라는 오늘날 추적의 기본 틀이 여기서 나왔다.
Site Reliability Engineering — Service Level Objectives책(2016)SLI·SLO·SLA를 구분하고 목표를 어떻게 고르는지 설명한 장.
The Site Reliability Workbook — Alerting on SLOs책(2018)경보 방식 여섯 가지를 비교해 다중 창·다중 소진율 경보에 이르는 과정을 숫자로 보인다.
W3C Trace Context표준traceparent·tracestate 헤더로 추적 문맥을 서비스 사이에 전달하는 형식.
OpenTelemetry 문서공식 문서API·SDK·Collector·OTLP와 신호별 개념. 계측의 사실상 표준이다.
The USE Method (Brendan Gregg)글자원마다 사용률·포화도·오류를 차례로 보는 성능 점검 순서.