Datadog / python

13 개의 포스트

datadog

How Datadog's IT team automated account inactivity and SaaS spend management (새 탭에서 열림)

데이터독(Datadog)은 급격히 증가하는 SaaS 라이선스 비용을 최적화하고 보안 리스크를 줄이기 위해 기존의 내부 도구인 'Clarity'를 'Clarity License Manager(CLM)'로 확장했습니다. 이 시스템은 여러 SaaS 애플리케이션의 사용자 활동을 자동으로 모니터링하여 비활성 계정을 식별하고, 사용자 알림 및 자동 비활성화 프로세스를 통해 운영 효율성을 극대화합니다. 결과적으로 데이터독은 불필요한 비용 지출을 막는 동시에, 미사용 계정으로 인한 보안 위협을 효과적으로 제거하고 직원들에게는 원활한 계정 복구 경험을 제공하고 있습니다. ### 기존 라이선스 관리의 문제점 * 과거 IT 지원 팀은 분기별로 수동 감사를 수행하여 라이선스 사용 현황을 파악했으나, 이는 매우 비효율적이고 지루한 작업이었습니다. * IT 직원이 사용자에게 일일이 연락해 계정 유지 여부를 확인해야 했기 때문에 직원들의 업무 흐름을 방해하는 등 사용자 경험이 저하되었습니다. * 실시간 데이터에 기반한 인사이트가 부족하여 소프트웨어 구매 시 데이터에 기반한 의사결정을 내리기 어려웠습니다. ### 자동화된 라이선스 최적화 워크플로우 * 개별 SaaS API와 Google Workspace SAML 감사 로그를 결합하여 사용자 활동 데이터를 유연하고 보안상 안전한 방식으로 수집합니다. * 특정 기간(기본 90일) 동안 앱을 사용하지 않은 사용자에게 Slack과 이메일로 자동 알림을 발송하여 활성 상태 유지에 필요한 구체적인 행동을 안내합니다. * 사용자가 안내된 조치를 취하지 않을 경우 CLM이 해당 SaaS 계정을 자동으로 비활성화하며, 이 데이터는 Amazon RDS(Postgres)에 저장되어 관리됩니다. * 재접속이 필요한 직원을 위해 티켓 시스템(Freshservice)과 연동된 자동 복구 워크플로우를 구축하여, 단 몇 초 만에 이전 권한 그대로 계정을 복구할 수 있게 했습니다. ### 마이크로서비스 및 어댑터 기반 아키텍처 * Python과 AWS Lambda를 기반으로 한 마이크로서비스 구조를 채택하여 SaaS 환경의 확장에 유연하게 대응하고 시스템 회복 탄력성을 높였습니다. * 각 SaaS 애플리케이션의 고유한 로직을 처리하기 위해 '애플리케이션별 어댑터(Adapter)' 패턴을 도입했습니다. * 어댑터는 사용자 조회, 로그인 데이터 획득, 활성화/비활성화 등 공통 인터페이스를 제공하여 메인 마이크로서비스 로직과 개별 앱의 복잡한 API 통신 로직을 분리합니다. * 이러한 설계는 단일 책임 원칙(Single Responsibility)을 준수하며 코드의 재사용성을 높이고, 새로운 SaaS 도구를 시스템에 빠르게 통합할 수 있게 합니다. 기업의 규모가 커질수록 수동 라이선스 관리는 비용 누수와 보안 취약점을 야기하는 큰 부담이 됩니다. Datadog의 CLM 사례처럼 사용자 활동 데이터를 기반으로 비활성 계정을 자동 관리하고, 셀프 서비스 형태의 복구 프로세스를 갖추는 것은 비용 절감과 보안 강화라는 두 마리 토끼를 잡을 수 있는 실무적인 해법이 될 수 있습니다.

datadog

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

