Python

52 개의 포스트

discord4분 읽기큐레이션 요약

Osprey: 규칙 엔진 오픈 소

Discord는 실시간 안전 대응을 위해 개발한 규칙 엔진 Osprey를 ROOST 및 internet.dev 팀과 오픈소스로 공개했다. Osprey는 초당 수천 건의 이벤트를 처리하고, Python 기반 규칙 언어로 탐지 정책을 빠르게 배포하며, 판정 결과와 실행 과정을 추적할 수 있도록 설계됐다. 이를 통해 플랫폼은 새로운 위협에 대응하는 데 필요한 엔지니어링 부담을 줄이고, 탐지 결과를 다음 규칙 개선에 활용할 수 있다. ## Osprey를 개발한 배경과 목표 - 온라인 플랫폼은 스팸, 사기, 악성 사용자 등 유사한 안전 문제를 반복적으로 해결해야 한다. - Osprey는 각 기업이 안전 도구를 처음부터 만들지 않도록 재사용 가능한 규칙 엔진을 제공한다. - 주요 요구사항은 다음과 같다. - **대규모 실시간 처리:** 초당 수천 건의 이벤트를 처리하고 플랫폼 성장에 맞춰 확장 - **신속한 대응:** 표현력 있는 규칙을 작성해 수분 내 적용 - **명확한 판정:** 활동을 안전, 의심, 악성 등으로 판단할 수 있는 결과 제공 - **실행 과정 공개:** 어떤 규칙이 실행됐고 오류가 발생했는지 확인 가능 - **지속적인 학습:** 탐지 결과와 조사 내용을 새로운 규칙 개선에 반영 - **확장성:** 앞으로 등장할 새로운 공격 패턴과 기능을 수용 ## 전체 처리 구조 - Osprey는 플랫폼에서 발생한 **Action**을 입력으로 받는다. - Action은 다음 방식으로 전달할 수 있다. - gRPC를 통한 동기 처리 - 메시지 큐를 통한 비동기 처리 - 입력된 Action은 SML로 작성된 **Rules**를 거친다. - 규칙은 **UDF(User Defined Function)**로 확장할 수 있다. - 실행 과정에서 **Features**와 **Effects**가 생성된다. - 일부 Effects인 **Verdict**는 동기 요청자에게 즉시 판정 결과를 반환한다. - 모든 출력은 Apache Druid 클러스터로 전송되어 조사용 UI에서 검색·분석된다. ## Action: 규칙 엔진의 입력 이벤트 - Action은 Osprey에 전달되는 이벤트이며, 각 이벤트 유형은 고유한 ID와 스키마를 가진다. - 사실상 호출자가 원하는 데이터를 담은 JSON 객체로 구성된다. - 예를 들어 `user_login_attempted` 이벤트에는 사용자 ID, 이름, 이메일, IP 주소 등을 포함할 수 있다. - 이벤트 스키마를 애플리케이션에 맞게 정의할 수 있어 로그인, 메시지 전송, 계정 생성 등 다양한 활동을 처리할 수 있다. ## Rule과 SML 규칙 언어 - Rule은 Osprey의 핵심 구성 요소로, 특정 조건이 충족됐을 때 수행할 조치를 정의한다. - SML(Some Made-up Language)은 Python을 기반으로 한 규칙 언어다. - 기술 지식이 많지 않은 운영·안전 담당자도 작성할 수 있도록 비교적 단순한 문법을 사용한다. - 규칙은 다른 규칙과 데이터를 참조할 수 있어 복잡한 탐지 로직도 구성 가능하다. - 정적 검증을 통해 규칙 작성 방식을 강제할 수 있다. - 변수명 규칙 검사 - 데이터 타입 검사 - 특정 Entity에 적용 가능한 Effect 검사 - 예시에서는 이메일이 특정 값과 일치하면 해당 사용자의 Entity에 `spammer` 라벨을 추가한다. - `EntityJson`으로 사용자 ID를 추출 - `JsonData`로 이메일을 추출 - `Rule`로 스팸 사용자 조건 정의 - `WhenRules`로 조건 충족 시 `LabelAdd` 실행 ## UDF: 규칙 언어를 확장하는 Python 함수 - UDF는 실제 Python으로 작성되며 SML 규칙 어디서든 호출할 수 있다. - `Rule`, `WhenRules`, `JsonData` 등 Osprey의 기본 기능도 UDF로 구현되어 있다. - 사용자가 자체 UDF를 추가해 제품별 기능이나 외부 서비스 연동을 구현할 수 있다. - 예를 들어 외부 머신러닝 서비스에 링크를 전달해 스팸 점수인 `0~1` 범위의 값을 받아 규칙 조건으로 사용할 수 있다. - UDF는 다음과 같은 실행 정보를 정의할 수 있다. - 어떤 기능 범주에 속하는지 - 비동기 실행 여부 - 외부 서비스 접근 방식 - 실행 결과의 타입 - 따라서 규칙 엔진 자체를 수정하지 않고도 새로운 탐지 모델, 데이터 소스, 내부 서비스를 연결할 수 있다. ## Feature: 실행 결과로 생성되는 데이터 - Feature는 Osprey의 전역 네임스페이스에 등록된 변수다. - 모든 Feature는 고유한 이름을 가져야 한다. - 변수명 앞에 `_`를 붙이면 Feature로 외부에 내보내지 않고 현재 파일의 로컬 변수로 유지할 수 있다. - 실행 결과인 Feature는 Druid에 전송·색인된다. - 이후 조사 UI에서 `UserEmail == 'despicable@example.com'`처럼 특정 Feature 값을 기준으로 이벤트를 검색할 수 있다. - 예시의 `UserId`와 `UserEmail`은 모두 Feature다. ## Entity: 효과를 적용할 수 있는 지속적 대상 - Entity는 Feature의 특수한 형태다. - 모든 Entity는 Feature지만, 모든 Feature가 Entity인 것은 아니다. - Discord에서는 사용자, 서버, 이메일처럼 지속적으로 추적할 수 있는 대상을 Entity로 표현한다. - Entity에는 라벨, 분류, 신호 등의 Effect를 적용할 수 있다. - Entity 유형에 따라 적용 가능한 Effect가 달라지며, 이를 정적 검증으로 제한한다. - Osprey UI에서 Entity를 선택하면 해당 대상의 과거 활동과 처리 이력을 확인하는 Entity View로 이동할 수 있다. ## Effect와 Verdict - Effect는 하나 이상의 Rule이 참으로 평가됐을 때 발생하는 결과 또는 조치다. - Effect는 실행 전에 검증되며, 실행이 끝난 뒤 집계해 처리된다. - Entity에 라벨·분류·신호를 부여하는 작업이 대표적인 Effect다. - 동기 Action의 경우 Verdict Effect를 통해 호출자에게 규칙의 판정 결과를 반환할 수 있다. - 이를 활용하면 로그인이나 콘텐츠 게시 요청을 즉시 허용·차단하거나 추가 조사를 요구하는 흐름을 만들 수 있다. ## 실용적인 활용 방향 Osprey는 이벤트 수집, Python 기반 규칙 작성, 외부 탐지 서비스 연동, Druid 기반 조사까지를 하나의 구조로 제공한다. 새로운 위협에 자주 대응해야 하는 플랫폼이라면 규칙을 애플리케이션 코드와 분리하고, 정적 검증과 실행 추적을 갖춘 Osprey 같은 엔진을 활용하는 것이 운영 속도와 투명성을 높이는 방법이 될 수 있다.

