Datadog / datadog

11 개의 포스트

2023-03-08 incident: A deep dive into the platform-level recovery | Datadog (새 탭에서 열림)

2023년 3월 발생한 대규모 장애 당시 Datadog은 전체 컴퓨팅 용량의 60%를 상실했으며, 이를 복구하기 위해 계층화된 쿠버네티스 구조에 따른 체계적인 재부팅 전략을 수행했습니다. EU1 리전의 복구 과정에서 팀은 단순한 노드 재가동을 넘어 클라우드 제공업체의 피어링 그룹 제한과 서브넷 IP 고갈이라는 예상치 못한 인프라 한계에 직면했습니다. 이 글은 대규모 인프라 장애 시 제어 평면(Control Plane)의 복구 순서와 백로그 처리를 위한 과도한 스케일 아웃이 유발하는 2차 병목 현상을 상세히 다룹니다. **계층적 쿠버네티스 구조와 복구 전략** * Datadog은 관리 효율성을 위해 '부모(Parent)-자식(Child)' 형태의 계층적 클러스터 구조를 사용합니다. 부모 클러스터는 자식 클러스터의 제어 평면을 포드(Pod) 형태로 호스팅하며, 자식 클러스터는 실제 애플리케이션 워크로드를 실행합니다. * 장애의 원인이 된 시스템 패치(Ubuntu 22.04의 systemd-networkd 관련 이슈)로 인해 네트워크 연결이 끊긴 노드들을 복구하기 위해 엄격한 순서에 따른 재부팅을 진행했습니다. * 복구는 (1) 부모 클러스터 제어 평면 노드 재시작, (2) 부모 노드 위에서 실행되는 자식 클러스터 제어 평면 포드 복구, (3) 수천 개의 자식 클러스터 애플리케이션 노드 재시작 순으로 이루어졌습니다. * 특히 제어 평면에 과부하가 걸리지 않도록 노드 재시작 속도를 조절했으며, 워크로드의 중요도에 따라 클러스터별 복구 우선순위를 설정했습니다. **인프라 확장 제한으로 인한 복구 지연** * 모든 컴퓨팅 용량을 복구한 후, 장애 동안 쌓인 대규모 데이터 백로그를 처리하기 위해 급격한 스케일 아웃(Scale-out)을 시도하는 과정에서 예상치 못한 제한에 부딪혔습니다. * **GCP 네트워크 피어링 제한:** EU1 리전 내 인스턴스 수가 15,500개에 도달하며 구글 클라우드의 네트워크 피어링 그룹 제한에 걸려 약 4시간 동안 추가 인스턴스 생성이 차단되었습니다. 이는 구글 측과의 긴급 협력을 통해 한도를 증설하여 해결했습니다. * **서브넷 IP 주소 고갈:** 로그 및 트레이스 처리를 담당하는 특정 클러스터들이 평상시보다 2배 이상 스케일 아웃을 시도하면서 서브넷 내 사용 가능한 IP 주소가 바닥났습니다. * 평소 IP 사용률을 66% 이하로 유지하도록 모니터링해왔으나, 백로그 처리를 위한 폭발적인 수요는 평상시 변동 폭을 훨씬 상회하는 수준이었습니다. 결과적으로 특정 클러스터들은 약 6시간 동안 최적의 속도로 데이터를 처리하지 못했습니다. **교훈 및 실용적 권장사항** 복구 계획을 세울 때는 단순히 시스템을 정상화하는 것을 넘어, 장애 이후 발생할 '데이터 백로그 처리'를 위한 초과 용량 확보 시나리오를 반드시 고려해야 합니다. 클라우드 제공업체의 하드웨어 리소스 한계뿐만 아니라 네트워크 피어링, 서브넷 IP 할당 범위와 같은 소프트웨어적/구성적 제한 사항을 사전에 파악하고, 극단적인 스케일링 상황에서도 유연하게 대처할 수 있는 여유 용량(Headroom) 설계가 필수적입니다.

Robust statistical distances for machine learning | Datadog (새 탭에서 열림)

