monitoring

5 개의 포스트

기획부터 개발까지 전부 직접 했습니다 – 우테코 7기 크루 서비스 론칭! | 우아한형제들 기술블로그 (새 탭에서 열림)

우아한테크코스 7기 크루들이 기획부터 디자인, 개발 및 운영까지 전 과정을 직접 수행하며 실제 사용자를 위한 서비스를 성공적으로 론칭했습니다. 이번 프로젝트는 단순한 기술 습득을 넘어 개발자가 왜 기획과 디자인에 참여해야 하는지, 그리고 사용자 피드백이 아키텍처와 도메인 설계에 어떤 영향을 미치는지 몸소 체험하는 과정이었습니다. 결과적으로 크루들은 2주 단위의 스프린트와 실시간 모니터링, 배포 환경 구축 등 실무에 근접한 경험을 통해 현장 중심의 문제 해결 역량을 갖춘 개발자로 성장했습니다. **개발자 중심의 기획과 협업 문화의 정착** - 우아한테크코스는 레벨 3, 4 과정을 통해 개발자가 직접 기획과 디자인을 포함한 서비스의 전주기를 책임지는 팀 프로젝트를 진행합니다. - 기술적인 구현뿐만 아니라 말하기, 글쓰기 교육을 병행하여 팀원 간의 의견 조율 및 설득 등 소프트 스킬의 중요성을 강조합니다. - 아키텍처 설계와 같은 기술적 결정이 팀의 목표와 사용자의 가치에 어떻게 부합해야 하는지 고민하며 개발자의 역할을 확장했습니다. **픽잇(Pickeat): 취향과 제약을 반영한 협업형 식사 선택 서비스** - "아무거나"라는 답변 뒤에 숨겨진 기피 음식과 다이어트 등의 제약 사항을 실시간 투표로 해결하여 최적의 식당을 추천합니다. - 위치 정보 기반의 식당 자동 조회 및 템플릿 기능을 도입하여 반복되는 회식이나 미팅 시 의사결정 속도를 높였습니다. - 데모데이와 홍보를 통해 받은 피드백을 바탕으로 UI와 백엔드 도메인 구조를 유연하게 재설계하며 사용자 중심의 반복적인 개선 과정을 거쳤습니다. **보따리(Bottari): 실시간 동기화 기반의 상황별 체크리스트** - 출근, 여행, 이사 등 다양한 상황에 맞춘 템플릿 기반 리스트 생성과 팀 단위의 실시간 협업 체크 기능을 제공합니다. - 단순한 기능 구현을 넘어 사용자가 물건을 잊지 않게 돕는 알림 타이밍과 체크 상태 동기화 등 사용자 경험(UX)의 세부 요소를 정밀하게 다듬었습니다. - '기술은 문제를 해결하는 도구'라는 철학 아래 사용자가 안심하고 기억을 맡길 수 있는 흐름을 구현하는 데 집중했습니다. **커피빵(Coffee Bread): 웹소켓 기반의 실시간 내기 미니게임** - 가위바위보보다 더 큰 재미와 긴장감을 주기 위해 실시간 미니게임과 가중치 적용 룰렛 시스템을 도입한 서비스입니다. - 웹소켓(WebSocket) 기술과 분산 환경이라는 기술적 난제를 극복하며 실시간 상호작용이 끊김 없이 이루어지도록 개발했습니다. - 게임의 공정성과 재미를 위해 룰렛 알고리즘을 수차례 수정하고, 실제 사용자들의 피드백을 반영해 밸런스를 최적화했습니다. 이 서비스들은 단순한 교육용 프로젝트를 넘어 실제 배포와 운영을 거치며 기술적 완성도를 높였습니다. 개발자가 기획 단계부터 깊이 관여할 때 사용자에게 더욱 가치 있는 프로덕트가 탄생한다는 점을 시사하며, 실무적인 문제 해결 역량을 키우고 싶은 주니어 개발자들에게 좋은 협업의 귀감이 됩니다.