원문 읽기(새 탭에서 열림)
meta원문

2025 파이썬 타이 (새 탭에서 열림)

2025년 파이썬 타입(Typed Python) 설문조사 결과, 응답자의 86%가 타입 힌트를 일상적으로 사용할 만큼 파이썬 생태계에서 타입 시스템이 핵심적인 위치를 차지하고 있음이 확인되었습니다. 개발자들은 타입 힌트를 통해 코드 가독성 향상과 버그 예방 효과를 누리고 있지만, 외부 라이브러리의 불완전한 타입 지원과 복잡한 제네릭 사용에는 여전히 어려움을 느끼고 있습니다. 향후 파이썬 타입 시스템은 TypeScript 수준의 유연한 타입 표현력과 런타임 성능 최적화를 지향하는 방향으로 발전할 것으로 보입니다. ### 높은 채택률과 경험 수준별 활용 양상 * 전체 응답자의 86%가 타입 힌트를 "항상" 또는 "자주" 사용한다고 답하여, 파이썬 개발에서 타입 시스템이 표준으로 자리 잡았음을 보여주었습니다. * 경력 5~10년 차 개발자의 채택률이 93%로 가장 높았으며, 이는 중견 개발자들이 타입 시스템의 이점을 가장 적극적으로 수용하고 있음을 시사합니다. * 반면 10년 이상의 숙련된 개발자(80%)와 2년 미만의 신입 개발자(83%)는 상대적으로 낮은 채택률을 보였는데, 이는 각각 레거시 코드베이스의 영향과 타입 시스템의 학습 곡선 때문으로 분석됩니다. ### 파이썬 타입 시스템의 주요 장점 * **점진적 채택(Gradual Adoption):** 기존 코드에 선택적으로 타입을 도입할 수 있는 유연성이 개발자들에게 가장 큰 매력으로 작용합니다. * **문서화 및 가독성:** 타입 힌트가 코드 내 문서 역할을 하여 대규모 프로젝트에서 로직을 이해하고 협업하는 효율을 높여줍니다. * **IDE 도구 지원:** 자동 완성, 정의 이동(Jump-to-definition), 인라인 타입 힌트 등 개발 환경의 생산성을 비약적으로 향상시킵니다. * **Pydantic 및 FastAPI 연동:** 런타임에 타입을 검사하고 활용하는 라이브러리와의 강력한 시너지 효과를 높게 평가했습니다. ### 현장에서 겪는 주요 기술적 난관 * **서드파티 라이브러리 지원 부족:** NumPy, Pandas, Django 등 널리 쓰이는 라이브러리의 타입 주석이 불완전하거나 부정확하여 연동에 어려움을 겪고 있습니다. * **고급 기능의 복잡성:** 제네릭(Generics), TypeVar, 공변성/반공변성(Co/Contravariance), 복잡한 콜백 함수 정의 등이 이해하기 어렵다는 의견이 많았습니다. * **도구의 파편화 및 성능:** Mypy와 Pyright 간의 검사 결과가 일치하지 않는 경우가 잦으며, 대규모 코드베이스에서 Mypy의 검사 속도가 느린 점이 페인 포인트로 지적되었습니다. * **가독성과 장황함:** 복잡한 데이터 구조에 타입을 적용할 때 코드가 지나치게 길어지고 '파이썬답지(Pythonic)' 않게 느껴진다는 비판도 존재합니다. ### 향후 요구되는 주요 기능 * **TypeScript 스타일의 기능 도입:** 교차 타입(Intersection types, `&`), 매핑 타입(Mapped types), 조건부 타입 등 더 강력한 타입 표현력을 요구하고 있습니다. * **유틸리티 타입:** TypeScript의 `Pick`, `Omit`, `keyof`와 같은 편리한 타입 조작 도구에 대한 수요가 높습니다. * **런타임 강제성 및 성능:** 타입 정보를 활용하여 런타임에 실제 성능을 최적화하거나, 타입을 강제로 검증할 수 있는 기능이 필요하다는 의견이 많았습니다. 파이썬 타입 시스템은 이제 선택이 아닌 현대적 파이썬 개발의 표준으로 진화했습니다. 신규 프로젝트라면 Pyright와 같은 최신 도구를 적극 활용하여 엄격한 타입 체크를 권장하며, 복잡한 제네릭보다는 명확한 프로토콜(Protocols)과 데이터 클래스를 활용하여 가독성과 안정성을 동시에 챙기는 전략이 실무적으로 유용합니다.