데이터독(Datadog)은 시계열 데이터 분석의 한계를 극복하기 위해 최첨단 오픈 웨이트 파운데이션 모델인 ‘Toto’와 관측성(Observability) 전용 벤치마크인 ‘BOOM’을 공개했습니다. Toto는 방대한 양의 익명화된 관측 데이터를 학습하여 별도의 추가 훈련 없이도 즉각적인 제로샷(Zero-shot) 예측이 가능하며, 기존 범용 모델들보다 월등히 높은 정확도를 보여줍니다. 이번 발표는 복잡한 IT 인프라 환경에서 발생하는 시계열 데이터를 보다 정확하게 예측하고 분석할 수 있는 새로운 표준을 제시했다는 점에서 기술적 의미가 큽니다. **시계열 파운데이션 모델 Toto의 구조와 특징** - Toto는 패치 기반 트랜스포머(PatchTST) 아키텍처를 기반으로 설계되어 시계열 데이터의 국소적 패턴과 장기적인 의존성을 동시에 효과적으로 포착합니다. - 수십억 개의 데이터 포인트를 포함하는 대규모 관측성 데이터셋으로 사전 학습되어, CPU 사용량, 네트워크 트래픽, 에러율 등 IT 환경 특유의 복잡한 패턴에 최적화되어 있습니다. - 특정 도메인에 종속되지 않는 강력한 제로샷 추론 성능을 갖추고 있어, 사용자가 자신의 데이터로 모델을 다시 학습시키지 않고도 즉시 고성능 예측 결과를 얻을 수 있습니다. - 데이터의 결측치나 불규칙한 샘플링 주기 등 실제 운영 환경에서 빈번하게 발생하는 데이터 품질 문제에 대해서도 높은 회복 탄력성을 보여줍니다. **관측성 데이터 전용 벤치마크 BOOM** - 기존의 시계열 벤치마크(ETT, Weather 등)가 실제 IT 인프라의 동적인 변동성을 충분히 반영하지 못한다는 문제를 해결하기 위해 ‘BOOM(Benchmark for Observability Orchestration and Modeling)’을 구축했습니다. - BOOM은 수만 개의 실제 서비스 메트릭을 포함하며, 급격한 스파이크(Spikes), 데이터 드리프트, 다중 계절성 등 클라우드 네이티브 환경의 독특한 특성을 데이터셋에 녹여냈습니다. - 이를 통해 시계열 모델의 성능을 단순히 수학적 지표로만 평가하는 것이 아니라, 실제 운영 환경에서의 유용성을 객관적으로 검증할 수 있는 표준을 제공합니다. **성능 검증 및 비교 우위** - 데이터독의 실험 결과에 따르면, Toto는 Chronos, TimesFM, Lag-Llama 등 기존의 주요 시계열 파운데이션 모델들과 비교했을 때 BOOM 벤치마크에서 가장 우수한 예측 성능을 기록했습니다. - 특히 관측성 데이터 특유의 높은 노이즈와 비정형 패턴 속에서도 낮은 오차율(MSE, MAE)을 유지하며 실전 투입 가능성을 입증했습니다. - 모델의 가중치가 공개된 '오픈 웨이트' 방식으로 제공되므로, 기업들은 Hugging Face를 통해 모델을 다운로드하여 자신의 프라이빗한 환경 내에서 보안 걱정 없이 활용할 수 있습니다. Toto와 BOOM의 공개는 시계열 분석 기술을 전통적인 통계 모델에서 AI 기반 파운데이션 모델로 전환하는 중요한 이정표입니다. 인프라 운영자와 데이터 과학자는 Toto를 활용해 이상 징후 탐지, 용량 계획(Capacity Planning), 비용 최적화 등을 더욱 정교하게 수행할 수 있으며, 공개된 벤치마크를 통해 자신의 분석 모델을 검증하고 지속적으로 개선해 나갈 수 있습니다.

Our journey taking Kubernetes state metrics to the next level | Datadog (새 탭에서 열림)

Datadog은 대규모 Kubernetes 환경에서 오픈소스 도구인 kube-state-metrics(KSM)를 운영하며 겪은 확장성 문제를 해결하기 위해 오픈소스 커뮤니티에 직접 기여하여 성능을 대폭 개선했습니다. 기존 KSM은 수천 개의 노드와 수만 개의 포드가 있는 환경에서 지표 수집 시간이 수십 초에 달하고 데이터 용량이 비대해지는 성능 저하 문제를 안고 있었습니다. 이를 해결하기 위해 KSM v2 개발 과정에 참여하여 지표 생성 프로세스를 최적화함으로써 수집 속도를 15배 향상하고 대규모 클러스터에서도 고해상도 데이터를 안정적으로 확보할 수 있게 되었습니다. **KSM의 작동 원리와 기존의 한계** * KSM은 Kubernetes API 서버를 리스닝하며 객체의 상태 지표를 생성하는 서비스로, 인포머(Informer) 패턴을 사용해 클러스터 수준의 메타데이터를 OpenMetrics 형식으로 노출합니다. * Datadog 에이전트는 15초마다 `/metrics` 엔드포인트를 크롤링하여 데이터를 수집하며, 필요에 따라 `label_joins` 설정을 통해 메타데이터를 결합해 지표의 가독성을 높입니다. * 하지만 기존 구조에서는 쿼리 시점에 대량의 데이터가 한꺼번에 덤프되고, 지표 생성 과정에 개입할 수 있는 훅(hook)이 부족하여 성능 확장에 제약이 있었습니다. **대규모 환경에서의 확장성 병목 현상** * 리소스당 지표 생성량을 분석한 결과 노드는 약 9개, 포드는 약 40개의 지표를 생성하며, 수만 개의 포드가 있는 환경에서는 매 수집 주기마다 수백만 개의 지표를 처리해야 합니다. * 이로 인해 네트워크 호출 시간이 수십 초로 늘어나고 데이터 크기가 수십 메가바이트에 달하게 되어, 지표의 정밀도를 낮추거나 수집 주기를 강제로 늦춰야 하는 상황이 발생했습니다. * Datadog은 이를 해결하기 위해 포드, 노드, 기타 리소스별로 KSM 배포를 물리적으로 분리하는 전략을 사용했으나 이는 임시방편에 불과했습니다. **오픈소스 기여를 통한 성능 최적화** * Datadog 팀은 내부적인 수정을 넘어 KSM v2.0.0의 메인 커뮤니티와 협력하여 지표 생성 로직과 빌더(Builder) 구조를 근본적으로 개선했습니다. * 결과적으로 지표 수집 프로세스 소요 시간을 기존 대비 15배 단축하는 성과를 거두었으며, 이는 대규모 인프라 운영의 핵심적인 전환점이 되었습니다. * 이러한 경험은 오픈소스 커뮤니티에 기여하는 것이 개별 기업의 인프라 문제를 해결함과 동시에 기술적 생태계 전체의 성능을 끌어올리는 가장 효과적인 방법임을 시사합니다. **실용적인 결론 및 추천** 대규모 Kubernetes 클러스터를 운영 중이라면 KSM v2 이상의 버전을 채택하여 최적화된 지표 수집 성능을 확보하는 것이 필수적입니다. 또한 단일 KSM 배포에서 성능 저하가 발생할 경우, 본문에서 언급된 것처럼 리소스 유형별(Collectors)로 배포를 분리하여 부하를 분산하는 전략을 검토해 보시기 바랍니다.