우아한형제들이 장애를 놓치지 않고 탐지하는 방법 | 우아한형제들 기술블로그 (새 탭에서 열림)

우아한형제들은 시스템 장애로 인한 고객 불편을 최소화하기 위해 서비스 지표 중심의 '서비스 이상 탐지 시스템'을 구축했습니다. 전통적인 인프라 모니터링의 사각지대를 보완하고자 실시간 데이터 예측과 임계치 관리 메커니즘을 도입했으며, 이를 통해 장애 탐지 속도와 대응 효율성을 동시에 확보했습니다. **서비스 지표 중심의 이상 탐지 필요성** * CPU, 메모리 사용률 등 전통적인 시스템 지표 모니터링만으로는 모든 장애 구간을 완벽하게 커버하기 어렵고 사각지대가 발생할 수밖에 없습니다. * 반면 주문 수, 결제 성공률 등 서비스 지표는 사용자 경험을 직접적으로 반영하며, 지표의 종류가 한정적이라 최소한의 관리로도 높은 탐지 효율을 낼 수 있습니다. * 서비스 이상 탐지 시스템은 장애가 발생했을 때 사용자 영향이 지표 변화로 나타나는 즉시 이를 포착하는 것을 목표로 합니다. **중앙값(Median) 기반의 탐지 기법 설계** * 배달 서비스 특성상 점심과 저녁 시간에 주문이 집중되는 선명한 패턴이 존재하므로, 과거 데이터를 통해 정상 범위를 비교적 쉽게 예측할 수 있습니다. * 분석의 용이성과 이상치(Outlier)에 대한 강건함을 확보하기 위해 IQR이나 2-sigma 대신 직관적인 중앙값(Median) 방식을 채택했습니다. * 복잡한 AI 모델을 사용하기보다 빠르게 구현하고 개선할 수 있는 구조를 선택하여 원인 분석과 시스템 업데이트의 속도를 높였습니다. **정확도 향상을 위한 임계 도달 횟수 관리** * 실시간으로 수집되는 실제값(Actual)이 예측된 임계값(Warning, Critical)에 도달할 때 장애를 판단합니다. * 일시적인 지표 튀기 현상으로 인한 오탐(False Positive)을 방지하기 위해, 임계값에 특정 횟수 이상 연속으로 도달했을 때만 경보를 발생시키는 '임계 도달 횟수'를 관리합니다. * 탐지 속도(낮은 횟수 설정)와 정확도(높은 횟수 설정) 사이의 트레이드오프를 고려하여 각 지표의 성격에 맞는 최적의 안정화 기간을 거칩니다. **신속한 대응을 위한 경보 및 프로세스 연계** * 장애 탐지 시 슬랙(Slack) 채널로 지표 현황, 긴급도, 그래프가 포함된 경보를 즉시 발송하여 상황 파악을 돕습니다. * 단순히 알림을 보내는 데 그치지 않고, 장애 숙련도와 관계없이 누구나 표준화된 절차에 따라 대응할 수 있도록 후속 프로세스 가이드를 함께 제공합니다. 장애는 완벽히 막을 수 없지만 탐지 시간은 단축할 수 있습니다. 복잡한 알고리즘에 매몰되기보다 서비스의 비즈니스 패턴을 명확히 분석하고, 가장 직관적인 지표와 통계 모델을 적용하는 것이 실무적인 관점에서는 훨씬 강력한 장애 대응 체계를 만드는 방법입니다.

Telegraf로 커스텀 지표 수집하기: Exporter 개발 경험 공유 (새 탭에서 열림)