slack4분 읽기큐레이션 요약

더 나은 소프트웨어를 만들기

빌드가 60분씩 걸리면 코드 변경에 대한 피드백이 늦어져 개발 생산성이 크게 떨어진다. Slack은 Bazel과 전통적인 성능 최적화 원칙인 캐싱·병렬화를 결합해 빌드 시간을 개선했다. 핵심은 빌드를 명확한 입력·출력 단위의 그래프로 모델링하고, 재사용 가능하고 병렬 실행 가능한 작은 작업으로 나누는 것이다. ## 빌드를 방향성 비순환 그래프로 모델링 - 백엔드와 프런트엔드는 서로 독립적으로 개발·배포될 수 있으며, 각각 필요한 소스 파일에만 의존한다. - 빌드 구성 요소와 배포 산출물 사이의 의존성은 방향성 비순환 그래프(DAG)로 표현된다. - 특정 Python 파일이 변경되면 백엔드만 다시 빌드하고, TypeScript 파일 변경 때문에 백엔드까지 재빌드하지 않도록 의존성을 정확히 정의할 수 있다. - 그래프로 빌드를 표현하면 애플리케이션 코드와 동일하게 다음 최적화를 적용할 수 있다. - 이미 수행한 작업의 결과를 저장해 다시 계산하지 않기 - 여러 컴퓨팅 자원에 작업을 분산해 동시에 처리하기 ## 캐싱을 통한 불필요한 작업 제거 - 캐시는 입력값과 결과값을 연결해 동일한 입력에 대한 작업을 한 번만 수행하도록 한다. - 예를 들어 `factorial(n)`은 입력 `n`에 따라 결과가 항상 같으므로 `functools.cache`를 적용할 수 있다. - 빌드 캐싱이 올바르게 작동하려면 작업이 다음 조건을 만족해야 한다. - **Hermetic**: 명시적으로 전달된 입력만 사용해 결과를 생성해야 한다. - **Idempotent**: 동일한 입력에 대해 항상 동일한 결과를 내야 한다. - 캐시 성능은 전체 호출 중 캐시에서 결과를 가져오는 비율인 캐시 적중률(hit rate)에 좌우된다. ## 작업 단위를 작게 나눠 캐시 적중률 높이기 - 이미지 목록 전체와 변환 목록 전체를 입력으로 받는 `process_images()`에 캐시를 적용하면, 이미지 하나만 추가돼도 전체 입력이 바뀐 것으로 간주된다. - 이 방식은 캐시 키가 지나치게 크고 거칠어, 작은 변경에도 모든 작업을 처음부터 다시 수행해야 한다. - 대신 이미지 하나에 변환 하나를 적용하는 `process_image(image, transform)`처럼 더 작은 단위에 캐시를 적용할 수 있다. - 그러면 새로 추가되거나 변경된 이미지·변환 조합만 처리하고, 이미 계산한 조합은 캐시에서 재사용할 수 있다. - 상위 수준 API는 유지하면서 내부 작업 단위만 세분화하는 방식이 성능과 재사용성을 높인다. ## 병렬화를 통한 작업 분산 - 이미지 처리처럼 서로 독립적인 작업은 여러 CPU 코어나 프로세스, 네트워크상의 다른 컴퓨팅 노드로 분산할 수 있다. - 병렬 실행을 위해서는 다음 조건이 필요하다. - 작업의 입력과 출력이 명확하게 정의되어야 한다. - 입력과 출력을 스레드·프로세스·네트워크 경계 너머로 전달할 수 있어야 한다. - 작업이 어떤 순서로 완료되거나 실패할지 보장할 수 없으므로 결과 처리 규칙을 명확히 해야 한다. - 예시의 스레드 기반 구현은 이미지 결과가 입력 순서와 다르게 반환될 수 있다. - 결과 순서 보장 여부는 API 계약의 일부이며, 사용자가 허용할 수 있는 동작인지 사전에 결정해야 한다. ## 병렬화에서도 작업 단위의 크기가 중요 - 작업 수가 적고 각각의 작업이 너무 크면 사용 가능한 컴퓨팅 자원에 충분히 분산하지 못한다. - 반대로 작업을 지나치게 잘게 나누면 작업 전달·관리 오버헤드가 커질 수 있다. - 적절한 작업 크기와 개수의 균형은 문제마다 다르므로 API와 빌드 단위를 설계할 때 함께 고려해야 한다. - 캐싱과 병렬화 모두 입력·출력이 명확하고 독립적인 작은 작업 단위를 필요로 한다. ## Bazel 빌드로 원칙 확장 - Bazel은 빌드를 방향성 비순환 그래프 형태의 **타깃(target)** 으로 정의한다. - 각 타깃에는 다음 세 가지 핵심 요소가 있다. - 빌드 단계의 입력이 되는 의존 파일 - 빌드 단계가 생성하는 출력 파일 - 입력을 출력으로 변환하는 명령어 - 이러한 명시적 정의를 바탕으로 변경된 타깃만 다시 빌드하고, 결과를 캐시하며, 서로 독립적인 타깃을 병렬 실행할 수 있다. - 따라서 빌드 시스템의 성능 개선은 단순히 더 빠른 도구를 도입하는 문제가 아니라, 코드 성능 최적화와 마찬가지로 작업의 경계와 의존성을 설계하는 문제다. 빌드 시간을 줄이려면 먼저 의존성과 입출력을 명확히 정의하고, 변경 범위가 작은 작업 단위로 빌드를 나누는 것이 좋다. 그 위에 hermetic·idempotent한 작업을 캐시하고 독립 작업을 병렬화하면, 대규모 프로젝트에서도 불필요한 재빌드를 줄이고 개발자 피드백 속도를 높일 수 있다.