Datadog은 대규모 쿠버네티스 환경에서 `kube-state-metrics`(KSM)를 운영하며 발생한 성능 병목 현상을 해결하기 위해 오픈소스 커뮤니티에 직접 기여했습니다. 기존의 텍스트 기반 엔드포인트 스크래핑 방식은 수백만 개의 메트릭을 처리할 때 심각한 네트워크 부하와 지연 시간을 유발했으나, 이번 개선을 통해 메트릭 수집 속도를 기존 대비 15배 향상시키는 성과를 거두었습니다. 결과적으로 대규모 클러스터에서도 데이터의 정밀도를 유지하며 안정적인 관측성을 확보할 수 있게 되었습니다. ### KSM의 기본 작동 원리와 메트릭 수집 - KSM은 인포머(Informer) 패턴을 활용하여 쿠버네티스 API 서버의 객체 상태 변화를 관찰하고 이를 Openmetrics 형식의 텍스트로 노출합니다. - Datadog 에이전트는 15초 주기로 KSM의 `/metrics` 엔드포인트를 크롤링하여 데이터를 수집하며, 이 과정에서 `label_joins` 설정을 통해 메타데이터 레이블을 결합하여 분석 가치를 높입니다. - 예를 들어, 특정 배포(Deployment)의 레이블 정보를 다른 관련 메트릭에 태그로 추가하여 다각적인 모니터링이 가능하도록 지원합니다. ### 대규모 인프라에서의 확장성 병목 현상 - 클러스터 규모가 수천 개의 노드와 수만 개의 파드로 커지면, 한 번의 수집 주기마다 처리해야 할 메트릭이 수백만 개에 달하게 됩니다. - 파드 하나당 약 40개의 메트릭이 생성되는데, 이로 인해 네트워크 호출 시 전송되는 데이터 양이 수십 메가바이트에 달하고 크롤링 시간은 수십 초까지 늘어납니다. - 이러한 지연 시간 때문에 수집 주기를 억지로 늘려야 했고, 이는 데이터의 세밀함(granularity)을 떨어뜨려 내부 사용자들의 경험을 저해하는 결과를 초래했습니다. ### 오픈소스 기여를 통한 KSM 구조 개선 - Datadog 팀은 내부적인 임시방편을 만드는 대신 KSM v2.0 릴리스 시점에 맞춰 업스트림 소스 코드에 직접 기여하는 방식을 택했습니다. - 기존 KSM v1은 빌더(Builder)가 스토어를 관리하며 쿼리 시점에 데이터를 한꺼번에 덤프하는 구조였으나, 이를 개선하여 메트릭 생성 과정에 직접 개입(Hook)할 수 있는 유연성을 확보했습니다. - 리소스 유형별로 KSM 배포를 분리(Pods, Nodes, 기타 리소스 등)하는 전략과 함께, 메트릭 생성 로직 자체를 최적화하여 대규모 데이터 처리 효율을 극대화했습니다. 대규모 쿠버네티스 환경을 운영하는 조직이라면 KSM v2.0 이상의 개선된 구조를 적극적으로 도입하고, 리소스의 양에 따라 KSM 배포를 적절히 분할하여 메트릭 수집 지연 시간을 최소화할 것을 권장합니다.

datadog

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)로 배포를 분리하여 부하를 분산하는 전략을 검토해 보시기 바랍니다.

datadog

How we minimized the overhead of Kubernetes in our job system (새 탭에서 열림)

Datadog은 기존 작업 시스템을 Kubernetes로 이전하는 과정에서 CPU 사용량은 증가하고 작업 처리 속도는 40-50% 저하되는 성능 퇴행 문제를 겪었습니다. 이를 해결하기 위해 VM과 Kubernetes 간의 정밀한 비교 실험을 설계하고, 지표 측정 방식과 리소스 할당(Resource Requests) 설정을 최적화하여 성능을 이전 수준으로 복구했습니다. 본 분석을 통해 Kubernetes 오버헤드의 실체를 파악하고, 고성능 워크로드를 위한 포드 배치 전략을 도출했습니다. ### 실험 환경의 통제와 정렬 * **환경 변수 통일**: 성능 차이의 원인을 정확히 규명하기 위해 VM과 Kubernetes 클러스터의 인스턴스 유형(c5.2xlarge), 커널 버전(3.13.0-141), 실행 스크립트를 동일하게 맞추어 비교 대상을 단일화했습니다. * **배치 구조 최적화**: 기존 VM 방식과 유사하게 하나의 포드 내에 하나의 부모 프로세스와 그 자식 워커들을 배치하여, 노드당 부모 프로세스 수와 포드 수가 일치하도록 구성했습니다. ### 측정 지표의 재정의: Idle CPU의 중요성 * **Load Average의 한계**: Kubernetes에서는 상태 확인 등을 위한 배경 프로세스가 빈번하게 실행되는데, 이는 실제 CPU 사용량과 무관하게 Load Average 수치를 비정상적으로 높여 시스템이 바쁜 것처럼 오해하게 만듭니다. * **Idle CPU 활용**: 프로세스 개수가 아닌 '실제 CPU가 일하지 않는 시간'을 측정하는 Idle CPU 지표를 선택함으로써, 시스템의 남은 용량을 더 정확하게 파악하고 성능 분석의 신뢰도를 높였습니다. * **처리량(Throughput) 중심**: 배치 작업의 특성에 맞춰 지연 시간(Latency)보다는 30초당 완료된 작업 수라는 처리량 지표를 핵심 성능 지표로 설정했습니다. ### 리소스 요청(Resource Requests) 및 스케줄링 튜닝 * **스케줄링 병목 해결**: 초기에 각 포드가 1 Core CPU를 요청하도록 설정했을 때, 노드당 4개의 포드만 배치되는 과소 활용 문제가 발생했습니다. 목표치인 노드당 6개 포드 배치를 위해 CPU 요청을 100m으로, 메모리 요청을 500MB로 대폭 낮췄습니다. * **단일 리소스 기준 권장**: 여러 리소스(CPU, 메모리 등)의 요청 값을 모두 엄격하게 잡으면 스케줄링이 복잡해지므로, 하나의 주된 리소스를 기준으로 배치를 유도하고 나머지는 실제 필요량에 가깝게 설정하는 것이 효율적임을 확인했습니다. * **Request와 Limit의 구분**: `request`는 스케줄링을 위한 최소 보장치이며, 실제 실행 중의 제약은 `limit`이 담당하므로 `request`를 낮추는 것이 실행 성능에 부정적인 영향을 주지 않는다는 점을 활용했습니다. ### 포드별 오버헤드의 실체 분석 * **프로세스 구조**: `pstree`를 통해 분석한 결과, 포드당 오버헤드는 주로 컨테이너 런타임인 `containerd-shim`에서 발생했습니다. * **CPU 및 메모리 비용**: 실험 결과 포드당 CPU 오버헤드는 무시할 수 있는 수준이었으며, 메모리는 포드당 약 24MB(containerd-shim 및 pause 컨테이너 포함) 수준으로 측정되었습니다. * **결론적 선택**: 오버헤드가 크지 않기 때문에, 관리 효율성을 위해 포드 하나에 여러 부모 프로세스를 억지로 집어넣기보다 '포드당 1 부모 프로세스' 구조를 유지하는 것이 더 유리하다는 결론을 내렸습니다. Kubernetes로 이전 시 발생하는 성능 저하는 플랫폼 자체의 문제라기보다 잘못된 리소스 요청 설정과 지표 해석에서 기인하는 경우가 많습니다. 노드당 포드 밀도를 최적화하기 위해 `Resource Requests`를 전략적으로 낮게 설정하고, 시스템의 부하를 판단할 때는 Load Average 대신 Idle CPU를 관찰함으로써 VM에 근접한 성능을 확보할 수 있습니다.

