엔지니어링

Elastic Observability 배포의 일부로 무료 개방형 Elastic APM 추가

최근 포스팅에서는 Elastic Observability의 무료 개방형 계층을 시작하는 방법을 다루었습니다. 아래에서는, 애플리케이션 성능 모니터링(APM) 또는 Observability 클러스터의 "추적" 데이터에서 무료로 메트릭 수집을 시작할 수 있도록 배포를 확장하기 위해 수행해야 하는 작업에 대해 상세히 설명해 보겠습니다.

APM이란 무엇인가?

애플리케이션 성능 모니터링을 사용하면 애플리케이션이 시간을 보내는 위치, 수행하고 있는 작업, 호출 중인 다른 애플리케이션 또는 서비스, 발생하고 있는 오류 또는 예외를 확인할 수 있습니다.

distributed-trace.png

또한 APM을 통해 대기 시간 및 처리량과 같은 주요 성능 지표의 내역과 추세, 트랜잭션 및 종속성 정보를 확인할 수 있습니다.

ruby-overview.png

SLA 위반에 대한 경보를 설정하거나, 최신 릴리즈의 영향을 측정하거나 다음에 개선해야 할 부분을 결정하는 경우에도, APM은 근본 원인 분석을 지원하여 사용자 경험을 개선하고 MTTR(평균 해결 시간)을 0으로 단축하도록 지원할 수 있습니다.

논리적 아키텍처

Elastic APM은 Elastic Agent 내부의 APM 통합에 의존합니다. 이 통합은 APM 에이전트로 설치된 애플리케이션에서 Elastic Observability 클러스터로 애플리케이션 추적 및 메트릭 데이터를 전달합니다. Elastic APM은 다음과 같이 다양한 에이전트 옵션을 지원합니다.

  • Java, .NET, Go, Ruby, Python, Node.js,  PHP 및 클라이언트 측 JavaScript 및 클라이언트 사이드 JavaScript를 비롯한 여러 언어에서 사용할 수 있는 네이티브 Elastic APM 에이전트
  • OpenTelemetry로 계측된 코드
  • OpenTracing으로 계측된 코드
  • Jaeger로 계측된 코드

이 블로그에서는, 네이티브 Elastic APM Python 에이전트를 사용하여 코드를 계측하는 방법에 대한 간단한 예를 제공해 드릴 것입니다. 그러나 전반적인 단계는 다른 언어에서도 유사합니다.

Elastic APM AgentElastic Agent 사이에는 강력한 차이가 있습니다. 위의 다이어그램에서 볼 수 있듯이, 이러한 구성 요소는 매우 다르기 때문에 혼동하지 않는 것이 중요합니다.

Elastic Agent 설치

첫 번째 단계는 Elastic Agent를 설치하는 것입니다. Fleet을 먼저 설치해야 합니다. 또는 Elastic Agent 독립 실행형을 설치할 수 있습니다. 이 안내서에 따라 Elastic Agent를 설치합니다. 그러면 여러분이 도달할 수 있는 APM 통합 엔드포인트가 제공됩니다. Elastic Cloud에서는 APM 통합을 호스팅하기 때문에 이 단계가 없습니다. 다음을 실행하여 Elastic Agent가 실행 중인지 확인합니다.

curl <ELASTIC_AGENT_HOSTNAME>:8200

Elastic APM 에이전트를 사용하여 샘플 코드 계측

다양한 언어 에이전트에 대한 지침은 프로그래밍 언어에 따라 다르지만, 높은 수준에서는 유사한 흐름을 가집니다. 먼저, 언어의 기본 사양에서 에이전트에 대한 종속성을 추가한 다음 APM 통합을 찾는 방법을 알려주도록 에이전트를 구성합니다.

원하는 모든 옵션을 사용해 볼 수 있지만, 제가 만든 이 Python 예제를 사용하여 Python 지침을 자세히 살펴보겠습니다.

샘플 코드 가져오기(또는 여러분의 자체 코드 사용)

시작하려면, GitHub 리포지토리를 복제한 후 다음 디렉터리로 변경합니다.

git clone https://github.com/davidgeorgehope/PythonElasticAPMExample
cd PythonElasticAPMExample

종속성을 추가하는 방법

Elastic APM 종속성을 추가하는 것은 간단합니다. GitHub 리포지토리 에서 app.py 파일을 확인하면 다음 코드 줄이 표시됩니다.

import elasticapm
from elasticapm import Client

app = Flask(__name__)
app.config["ELASTIC_APM"] = { "SERVICE_NAME": os.environ.get("APM_SERVICE_NAME", "flask-app"), "SECRET_TOKEN": os.environ.get("APM_SECRET_TOKEN", ""), "SERVER_URL": os.environ.get("APM_SERVER_URL", "http://localhost:8200"),}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])

Flask를 위한 Python 라이브러리는 트랜잭션을 자동 검색할 수 있지만, 이 예제에서 수행한 것처럼 다음과 같이 코드로 트랜잭션을 시작할 수도 있습니다.

@app.route("/")
def hello():
client.begin_transaction('demo-transaction')
client.end_transaction('demo-transaction', 'success')

에이전트 구성

