Dev Stories

Observability In Azure

안녕하세요. AI Platform Engineering팀에서 Platform Engineer로 근무하고 있는atform Engineering팀은 KT의 Azure AI Platform을 구축 및 운영하는 역할을 담당하고 있습니다.




AI Platform에서는 여러팀이 AI 학습 및 서빙, Agent 서비스등 여러 AI 기반 프로젝트를 모놀리식, MSA 아키텍처 기반으로를 진행하고 있습니다.

이 글에서는 MSA 아키텍처 운영의 필수 요소로 떠오른 Observability(관찰 가능성)의 개념을 설명하고, 기존의 Monitoring과의 차이를 비교하며, 가상의 서비스 예제와 AI Platform 내의 하나의 서비스를 예제로 선택해서 Observability가 구축된 상황을 설명하겠습니다.

Microservice Architecture

Observability를 알아보기 전에, 먼저 Observability가 왜 중요한지 이해하기 위해 MSA(Microservices Architecture)에 대해 간략히 살펴보겠습니다.

MSA는 하나의 애플리케이션을 여러 개의 독립적인 작은 서비스로 분리하여 개발하고 운영하는 아키텍처입니다. 각 서비스는 특정 비즈니스 기능을 담당하며, 독립적으로 배포 및 확장이 가능합니다. 서비스 간에는 주로 REST API나 메시지 큐를 통해 통신하며, 각 서비스는 자체 데이터 저장소를 가질 수 있습니다.

예를 들어, 쇼핑몰 시스템을 MSA로 구현할 때는 사용자 관리 서비스, 주문 처리 서비스, 결제 처리 서비스 등으로 나눕니다. 각 서비스는 독립적으로 개발되고, 사용자 정보가 필요할 경우 주문 처리 서비스는 사용자 관리 서비스에 API 요청을 보내어 정보를 조회합니다. 이런 방식으로 각 서비스는 자신의 역할에 집중하며 독립적으로 운영됩니다.

MSA 환경에서는 개별 서비스의 상태뿐 아니라, 서비스 간의 호출 관계나 흐름을 추적하는 것이 어려워집니다. 따라서 시스템 전반의 상태를 명확히 이해하고, 장애나 이상 징후를 신속하게 파악하기 위한 Observability가 필수적입니다.

Observability

Observability(관찰 가능성)는 시스템의 내부 상태를 외부에서 노출된 데이터를 기반으로 이해할 수 있는 능력을 말합니다. 단순히 시스템이 잘 동작하는지를 넘어, "왜 그렇게 동작하는가?"에 대한 통찰을 제공합니다.

Observability는 보통 세 가지 핵심 신호을 기반으로 합니다:

  • Logs (로그): 시스템 내에서 발생한 이벤트의 기록

  • Metrics (지표): 수치화된 데이터로 시스템의 성능을 나타냄

  • Traces (추적): 시스템 내 요청의 흐름을 시각화

이 세 가지를 종합적으로 분석함으로써, 개발자 또는 운영자는 시스템의 상태를 더 깊이 이해하고 문제를 빠르게 해결할 수 있습니다.


Monitoring과 Observability의 차이점

Observability와 Monitoring을 혼용해서 사용하지만, 엄연히 다른 개념입니다.

구분

Monitoring

Observability

목적

이미 알려진 문제를 감지

시스템의 새로운 문제를 탐지하고 이해

방식

사전에 정의된 지표나 알림(CPU, Memory 사용량)

시스템 전반의 데이터를 수집하여 원인 분석

한계

정해진 범위 외의 문제 탐지 어려움

미지의 문제에 대한 통찰 제공

Monitoring 예시:

  • CPU 사용률이 90%를 넘으면 경고 발생

  • 응답 시간이 5초를 넘으면 알림

Observability 예시:

  • CPU 사용률이 높아졌을 때, 어떤 API 호출이 병목을 유발했는지 Logs, Metrics, Traces를 통해 분석

  • 특정 사용자의 요청 경로를 추적하여 오류의 정확한 원인을 파악

정리하면 Monitoring은 알려진 문제에 대한 감시 체계이고, Observability는 시스템 내부 상태를 깊이 있게 이해할 수 있는 능력입니다. 두 개념은 상호 보완적이며, 안정적인 시스템 운영을 위해 함께 활용되어야 합니다.


Observability in OpenSource(OpenTelemetry)

오픈소스 생태계에서는 OpenTelemetry를 중심으로 한 Observability 구현이 표준이 되어가고 있습니다.