datadog

How we wrote a Python profiler (새 탭에서 열림)

Datadog은 Java의 효율적인 상시 가동형 프로파일러에서 영감을 얻어, 서비스 성능 저하 없이 운영 환경에서 지속적으로 실행 가능한 Python용 통계적 프로파일러를 개발했습니다. 기존의 결정론적 프로파일러는 높은 오버헤드로 인해 실서비스 적용이 불가능했으나, 통계적 샘플링 기법과 모듈화된 설계를 통해 실제 사용자 부하가 걸리는 운영 환경의 성능 데이터를 정밀하게 분석할 수 있게 되었습니다. ## 결정론적 프로파일러의 한계와 실서비스 적용의 어려움 * Python의 표준 도구인 `cProfile`은 모든 함수 호출을 추적하는 결정론적(Deterministic) 방식을 사용하지만, 이는 운영 환경에 적합하지 않습니다. * 모든 함수 호출을 기록할 경우 오버헤드가 2~3배까지 증가하여 실제 서비스 성능을 심각하게 저하시킬 수 있습니다. * 반대로 함수 단위가 크고 단순한 코드에서는 추적할 데이터가 부족하여 프로그램의 동작을 제대로 이해하기 어렵다는 단점이 있습니다. * 결과적으로 운영 시스템에서 항상 켜놓고(Always-on) 사용할 수 있는 가벼운 프로파일링 도구가 Python 생태계에는 부족했습니다. ## 프로덕션 환경 프로파일링의 필요성 * 개발용 노트북과 실제 프로덕션 환경은 하드웨어, 데이터 타입, 동시성 수준 등 모든 면에서 다르기 때문에 운영 환경에서의 데이터 수집이 필수적입니다. * "우리가 무엇을 모르는지"를 파악하기 위해서는 실제 워크로드를 처리하는 애플리케이션의 동작을 직접 관찰해야 합니다. * 실제 데이터에 기반하지 않은 최적화는 오히려 성능을 해치는 "조기 최적화(Premature optimization)"의 함정에 빠질 위험이 큽니다. ## 통계적 프로파일링의 메커니즘과 장점 * 통계적 프로파일링은 모든 이벤트를 기록하는 대신, 수 밀리초 단위로 프로그램 상태를 간헐적으로 샘플링하여 관찰합니다. * 개별 함수 호출을 놓칠 수는 있지만, 장시간 수집된 데이터는 프로그램의 리소스 소비 현황을 매우 정확하고 신뢰성 있게 대변합니다. * 오버헤드가 극도로 낮기 때문에 프로파일링을 하지 않을 때와 거의 동일한 환경에서 애플리케이션의 실제 성능을 측정할 수 있습니다. ## Datadog Python 프로파일러의 구조와 특징 * **JDK Flight Recorder 기반 설계**: Recorder(데이터 저장), Collector(데이터 수집), Exporter(외부 전송), Scheduler(주기 관리)로 구성 요소를 모듈화했습니다. * **스택 컬렉터(Stack Collector)**: 핵심 컴포넌트로, 초당 100회씩 모든 Python 스레드의 실행 스택, CPU 사용 시간, 예외 처리 정보 등을 수집합니다. * **낮은 오버헤드 유지**: 프로파일러가 스스로의 성능 소비를 측정하여 시스템 부하를 능동적으로 조절함으로써 서비스 영향을 최소화합니다. * **확장성**: CPU 사용량뿐만 아니라 메모리 할당 등 다양한 데이터를 수집할 수 있도록 확장 가능한 수집기 구조를 채택했습니다. 최적화의 방향을 잡지 못해 고민 중이라면, 개발 환경의 짐작이 아닌 프로덕션 환경의 실제 데이터를 보여주는 통계적 프로파일러 도입을 권장합니다. 이는 서비스 성능 저하 없이 코드 수준의 병목 지점을 파악할 수 있는 가장 확실한 방법입니다.

datadog

