Elastic Stack을 사용해 로그와 APM 추적을 손쉽게 상호 연관시켜 통합 가시성을 향상하는 방법 | Elastic Blog
엔지니어링

로그와 APM 추적을 손쉽게 상호 연관시켜 통합 가시성을 향상하는 방법

애플리케이션 성능 모니터링(APM)과 로깅은 모두 에코시스템에 대한 중요한 인사이트를 제공합니다. 이를 컨텍스트와 함께 사용하면 애플리케이션의 문제를 해결하는 방법에 대한 중요한 단서를 확보할 수 있습니다.

분석 대상인 로그 데이터가 점점 더 복잡해짐에 따라 기존 도구로는 관련 데이터를 찾는 것이 어려울 수 있습니다. Elastic Stack에서 지원하는 Elastic Observability를 사용하면 Kibana에서 클릭 몇 번으로 로그를 APM과 상호 연관시킬 수 있습니다. 웹 앱의 특정 트랜잭션에 대해 사용자가 요청한 내용과 연관된 로그를 손쉽게 확인할 수 있습니다.

Elastic APM에서 추적 로그 확인

다음은 Elastic APM의 스크린샷으로, 특정 트랜잭션과 관련된 모든 작업의 세부 항목을 보여줍니다. Actions를 클릭하고,

Elastic APM에서 추적 샘플의 오른쪽 위에 있는 [Actions]를 클릭합니다.

Show trace logs를 선택하면,

[Show trace logs]를 클릭합니다.

다음과 같은 화면이 표시됩니다.

이제 Elastic APM에서 추적과 연결된 로그를 볼 수 있습니다.

이러한 메시지는 해당하는 특정 트랜잭션과 관련된 추가 세부 정보입니다. 이러한 종류의 추가 정보는 APM 또는 다른 모니터링 유형에는 적합하지 않으므로 로그로만 제공할 수 있습니다. 다양한 모니터링 기능을 통합하는 Elastic Stack 덕분에 이제 트랜잭션에 세부 정보를 추가할 수 있는 뛰어난 유연성을 갖추게 되었습니다. 서로 다른 유형의 데이터를 하나의 데이터 저장소에 저장하면 조사를 신속하게 진행할 수 있습니다.

Elastic APM Python 에이전트 설치 및 구성

‘정말 훌륭한 기능이지만 내 시스템에서 비슷한 결과를 얻으려면 어떻게 해야 하지?’라고 생각하실 수도 있습니다.

예제를 통해 로그와 APM 추적을 통합하는 방법을 살펴보겠습니다. 다음은 위의 스크린샷에 나온 Python 앱의 관련 코드입니다. 사용자가 앱에 요청을 할 때마다 정보를 추가할 수 있는 방법이 필요합니다.

먼저 기본적으로 Elastic APM Python 에이전트를 설치해야 합니다. 이를 종속성으로 추가하겠습니다. Flask 앱으로, 종속성 이름 뒤의 대괄호 안에 [flask]라고 표시되어 있는 것을 볼 수 있습니다. 지원되는 각 프레임워크에 대한 자세한 내용은 Python 에이전트 설명서에서 확인하세요.

# requirements.txt 참조 
elastic-apm[flask]==5.3.3

먼저 가져오기가 적절하게 적용되었는지 확인하겠습니다.

# app.py 참조 
import logging 
from elasticapm.contrib.flask import ElasticAPM 
from elasticapm.handlers.logging import Formatter

그런 다음 정보를 APM 서버로 보내도록 Python 에이전트를 구성하겠습니다.

# app.py 참조 
app = Flask(__name__)  # 평소대로 앱 초기화 
app.config['ELASTIC_APM'] = { 
  'SERVICE_NAME': 'foodbankhero', 

  # 사용자 정의 APM 서버 URL 설정(기본값: http://localhost:8200) 
  'SERVER_URL': 'http://localhost:8200' 

  #APM 서버에 토큰이 필요한 경우 사용 
  # APM 서버는 보안을 위해 토큰을 요구하도록 구성할 수 있으므로 서드파티에서 임의의 데이터로 장애를 일으킬 수 없음 
  # 'SECRET_TOKEN': '' 
} 
apm = ElasticAPM(app)  # APM으로 Flask 앱을 계측하는 코드

로그 구성

이제 위의 스크린샷과 같이 APM 추적과 상호 연관될 수 있도록 로그를 구성해 보겠습니다.

# app.py 참조 
fh = logging.FileHandler('foodbankhero.log') 

# 앞서 Python 에이전트에서 사용자 정의 포맷터를 가져왔습니다 
formatter = Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
fh.setFormatter(formatter) 
logging.getLogger().addHandler(fh) 

# … 앱의 어딘가에 존재 ... 
logging.getLogger().info(‘Foodbank {} needs {} items’.format(id, len(items))) 
logging.getLogger().info(‘Returning {} foodbank records’.format(len(results)))

다음은 현재 로그가 어떻게 바뀌었는지 보여주는 샘플입니다.

2020-05-12 01:57:14,029 - flask.app - INFO - 172.22.0.1 - - [12/May/2020 01:57:15] "GET / HTTP/1.1" 200 - | elasticapm transaction.id=f31f884b961a6089 trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

이렇게 설정하면 모든 요청에 대한 모든 로그 줄이 추적 정보로 보강되며, 심지어 정적 자산에 대한 요청에도 적용됩니다(앱이 이를 지원하도록 구성된 경우). 예를 들어 다음과 같습니다.

2020-05-12 01:57:14,029 - werkzeug - INFO - 172.22.0.1 - - [12/May/2020 01:57:14] "GET /favicon.ico HTTP/1.1" 404 - | elasticapm transaction.id=f31f884b961a6089  
trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

Elastic APM을 직접 사용해 보세요

기존 사일로를 허물고 컨텍스트를 활용하여 문제를 더 빠르게 해결할 준비가 되셨나요? Elastic Observability를 사용하면 간단하게 데이터를 상호 연관시키고 즉시 필요한 정보를 찾을 수 있습니다.

Elastic APM을 시작하는 것이 얼마나 쉬운지 확인해 보세요. 프로젝트에 코드 몇 줄을 추가하고 Elasticsearch로 데이터 전송을 시작하기만 하면 됩니다. Elastic Cloud의 무료 체험판을 사용하여 로그와 APM을 상호 연관시켜 보세요.