아래 그림은 OpenTelemetry의 아키텍처를 한눈에 보여주는 구조도이며 다양한 소스에서 수집한 관측 데이터를 중앙의 OTel Collector로 집계한 후, 이를 다양한 관측 도구 및 저장소로 전달합니다. 마이크로서비스는 OTel SDK, API, 자동 계측 방식을 통해 데이터를 수집하며, Kubernetes나 L7 프록시 같은 공용 인프라에서도 데이터를 받아 Collector로 전송됩니다.

OTel Collector에서 수집된 데이터는 설정된 Exporter를 통해 타임 시리즈 데이터베이스(예: Prometheus, InfluxDB), 트레이스 저장소(예: Jaeger, Zipkin), 또는 컬럼 기반 저장소(예: ClickHouse, BigQuery)로 전송되어 저장됩니다.

이렇게 저장된 데이터는 Grafana, Kibana, Jaeger UI 등 다양한 시각화 도구나 API를 통해 대시보드 형태로 시각화되며, 시스템 성능 모니터링, 장애 분석, 로그 추적 등에 활용됩니다.


1.png


그림 2.1 OpenTelemetry Architecture출처: What is OpenTelemetry?


위 그림의 OpenTelemetry 기반의 Observability 아키텍처에서 각 구성 요소의 역할을 간략히 정리해보겠습니다.

OTel Collector애플리케이션, 인프라 등 다양한 소스에서 메트릭, 로그, 트레이스를 수집하고 가공하여 여러 백엔드로 전달하는 중간 처리자 역할을 합니다.

Time Series DatabasesPrometheus, InfluxDB와 같은 DB는 시간 기반 메트릭을 저장하고 모니터링 및 알림 설정에 활용됩니다.

Trace DatabasesJaeger, Zipkin, Tempo 등은 분산 트레이싱 데이터를 저장하고 요청 흐름, 지연, 오류 등을 시각화합니다.

Column StoresClickHouse, BigQuery와 같은 컬럼 기반 저장소는 대량의 로그나 이벤트 데이터를 저장하고 고속 분석에 적합합니다.

Visualization ToolsGrafana, Kibana 등은 메트릭, 로그, 트레이스 데이터를 대시보드로 시각화해 모니터링과 문제 분석을 지원합니다.

Observability in Azure

Azure의 Observability는 Azure Monitor를 중심으로 다양한 데이터 소스로부터 메트릭, 로그, 트레이스, 구성 변경 정보를 수집하고 이를 통합 분석 및 시각화하는 구조로 구성됩니다.

Overview

아래의 다이어그램과 같이 애플리케이션, 인프라, 플랫폼, 커스텀 소스 등에서 수집된 데이터는 App SDK, 에이전트, API 등을 통해 Azure Monitor로 전달되며, 이 데이터는 내부 플랫폼에서 정제되어 다양한 분석 및 대응 도구로 활용됩니다. Workbooks, Dashboards, Power BI, Grafana를 통해 시각화하고, Metric Explorer나 Log Analytics로 분석하며, AIOps, 알림, 자동 확장 등의 기능을 통해 실시간 대응이 가능합니다. 또한 Event Hub, Azure DevOps, Logic Apps 등 다양한 외부 시스템과도 쉽게 통합되어 확장성과 유연성을 제공합니다.


이미지
 
그림 2.2 Azure Monitor Architecture출처:Azure Monitor overview - Azure Monitor


Azure의 Observability 기능을 사용하기 위한 서비스들에 대해 간략히 설명합니다.

  • Azure Monitor: Azure에서 제공하는 핵심 통합 모니터링 플랫폼입니다. 클라우드 및 온프레미스 환경에서 실행되는 애플리케이션, 인프라, 네트워크 리소스의 성능과 상태를 수집, 분석, 시각화, 응답할 수 있도록 지원합니다.

  • : Azure Monitor의 하위 서비스 중 하나로, 특히 애플리케이션 수준의 Observability에 초점을 맞춘 도구입니다. 주로 웹 애플리케이션, API 서버, 클라이언트 앱의 성능과 사용 현황을 실시간으로 분석할 수 있게 도와줍니다. application insight는 리소스 생성시 반드시 1개의 Log Analytics Workspace와 연동이 필요합니다.

  • Log Analytics Workspace: Azure Monitor의 핵심 기능 중 하나로, 다양한 소스에서 수집한 로그 데이터를 저장하고 질의(Query)를 통해 분석할 수 있도록 해줍니다.

  • Container Insights: Kubernetes 클러스터 및 컨테이너 기반 워크로드의 상태와 성능을 모니터링하며, CPU/메모리 사용량, 컨테이너 재시작, 노드 상태 등의 정보를 시각화해 줍니다.

