Observability란?
Observability는 시스템의 내부 상태를 진단하고 성능 향상을 지원하여 문제를 사전 해결합니다.
Observability란 무엇인가?
소개
최근 클라우드 네이티브 환경과 마이크로서비스 아키텍처의 확산으로 인해 시스템은 점점 더 복잡해지고 있습니다. 이러한 복잡성 속에서 시스템의 상태를 정확하게 파악하고 문제 발생 시 신속하게 해결하기 위해 Observability(관찰 가능성)의 중요성이 더욱 부각되고 있습니다. Observability는 단순히 시스템의 현재 상태를 모니터링하는 것을 넘어, 시스템의 내부 동작을 심층적으로 이해하고 예측 가능하도록 만드는 것을 목표로 합니다. 또한, DevOps 및 DevSecOps 팀이 더 빠른 개발 주기를 달성하고, 협업을 개선하며, 문제를 사전에 해결할 수 있도록 지원합니다
본 문서에서는 Observability의 개념, 핵심 요소, 시스템 모니터링과의 차이점, 주요 도구 및 기술, 그리고 실제 활용 사례 등을 자세히 살펴보겠습니다.
Observability의 정의 및 개념
Observability는 시스템의 외부 출력을 통해 내부 상태를 파악하고 이해하는 능력을 의미합니다. 즉, 시스템에서 생성되는 로그, 메트릭, 트레이스와 같은 데이터를 분석하여 시스템의 동작 방식, 성능 병목 현상, 오류 발생 원인 등을 파악할 수 있도록 하는 것입니다. 이는 제어 이론에서 유래된 개념으로, 시스템의 안정성과 제어 가능성을 높이는 데 중요한 역할을 합니다.
Observability는 단순히 "시스템이 작동하는지" 여부를 확인하는 것이 아니라, "시스템이 왜 그렇게 작동하는지" 목적을 이해하는 데 중점을 둡니다. 따라서 현대 시스템의 복잡성이 증가할수록 Observability의 중요성은 더욱 부각되고 있습니다.
Observability의 핵심 요소: Metrics, Logs, Traces
Observability는 다음 세 가지 핵심 요소를 기반으로 시스템의 상태를 파악합니다.
- Metrics(메트릭): 시스템의 성능과 상태를 측정하는 수치 데이터입니다. CPU 사용량, 메모리 사용량, 요청 처리량, 오류율 등 다양한 지표를 포함합니다. 메트릭은 시스템의 전반적인 상태를 파악하고 추세를 분석하는 데 유용합니다.
- Logs(로그): 시스템에서 발생하는 이벤트에 대한 자세한 기록입니다. 애플리케이션 로그, 시스템 로그, 보안 로그 등 다양한 종류가 있습니다. 의미 있는 로그를 생성하려면 애플리케이션 코드를 신중하게 계측해야 합니다. 예를 들어 타임스탬프, 심각도 수준 및 컨텍스트와 같은 주요 이벤트 세부 정보를 캡처하고, 일관된 로그 수준(디버그, 정보, 경고, 오류)을 사용하여 상세도를 제어하며, 통합된 보기를 위해 중앙 집중식 로그 집계 및 분석을 구현해야 합니다. 로그 분석을 통해 시스템의 동작 과정을 자세히 파악하고 문제 발생 시 원인을 분석할 수 있지만, 로그 데이터는 종종 구조화되지 않았거나 노이즈가 많아 분석하기엔 어려움이 있을 수 있습니다. 대표적으로 High Cardinality는 로그 분석에 영향을 미치는 요소 중 하나로, 수천 또는 수백만 명의 사용자가 있는 시스템에서 하나의 사용자 ID와 같이 고유한 값이 많은 데이터를 의미합니다. High Cardinality 데이터는 로그 분석 시 시스템 성능을 저하시킬 수 있습니다.
- Traces(트레이스): 사용자 요청이 시스템을 통과하는 경로를 추적하는 데이터입니다. 요청이 어떤 서비스를 거쳐 처리되는지, 각 서비스에서 얼마나 시간이 소요되는지 등을 파악할 수 있습니다. 트레이스는 분산 시스템에서 성능 병목 현상을 파악하고 문제를 진단하는 데 유용합니다.
이 세 가지 요소는 서로 연관되어 있으며, 종합적인 분석을 통해 시스템에 대한 완벽한 그림을 그릴 수 있도록 도와줍니다. 예를 들어, 메트릭에서 특정 지표의 이상 징후가 발견되면 로그와 트레이스를 분석하여 근본 원인을 파악할 수 있습니다. 로그 분석은 메트릭 급증 및 트레이스 이상에 대한 컨텍스트를 제공하고, 메트릭은 로그 분석을 안내하는 경고를 트리거할 수 있으며, 트레이스는 기록된 오류 및 성능 병목 현상의 원인을 밝혀낼 수 있습니다.
Observability와 Monitoring의 차이점
Observability와 시스템 모니터링은 둘 다 시스템의 상태를 파악하는 데 사용되지만, 몇 가지 중요한 차이점이 있습니다.
- 모니터링: 시스템의 알려진 지표를 수집하고 분석하여 이미 정의된 문제 를 감지하는 데 중점을 둡니다. 주로 시스템의 정상적인 작동 여부를 확인하고, 예상되는 문제 발생 시 경고를 발생시키는 데 사용됩니다.
- Observability: 시스템의 모든 출력 데이터를 활용하여 알려지지 않은 문제 를 포함한 모든 문제를 파악하고 진단하는 데 중점을 둡니다. 시스템의 내부 동작을 심층적으로 이해하고 예측 가능하도록 만드는 데 사용됩니다.
즉, 모니터링은 "무엇이 잘못되었는가?"를 알려주는 반면, Observability는 "왜 잘못되었는가?"를 이해하도록 도와줍니다. 전통적인 모니터링 도구는 복잡한 분산 시스템을 처리하는 데 제한적이며, 사전 정의된 메트릭을 기반으로 알려진 문제만 감지할 수 있습니다. 반면, Observability 플랫폼은 더 심층적인 통찰력을 제공하고 사전 예방적인 문제 해결을 가능하게 합니다.
Observability는 모니터링을 포함하는 더 큰 개념이라고 할 수 있습니다. 효과적인 Observability를 위해서는 포괄적인 모니터링 시스템 구축이 필수적입니다. 효과적인 조사를 수행하려면 모든 시스템의 내부 상태와 상태에 대한 전체적인 그림을 얻기 위해 매핑하고 모니터링해야 하는 많은 신호가 있습니다. 포괄적이고 설명적인 모니터링을 통해 시스템 상태와 성능의 이상 징후를 발견하고, Observability를 통해 수백 개의 서비스 구성 요소 간의 상호 작용으로 인해 발생하는 경우에도 이러한 이상 징후를 추가로 조사할 수 있습니다.
Benefits of Observability
Observability는 시스템 안정성, 성능 및 보안 향상 외에도 다음과 같은 다양한 이점을 제공합니다.
- 향상된 사용자 경험: 사용자 여정을 이해하고, 불편 사항을 식별하며, 애플리케이션을 최적화하여 더 나은 사용자 경험을 제공합니다.
- 운영 효율성 증대: 문제 해결 시간을 단축하고 시스템 관리 효율성을 높여 운영 비용을 절감합니다.
- 혁신 가속화: 시스템에 대한 더 나은 이해를 통해 새로운 기능 개발 및 배포를 가속화하고 혁신을 촉진합니다.
- 네트워크 아키텍처 최적화: 네트워크 성능을 향상시키고 병목 현상을 제거하여 최적화된 네트워크 아키텍처를 구축합니다.
- 다운타임 감소: 시스템 오류 및 장애를 신속하게 감지하고 해결하여 다운타임을 최소화합니다.
- 네트워크 성능 향상: 네트워크 트래픽을 효율적으로 관리하고 최적화하여 네트워크 성능을 향상시킵니다.
Observability 구현 도구 및 기술
Observability를 구현하는 데 사용되는 다양한 도구와 기술이 있습니다. 몇 가지 주요 도구들을 살펴보겠습니다.
Observability를 구현하기 위해서는 일반적으로 다음 네 가지 구성 요소가 필요합니다.
- 계측(Instrumentation): 시스템의 다양한 구성 요소(컨테이너, 서비스, 애플리케이션, 호스트 등)에서 원격 측정 데이터를 수집하는 측정 도구입니다. 전체 인프라에 대한 가시성을 확보하는 데 필수적입니다.
- 데이터 상관 관계(Data correlation): 시스템 전체에서 수집된 원격 측정 데이터를 처리하고 상관 관계를 분석하여 컨텍스트를 생성하고 시계열 시각화를 위한 자동 또는 사용자 지정 데이터 큐레이션을 가능하게 합니다.
- 사고 대응(Incident response): 온콜 일정 및 기술 숙련도를 기반으로 중단에 대한 데이터를 적절한 담당자와 팀에게 전달하기 위한 사고 관리 및 자동화 기술입니다.
- AIOps: 머신 러닝 모델을 사용하여 사고 데이터를 자동으로 집계, 상관 관계 분석 및 우선 순위를 지정하여 경고 노이즈를 필터링하고 시스템에 영향을 미칠 수 있는 문제를 감지하며 사고 발생 시 대응 속도를 높입니다.
- Prometheus: 시스템의 메트릭을 수집하고 저장하는 오픈소스 모니터링 시스템입니다. 다차원 데이터 모델과 유연한 쿼리 언어(PromQL)를 제공하며, 풀 기반 데이터 수집 모델을 사용하여 HTTP 엔드포인트에서 메트릭을 스크랩합니다. Prometheus는 Kubernetes 환경에서 널리 사용되며, 수천 개의 시계열 메트릭을 지원하도록 확장 가능하도록 설계되었습니다. Grafana와 통합하여 향상된 데이터 시각화를 제공합니다.
- Grafana: 다양한 데이터 소스를 시각화하는 오픈소스 플랫폼입니다. Prometheus와 연동하여 메트릭을 시각적으로 표현하고 대시보드를 생성할 수 있습니다. 사용자 정의 가능한 대시보드와 다양한 시각화 옵션을 제공하며, OpenTelemetry, Jaeger 및 Zipkin을 포함한 가장 인기 있는 Observability 도구/프로토콜에서 트레이스 데이터를 수집할 수 있습니다. 또한 대시보드 패널에서 직접 경고 규칙을 정의할 수 있습니다.
- Jaeger: 분산 트레이싱을 위한 오픈소스 도구입니다. 마이크로서비스 아키텍처에서 요청의 흐름을 추적하고 성능 병목 현상을 분석하는 데 사용됩니다. Jaeger는 분산 컨텍스트 전파를 전문으로 하여 여러 마이크로서비스에서 자세한 트레이스를 캡처하고, 다양한 마이크로서비스 간의 상호 작용을 보여줌으로써 분산 트레이스를 시각화할 수 있습니다.
Cloud-Specific Observability Tools
다양한 클라우드 환경에서 Observability를 구현하기 위한 도구들이 제공됩니다.
- AWS:
- AWS X-Ray: 프로덕션 환경의 분산 애플리케이션을 분석하고 디버깅하는 데 도움을 줍니다.
- Amazon CloudWatch: AWS 리소스 및 애플리케이션의 모니터링 및 Observability를 제공합니다.
- AWS CloudTrail: AWS 계정의 거버넌스, 규정 준수, 운영 및 위험 감사를 가능하게 합니다.
- Azure:
- Azure Monitor: 클라우드 및 온프레미스 환경에서 원격 측정 데이터를 수집, 분석 및 처리하기 위한 솔루션을 제공하여 애플리케이션의 가용성과 성능을 극대화합니다.
- Google Cloud:
- Google Cloud Logging: 대규모로 수행되는 완전 관리형 서비스로, 애플리케이션 및 시스템 로그 데이터는 물론 GKE 환경, VM 및 애플리케이션 컨테이너의 사용자 지정 로그 데이터를 수집할 수 있습니다.
Observability 활용 사례
Observability는 다양한 분야에서 시스템의 성능을 향상시키고 문제 해결을 가속화하는 데 활용됩니다. 몇 가지 구체적인 사례를 살펴보겠습니다.
네트워크 문제 해결
네트워크 트래픽을 분석하여 병목 현상, 지연 시간, 패킷 손실 등의 문제를 진단하고 해결합니다. 네트워크 장비 및 서비스의 성능을 모니터링하고 문제 발생 시 신속하게 대응합니다. 예를 들어, 네트워크 토폴로지를 시각화하고 트래픽 흐름을 모니터링하여 문제를 즉시 감지하고 발생 위치를 파악하여 해결할 수 있습니다.
애플리케이션 성능 향상
애플리케이션의 성능을 실시간으로 모니터링하고 문제 발생 시 신속하게 대응합니다. 사용자 경험, 응답 시간, 오류율 등을 추적하고 분석하여 애플리케이션의 성능을 최적화합니다. 예를 들어, 로그 및 트레이스에서 얻은 자세한 데이터를 통해 문제의 정확한 원인을 파악하고 적시에 진단 및 수정할 수 있습니다.
보안 위협 탐지
시스템 로그 및 이벤트를 분석하여 비정상적인 활동을 감지하고 보안 위협에 대응합니다. 침입 탐지, 악성 코드 분석, 취약점 스캐닝 등에 활용됩니다. 예를 들어, 실시간 변경 사항 감지를 통해 무단 구성 변경과 같은 의심스러운 활동을 파악하고, 중요 장치의 잘못된 구성과 같은 사람의 실수를 예방할 수 있습니다.
분산 시스템 디버깅
마이크로서비스 아키텍처에서 발생하는 오류를 추적하고 근본 원인을 분석합니다. 로그, 메트릭, 트레이스 데이터를 종합적으로 분석하여 문제가 발생한 서비스를 식별하고 해결 방안을 찾습니다.
시스템 성능 분석
메트릭 데이터를 분석하여 시스템의 성능 병목 현상을 파악하고 최적화합니다. 시스템의 자원 사용량, 응답 시간, 처리량 등을 모니터링하고 분석하여 성능 저하 요인을 찾아 개선합니다.
Challenges of Observability
Observability를 구현하는 데에는 다음과 같은 어려움이 있습니다.
- 데이터 사일로: 조직은 서로 다른 데이터 소스와 여러 개의 분리된 모니터링 도구를 관리합니다.
- 데이터의 양, 속도 및 다양성: AWS, Azure, Google Cloud 및 Kubernetes와 같은 플랫폼의 수많은 구성 요소에서 방대한 양의 원시 데이터가 생성됩니다.
- 수동 계측 및 구성: Observability 도구를 효과적으로 사용하려면 수동 계측 및 구성이 필요할 수 있습니다.
- 프로덕션 이전 Observability 부족: 개발 초기 단계부터 Observability를 고려하지 않으면 프로덕션 환경에서 도입하는 과정이 매우 복잡해질 수 있으며
결론
Observability는 복잡한 시스템을 이해하고 관리하는 데 필수적인 요소입니다. 시스템의 외부 출력을 통해 내부 상태를 파악하고 문제를 해결함으로써 시스템의 안정성, 성능, 보안을 향상시킬 수 있습니다. Observability는 또한 사용자 경험을 개선하고, 운영 효율성을 높이며, 혁신을 가속화하는 데 도움을 줄 수 있습니다.
하지만 Observability를 구현하는 데에는 데이터 사일로, 데이터의 양과 복잡성, 수동 계측 및 구성 등의 어려움이 존재합니다. 따라서 Observability를 효과적으로 구현하기 위해서는 적절한 도구와 기술을 활용하고, 시스템의 특성에 맞는 전략을 수립해야 합니다. 또한, 개발 초기 단계부터 Observability를 고려하여 시스템을 설계하고 구축하는 것이 중요합니다.
Observability는 클라우드 네이티브 환경과 마이크로서비스 아키텍처의 발전과 함께 더욱 중요해지고 있으며, 앞으로도 시스템 관리 및 운영에 필수적인 요소로 자리매김할 것으로 예상됩니다.
- https://www.dynatrace.com/news/blog/what-is-observability-2/
- https://faun.pub/what-is-observability-2-0-0cc9a40fe065
- https://www.ibm.com/think/topics/observability
- https://www.splunk.com/en_us/blog/learn/observability.html
- https://www.honeycomb.io/getting-started/observability-glossary
- https://www.dynatrace.com/news/blog/observability-vs-monitoring/
- https://openobserve.ai/resources/logs-metrics-traces-observability