원문 읽기(새 탭에서 열림)
google원문

DS-STAR: 최첨 (새 탭에서 열림)

DS-STAR는 통계 분석부터 시각화, 데이터 가공에 이르는 방대한 작업을 자동화하는 최첨단 데이터 과학 에이전트로, 특히 구조화되지 않은 다양한 형식의 데이터를 처리하는 데 탁월한 성능을 보입니다. 이 에이전트는 데이터 파일의 맥락을 자동으로 추출하고, 생성된 계획을 검증하며, 피드백에 따라 계획을 반복적으로 수정하는 세 가지 핵심 혁신을 통해 기존 모델의 한계를 극복했습니다. 결과적으로 DABStep을 포함한 주요 데이터 과학 벤치마크에서 기존의 최첨단 모델들을 제치고 1위를 차지하며 그 실효성을 입증했습니다. **다양한 데이터 형식의 자동 분석 및 맥락 추출** * 기존 데이터 과학 에이전트들이 CSV와 같은 정형 데이터에 의존했던 것과 달리, DS-STAR는 JSON, 비구조화 텍스트, 마크다운 등 현실 세계의 다양한 데이터 형식을 처리할 수 있습니다. * 워크플로의 첫 단계에서 디렉토리 내의 모든 파일을 자동으로 조사하여 데이터의 구조와 내용을 텍스트 요약 형태로 추출합니다. * 이 요약 정보는 에이전트가 당면한 과제를 해결하는 데 필요한 필수적인 맥락 데이터로 활용됩니다. **반복적 계획 수립 및 검증 프레임워크** * DS-STAR는 계획(Planner), 구현(Coder), 검증(Verifier), 라우팅(Router) 단계로 구성된 반복 루프를 통해 작동합니다. * LLM 기반의 검증 에이전트(Verifier)가 각 단계에서 수립된 계획의 충분성을 평가하며, 만약 미흡하다고 판단될 경우 라우터(Router)가 단계를 수정하거나 추가하도록 유도합니다. * 이는 전문가가 구글 코랩(Google Colab)과 같은 도구를 사용하여 중간 결과를 확인하며 순차적으로 분석을 진행하는 방식을 모방한 것으로, 최대 10회까지 반복 정제 과정을 거칩니다. **벤치마크 성능 및 실전 데이터 대응 능력** * DABStep, KramaBench, DA-Code와 같은 주요 벤치마크 평가에서 AutoGen 및 DA-Agent와 같은 기존 모델들을 일관되게 압도했습니다. * 특히 DABStep 벤치마크에서는 정확도를 기존 41.0%에서 45.2%로 끌어올리며 공공 리더보드 1위를 기록했습니다. * 단일 파일 작업(Easy task)뿐만 아니라 여러 이기종 데이터 소스를 결합해야 하는 복잡한 작업(Hard task)에서 경쟁 모델 대비 압도적인 성능 우위를 보였습니다. DS-STAR는 정형 데이터에 국한되지 않고 실제 비즈니스 현장의 파편화된 데이터를 통합 분석해야 하는 환경에서 매우 유용한 도구가 될 수 있습니다. 복잡한 데이터 과학 워크플로를 자동화하고자 하는 조직은 DS-STAR의 순차적 계획 수립 및 자기 검증 메커니즘을 도입함으로써 분석의 정확도와 신뢰성을 획기적으로 높일 수 있을 것입니다.