장단점

Azure의 모니터링 서비스는 리소스나 데이터 단위로 Pay-as-you-go 방식으로 과금되지만, 다른 Azure 서비스 와의 연결성이 아주 좋아 손쉽게 구축할 수 있으며, 인프라 관점에서 관리 포인트가 적어 운영 효율성을 높이는 데 유리합니다.

Azure Observability 관련 서비스들은 아래와 같이 정리 할 수 있습니다.

제품명

주요 역할

범위

장점

단점

Azure Monitor

Azure 리소스 전반 통합 모니터링

Metrics, Logs

  • Azure 리소스 연계 쉬움

  • Metric 기반 Alert 기능 통합 가능

  • Azure 전용, 멀티클라우드 한계- 세밀한 커스터마이징 제한


애플리케이션 성능(APM) 및 분산 추적

Traces, Logs, Metrics

  • 자동 계측 지원

  • 요청/의존성 추적

  • 빠른 문제 파악 가능

  • 서비스 단위로 다양한 기능 제공

  • UI 복잡- 과도한 데이터 수집 시 비용 증가 가능

Log Analytics Workspace

중앙 로그 수집 및 KQL 기반 분석

Log

  • KQL 기반 강력한 로그 탐색

  • 다양한 Azure내에 데이터 소스 통합 가능

  • KQL 학습 필요

  • 데이터 용량 기반 추가 비용

Container Insights

AKS/Kubernetes 모니터링

Metrics, Log

  • AKS에 최적화

  • 자동 메트릭 수집

  • Azure Monitor 기반

  • 커스터마이징 어려움

Azure Dashboard

시각화 대시보드 구성

시각화 도구

  • 사용자 정의 가능

  • 여러 리소스 통합 표시

  • Azure Portal 내 간편 제공

  • 간편한 사용자별 대시보드 공유

  • 실시간 대시보드로 한계- 외부 데이터 소스 연계 제한

  • 오픈소스(grafana), 상용제품(datadog) 대비 낮은 기능성

Azure VS OpenSource

Azure는 통합된 SaaS 기반 솔루션을 통해 손쉽고 빠르게 Observability 환경을 구축할 수 있는 반면, OpenSource는 벤더 종속을 최소화하면서도 유연하고 확장성 높은 관측 체계를 설계할 수 있습니다. 각각의 접근 방식은 구축 목적, 시스템 복잡도, 운영 조직의 역량에 따라 장단점이 분명히 구분됩니다.

구분

OpenSource (예: OpenTelemetry)

Azure (Monitor, 등)

라이선스/비용

무료, 라이선스 자유

Pay-as-you-go (리소스/데이터 단위 과금)

구축 난이도

직접 설치, 설정 필요

상대적으로 쉬움

운영 관리 포인트

시스템 구축·운영·업데이트 모두 직접 관리

Azure가 인프라 관리, 관리 포인트 최소화

유연성/커스터마이징

코드 수준 커스터마이징 가능, 매우 유연함

일부 제한, Azure 환경에 최적화

멀티클라우드/온프렘 지원

기본 지원 (벤더 종속 없음)

Azure 전용 서비스 위주

장점 요약

비용 절감, 벤더 독립성, 유연한 아키텍처

쉬운 구축, 빠른 운영 시작, 관리 최소화

단점 요약

높은 학습 곡선, 직접 운영 부담

비용 발생, Azure 종속성


구축, 운영시 유의점

Application Insights는 데이터 저장소로 Log Analytics Workspace를 사용합니다. Log Analytics Workspace의 비용 정책은 Pay-as-you-go 방식이기 때문에, 대규모 서비스의 경우 샘플링 기능을 활성화하는 것이 비용 효율성을 높일 수 있습니다. 예를 들어, error 발생 시 100%, info 발생 시 10%의 비율로 데이터를 저장하도록 서비스 내의 Agent에서 샘플링 비율을 조정하는것이 효율적일 것입니다.

Log Analytics Workspace

각 리소스별 진단 설정을 했을 때 리소스를 사용량이 많은경우 Pay-as-you-go 정책에 따라 과금량이 급증 할 수 있습니다. 진단 설정의 경우 샘플링 기능이 없기 때문에 리소스의 로그 생성이 많은 리소스인 경우 진단 설정을 제외하거나, 만약 제외 할 수 없는 경우라면 해당 리소스가 생성하는 log가 저장되는 table의 retention 기간, archive 기간을 조절하는것이 필요합니다.