Secure publication of Datadog Agent integrations with TUF and in-toto (새 탭에서 열림)

Datadog은 에이전트 통합 기능의 배포 주기를 에이전트 본체와 분리하여 자동화하는 동시에, 전체 공급망의 보안을 보장하기 위해 TUF(The Update Framework)와 in-toto를 도입했습니다. 기존의 TLS나 GPG 방식이 해결하지 못하는 인프라 침해 공격에 대응하기 위해, 개발자의 코드 커밋부터 최종 사용자의 설치 단계까지 모든 과정을 검증 가능한 구조로 설계했습니다. 이를 통해 Datadog은 자동화된 배포의 효율성과 '침해 저항성(Compromise-resilience)'을 갖춘 강력한 보안을 동시에 달성했습니다. ## 자동 배포의 필요성과 보안 과제 * **배포 주기 분리:** 수백 개의 통합 패키지를 에이전트 릴리스와 분리하여 독립적으로 업데이트함으로써 사용자에게 최신 기능을 신속하게 제공하고자 했습니다. * **기존 보안의 한계:** TLS 암호화나 단순 GPG 서명은 중간자 공격(MitM)은 방어할 수 있지만, 개발자와 사용자 사이의 인프라가 침해되어 코드가 변조되는 상황에는 취약합니다. * **침해 저항 시스템 구축:** 인프라의 일부가 장악되더라도 소프트웨어의 진본성과 무결성을 보호할 수 있는 CI/CD 시스템이 필요했습니다. ## in-toto를 통한 소프트웨어 공급망 검증 * **단계별 무결성 보장:** 소프트웨어 공급망을 코드 작성, 패키징(Wheel 파일 생성), 서명 등 일련의 고정된 단계로 정의하고 각 단계마다 입력과 출력에 대한 서명된 메타데이터를 생성합니다. * **최종 검증 과정:** Datadog 에이전트는 설치 시 서명된 메타데이터를 검사하여, 해당 패키지가 지정된 담당자에 의해 정의된 절차대로 생성되었는지 확인합니다. * **4단계 워크플로우:** 1. 개발자가 Python 소스 코드와 YAML 설정 파일을 작성합니다. 2. CI/CD 시스템이 소스 코드를 수신하여 Python Wheel(ZIP 파일)로 패키징합니다. 3. CI/CD 시스템이 동일한 Wheel 파일들에 대해 TUF 서명을 수행합니다. 4. 에이전트가 파일을 다운로드하여 개발자가 서명한 코드와 정확히 일치하는지 최종 확인합니다. ## TUF를 활용한 안전한 키 관리 및 전송 * **신뢰의 뿌리(Root of Trust):** in-toto가 공급망 단계를 검증한다면, TUF는 검증에 사용되는 공개키를 안전하게 배포, 취소, 교체하는 역할을 담당합니다. * **공격 방어:** 메타데이터의 일관성과 진본성을 보장하며, 공격자가 이전 버전으로 되돌리는 롤백(Rollback) 공격이나 무한 재생(Replay) 공격을 방지합니다. * **오프라인 부트스트래핑:** TUF를 통해 신뢰를 오프라인에서 구축하고 하드웨어 키로 개발자 서명 키를 보호함으로써 in-toto의 보안 보장을 더욱 공고히 합니다. ## Yubikey 기반의 하드웨어 보안 서명 * **키 유출 방지:** 개발자는 GPG 서명 키를 생성하고 저장할 수 있는 하드웨어 키(Yubikey)를 사용하며, 키는 장치 외부로 내보낼 수 없습니다. * **다중 보호 계층:** 서명 작업을 승인하기 위해서는 비밀번호(PIN) 입력과 장치에 대한 물리적인 터치가 반드시 필요합니다. * **사용 편의성:** CLI 도구를 통해 in-toto와 GPG 호출 과정을 투명하게 처리하여, 개발자의 업무 흐름을 방해하지 않으면서도 키 침해 위험을 최소화했습니다. ## 사용자 경험과 실용적 결론 * **투명한 보안:** 사용자는 평소와 다름없이 에이전트를 통해 통합 기능을 설치하지만, TUF나 in-toto가 공격을 감지하면 즉시 설치를 차단하고 상세한 오류 메시지를 표시합니다. * **업계 표준 지향:** Datadog은 이처럼 두 기술을 밀접하게 통합함으로써 보안 소프트웨어 배포가 단순히 '선택 사항'이 아닌 업계의 '표준'이 되도록 기여하고 있습니다. * **추천 사항:** 자동화된 CI/CD 환경에서 보안을 강화하려는 조직은 소프트웨어 공급망의 각 단계를 투명하게 기록하는 in-toto와 키 관리 체계를 담당하는 TUF의 조합을 검토할 필요가 있습니다.

datadog

Cgo and Python (새 탭에서 열림)