Making fetch happen: Building a general-purpose query and render scheduler | Datadog (새 탭에서 열림)

Datadog은 대규모 대시보드의 복잡한 데이터 페칭과 렌더링 성능을 최적화하기 위해 기존의 복잡한 휴리스틱 기반 스케줄러를 단순화하고 범용적인 시스템으로 재설계했습니다. 새로운 스케줄러는 쿼리와 렌더링 로직을 분리하고 가시성 중심의 작업 분배 알고리즘을 도입하여 백엔드 부하를 줄였으며, 최신 브라우저 스케줄링 API를 통해 런타임 성능을 극대화했습니다. 결과적으로 코드의 복잡성은 대폭 낮아졌고, API 호출 오류 감소와 함께 전반적인 사용자 경험이 향상되는 성과를 거두었습니다. ### 기존 스케줄러(v1)의 구조적 한계 * 20개 이상의 복잡한 매개변수와 서로 얽힌 휴리스틱으로 구성되어 있어, 개발자가 시스템의 동작을 예측하거나 유지보수하기 매우 어려웠습니다. * 쿼리(데이터 페칭)와 렌더링 스케줄링이 명확히 분리되지 않아, 렌더링 작업이 지연될 때 연관 없는 쿼리까지 함께 지연되는 비효율이 발생했습니다. * 대시보드 환경에만 특화된 로직으로 작성되어 있어, Datadog 내의 다른 제품이나 일반적인 위젯 컴포넌트에서 재사용하기 어려운 구조였습니다. ### 단순하고 효율적인 쿼리 스케줄링 알고리즘 * 화면에 보이는(Visible) 위젯의 쿼리는 즉시 실행하고, 비가시적 위젯의 쿼리는 큐에 쌓아 순차적으로 처리하는 단순한 방식을 채택했습니다. * 비가시적 쿼리는 2000ms의 고정된 시간 윈도우 내에서 최대 10개까지만 실행하도록 제한하여 백엔드 서비스의 부하를 안정화했습니다. * 브라우저가 자체적으로 처리하는 탭 포커스 여부 확인 등의 불필요한 체크 로직을 제거하여 관리 매개변수를 20개에서 6개로 줄였습니다. * 효율적인 작업 분산을 통해 '429(Too many requests)' 에러 발생률을 낮추었으며, 이는 결과적으로 재시도 횟수를 줄여 데이터 로딩 속도를 개선했습니다. ### Browser Scheduling API를 통한 렌더링 제어 * 브라우저의 CPU 및 메모리 자원 상태를 고려하지 못하던 기존 방식의 한계를 극복하기 위해 네이티브 브라우저 스케줄링 API(`postTask`)를 도입했습니다. * 작업을 중요도에 따라 `user-blocking`(사용자 차단), `user-visible`(사용자 가시), `background`(백그라운드) 세 단계로 분류하여 브라우저가 최적의 시점에 실행하도록 위임했습니다. * 중요도가 낮은 렌더링 작업은 브라우저가 유휴 상태일 때 실행되도록 설정하여 메인 스레드의 병목 현상을 방지하고 부드러운 UI 반응성을 확보했습니다. * `TaskController`를 활용해 특정 그룹의 작업 우선순위를 일괄 변경하거나 불필요한 작업을 즉시 중단(abort)할 수 있는 제어 구조를 갖추었습니다. 애플리케이션의 성능 최적화를 고려한다면 복잡한 자체 규칙을 만들기보다 가시성(Visibility)과 같은 핵심 지표에 집중하고, 최신 브라우저가 제공하는 스케줄링 표준 API를 활용하여 시스템 자원을 효율적으로 관리하는 것이 바람직합니다.

How we built a Ruby library that saves 50% in testing time | Datadog (새 탭에서 열림)