Observability 구축

현재 AI 플랫폼에서는 여러 프로젝트들이 Azure 서비스를 기반으로 Observability가 구축되어 있습니다.

샘플 프로젝트에서 를 이용한 기본적인 Observability 구축 방법AI 플랫폼의 하나의 프로젝트를 예시로 Observability에 대해 설명하고자 합니다.

샘플 프로젝트

샘플 프로젝트에서는 API Management Service, Container Apps, SQLite를 사용하여 특정 서비스를 구축한다고 했을 때 Observability를 구축하는 방법에 대해 설명하겠습니다.

Application Insights 사용

Azure Observability 서비스들 중에서 Application insights를 사용하여 MSA 아키텍처에서의 API 요청 Metric, Trace, Log 확인을 예제로 보여드리겠습니다.

다음은 예제로 구성한 데모 아키텍처의 호출 시퀀스 다이어그램입니다. 사용자 요청은 Azure API Management를 통해 Spring Boot 기반의 Container App으로 전달되고, 해당 애플리케이션은 내부적으로 요청받은 사용자 정보를 SQLite에 저장한 후 응답을 반환합니다.


3.png


그림 3.1 데모 시퀀스 다이어그램


Java Agent 설정

application insights로 metric, trace, log 데이터를 전송하기 위해 agent 설정이 필요합니다.

Agent jar 파일 다운로드

아래 링크에서 용 OpenTelemetry Java Agent를 다운로드합니다:


Releases · microsoft/ApplicationInsights-Java

wget https://github.com/microsoft/ApplicationInsights-Java/releases/latest/download/applicationinsights-agent-3.x.x.jar -O applicationinsights-agent.jarconnection string 확인 및 추가

application insights 연결시 connection string으로 인증을 하게 됩니다.

java application 시작시 환경변수로 connection string을 읽을 수 있도록 connection string을 환경변수로 설정하거나 image를 build하는 경우 Dockerfile의 환경변수에 추가합니다.

ENV APPLICATIONINSIGHTS_CONNECTION_STRING="InstrumentationKey=YOUR_INSTRUMENTATION_KEY"실행 커맨드 변경

어플리케이션 실행시 -javaagent 옵션을 추가해야 합니다.

java \ -javaagent:appinsight/applicationinsights-agent-3.7.3.jar \ -jar /app/app.jaragent 동작 확인

agent가 정상 동작한다면 아래와 같이 어플리케이션 실행 시 console log에서 c.m.applicationinsights.agent 패키지에서 생성되는 log를 확인 할 수 있습니다.

TypeScript
2025-06-02 16:08:02.813+09:00 INFO  c.m.applicationinsights.agent -  Java Agent 3.7.1 started successfully (PID 20150, JVM running for 6.13 s)
2025-06-02 16:08:02.814+09:00 INFO  c.m.applicationinsights.agent - Java version: 21.0.6, vendor: Microsoft, home: /Library/Java/JavaVirtualMachines/microsoft-21.jdk/Contents/Home
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.4.2)
2025-06-02T16:08:03.238+09:00  INFO 20150 --- [order-service] [           main] c.k.o.o.OrderServiceApplication          : Starting OrderServiceApplication v0.0.1-SNAPSHOT using Java 21.0.6 with PID 20150 (/Projects/opentelemetry-demo/order-service/build/libs/order-service-0.0.1-SNAPSHOT.jar started by chpark in /Projects/opentelemetry-demo/order-service)
2025-06-02T16:08:03.245+09:00  INFO 20150 --- [order-service] [           main] c.k.o.o.OrderServiceApplication          : The following 1 profile is active: "dev"
2025-06-02T16:08:03.635+09:00  INFO 20150 --- [order-service] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-06-02T16:08:03.714+09:00  INFO 20150 --- [order-service] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 74 ms. Found 1 JPA repository interface.
2025-06-02T16:08:04.017+09:00  INFO 20150 --- [order-service] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

확인 결과

GUI를 이용한 End-to-end transaction 확인

POST /api/v1/users 경로로 api 요청을 했을 때 application insights에서 전체 transaction 요청을 추적 할 수 있는 기능을 제공합니다.

아래에서 보이듯이 apim → container apps → sqlite 순으로 요청되는 Trace를 볼 수 있고 각 구간별 소요 시간 및 상세 정보 또한 확인 할 수 있습니다.