google원문

MLE-STAR: 최첨단 머 (새 탭에서 열림)

MLE-STAR는 웹 검색 기능과 정밀한 코드 블록 최적화 메커니즘을 결합한 차세대 머신러닝 엔지니어링 에이전트로, 복잡한 ML 파이프라인 구축 과정을 자동화합니다. 기존 에이전트들이 LLM의 사전 지식에만 의존하거나 코드 전체를 한 번에 수정하려 했던 한계를 극복하기 위해, 성능에 가장 큰 영향을 미치는 특정 구성 요소를 식별하고 이를 집중적으로 개선하는 방식을 채택했습니다. 그 결과 MLE-Bench-Lite의 Kaggle 경진 대회에서 63%의 메달 획득률을 기록하며 기존 기술들을 압도하는 성능을 증명했습니다. **웹 검색을 통한 최신 기법 도입 및 초기 솔루션 구축** * LLM의 내장된 지식에만 의존할 때 발생하는 특정 라이브러리(예: scikit-learn) 편향 문제를 해결하기 위해 실시간 웹 검색 기능을 활용합니다. * 주어진 과제와 데이터 모달리티에 가장 적합한 최신(State-of-the-art) 모델과 방법론을 검색하여 초기 솔루션 코드를 생성하는 기반으로 삼습니다. **어블레이션 연구 기반의 타겟 코드 블록 정제** * 전체 파이프라인 코드를 무작위로 수정하는 대신, '어블레이션 연구(Ablation Study)'를 수행하여 피처 엔지니어링이나 모델 구조 등 성능 기여도가 가장 높은 특정 코드 블록을 찾아냅니다. * 식별된 핵심 블록에 대해 이전 시도의 실행 결과와 피드백을 반영하며 집중적인 반복 실험을 수행함으로써, 특정 파이프라인 단계에서의 최적화를 심도 있게 진행합니다. **지능형 솔루션 앙상블 전략** * 단순한 성능 기반 투표 방식에서 벗어나, 에이전트가 스스로 여러 후보 솔루션을 병합할 수 있는 최적의 앙상블 전략을 직접 설계하고 제안합니다. * 병렬로 생성된 다양한 해결책들을 유기적으로 결합하며, 이 과정 또한 반복적인 피드백 루프를 통해 지속적으로 개선하여 최종 예측 성능을 극대화합니다. **시스템 안정성 및 신뢰성 강화를 위한 모듈** * **디버깅 에이전트:** 파이썬 스크립트 실행 중 발생하는 트레이스백(Traceback) 오류를 분석하고 즉각적으로 코드를 교정합니다. * **데이터 누수(Data Leakage) 체크:** 테스트 데이터의 정보가 학습 과정에 유입되는 위험을 방지하기 위해 실행 전 스크립트의 논리적 무결성을 검증합니다. * **데이터 사용 확인 도구:** 에이전트가 CSV와 같은 단순한 데이터만 사용하고 다른 중요한 데이터 소스를 누락하지 않도록 모든 제공된 데이터를 활용하는지 감시합니다. MLE-STAR는 단순한 코드 생성을 넘어 데이터 분석, 전략 수립, 오류 수정 및 검증에 이르는 머신러닝 엔지니어링의 전 과정을 수행할 수 있음을 보여줍니다. 특히 Kaggle과 같은 실제 경쟁 환경에서 높은 성과를 낸 만큼, 향후 기업 현장에서 복잡한 데이터 파이프라인을 효율적으로 구축하고 실험 비용을 절감하는 데 실질적인 도움을 줄 것으로 기대됩니다.