Go 애플리케이션에 CPython 인터프리터를 내장하면 기존의 풍부한 Python 라이브러리를 재사용하거나 런타임에 코드를 동적으로 확장할 수 있는 강력한 유연성을 얻을 수 있습니다. Datadog은 에이전트의 핵심 로직을 Go로 전환하면서도 기존의 Python 기반 체크 로직을 유지하기 위해 이 방식을 채택했으며, 이를 통해 전체 프로그램을 다시 컴파일하지 않고도 커스텀 체크를 실행할 수 있는 구조를 완성했습니다. 결과적으로 `cgo`와 인터프리터 추상화 레이어를 활용하면 Go의 성능과 Python의 유연성을 동시에 확보하는 것이 가능합니다. ## Python을 Go에 내장해야 하는 이유 * **점진적 포팅:** 기존 Python 프로젝트를 Go로 옮길 때 모든 기능을 한 번에 재구현할 필요 없이, 부분적으로 기능을 이전하며 안정성을 유지할 수 있습니다. * **기존 라이브러리 재사용:** 새로운 언어로 다시 작성하기 까다로운 방대한 Python 라이브러리나 기존 소프트웨어 자산을 그대로 가져와 사용할 수 있습니다. * **동적 확장성:** 런타임에 외부 Python 스크립트를 로드하고 실행할 수 있어, 애플리케이션을 다시 컴파일하거나 배포하지 않고도 기능을 추가하거나 수정할 수 있습니다. * **Datadog의 사례:** 사용자가 직접 작성한 커스텀 체크 로직을 에이전트 재빌드 없이 즉시 실행하기 위해 이 기술을 핵심적으로 활용합니다. ## cgo를 이용한 언어 간 인터페이스(FFI) 구현 * **cgo의 역할:** CPython 인터프리터는 C로 작성되었으며 C API를 제공하기 때문에, Go에서 이를 호출하기 위해서는 외래 함수 인터페이스(FFI)인 `cgo`를 반드시 사용해야 합니다. * **프리앰블(Preamble) 활용:** `import "C"` 바로 위에 주석으로 C 코드를 작성하는 프리앰블 형식을 통해 `#include <Python.h>`와 같은 헤더 파일을 포함하고 C 함수에 접근합니다. * **빌드 프로세스:** `go build` 시 `cgo` 도구는 내부적으로 C와 Go 모듈을 생성하며, 각각의 컴파일러를 호출한 뒤 최종적으로 링커를 통해 하나의 바이너리로 합칩니다. * **환경 설정:** `#cgo pkg-config: python-2.7` 지시자를 사용하면 시스템의 `pkg-config`를 통해 컴파일 및 링크에 필요한 플래그를 자동으로 가져와 빌드 과정을 간소화할 수 있습니다. ## 인터프리터 제어와 go-python 라이브러리 * **인터프리터 생명주기:** Go 프로그램 내에서 Python 코드를 실행하려면 `Py_Initialize()`로 인터프리터를 시작하고, 작업이 끝나면 `Py_Finalize()`로 자원을 해제해야 합니다. * **추상화 레이어:** 직접적인 `cgo` 호출은 코드가 복잡해질 수 있으므로, Datadog은 `go-python`과 같은 래퍼 라이브러리를 사용하여 더 Go다운(idiomatic) 방식으로 Python API를 다룹니다. * **모듈 로드 및 실행:** `PyImport_ImportModule`로 디스크의 Python 파일을 가져오고, `GetAttrString`으로 특정 함수를 찾아 `Call` 메서드로 실행하는 일련의 과정을 Go 코드로 구현할 수 있습니다. * **기술적 세부사항:** Python 함수에 인자가 없더라도 C API 수준에서는 빈 튜플(`PyTuple_New(0)`)과 빈 딕셔너리(`PyDict_New()`)를 명시적으로 전달해야 하는 등의 규칙을 준수해야 합니다. Go의 정적 타입 시스템과 고성능 환경을 유지하면서도 Python의 생태계를 활용하고 싶다면 CPython 임베딩은 매우 실무적인 선택지입니다. 특히 `go-python`과 같은 라이브러리를 통해 `cgo`의 복잡성을 걷어내면 유지보수가 용이한 확장형 아키텍처를 구축할 수 있습니다.

datadog

Hackathon project: Viewing Datadog metrics in Minecraft (새 탭에서 열림)