4.png

그림 3.2 end-to-end transaction 조회


KQL을 이용한 log, Trace, Metric 확인

에서는 Log Analytics workspace를 이용하여 log, metric, trace를 테이블 형태로 저장합니다.

데이터가 저장되는 각 테이블은 다음과 같이 확인할 수 있습니다:

  • traces: 애플리케이션에서 출력한 로그 메시지를 저장합니다 (console log, 커스텀 log 등).

  • requests: 수신된 HTTP 요청의 메타데이터와 상태 정보를 저장합니다.

  • dependencies: 외부 서비스나 데이터베이스에 대한 호출 정보를 저장합니다.

  • exceptions: 애플리케이션에서 발생한 예외 정보를 저장합니다.

  • pageViews: 웹 애플리케이션의 페이지 뷰 정보를 저장합니다.

  • customEvents: 사용자가 정의한 이벤트 데이터를 저장합니다.

  • availabilityResults: 가용성 테스트의 결과를 저장합니다.

  • performanceCounters: 서버의 성능 지표(CPU, 메모리 등)를 저장합니다.

  • metrics: 사용자 정의 또는 자동 수집된 메트릭 데이터를 저장합니다.

이 문서에서는 traces, requests 테이블에 대해서만 설명하겠습니다. 자세한 내용은 참조된 Azure 공식 문서에서 확인할 수 있습니다.


Application Insights telemetry data model - Azure Monitor
 


5.png


그림 3.3 trace 테이블 조회

traces 테이블을 통해 애플리케이션 내부에서 출력된 콘솔 로그나 커스텀 로그를 실시간으로 확인할 수 있습니다. 위 그림에서는 사용자 생성 API(/api/v1/users)가 호출될 때 HelloController에서 기록한 로그를 확인할 수 있습니다. 로그에는 요청한 유저의 정보와 함께 요청을 처리한 스레드 정보, 로거 이름 등 다양한 customDimensions 데이터도 함께 기록되어 있어서 문제 분석 시 매우 유용합니다.


6.png


그림 3.4 requests 테이블 조회

requests 테이블은 외부에서 들어온 HTTP 요청의 이력을 기록합니다. 요청의 URL, 메서드, 성공 여부, 응답 코드를 포함하여 API 호출의 전반적인 흐름을 확인 할 수 있습니다. 위 그림에서는 API Management와 Azure Container Apps 두 곳에서 /api/v1/users API가 호출되었고, 모두 성공적으로 응답되었음을 확인할 수 있습니다.


Observability In Project

아래와 같이 AI Platform 내에 하나의 프로젝트에서는 Azure의 AKS, API Management Service, Postgres등 여러 리소스를 사용하고 있습니다.

7.png


그림 4.1 Service Architecture

위 서비스들의 호출 상관 관계, api별 평균 호출 시간등 의 기능을 이용하여 확인 할 수 있습니다.

아래 처럼 서비스 개발자는 application map을 이용해 전체 모듈간의 호출 상관 관계를 다이어그램으로 손쉽게 확인 합니다. 또한 transaction search를 이용해 개별 api transaction을 확인 하고 있습니다.

8.png


그림 4.2 Application Map

정리하며

Observability는 단순한 모니터링을 넘어, 시스템의 내부 동작을 깊이 있게 이해하고 예기치 못한 문제를 조기에 탐지하는 데 필수적인 요소입니다. 특히 MSA 아키텍처처럼 복잡도가 높은 환경에서는 로그, 지표, 트레이스를 통합적으로 분석할 수 있는 관찰 체계가 반드시 필요합니다.

Azure는 와 같은 도구를 통해 개발자와 운영자가 애플리케이션의 상태를 직관적으로 파악하고, 문제의 원인을 빠르게 분석할 수 있도록 강력한 Observability 기능을 제공합니다. Azure 뿐만 아니라 OpenTelemetry 기반으로 Observability를 도입해 본다면, 운영 효율성과 장애 대응력이 크게 향상될 것입니다.


참고자료

Application Insights에서 OpenTelemetry 사용 - Azure Monitor

구성 옵션 - Java용 Azure Monitor Application Insights - Azure Monitor

TraceContext 표준 문서 Trace Context

Log Analytics cost optimization Log Analytics 작업 영역에서 데이터 보존 관리 - Azure Monitor

Azure Monitor cost optimization Azure Monitor의 비용 최적화 - Azure Monitor

박철호

AI Platform Engineering팀에서 Azure AI Platform을 구축 및 운영을 담당하고 있습니다.