line원문

문의 대응을 효율화하기 위한 RAG 기반 봇 도입하기 (새 탭에서 열림)

LY 주식회사의 SR(Service Reliability) 팀은 반복되는 AWX 플랫폼 관련 문의를 효율적으로 처리하기 위해 RAG(검색 증강 생성) 기반의 지원 봇을 도입했습니다. 이 시스템은 사용자가 방대한 가이드 문서를 읽지 않고 중복된 질문을 던질 때 발생하는 운영 리소스 소모 문제를 해결하기 위해 고안되었습니다. 사내 위키와 과거 상담 이력을 활용해 정확도 높은 답변을 생성함으로써 관리자의 개입 없이도 사용자 문제를 신속하게 해결하는 성과를 거두었습니다. **AWX 지원 봇의 기술 스택 및 구성** - **LLM 및 프레임워크:** OpenAI의 GPT 모델을 메인 엔진으로 사용하며, LangChain 프레임워크를 통해 전체적인 워크플로를 관리합니다. Slack과의 연동은 Bolt for Python을 활용했습니다. - **임베딩 모델:** 다국어 지원 및 문장 비교 성능이 뛰어난 'paraphrase-multilingual-mpnet-base-v2' 모델(SBERT)을 선택하여 글로벌 임직원의 다양한 언어 문의에 대응합니다. - **벡터 데이터베이스:** 사내에서 PaaS 형태로 제공되어 접근성이 높은 OpenSearch를 사용하며, 텍스트 데이터를 고차원 벡터로 변환하여 저장하고 검색합니다. **RAG 및 벡터 검색을 통한 답변 정확도 향상** - **LLM의 한계 극복:** 학습되지 않은 최신 정보 부재나 허위 정보 생성(Hallucination) 문제를 해결하기 위해, 질문과 관련된 신뢰할 수 있는 컨텍스트를 LLM에 함께 전달하는 RAG 기법을 적용했습니다. - **벡터 검색 원리:** 사용자의 질문을 임베딩하여 벡터화한 뒤, 벡터 DB 내에서 의미적으로 유사한 문장들을 k-NN(최근접 이웃) 방식으로 검색하여 최적의 참고 자료를 추출합니다. - **유사도 기반 추출:** 단순 키워드 매칭이 아닌 의미적 유사성을 판단하므로, 'Buy'와 'Purchase'처럼 단어는 달라도 맥락이 같은 정보를 정확히 찾아낼 수 있습니다. **봇 워크플로 및 데이터 활용 전략** - **사용자 상호작용:** 사용자가 Slack으로 문의하면 봇이 사내 위키와 과거 Slack 스레드 데이터를 검색합니다. 추출된 데이터를 바탕으로 LLM이 1차 답변을 제공하며, 해결되지 않을 경우에만 '관리자 호출' 버튼을 통해 담당자를 연결합니다. - **데이터 소스 다각화:** 공식 가이드 문서뿐만 아니라 실제 사용자들이 겪었던 문제와 해결책이 담긴 'Slack 문의 스레드 데이터'를 함께 인덱싱하여 실무적인 답변이 가능하도록 구성했습니다. - **리소스 최적화:** 봇의 자동 응답을 통해 단순 반복 문의에 대한 관리자의 수동 대응 시간을 줄이고, 개발 조직이 서비스 운영 본연의 업무에 더 집중할 수 있는 환경을 조성했습니다. RAG 기반 시스템을 구축할 때 가장 중요한 것은 신뢰할 수 있는 데이터 소스의 확보입니다. LY의 사례처럼 공식 문서와 실제 상담 이력을 병행 활용하면 LLM이 훨씬 구체적이고 실무에 유효한 답변을 생성할 수 있습니다. 운영 중인 서비스의 문의 대응 리소스가 부담된다면, 익숙한 벡터 DB와 오픈소스 임베딩 모델을 조합한 RAG 봇 도입을 적극 추천합니다.

discord3분 읽기큐레이션 요약

A/B 테스트 없이 제품 영향