개발 효율성을 저해하는 길고 불안정한 CI 파이프라인 문제를 해결하기 위해, 테스트와 소스 코드 간의 의존성을 분석하여 변경된 코드와 관련된 테스트만 선택적으로 실행하는 '테스트 영향 분석(Test Impact Analysis)' 기술이 주목받고 있습니다. Datadog은 Ruby 환경에서 이를 실현하기 위해 성능 저하를 최소화하면서도 기존 도구와 호환되는 전용 라이브러리를 개발하였으며, 이는 전체 테스트 시간을 절반 수준으로 단축하는 성과를 거두었습니다. 이 과정에서 개발 팀은 Ruby 내장 모듈의 한계를 극복하기 위해 C 확장을 통한 저수준 인터프리터 이벤트 활용 방식을 채택했습니다. ## 테스트 영향 분석(TIA)의 개념과 필요성 - 소프트웨어 규모가 커짐에 따라 전체 테스트 수트 실행 시간은 비대해지며, 코드 변경과 무관한 '불안정한 테스트(Flaky tests)'로 인해 CI가 실패하는 빈도가 높아집니다. - 테스트 영향 분석은 각 테스트가 실행될 때 접근하는 소스 파일 목록을 동적으로 맵핑하여 저장하는 기술입니다. - Git 커밋 시 변경된 파일과 맵핑된 파일 목록에 교집합이 있는 테스트만 실행함으로써, 불필요한 리소스 낭비를 줄이고 파이프라인의 안정성을 높일 수 있습니다. - Datadog의 'Intelligent Test Runner'는 이러한 원리를 바탕으로 정확성, 성능, 사용자 투명성을 핵심 가치로 설계되었습니다. ## 기존 Ruby 솔루션의 성능 한계 - **내장 Coverage 모듈:** Ruby 3.1에서 추가된 resume/suspend 메서드를 통해 테스트별 커버리지를 측정할 수 있으나, `simplecov`와 같은 기존 도구와 충돌하며 약 300% 수준의 매우 높은 성능 오버헤드가 발생합니다. - **TracePoint API:** 코드 실행 시 이벤트를 구독하는 표준 API로 구현이 용이하고 호환성도 뛰어나지만, 순수 코드 실행 위주의 벤치마크(RuboCop 등)에서 200~400%의 오버헤드를 기록하여 실무 적용이 어렵습니다. - 이러한 기존 방식들은 대규모 테스트 수트를 빠르게 실행하려는 원래의 목적에 부합하지 않는 성능 결과(기존보다 3~4배 느려짐)를 보였습니다. ## C 확장을 이용한 저수준 인터프리터 이벤트 활용 - 성능 문제를 해결하기 위해 Ruby VM의 내부 동작을 분석하고, C 언어로 직접 커버리지 수집 도구를 개발했습니다. - Ruby 인터프리터 내부에서 사용하는 `rb_thread_add_event_hook` 함수를 활용해 `RUBY_EVENT_LINE` 이벤트를 직접 훅(hook)하는 방식을 취했습니다. - 테스트 시작(start)과 종료(stop) 시점에만 이벤트 훅을 등록 및 해제하며, 실행되는 파일의 경로가 프로젝트 루트 내에 있는지 C 수준에서 빠르게 필터링하여 해시 구조에 저장합니다. - 이 방식은 Ruby 레벨의 추상화 단계를 건너뛰고 VM 이벤트에 직접 접근함으로써, 데이터 수집의 정확성을 유지하면서도 실행 오버헤드를 획기적으로 낮추는 기반이 되었습니다. Ruby 기반의 대규모 프로젝트를 운영 중이라면 매번 전체 테스트를 실행하기보다, 변경 사항에 기반한 지능형 테스트 실행 방식을 도입하여 CI 비용과 시간을 최적화할 것을 권장합니다. 특히 성능에 민감한 환경에서는 표준 API에 의존하기보다 저수준 최적화가 포함된 전문적인 모니터링 도구를 활용하는 것이 효과적입니다.

How we use Vale to improve our documentation editing process | Datadog (새 탭에서 열림)

데이터독(Datadog)은 대규모 오픈 소스 기여자와 수많은 제품군을 보유한 환경에서 문서의 일관성과 품질을 유지하기 위해 'Vale'이라는 오픈 소스 산문 린터(Linter)를 도입했습니다. 이를 통해 수동 편집에 드는 리소스를 대폭 줄이고, 스타일 가이드를 코드로 관리함으로써 문서 검토 과정을 자동화하는 성과를 거두었습니다. 결과적으로 작성자가 코드를 제출하기 전 단계에서부터 스스로 문서를 수정할 수 있는 '시프트 레프트(Shift-left)' 문화를 정착시켜 전체적인 문서화 효율을 높였습니다. ### 대규모 문서 기여 관리의 한계 * 데이터독 문서팀은 약 14명의 작가가 1,400명 이상의 기여자(내부 개발자 및 외부 기여자)가 생성하는 문서를 관리하며, 작가 1인당 개발자 비율은 200대 1에 달합니다. * 2023년 한 해에만 35개 이상의 제품과 수백 개의 API, 통합 서비스에 대해 20,000개 이상의 풀 리퀘스트(PR)를 처리했습니다. * 당번 작가는 하루 평균 40개 이상의 PR을 검토해야 하므로, 수동으로 모든 문법, 어조, 스타일 가이드를 확인하는 것은 물리적으로 불가능한 상황이었습니다. ### Vale를 활용한 문서 스타일 린팅 자동화 * 오픈 소스 CLI 도구인 Vale를 작성 환경과 CI(지속적 통합) 워크플로우에 통합했습니다. * GitHub Actions를 통해 PR이 생성될 때마다 Vale이 HTML 및 마크다운 파일을 스캔하여 스타일 규칙 위반 사항을 자동으로 댓글로 남깁니다. * 너무 긴 문장, 불필요한 수식어 사용, 오래된 타자기 습관(이중 공백 등)을 자동으로 감지하여 작가가 검토하기 전에 기여자가 스스로 수정할 수 있게 합니다. ### 스타일 가이드의 코드화 (Codifying Style Guide) * 과거에는 컨플루언스(Confluence)나 위키 등에 흩어져 있던 편집 가이드라인을 `datadog-vale`이라는 오픈 소스 프로젝트를 통해 코드 형태로 변환했습니다. * YAML 형식을 사용하여 검증하고자 하는 스타일 규칙을 정의하며, 정규 표현식(RegEx)을 통해 특정 패턴(예: 옥스퍼드 콤마 누락)을 감지합니다. * 특정 단어(simply, easily 등)를 지양하게 하는 `words.yml`, 라틴어 약어 대신 쉬운 영어를 쓰게 하는 `abbreviations.yml` 등의 규칙을 통해 일관된 어조를 유지합니다. * 휴고(Hugo) 숏코드와 같이 스타일 검사에서 제외해야 할 영역은 정규 표현식으로 필터링하여 오탐지를 방지합니다. ### 실용적인 제언 대규모 팀이나 프로젝트를 운영하고 있다면 스타일 가이드를 단순히 문서로만 남기지 말고, Vale와 같은 도구를 사용해 자동화된 규칙으로 변환하는 것이 좋습니다. 데이터독이 공개한 `datadog-vale` 규칙을 참고하면 옥스퍼드 콤마 사용이나 전문 용어 관리 등을 손쉽게 자신의 프로젝트에 적용해 볼 수 있습니다.