Datadog의 엔지니어들은 사내 해커톤을 통해 시스템 모니터링 대시보드를 마인크래프트 게임 내부에서 구현하는 실험적인 프로젝트를 진행했습니다. 파이썬과 Datadog API를 활용해 실시간 인프라 메트릭을 게임 내 블록 형태로 시각화했으며, 이를 통해 온콜(on-call) 업무 중인 엔지니어가 게임을 즐기면서도 시스템 상태를 직관적으로 확인할 수 있는 환경을 구축했습니다. 이 프로젝트는 기술적인 재미와 더불어 대용량 데이터를 게임 환경에 효율적으로 렌더링하기 위한 성능 최적화 과정을 잘 보여줍니다. ### 마인크래프트 제어와 데이터 연동 * 파이썬의 익숙함과 풍부한 라이브러리를 활용하기 위해 `py3minepi`와 Raspberry Juice API를 사용하여 마인크래프트 환경을 제어했습니다. * `mc.setBlock(x, y, z, block_id)`와 같은 간단한 함수 호출을 통해 게임 내 특정 좌표에 블록을 생성하거나 제거하며 시각화의 기초를 마련했습니다. * Datadog 파이썬 라이브러리를 통해 API 및 애플리케이션 키로 인증한 뒤, `Metric.query` 기능을 사용하여 CPU 사용량과 같은 실시간 데이터를 스트리밍했습니다. ### 설정 기반의 대시보드 및 모니터 구현 * 그래프의 위치, 크기, 방향, 색상 및 투명도와 같은 시각적 요소를 코드와 분리하기 위해 YAML 설정 파일을 도입했습니다. * 실시간 데이터를 기반으로 모니터링 상태를 반영하여, 시스템에 경고가 발생하면 빨간색 블록이 켜지고 정상 상태가 되면 초록색으로 돌아오는 시각적 알람 기능을 구현했습니다. * 단순한 그래프를 넘어 여러 메트릭을 동시에 확인할 수 있는 복합 대시보드 레이아웃을 구성하여 게임 내에서도 실제 모니터링 도구와 유사한 경험을 제공했습니다. ### 영속성 관리와 성능 최적화 과제 * **블록 영속성 문제:** 마인크래프트 블록은 한 번 생성되면 계속 유지되므로, 데이터가 갱신될 때마다 이전 블록을 지워주는 '진공(vacuum)' 함수를 작성하여 화면을 정제했습니다. * **대역폭 및 렌더링 최적화:** 웹 기반의 대시보드와 달리 JS나 CSS를 사용할 수 없으므로 데이터를 행 단위로 단순화하여 시각화했습니다. * **캐싱 도입:** 대규모 그래프를 출력할 때 데이터 파이프라인에 과부하가 걸리는 문제를 해결하기 위해, 실제 업무에서 사용하는 것과 유사한 캐싱 메커니즘을 적용하여 성능을 개선했습니다. 이 프로젝트는 엔지니어링의 본질적인 즐거움인 '해킹'을 통해 익숙한 도구를 전혀 새로운 환경에 이식한 사례입니다. 단순히 재미를 넘어 실시간 데이터 처리와 렌더링 최적화라는 기술적 도전을 담고 있으며, 관련 소스 코드는 GitHub에 공개되어 있어 누구나 자신의 메트릭을 마인크래프트 세상에 구현해 볼 수 있습니다.

datadog

Protobuf parsing in Python (새 탭에서 열림)

Datadog은 Kubernetes 메트릭 수집 효율을 높이기 위해 kube-state-metrics의 프로토콜 버퍼(Protobuf) 지원 기능을 도입하고 그 성능을 검증했습니다. 이 글은 텍스트 형식 대비 Protobuf의 효율성을 정량적으로 확인하기 위한 과정과, 특히 파이썬 환경에서 다중 메시지 스트리밍을 처리하는 구체적인 기술적 구현 방법을 다룹니다. 결론적으로 대규모 데이터 통신에서 이진 포맷이 제공하는 속도와 자원 효율성 이점을 실무에 어떻게 적용할 수 있는지에 대한 가이드를 제공합니다. ## 프로토콜 버퍼의 기초와 데이터 직렬화 * 프로토콜 버퍼(Protobuf)는 구조화된 데이터를 빠르고 효율적으로 이진 스트림으로 직렬화하는 방식으로, 머신 간 통신 및 RPC(원격 프로시저 호출)에 최적화되어 있습니다. * 데이터의 구조를 정의하는 `.proto` 파일을 작성한 후, `protoc` 컴파일러를 통해 파이썬 등 다양한 언어에 맞는 소스 코드를 생성하여 사용할 수 있습니다. * 텍스트 기반 형식과 달리 엄격한 타입 정의를 통해 데이터의 일관성을 보장하며, 페이로드 크기를 획기적으로 줄여 HTTP API 성능을 개선합니다. ## 다중 메시지 스트리밍의 기술적 과제 * Protobuf는 자체 구분자(Self-delimiting)가 없는 설계 특성상, 여러 개의 메시지를 하나의 파일이나 소켓 스트림에 연속적으로 담을 때 각 메시지의 경계를 식별하기 어렵습니다. * 이 문제를 해결하기 위해 각 메시지를 직렬화하기 전, 해당 메시지의 크기(Size) 정보를 머리말(Prefix)로 추가하는 방식이 권장됩니다. * Java 구현체는 `parseDelimitedFrom`과 같은 내장 메서드를 통해 이를 지원하지만, 파이썬 표준 라이브러리는 이러한 기능을 기본적으로 제공하지 않아 별도의 구현이 필요합니다. ## 파이썬에서의 Varint 기반 스트리밍 구현 * 메시지 크기를 기록할 때는 작은 정수에 더 적은 바이트를 사용하는 가변 길이 정수 인코딩 방식인 'Varint'를 사용하며, 이는 효율적인 이진 통신을 가능하게 합니다. * 파이썬에서는 `google.protobuf.internal` 패키지에 포함된 내부 함수인 `_VarintBytes`(인코딩용)와 `_DecodeVarint32`(디코딩용)를 활용하여 Java와 호환되는 스트리밍 구조를 만들 수 있습니다. * 직렬화 시에는 메시지의 `ByteSize()`를 측정해 Varint로 먼저 쓰고 데이터를 기록하며, 역직렬화 시에는 버퍼에서 Varint를 읽어 메시지 길이를 파악한 후 해당 바이트만큼 데이터를 추출하여 파싱합니다. 데이터 전송 효율이 중요한 대규모 Kubernetes 모니터링 환경에서는 텍스트 포맷보다 Protobuf를 사용하는 것이 성능상 매우 유리합니다. 특히 파이썬 환경에서 다수의 메트릭을 스트리밍할 때는 표준 라이브러리 내부의 Varint 유틸리티를 활용하여 데이터 경계를 구분함으로써, Java 시스템과 완벽히 호환되면서도 고성능인 데이터 처리 파이프라인을 구축할 것을 권장합니다.