Discord는 네트워크 효과 때문에 음성 메시지 기능을 전통적인 사용자 단위 A/B 테스트로 평가하기 어렵다고 판단했다. 대신 여러 국가의 데이터를 가중합해 처리 국가의 가상 대조군인 ‘합성 통제’를 만들고, 기능 출시 전후의 차이를 비교했다. 이 방법은 단일 국가 비교보다 관측·비관측 차이를 잘 보정하며, 네트워크 기반 기능의 인과 효과를 추정하는 현실적인 대안이 된다. ## 네트워크 효과로 인한 A/B 테스트의 한계 - Discord의 사용자 행동은 같은 서버, DM, 그룹 DM 등 네트워크 안에서 서로 영향을 준다. - 한 그룹의 사용자가 다른 그룹의 사용자와 상호작용하면 대조군과 실험군의 독립성이 깨진다. - 이는 실험 단위 간 간섭이 없다고 가정하는 SUTVA(Stable Unit Treatment Value Assumption)를 위반할 수 있다. - 음성 메시지는 한 사용자가 보내고 다른 사용자가 받아야 의미가 있으므로 네트워크 효과에 특히 취약하다. - 네트워크 단위 무작위화가 이상적이지만 Discord의 테스트 플랫폼은 당시 클러스터 무작위화를 지원하지 않았다. ## 국가 단위 테스트의 문제점 - 사용자 단위 A/B 테스트는 네트워크 간 상호작용 때문에 결과가 왜곡될 수 있다. - 국가별로 실험군과 대조군을 나누면 네트워크 효과를 줄일 수 있지만, 국가 자체의 차이가 처리 효과와 섞인다. - 브라질과 아르헨티나를 비교하는 방식은 언어, 사용자 규모, 문화, 역사 등 통제하기 어려운 요인을 포함한다. - 이런 누락 변수는 **누락 변수 편향(omitted variable bias)**을 일으켜 기능의 실제 효과를 왜곡한다. - 특정 국가에서 얻은 결과는 해당 국가에만 적용될 가능성이 있어 외적 타당도도 낮다. ## 합성 통제 방법 - 합성 통제는 하나의 처리 단위를 여러 비처리 단위의 가중합과 비교하는 방법이다. - 예를 들어 브라질을 처리 국가로 삼고, 아르헨티나·우루과이·칠레 등의 데이터를 각각 가중해 ‘합성 브라질’을 만든다. - 합성 브라질은 실제 브라질이 기능을 받지 않았을 때 나타났을 결과, 즉 반사실(counterfactual)을 추정한다. - 단일 대조 국가보다 여러 국가의 정보를 활용하므로 국가별 특이성이 결과에 미치는 영향을 줄일 수 있다. - 무작위화가 불가능하거나 윤리적·운영상 비용이 큰 상황에서 유용하다. ## 필요한 데이터와 구현 절차 - 처리 국가의 기능 출시 전후 결과 데이터가 필요하다. - 동일한 기간에 대해 여러 대조 국가의 결과 데이터도 수집해야 한다. - 합성 통제 가중치는 분석 라이브러리로 계산할 수 있다. - R: `Synth` - Python: `SyntheticControlMethods` - 분석 결과는 실제 처리 국가의 추세와 합성 통제의 추세 차이로 해석한다. - 출시 전에는 두 추세가 최대한 비슷해야 합성 통제가 신뢰할 만한 반사실을 제공한다고 볼 수 있다. ## MSPE를 이용한 검증 - 합성 통제가 얼마나 잘 작동했는지는 평균제곱예측오차(MSPE, Mean Squared Prediction Error)로 평가한다. - 기능 출시 전 MSPE가 낮아 실제 국가와 합성 국가의 추세가 유사한지 확인한다. - 기능 출시 후 MSPE가 크게 증가하면, 기능 출시로 인해 실제 처리 국가의 결과가 합성 통제와 달라졌다는 신호가 된다. - 기능이 도입되지 않은 다른 기간에도 합성 통제가 실제 결과를 잘 따라가는지 확인하는 위약(placebo) 또는 안정성 검사를 수행할 수 있다. - 출시 전부터 추세 차이가 크거나 다른 기간에도 오차가 크다면 인과 효과 해석에 주의해야 한다. ## 실용적인 결론 네트워크 효과로 사용자 단위 A/B 테스트가 적합하지 않을 때는 국가·지역·서버 같은 집단을 처리 단위로 삼고 합성 통제를 활용하는 것이 효과적이다. 다만 신뢰도 높은 결과를 얻으려면 충분한 사전 기간, 적절한 대조 집단, 낮은 사전 MSPE, 그리고 위약 검증이 필요하다.

원문 읽기(새 탭에서 열림)
figma원문

C++ 빌드 시간 단축하기 (새 탭에서 열림)