How we optimized our Akka application using Datadog’s Continuous Profiler | Datadog (새 탭에서 열림)

Datadog은 자바 기반 어플리케이션에서 Akka 프레임워크를 사용할 때 발생하는 예상치 못한 CPU 사용량 급증 문제를 조사하였으며, 그 원인이 `ForkJoinPool`의 비효율적인 스레드 관리임을 밝혀냈습니다. 불규칙한 작업 흐름을 가진 액터(Actor)가 과도한 스레드 활성화 및 비활성화를 유발하여 전체 CPU의 20~30%를 낭비하고 있었으나, 이를 안정적인 작업 부하를 가진 디스패처로 이동시킴으로써 문제를 해결했습니다. 이 사례는 추상화된 프레임워크 하부의 스레드 풀 동작 원리를 이해하고 프로파일링을 통해 실질적인 병목 지점을 찾는 것이 얼마나 중요한지 보여줍니다. ### 프로파일링을 통한 병목 지점 탐색 * 로그 파싱 알고리즘을 최적화했음에도 불구하고 CPU 사용량이 줄어들지 않거나 오히려 늘어나는 현상이 발생하여 Datadog Continuous Profiler를 통해 심층 분석을 수행했습니다. * 플레임 그래프(Flame Graph) 분석 결과, 실제 비즈니스 로직이 아닌 `ForkJoinPool.scan()` 및 `Unsafe.park()` 메서드에서 상당한 CPU 시간이 소비되고 있음을 확인했습니다. * 특정 스레드 풀의 상태를 조사한 결과, 별도의 설정 없이 기본 Akka 디스패처를 사용하는 `LatencyReportActor`가 이 현상의 주범으로 지목되었습니다. ### ForkJoinPool의 동작 원리와 병목 원인 * `ForkJoinPool`은 대기 중인 작업 수에 따라 내부 워커 스레드를 동적으로 생성, 중지(`park`), 재개(`unpark`)하며 활성 스레드 수를 관리합니다. * 작업 흐름이 불규칙할 경우 스레드를 빈번하게 깨우고 다시 재우는 과정에서 비용이 큰 네이티브 호출인 `Unsafe.park()`와 `unpark()`가 대량으로 발생하여 CPU를 낭비하게 됩니다. * 문제의 액터는 매초 짧은 시간 동안만 데이터를 처리하고 나머지 시간은 대기하는 특성을 가졌는데, 이때마다 CPU 코어 수만큼 설정된 32개의 스레드가 일시에 깨어났다가 다시 잠드는 현상이 반복되었습니다. ### 설정 변경을 통한 성능 최적화 * 불규칙한 작업을 수행하는 액터를 기본 디스패처에서 이미 안정적인 작업 흐름을 유지하고 있는 메인 'work' 디스패처로 이동시키는 단 한 줄의 설정 변경을 적용했습니다. * 이 변경을 통해 `ForkJoinPool.scan()`에서 소비되는 CPU 시간이 급격히 감소하였으며, 서비스 전체의 평균 CPU 사용량이 약 30% 줄어드는 성과를 거두었습니다. * 또한 32개까지 치솟았던 기본 디스패처의 스레드 풀 크기가 2개로 줄어들어 불필요한 컨텍스트 스위칭과 리소스 낭비가 해결되었음을 확인했습니다. ### 효율적인 ForkJoinPool 관리를 위한 권장 사항 `ForkJoinPool`이나 Akka를 사용하는 환경에서 성능을 유지하려면 `ForkJoinPool.scan()` 메서드의 CPU 점유율을 모니터링해야 합니다. 만약 이 수치가 10~15%를 초과한다면 다음과 같은 조치를 고려하십시오. * **액터 인스턴스 제한**: 불필요하게 많은 액터가 생성되지 않도록 조절합니다. * **스레드 풀 최대치 제한**: 워크로드에 맞춰 스레드 풀의 최대 크기를 적절히 제한합니다. * **스레드 풀 통합**: 여러 개의 풀을 사용하기보다 풀의 개수를 줄여 작업 부하가 골고루 분산되도록 유도합니다. * **태스크 큐 활용**: 급격한 작업 급증(Spike)을 완충할 수 있는 큐를 도입하여 스레드 풀이 급격하게 변동하는 것을 방지합니다.