datadog

The trouble with mounting (새 탭에서 열림)

데이터독(Datadog) 에이전트가 특정 환경에서 응답을 멈추고 종료조차 되지 않는 문제는 NFS(Network File System)의 '하드 마운트' 속성과 시스템 콜의 작동 방식 때문에 발생했습니다. 하드 마운트된 NFS 서버와의 연결이 끊기면 디스크 정보를 확인하는 `statvfs` 시스템 콜이 무한 대기에 빠지며, 이는 결과적으로 에이전트 전체의 중단으로 이어졌습니다. 이를 해결하기 위해 데이터독은 디스크 체크 로직을 별도 스레드로 분리하고 타임아웃을 적용함으로써, 고객사의 시스템 설정에 관계없이 에이전트의 가용성을 확보하는 설계를 도입했습니다. **에이전트 정지 현상과 원인 분석** * 일부 시스템에서 모든 메트릭 수집이 중단되고 에이전트가 '종료 불가능한(unkillable)' 상태로 멈추는 버그가 보고되었습니다. * 조사 결과, 에이전트는 항상 디스크 체크 과정에서 멈췄으며 구체적으로 파이썬의 `os.statvfs` 함수 호출 시점에서 병목이 발생했습니다. * `os.statvfs`는 내부적으로 glibc의 `statvfs` 시스템 콜을 호출하는데, 이는 리눅스 환경에서 파일 시스템의 상태 정보를 가져오는 표준적인 방법입니다. **NFS 하드 마운트와 시스템 콜의 무한 대기** * NFS를 '하드 마운트(hard mount)' 옵션으로 연결하면, 서버가 응답하지 않을 때 시스템 콜이 타임아웃 없이 성공할 때까지 영구적으로 재시도합니다. * 하드 마운트는 데이터의 일관성을 보장하지만 네트워크 불안정 시 해당 마운트 지점에 접근하는 프로세스를 '좀비' 상태로 만들 수 있으며, 이는 NFS의 기본 설정이기도 합니다. * 특히 glibc의 `statvfs` 구현체는 정보를 찾기 위해 `/proc/mounts`에 나열된 모든 디렉토리를 순회하므로, 현재 조사하려는 대상이 아닌 다른 NFS 마운트에 문제가 생겨도 시스템 전체가 멈추는 현상이 발생합니다. **별도 스레드 및 타임아웃 도입을 통한 해결** * 데이터독 에이전트는 고객이 설정한 마운트 옵션을 강제로 변경할 수 없으므로, 어떤 환경에서도 정상 동작할 수 있는 방어적인 코드가 필요했습니다. * 문제를 해결하기 위해 `statvfs` 호출을 별도의 스레드에서 실행하도록 구조를 변경하고, 메인 스레드에는 타임아웃 로직을 추가했습니다. * 만약 특정 마운트 지점에서 시스템 콜이 응답하지 않더라도, 메인 스레드는 지정된 시간 이후 작업을 포기하고 다음 메트릭 수집으로 넘어감으로써 에이전트의 전체 성능을 보존합니다. * 이 방식은 하드 마운트가 활성화된 시스템에서 약간의 메모리 사용량 증가를 야기하지만, 다양한 이질적 환경에서 모니터링 연속성을 보장하기 위한 필수적인 트레이드오프(Trade-off)로 채택되었습니다. 서버 환경에서 NFS를 운용할 때는 `soft` 마운트 옵션이나 `intr(interruptible)` 옵션을 검토하여 시스템 콜이 무한 대기에 빠지는 상황을 예방해야 합니다. 또한, 모니터링 도구와 같이 외부 환경에 민감한 애플리케이션을 개발할 때는 외부 시스템 콜(I/O) 작업을 반드시 별도 스레드로 격리하고 엄격한 타임아웃을 적용하는 설계가 중요합니다.

datadog

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

