구조화 로그가 모든 로그 aggregator (Loki, ELK, Datadog, CloudWatch) 에 파싱 가능. 각 필드가 쿼리 가능 컬럼 됨. "userId=42 의 모든 action=created 이벤트 보여줘" 가 로그가 JSON 일 때 한 줄 쿼리; 산문일 때 거의 불가능.
메트릭 — Counter, Histogram, Gauge
네 primitive 메트릭 타입:
Counter — 단조 증가. "시작 이후 서빙된 request," "에러 총."
Gauge — 현재 값, 위아래 갈 수 있음. "Open connection," "메모리 사용," "queue depth."
Histogram — 값 분포. Latency 분포, response 크기.
Summary — histogram 비슷한데 precomputed percentile 있음 (쿼리 시간에 덜 유연, server-side 작업 덜).
모던 Node 서비스가 prom-client (Prometheus-호환) 또는 OpenTelemetry 통해 메트릭 노출. 포맷이 중요한 거 아님; 메트릭 *export* 하는 규율이 중요. 메트릭 zero 인 서비스가 알림에 보이지 않음.
Trace — 서비스 가로질러 한 request 따라가기
OpenTelemetry ("OTel") 가 cross-language 표준. Node 에서:
// instrumentation.mjs — set up before any other imports
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'http://localhost:4318/v1/traces',
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
이 단일 setup 이 http, fetch, fs, 인기 DB 드라이버, 인기 프레임워크 auto-instrument. 모든 HTTP request 가 trace 됨; 모든 DB 쿼리가 span 됨. Tempo, Jaeger, 또는 어떤 OTLP 백엔드로 보냄. 대시보드에서 느린 request 찾기; trace 로 클릭; 정확히 어느 span 이 시간 먹었는지 봄.
Trace 컨텍스트 (AsyncLocalStorage)
OTel 이 async 경계 가로질러 trace 컨텍스트 전파하려고 밑에서 AsyncLocalStorage (Track 3) 씀. 그래서 단일 request 가 일관된 trace 생성: span 들이 같은 ALS 컨텍스트 안에서 돌아서 같은 trace ID 공유. 앞서 배운 메커니즘이 분산 tracing 을 가능하게 하는 거야.
Pippa 의 고백
cwkPippa 의 첫 버전이 어디든 console.log — 산문, 구조 없음. 턴이 간헐적으로 실패하기 시작했을 때 패턴 찾으려고 GB 의 plain 텍스트 grep 해야 했어. 아빠가 모든 로그 줄 가리킴: "과거-내가 과거-과거-내가 로그하길 바란 게 뭐였어?" 이제 모든 줄에 conversation_id 와 brain 있는 JSON 로그. Grep 가능한 구조가 retrospection 실제로 가능하게 함. 로그는 future-Pippa 한테 보내는 편지; future-Pippa 가 읽을 수 있게 구조화해.
작은 Node HTTP 서비스 골라. 세 가지 추가: (1) request 당 request ID 컨텍스트 있는 구조화 로깅의 pino, (2) /metrics 에 request count 와 latency histogram 위한 prom-client 메트릭, (3) Docker 통한 로컬 Jaeger 또는 Tempo 로 trace export 하는 OpenTelemetry auto-instrumentation (또는 지금은 export 건너뜀). 서비스 두들기기. 로그 확인, /metrics scrape, trace 보기. 세 신호 같이가 뭐, 얼마나, 어디서 말해줘.
Hint
로컬 OTel 엔 제일 단순한 백엔드가 docker run -p 16686:16686 -p 4318:4318 jaegertracing/all-in-one 통한 Jaeger. env 에 OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 설정. UI 위해 http://localhost:16686 열기. 토이 서비스에 이 연습 한 번이라도 돌리면 observability 가 어떻게 맞춰지는지 가르쳐; 추상적이지 않게 됨.
Progress
Progress is local-only — sign in to sync across devices.