2023-03-08 incident: A deep dive into our incident response | Datadog (새 탭에서 열림)

Datadog은 2023년 3월 발생한 사상 첫 글로벌 서비스 장애를 겪으며 자사의 장애 대응(Incident Response) 프로세스와 문화를 실전에서 검증했습니다. 수백 명의 엔지니어가 투입된 이번 사태를 통해 Datadog은 "직접 만든 사람이 직접 운영한다(You build it, you own it)"는 원칙과 비난 없는 사후 분석(Blameless Postmortem)의 중요성을 다시 한번 확인했습니다. 이 글은 전례 없는 대규모 장애 상황에서 유연한 의사결정과 체계적인 협업 시스템이 어떻게 복구를 견인했는지에 대한 기술적 기록을 담고 있습니다. **Datadog의 장애 모니터링 및 대응 체계** * **소유권 기반 모델:** 모든 엔지니어링 팀은 자신이 구축한 서비스의 운영을 직접 책임지며, 24시간 모니터링 경보에 몇 분 내로 응답해야 하는 "You build it, you own it" 모델을 따릅니다. * **대역 외(Out-of-band) 모니터링:** 플랫폼 자체가 중단될 경우를 대비해 인프라 외부에서 API를 호출하여 사용자 관점에서 상태를 체크하는 별도의 독립적인 모니터링 시스템을 운영합니다. * **Slack 기반 협업:** 장애 발생 시 전용 앱이 Slack 채널을 자동으로 생성하며, 관련 없는 엔지니어도 자유롭게 참여하여 도움을 줄 수 있는 개방적인 환경을 조성합니다. **고심도 장애(High-Severity) 관리 및 역할 분담** * **장애 지휘관(Incident Commander):** 대규모 장애 시 숙련된 시니어 엔지니어가 투입되어 전체 대응을 진두지휘하며, 복구 전략과 커뮤니케이션을 총괄합니다. * **전담 커뮤니케이션 팀:** 고객 지원 매니저와 경영진이 포함된 별도 팀이 구성되어 외부 고객 및 비즈니스 이해관계자에게 정확한 상태 정보를 전달합니다. * **지속적인 훈련:** 장애 선언 문턱을 낮게 설정하여 일상적으로 장애 대응 프로세스를 연습하며, 모든 엔지니어는 6개월마다 필수 리프레시 교육을 이수해야 합니다. **자율성과 비난 없는 조직 문화** * **절차보다 사람 우선:** 고정된 복구 매뉴얼은 복잡한 시스템의 변화 속도를 따라갈 수 없으므로, 엔지니어가 현장에서 상황에 맞는 최선의 판단을 내릴 수 있도록 자율권을 부여합니다. * **비난 없는 문화(Blameless Culture):** 장애의 원인을 개인의 실수가 아닌 시스템의 결함으로 간주하여, 엔지니어가 압박감 속에서도 창의적인 해결책을 찾을 수 있도록 지원합니다. * **강화된 사후 분석:** 모든 고심도 장애 이후에는 자동화된 알림을 통해 상세한 포스트모템 작성을 독려하며, 이를 통해 유사 장애의 재발을 방지합니다. **3월 8일 글로벌 장애 타임라인 및 초기 진단** * **장애 트리거(06:00 UTC):** systemd 업데이트가 시작되면서 예상치 못한 인프라 연쇄 반응이 발생했습니다. * **신속한 감지(06:03~06:18 UTC):** 장애 발생 3분 만에 모니터링 시스템이 문제를 감지했고, 15분 이내에 고심도 장애로 격상되었습니다. * **원인 파악(07:20~11:36 UTC):** 쿠버네티스(Kubernetes) 노드 실패가 글로벌 장애의 핵심 원인임을 식별했으며, 최종적으로 '무인 업데이트(Unattended upgrades)'가 트리거였음을 밝혀냈습니다. * **인프라 복구(12:05~19:00 UTC):** EU1 및 US1 리전의 컴퓨팅 용량을 순차적으로 복구하고 재발 방지를 위한 완화 조치를 적용하여 전체 인프라를 정상화했습니다. 대규모 시스템을 운영하는 조직이라면 고정된 대응 매뉴얼에 의존하기보다 엔지니어의 자율성을 존중하고, 장애를 학습의 기회로 삼는 비난 없는 문화를 구축하는 것이 중요합니다. 특히 플랫폼 전체가 마비되는 최악의 상황을 대비해 인프라 외부에서 독립적으로 작동하는 '대역 외 모니터링' 체계를 반드시 갖출 것을 추천합니다.

How Datadog uses Datadog to gain visibility into the Datadog user experience | Datadog (새 탭에서 열림)