6일 동안 850km를 달리는 동료의 도전을 응원하기 위해, 실시간 레이스 데이터를 수집하고 Datadog 대시보드로 시각화한 프로젝트 사례를 소개합니다. 파이썬을 활용한 웹 스크래핑과 Datadog의 메트릭 전송 기능을 결합하여, 멀리 떨어진 사무실에서도 실시간으로 선수의 순위와 주행 거리를 확인할 수 있는 모니터링 환경을 구축했습니다. ### 웹 스크래핑을 통한 데이터 추출 * 레이스 이벤트 웹사이트에서 일반 HTML 형태로 제공되는 주자들의 통계 데이터를 소스로 활용했습니다. * Python의 **Requests** 라이브러리를 사용하여 웹페이지의 HTML 코드를 가져오는 크롤러를 구현했습니다. * 가져온 HTML 데이터에서 실시간 순위, 총 주행 거리 등의 핵심 정보를 추출하기 위해 **BeautifulSoup** 라이브러리를 사용해 파싱 작업을 수행했습니다. ### StatsD를 활용한 메트릭 전송 * 추출한 데이터를 Datadog 에이전트와 **StatsD**를 통해 시스템으로 전송했습니다. * 선수의 주행 거리(`runner.distance`), 현재 순위(`runner.ranking`), 경과 시간(`runner.elapsed_time`)을 각각 **Gauge** 타입의 메트릭으로 정의했습니다. * 각 메트릭에 주자의 이름을 태그(`tags=["name:%s"]`)로 추가하여, 대시보드에서 특정 주자의 데이터를 쉽게 필터링하고 구분할 수 있도록 구성했습니다. ### 대시보드 시각화 및 결과 * 수집된 메트릭을 기반으로 실시간 영상 스트리밍과 재미를 위한 GIF 파일, 그리고 주요 지표들이 포함된 종합 대시보드를 제작했습니다. * 뉴욕과 파리 사무실 곳곳에 이 대시보드를 공유하여, 전 직원이 실시간으로 레이스 상황을 지켜보며 동료를 원격으로 응원할 수 있는 환경을 만들었습니다. 이 사례는 IT 인프라뿐만 아니라 외부의 실시간 데이터를 Datadog과 연결하여 조직 내 이벤트를 흥미롭게 공유하고 구성원들의 참여를 끌어낼 수 있음을 잘 보여줍니다. 데이터 수집부터 시각화까지의 과정이 비교적 간단하므로, 조직 내 다양한 온/오프라인 이벤트를 추적하는 데 응용해 볼 것을 추천합니다.

datadog

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 형태로 존재하기만 한다면, 어떤 외부 활동이라도 전문적인 인프라 모니터링 도구를 통해 실시간 대시보드로 구현할 수 있습니다.

datadog

Restroom hacks (새 탭에서 열림)

데이터독(Datadog)은 사무실 인원 증가로 인해 발생하는 화장실 대기 문제를 해결하고자 IoT 기술을 활용한 실시간 화장실 점유 모니터링 시스템을 구축했습니다. 이들은 프라이버시 보호를 위해 카메라 대신 도어락 상태를 감지하는 센서를 사용했으며, 수집된 데이터를 사내 대시보드와 연동하여 실무적인 편의성을 높였습니다. 이 프로젝트는 라즈베리 파이와 표준 유닉스 도구, 간단한 센서의 조합만으로도 일상의 물리적인 문제를 효율적으로 해결할 수 있음을 보여줍니다. **하드웨어 구성 및 현장 맞춤형 센서 적용** * 두뇌 역할을 하는 기기로 라즈베리 파이 2 모델 B를 채택하여 리눅스 환경에서 SSH와 WiFi를 통해 기기를 쉽게 관리할 수 있도록 했습니다. * 문의 형태에 따라 서로 다른 센서를 적용했습니다. 일반적인 버튼식 잠금장치에는 자석 리드 스위치(Magnetic reed switch)를, 슬라이드 방식의 칸막이 문에는 자동차 도어용 핀 스위치를 활용했습니다. * 전원 콘센트가 없는 위치나 WiFi 신호가 약한 콘크리트 벽 등 열악한 환경 조건에 맞춰 배선을 몰딩 처리하고 출력 박스 안에 기기를 매립하여 전문적인 외관을 유지했습니다. **소프트웨어 구현 및 시스템 통합** * 라즈베리 파이의 GPIO 핀을 `/sys/class/gpio/` 경로의 파일 시스템으로 제어하여 센서 상태를 읽어오는 파이썬 스크립트를 작성했습니다. * 작성된 스크립트는 `daemontools`와 `tcpserver`를 통해 안정적으로 실행되며 네트워크를 통해 상태 정보를 제공합니다. * 모든 소프트웨어 설정과 코드는 오픈소스로 공개되어 누구나 유사한 시스템을 구축할 수 있도록 지원합니다. **데이터 시각화 및 실제 활용** * 직원들은 터미널에서 `netcat(nc)` 명령어를 사용하여 즉시 화장실 가용 여부를 확인할 수 있습니다. * 맥 OS의 TextBar나 사무실 곳곳에 배치된 데이터독 대시보드 위젯에 실시간 상태를 표시하여 접근성을 극대화했습니다. * 복잡한 코드 작성보다는 적절한 센서 선정과 깔끔한 물리적 설치, 안정적인 네트워크 확보에 집중하여 실용적인 MVP(최소 기능 제품)를 완성했습니다. **결론** 임베디드 하드웨어와 유닉스 도구를 적절히 조합하면 최소한의 개발 비용으로 강력한 효과를 낼 수 있습니다. 하드웨어 프로젝트에서는 코드 작성 그 자체보다 물리적인 설치 환경에 대한 고려와 적합한 센서 선택이 성공의 핵심입니다. 이를 위해 사내의 '메이커' 문화를 장려하고 일상의 작은 불편함을 기술로 해결해보는 시도가 조직의 창의성을 높이는 데 큰 도움이 될 것입니다.