에이전트는 애플리케이션 추적 데이터를 APM 통합으로 전송해야 하며, 이를 위해서는 애플리케이션 추적 데이터에 연결할 수 있어야 합니다. 로컬 호스트의 IP에서 수신하도록 Elastic Agent를 구성하여 서브넷의 모든 항목이 여기로 데이터를 전송할 수 있도록 했습니다. 아래 코드에서 알 수 있듯이, docker-compose.yml을 사용하여 환경 변수를 통해 구성을 전달합니다. 여러분의 자체 Elastic 설치를 위해 이러한 변수를 편집하세요.

# docker-compose.yml
version: "3.9"
services:
flask_app:
build: .
ports:
- "5001:5001"
environment:
- PORT=5001
- APM_SERVICE_NAME=flask-app
- APM_SECRET_TOKEN=your_secret_token
- APM_SERVER_URL=http://host.docker.internal:8200

위에 대한 몇 가지 설명:

  • service_name: 이 항목을 생략하면 애플리케이션 이름만 기본값으로 지정되지만 여기서 이 이름을 재정의할 수 있습니다
  • secret_token: 비밀 토큰을 사용하면 APM 서버에 대한 요청을 승인할 수 있지만, APM 서버에 SSL/TLS가 설정되어 있고 비밀 토큰이 설정되어 있어야 합니다. 우리는 에이전트와 APM 서버 간에 HTTPS를 사용하고 있지 않기 때문에, 이것을 주석 처리하겠습니다.
  • server_url: 이렇게 하면 에이전트가 Elastic Agent 내부의 APM 통합에 도달할 수 있습니다. Elastic Agent를 실행하는 호스트의 이름 또는 IP로 이를 대체합니다.

이제 구성의 Elastic APM 측면이 완료되었으므로, README 의 단계에 따라 시작하면 됩니다.

docker-compose up --build -d

빌드 단계는 몇 분 정도 걸립니다.

실행 중인 샘플 애플리케이션으로 이동하려면 http://localhost:5001을 방문하세요. 샘플은 많지 않지만, 약간의 APM 데이터를 생성합니다. 약간의 부하를 생성하기 위해, 몇 번 다시 로드하거나 간단한 스크립트를 실행할 수 있습니다.

#!/bin/bash
# load_test.sh
url="http://localhost:5001"
for i in {1..1000}
do
  curl -s -o /dev/null $url
  sleep 1
done

이렇게 하면 매초마다 페이지가 다시 로드됩니다.

Kibana로 돌아가서, APM 앱으로 다시 이동하면(햄버거 아이콘, 그리고 나서 APM 선택) 새로운 flask-app 서비스가 표시됩니다(저의 것을 실행시켜 조금 더 많은 기록을 보여줍니다).

서비스 개요 페이지에서는 서비스 상태를 한 곳에서 한눈에 볼 수 있습니다. 개발자 또는 SRE인 경우, 다음과 같은 질문에 대답하는 데 도움이 되는 페이지입니다. 

  • 새로운 배포가 성능에 어떤 영향을 미치나요?
  • 영향을 가장 많이 받는 트랜잭션은 무엇인가요?
  • 기본 인프라와 성능이 어떤 상관 관계가 있나요?

이 보기는 지정된 시간(이 경우, 최근 15분) 내에 애플리케이션 추적 데이터를 Elastic APM으로 전송한 모든 애플리케이션의 목록을 제공합니다. 대기 시간, 처리량 및 오류율에 대한 미니 그래프를 보여주는 스파크라인도 있습니다. flask-app을 클릭하면 서비스 내의 다양한 트랜잭션을 보여주는 서비스 개요 페이지로 이동합니다(트랜잭션 섹션에서 볼 수 있듯이, 제 스크립트가 / 엔드포인트에 도달하고 있음을 기억하세요). 대기 시간, 처리량, 오류오류율에 대한 그래프를 더 크게 얻을 수 있습니다.

실제 애플리케이션을 계측하고 있을 때, 실제 로드에서 훨씬 더 많은 연결(및 오류!)을 확인할 수 있습니다

트랜잭션 보기에서 트랜잭션(이 경우 샘플 앱의 demo-transaction )을 클릭하면, 정확히 어떤 작업이 호출되었는지 확인할 수 있습니다.

여기에는 데이터베이스 쿼리와 같은 외부 서비스 호출에 대한 자세한 정보가 포함됩니다.

이제 그 다음은?

이제 Elastic Observability 클러스터를 실행하고 기본 제공 애플리케이션 추적 데이터를 수집했으므로, 애플리케이션이 사용 중인 언어에 대한 공용 API를 탐색하여 APM 데이터를 한 단계 업그레이드할 수 있습니다. API를 사용하면 사용자 정의 메타데이터를 추가하고, 비즈니스 트랜잭션을 정의하고, 사용자 정의 스팬을 생성하는 등의 작업을 수행할 수 있습니다. 다양한 APM 에이전트(Java, Ruby, Python 등)에 대한 공용 API 사양은 APM 에이전트 설명서 페이지에서 확인할 수 있습니다. 

Elastic APM에 대해 자세히 알아보려면, 클라우드 네이티브로 전환되는 Elastic APM에 대한 Elastic의 웨비나를 참조하여 Elastic APM이 에코시스템에서 도움이 될 수 있는 다른 방법을 알아보세요.

Elastic이 여러분의 Observability 클러스터를 호스팅하도록 하기로 결정하신 경우, Elastic Cloud의 Elasticsearch Service 무료 체험판에 등록하고 에이전트를 변경하여 새 클러스터를 가리키도록 할 수 있습니다.

원래 2021년 5월 5일에 게시되었으며, 2023년 4월 6일에 업데이트되었습니다.