Datadog의 프로덕트 디자이너들은 사용자 경험을 개선하기 위해 인터뷰와 같은 정성적 조사뿐만 아니라, 자사 도구를 직접 활용하는 '도그푸딩(Dogfooding)'을 통해 정량적 데이터를 수집합니다. RUM(Real User Monitoring)과 로그 분석을 통해 실제 사용자의 행동 패턴을 파악함으로써, 디자인 가설을 검증하고 데이터에 기반한 의사결정을 내리고 있습니다. 이러한 접근 방식은 사용자 입장에서 제품을 이해하고 협업 효율을 높이는 데 큰 기여를 합니다. ## 데이터 기반의 고정폭 글꼴(Monospace Font) 선정 * 로그, 스택 트레이스, 소스 코드 등 정보 밀도가 높은 데이터를 일관되게 보여주기 위해 특정 고정폭 글꼴을 도입할 필요성이 제기되었습니다. * 기존에는 시스템 폰트에 의존했기 때문에, 새로운 폰트 도입 시 발생할 수 있는 레이아웃의 시각적 변화를 최소화하고자 사용자들이 현재 가장 많이 보고 있는 폰트가 무엇인지 파악해야 했습니다. * CSS Font Loading API와 Datadog RUM을 결합하여 사용자의 브라우저에 실제 로드된 폰트 정보를 수집하고 대시보드화했습니다. * 분석 결과 'Roboto Mono'를 최종 후보로 선정하여 앱 전체에 적용했으며, 배포 후에도 RUM을 통해 의도한 대로 폰트가 출력되는지 성공적으로 검증했습니다. ## 사용자 인터랙션 분석을 통한 컴포넌트 간소화 * 패널 크기를 조절하는 'DraggablePane' 컴포넌트의 핸들이 너무 좁아 다양한 기능을 담기에 UI가 복잡해지는 문제가 있었습니다. * 어떤 기능이 실제로 사용되는지 확인하기 위해 커스텀 로거를 심어 각 버튼(최소화, 최대화 등)의 클릭 빈도를 추적했습니다. * 로그 분석 결과 최소화 및 최대화 버튼의 사용량이 거의 없다는 사실을 발견하고, 해당 버튼들을 제거하는 대신 핸들 더블 클릭 이벤트로 기능을 대체하여 UI를 간소화했습니다. ## 입력 오류 데이터 분석을 통한 구문 지원 확장 * 사용자가 자유롭게 시간 범위를 텍스트로 입력할 수 있는 'DateRangePicker'를 개발했으나, 초기에는 지원하는 구문이 한정적이어서 사용자 의도를 정확히 파악하지 못하는 경우가 많았습니다. * 시스템이 해석하지 못한 '잘못된 입력(invalid input)' 데이터와 해당 입력이 발생한 페이지, 국가 등의 정보를 로그로 수집하여 패턴을 분석했습니다. * 분석 결과 다수의 사용자가 'weeks'라는 키워드를 포함한 구문(예: last 1 week)을 입력하고 있음을 확인했습니다. * 해당 키워드를 지원하도록 구문 분석 로직을 업데이트한 결과, 입력 에러율이 기존 10%에서 5~6%로 즉각 감소하는 성과를 거두었습니다. 사용자 경험(UX) 디자인 과정에서 데이터 모니터링 도구를 활용하는 것은 단순히 수치를 확인하는 것을 넘어, 디자이너가 개발자와 같은 언어로 소통하고 객관적인 근거로 제품을 개선할 수 있게 해줍니다. 특히 실시간 로그와 에러 데이터를 추적하는 환경을 구축하면 사용자 피드백을 기다리지 않고도 제품의 미비점을 선제적으로 발견하여 수정할 수 있습니다.

How we migrated our acceptance tests to use Synthetic Monitoring | Datadog (새 탭에서 열림)