네이버의 서비스 운영 환경에서 효율적인 지표 수집을 위해 Telegraf를 활용하여 커스텀 Exporter를 개발한 경험과 그 노하우를 공유합니다. 다양한 오픈소스 솔루션의 벤치마크 결과를 바탕으로 Telegraf의 유연성과 확장성을 검증하였으며, 이를 통해 기존 지표 수집 시스템의 한계를 극복하고 운영 효율을 개선한 구체적인 사례를 제시합니다. 최종적으로는 커스텀 지표 수집이 필요한 엔지니어들에게 실무적인 적용 가이드와 최적화 옵션을 제안합니다. **오픈소스 기반 Exporter 도입 배경과 벤치마크** * 서비스 규모가 확장됨에 따라 표준 지표만으로는 파악하기 어려운 비즈니스 로직 및 특정 인프라 상태를 모니터링해야 하는 필요성이 증가했습니다. * 기존의 파편화된 수집 방식을 개선하기 위해 여러 오픈소스 기반 Exporter들의 성능, 유지보수 편의성, 확장성을 비교 분석하는 벤치마크 테스트를 수행했습니다. * 다양한 환경에 유연하게 대응하면서도 시스템 리소스 점유율이 낮은 최적의 솔루션을 찾는 과정이 수반되었습니다. **Telegraf의 구조와 선정 이유** * Telegraf는 플러그인 기반 아키텍처를 가진 에이전트로, 데이터 수집(Input), 처리(Processor), 집계(Aggregator), 전송(Output)의 전 과정을 설정 파일만으로 손쉽게 구성할 수 있습니다. * Go 언어로 작성되어 별도의 런타임 없이 단일 바이너리로 실행 가능하며, 메모리 사용량이 적어 사이드카(Sidecar) 형태로 배포하기에 적합합니다. * 이미 풍부한 커뮤니티 플러그인을 보유하고 있어 새로운 커스텀 지표를 추가하거나 데이터 형식을 변환할 때 개발 공수를 획기적으로 줄일 수 있습니다. **Telegraf 적용 후 개선점** * 여러 대의 서버와 서비스에서 발생하는 지표 수집 방식을 Telegraf로 표준화하여 관리 포인트가 단일화되었습니다. * 필요에 따라 지표를 가공하거나 필터링하는 기능을 활용하여 모니터링 시스템(Prometheus, InfluxDB 등)으로 전달되는 데이터의 양을 최적화했습니다. * 커스텀 Exporter 개발 시 반복되는 통신 로직이나 버퍼링 로직을 직접 구현할 필요 없이 Telegraf의 기능을 활용함으로써 개발 생산성이 향상되었습니다. **성능 최적화를 위한 주요 설정 옵션** * `flush_interval`: 지표를 수집하여 목적지로 전송하는 주기를 조절함으로써 네트워크 트래픽과 실시간성 사이의 균형을 맞춥니다. * `metric_batch_size` 및 `metric_buffer_limit`: 한 번에 전송할 지표의 양과 일시적인 장애 시 보관할 버퍼 크기를 설정하여 데이터 유실을 방지합니다. * `precision`: 지표의 타임스탬프 정밀도를 설정하여 저장소 용량을 효율적으로 관리하고 쿼리 성능을 개선합니다. 오픈소스 기반의 모니터링 환경을 구축하려는 엔지니어에게 Telegraf는 매우 강력한 도구입니다. 단순히 지표를 수집하는 것을 넘어, 전처리와 집계 과정을 표준화하고 싶다면 Telegraf의 플러그인 아키텍처를 적극 활용해 보기를 권장합니다. 특히 대규모 인프라에서 커스텀 Exporter 개발 시 발생하는 중복 코드를 줄이고 운영 안정성을 확보하는 데 큰 도움이 될 것입니다.

처음 만나는 OpenTelemetry (feat. Collector) (새 탭에서 열림)