피그마(Figma)는 C++ 코드베이스가 10% 증가할 때 빌드 시간이 50%나 급증하는 문제를 해결하기 위해, 컴파일러로 전송되는 데이터 양(바이트)을 줄이는 전략을 채택했습니다. 하드웨어 업그레이드나 캐싱만으로는 한계가 있음을 깨닫고, 불필요한 헤더 포함을 자동으로 찾아내고 방지하는 자체 도구인 'DIWYDU'와 'includes.py'를 개발하여 빌드 시간을 절반으로 단축했습니다. 결과적으로 빌드 시간의 핵심 지표가 전처리 후의 바이트 수에 비례한다는 점을 입증하며 대규모 개발 환경에서의 생산성을 확보했습니다. ### 헤더 포함 방식과 빌드 속도의 상관관계 * C++ 컴파일 과정에서 전처리기(Pre-processor)는 소스 파일에 포함된 모든 헤더 파일을 하나의 거대한 파일로 합치며, 이는 전이적 의존성(Transitive dependency)을 포함해 컴파일러가 처리해야 할 바이트 수를 기하급수적으로 늘립니다. * 피그마의 분석 결과, 실제 추가된 코드량보다 전처리 후 컴파일러로 전달되는 바이트 수의 증가 폭이 훨씬 컸으며, 이것이 빌드 시간 지연의 주요 원인으로 파악되었습니다. * 대형 파일에서 불필요한 헤더를 수동으로 제거하는 실험을 진행한 결과, 컴파일 바이트는 31%, 콜드 빌드 시간은 25% 감소하며 가설이 증명되었습니다. ### DIWYDU: 불필요한 헤더 제거 자동화 * 구글의 IWYU(Include What You Use)가 너무 엄격하여 적용이 어렵자, 피그마는 더 유연한 자체 도구인 DIWYDU(Don’t Include What You Don’t Use)를 개발했습니다. * 이 도구는 `libclang`의 파이썬 바인딩을 사용하여 추상 구문 트리(AST)를 분석하며, 특정 파일이 포함한 헤더에서 함수, 타입, 변수 등을 직접적으로 사용하는지 확인합니다. * 직접적인 의존성이 없는 헤더를 찾아내어 삭제하도록 플래그를 표시함으로써 모든 기능 브랜치에서 빌드 속도 저하를 방지합니다. * 다만, STL(표준 템플릿 라이브러리)의 프라이빗 헤더 구조나 `libclang` 파이썬 바인딩의 AST 노드 접근 제한(UNEXPOSED_EXPR 등)과 같은 기술적 한계는 존재합니다. ### includes.py를 통한 회귀 방지 및 측정 * 헤더를 실제로 사용하더라도 파일 크기가 너무 커서 빌드 속도를 늦추는 경우를 대비해, 전이적 바이트 수를 측정하는 `includes.py`를 구축했습니다. * Clang을 사용하지 않고 순수 파이썬으로 작성되어 실행 속도가 매우 빠르며(수 초 내외), CI(지속적 통합) 시스템에서 각 PR이 빌드 시간에 미치는 영향을 바이트 단위로 측정합니다. * 특정 PR이 컴파일 바이트 수를 과도하게 늘릴 경우 경고를 발생시켜 개발자가 전방 선언(Forward Declaration)을 사용하거나 헤더를 분리하도록 유도합니다. * 표준 라이브러리는 피그마 내부의 래퍼(Wrapper) 디렉토리를 통해 관리되므로, 표준 헤더의 바이트는 계산에서 제외하여 효율성을 높였습니다. C++ 프로젝트의 빌드 속도를 유지하기 위해서는 단순한 캐싱을 넘어 컴파일러가 처리하는 데이터의 총량을 관리해야 합니다. 불필요한 헤더 의존성을 제거하는 자동화 도구를 CI 파이프라인에 통합하고, '컴파일 바이트 수'를 성능 지표로 모니터링하는 것이 대규모 코드베이스의 개발 효율을 높이는 실질적인 방안이 될 수 있습니다.

datadog원문

Datadog IT 팀이 계정 비활성화와 SaaS 지출 관리를 자동화한 방법 (새 탭에서 열림)

데이터독(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원문

쿠버네티스 상태 메트 (새 탭에서 열림)

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원문

Kubernetes 상태 메트릭을 한 단계 끌어올린 우리의 여정 (새 탭에서 열림)

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원문

우리 작업 시스템에서 쿠버네티스 오버헤드를 최소화한 방법 (새 탭에서 열림)

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원문

우리가 Python 프로파일러를 작성한 방법 (새 탭에서 열림)

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원문

TUF와 in-toto를 활용한 Datadog Agent 통합 기능의 안전한 배포 (새 탭에서 열림)

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와 파이썬 (새 탭에서 열림)

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`의 복잡성을 걷어내면 유지보수가 용이한 확장형 아키텍처를 구축할 수 있습니다.