데이터독(Datadog)은 기존에 사용하던 Puppeteer 기반의 불안정한 인수 테스트 시스템을 자사 제품인 'Synthetic Monitoring'으로 전환함으로써 개발자 경험과 배포 효율성을 대폭 개선했습니다. 1년여에 걸친 이 마이그레이션 과정은 단순한 도구 교체를 넘어, 300명 이상의 엔지니어가 참여하는 대규모 코드베이스의 테스트 신뢰도를 높이고 유지보수 비용을 절감하는 성과를 거두었습니다. 결과적으로 팀은 더 빠른 피드백 루프를 확보하고 안정적인 지속적 통합(CI) 환경을 구축할 수 있었습니다. ### 기존 인수 테스트의 문제점과 한계 * **높은 불안정성(Flakiness):** Puppeteer와 Chromium 헤드리스 브라우저를 기반으로 한 커스텀 러너는 가상 그래픽 엔진과 네트워크 등 제어할 수 없는 외부 요인으로 인해 예기치 않은 테스트 실패가 잦았습니다. * **복잡한 구현 및 유지보수:** 버튼의 활성화 상태를 확인하고 클릭하는 등의 단순한 상호작용조차도 수동 스크립트로 일일이 작성해야 했으며, 제품 업데이트 시마다 수백 개의 테스트 파일을 직접 수정해야 하는 번거로움이 있었습니다. * **인프라 부하 및 실행 시간:** 테스트 규모가 커짐에 따라 CI 작업 시간이 35분 이상으로 늘어났고, 10만 줄 이상의 테스트 관련 코드와 인프라를 유지하기 위해 많은 리소스가 소모되었습니다. ### Synthetic Monitoring 기반의 해결책 도입 * **노코드(No-code) 방식의 테스트 생성:** 직접 스크립트를 작성하는 대신 사용자의 페이지 상호작용을 기록하는 방식을 채택하여 테스트 작성 난이도를 낮추고 직관성을 높였습니다. * **CI/CD 통합 도구 개발:** CI 환경에서 테스트를 트리거하고 결과를 수집하기 위해 `synthetics-ci`(이후 `datadog-ci`로 범용화) CLI를 개발했습니다. 이를 통해 `.synthetics.json` 설정 파일을 기반으로 테스트를 자동 실행할 수 있게 되었습니다. * **유연한 구성 관리:** API를 통해 테스트 결과 ID를 폴링하고 휴먼 리더블(human-readable)한 출력을 제공하여, 개발자가 CI 단계에서 문제를 즉각 파악할 수 있도록 설계했습니다. ### 대규모 조직을 위한 마이그레이션 전략 * **점진적 신뢰 구축:** 초기에는 테스트 실패가 배포를 막지 않는 'Non-blocking' 단계를 도입하여, 엔지니어들이 새로운 시스템에 익숙해질 수 있는 여유를 제공하고 PR 댓글로 결과만 공지했습니다. * **데이터 기반의 설문과 지원:** 분기별 엔지니어 만족도 조사를 통해 고충을 파악하고, 테스트를 가장 많이 보유한 팀들을 대상으로 직접적인 마이그레이션 지원과 교육 세미나를 진행했습니다. * **체계적인 추적과 일몰(Sunset) 전략:** 모든 마이그레이션 과정을 Jira 티켓으로 관리하며 팀별 담당자를 지정했습니다. 기존 플랫폼을 한 번에 제거하는 대신, 개별 테스트가 안정화될 때마다 단계적으로 폐쇄하여 리스크를 최소화했습니다. E2E(End-to-End) 테스트의 유지보수 비용과 불안정성으로 인해 생산성이 저하되고 있다면, 코드 기반의 무거운 테스트 프레임워크 대신 사용자 시나리오 녹화 기능과 CI 통합이 강화된 'Synthetic Monitoring' 류의 도구 도입을 검토해야 합니다. 특히 대규모 조직일수록 기술적 전환뿐만 아니라 문서화, 비차단적(Non-blocking) 테스트 운영 등을 통한 문화적 접근이 마이그레이션 성공의 핵심입니다.

Cheering on coworkers: Building culture with Datadog dashboards | Datadog (새 탭에서 열림)

데이터독(Datadog)의 엔지니어들은 6일 동안 약 850km를 달리는 초장거리 레이스에 출전한 동료를 응원하기 위해 실시간 레이스 모니터링 대시보드를 구축했습니다. 이 프로젝트는 웹 스크래핑 기술과 데이터독의 지표 수집 기능을 결합하여 외부 데이터를 대시보드에 시각화하는 과정을 보여줍니다. 이를 통해 기술적인 도구가 단순한 시스템 관제를 넘어 커뮤니티의 결속과 응원을 위한 도구로 어떻게 활용될 수 있는지 증명했습니다. ### 데이터 추출 및 파싱 대시보드 구축의 첫 단계는 대회 공식 웹사이트에서 선수의 실시간 데이터를 가져오는 것이었습니다. - 파이썬(Python)의 인기 라이브러리인 **Requests**를 사용하여 웹페이지의 HTML 코드를 수집하는 간단한 크롤러를 구현했습니다. - 수집된 HTML 데이터는 **BeautifulSoup** 라이브러리를 통해 파싱되어 현재 순위, 총 주행 거리 등 필요한 수치 데이터로 변환되었습니다. - 대회 사이트가 일반 텍스트 형태의 HTML로 데이터를 제공했기에 복잡한 API 없이도 손쉽게 데이터를 확보할 수 있었습니다. ### StatsD를 활용한 지표 전송 확보된 데이터는 데이터독 에이전트와 StatsD를 통해 실시간 지표(Metrics)로 변환되었습니다. - **dog.gauge** 메서드를 사용하여 세 가지 핵심 지표를 생성했습니다: 주행 거리(`runner.distance`), 현재 순위(`runner.ranking`), 경과 시간(`runner.elapsed_time`). - 각 지표에는 `name` 태그를 부여하여 여러 러너의 데이터를 구분하고 개별적으로 필터링할 수 있도록 설계했습니다. - 파이썬 스크립트를 통해 주기적으로 데이터를 갱신함으로써 실시간에 가까운 데이터 흐름을 유지했습니다. ### 대시보드 구성 및 시각화 수집된 지표들은 뉴욕과 파리 사무실에서 누구나 볼 수 있는 인터랙티브 대시보드로 구성되었습니다. - 단순히 숫자만 나열하는 것이 아니라 실시간 비디오 스트리밍과 재미를 위한 GIF 이미지를 포함하여 시각적 즐거움을 더했습니다. - 거리 차이(Lead)와 남은 시간 등 레이스 상황을 한눈에 파악할 수 있는 유의미한 지표들을 배치했습니다. - 이를 통해 전 세계 사무실의 동료들이 원격으로 레이스 상황을 공유하며 선수를 응원할 수 있는 환경을 조성했습니다. 만약 특정 이벤트나 실시간 경주 데이터를 모니터링하고 싶다면, 이 사례와 같이 파이썬의 웹 스크래핑 라이브러리와 데이터독의 Gauge 지표 기능을 결합해 보시기 바랍니다. 데이터가 HTML 형태로 존재하기만 한다면, 어떤 외부 활동이라도 전문적인 인프라 모니터링 도구를 통해 실시간 대시보드로 구현할 수 있습니다.