OpenTelemetry(OTel)는 클라우드 네이티브 환경에서 메트릭, 트레이스, 로그를 통합 관리하기 위한 오픈소스 표준 프레임워크로, 특정 벤더에 종속되지 않는 관측 가능성(Observability) 구축을 가능하게 합니다. 네이버는 기존 검색 모니터링 플랫폼 'SEER'를 OTel 및 오픈소스 기반으로 전환하면서 데이터 수집 효율성을 높이고 유연한 파이프라인을 확보했습니다. 특히 OTel Collector의 도입은 데이터 수집부터 가공, 전송에 이르는 전 과정을 표준화하여 운영 복잡도를 획기적으로 낮추는 결론에 도달했습니다. ### 데이터 중계의 핵심, OpenTelemetry Collector * Collector는 애플리케이션과 백엔드 사이에서 데이터를 수집, 처리, 전달하는 공급업체 불가지론적(Vendor-agnostic) 프록시 역할을 수행합니다. * 애플리케이션은 Collector에 데이터를 보내기만 하면 되므로, 백엔드 저장소가 변경되더라도 애플리케이션 코드를 수정할 필요가 없어 결합도가 낮아집니다. * 로컬 호스트나 별도의 게이트웨이 방식으로 배포할 수 있어 시스템 환경에 따른 유연한 아키텍처 구성이 가능합니다. ### 수집부터 전송까지의 파이프라인 구성 * **Receiver**: OTLP, Prometheus, Kafka 등 다양한 프로토콜로부터 데이터를 수집하며, 푸시(Push) 또는 풀(Pull) 방식을 모두 지원합니다. * **Processor**: 수집된 데이터를 백엔드로 보내기 전 가공하는 단계로, 배치 처리(Batch)를 통한 전송 효율화, 메모리 부족 방지(Memory Limiter), 민감 정보 필터링 등을 수행합니다. * **Exporter**: 처리된 데이터를 하나 이상의 백엔드 시스템(Elasticsearch, Jaeger, Prometheus 등)으로 전송하며, 여러 목적지로 동시에 데이터를 복제해 보낼 수도 있습니다. ### OTLP 프로토콜과 표준화의 이점 * OTLP(OpenTelemetry Protocol)는 gRPC 또는 HTTP를 사용하여 텔레메트리 데이터를 전송하는 OTel의 표준 프로토콜입니다. * 서로 다른 도구와 플랫폼 간의 상호운용성을 보장하며, 데이터 구조가 규격화되어 있어 분석 및 시각화 도구 선택의 폭이 넓어집니다. * 확장성이 뛰어난 바이너리 포맷을 사용하여 네트워크 대역폭 사용량을 최적화합니다. ### Kubernetes 환경에서의 효율적 운영, Operator * OpenTelemetry Operator를 사용하면 Kubernetes 환경에서 Collector의 배포 및 관리, 업데이트를 자동화할 수 있습니다. * 타겟 애플리케이션에 OTel 에이전트를 자동으로 주입(Injection)하는 기능을 제공하여 개발자의 번거로움을 줄여줍니다. * Collector의 설정(Config) 변경 시 사용자 정의 리소스(CRD)를 통해 선언적으로 관리할 수 있어 안정적인 운영이 가능합니다. ### 오픈소스 기여를 통한 기술 성숙도 강화 * 네이버는 실제 운영 환경에서 발견한 버그를 수정하고 필요한 기능을 제안하며 OpenTelemetry 커뮤니티에 적극적으로 기여하고 있습니다. * 오픈소스 생태계에 참여함으로써 단순히 기술을 소비하는 것을 넘어, 자사에 최적화된 기능을 표준에 반영하고 기술적 리더십을 확보하는 선순환 구조를 만들고 있습니다. **실용적인 제언** 모니터링 시스템의 확장성과 유연성을 고민하고 있다면, 처음부터 모든 것을 구축하기보다 **OpenTelemetry Collector**를 먼저 도입하여 데이터 파이프라인을 표준화할 것을 추천합니다. 이는 추후 분석 도구나 저장소를 교체할 때 발생하는 비용을 최소화하고, 분산 환경에서 발생하는 복잡한 데이터 흐름을 한곳에서 제어할 수 있는 가장 강력한 방법입니다.

앱 성공을 위한 필수 요소: 장애 모니터링 (새 탭에서 열림)

모바일 서비스의 성공을 위해서는 사용자 신고 이전에 장애를 포착하고 대응할 수 있는 체계적인 모니터링 시스템 구축이 필수적입니다. 단순히 에러를 수집하는 것에 그치지 않고, 로그 레벨을 정교하게 설계하고 핵심 이벤트를 시각화함으로써 운영 환경의 예기치 못한 문제를 실시간으로 파악할 수 있습니다. 이를 통해 장애 대응 시간을 단축하고 사용자 이탈을 방지하여 서비스의 전반적인 품질과 신뢰도를 높일 수 있습니다. **Flutter 환경에서의 Sentry 초기 설정과 데이터 보호** * **의존성 및 환경 설정**: `sentry_flutter`와 네트워크 로그 자동 기록을 위한 `sentry_dio` 패키지를 사용하며, DSN 설정 시 운영(production)과 개발(dev) 환경을 명확히 구분하여 태깅합니다. * **비용 및 성능 최적화**: 모든 트래픽을 수집하는 대신 `tracesSampleRate`를 조절하여 샘플링 비율을 최적화하고 운영 비용을 관리합니다. * **민감 정보 마스킹**: `beforeSend` 콜백을 활용해 서버로 로그를 전송하기 전 사용자 인증 토큰이나 IP 주소 등 개인정보를 삭제하거나 마스킹 처리합니다. * **맥락 파악을 위한 장치**: 사용자 아이디를 설정하는 `configureScope`와 클릭 및 화면 이동 경로를 기록하는 `Breadcrumb`, `NavigatorObserver`를 연결해 에러 발생 직전의 사용자 행동을 복원할 수 있게 합니다. **효율적인 운영을 위한 5단계 로그 레벨 설계** * **Debug & Info**: 개발 단계의 로그는 로컬에서만 확인하고, `info` 레벨은 회원 가입이나 결제처럼 데이터 상태가 변하는 핵심 행위에 대해서만 기록하여 불필요한 트래픽을 방지합니다. * **Warning**: 외부 시스템 연동 실패(API 오류, 푸시 유실 등) 시 기록하며, 사용자의 일시적인 네트워크 문제는 제외하여 노이즈를 줄입니다. 이는 '10분간 100회 발생'과 같은 특정 임계치 기반의 알림 설정 대상으로 활용됩니다. * **Error**: 코드상으로 통제할 수 없는 내부 로직 오류(Null 객체 접근, 파싱 실패, 불가능한 비즈니스 상태 등) 발생 시 기록하며, 즉각적인 확인과 대응이 필요한 단계입니다. * **Fatal**: 앱 크래시나 처리되지 않은 예외 상황을 기록하며, 서비스 가용성에 치명적인 영향을 주는 지표로 관리합니다. **데이터 기반 대응을 위한 커스텀 이벤트 및 대시보드 구성** * **태그 기반 쿼리**: 로그 전송 시 `module`, `eventName`, `reason` 등 커스텀 태그를 명확히 부여하면 특정 기능별 실패율을 쿼리로 쉽게 검색하고 분석할 수 있습니다. * **성능 지표 모니터링**: HTTP 인터셉터를 통해 API 응답 시간과 병목 구간을 측정하고, 화면 로딩 속도 등 사용자 경험에 직결되는 지표를 추적합니다. * **시각화와 알람**: 수집된 데이터를 바탕으로 '비정상 종료 발생 없는 사용자(Crash-free users)' 비율과 주요 이벤트 실패율을 시각화한 대시보드를 구성하고, 장애 지속 시 수신 대상을 단계적으로 확대하는 알람 체계를 구축합니다. 성공적인 모니터링을 위해서는 로그 메시지의 형식을 통일하고 팀 내에서 엄격한 로그 레벨 가이드라인을 공유하는 것이 중요합니다. 처음부터 모든 알람을 활성화하기보다는 핵심 지표부터 시작하여 점진적으로 임계치를 조절해 나감으로써, 알람 피로도를 줄이고 실제 장애 상황에 집중할 수 있는 환경을 만드는 것을 추천합니다.