[Monitoring] Elastic APM 스택 구성하기 (Docker)
Elasticsearch은 모니터링을 위한 자체적인 APM 스택을 제공한다.
Elasticsearch를 로그 및 메트릭 저장소로 활용하고, Kibana를 대시보드로 활용하는 것이다.
흔히 이걸 ELK 스택이라고 부르는데, Elasticsearch + Logstash + Kibana의 축약이다. 사실 여기서 Logstash는 필수요소가 아니다. 빼도 된다.
실제로 의미있는 구성요소는 Elasticsearch + Kibana + APM-Server다.
키바나를 구성하는 방법은 별도 포스트를 참조한다.
https://blog.naver.com/sssang97/223960423534
Integration: APM 세팅
먼저 키바나 페이지에 들어가서 설치를 해줘야하는 확장이 몇개 있다.
apm 대시보드를 만들려면 elastic apm 확장부터 깔아줘야 한다.
integration 들어가서




적당히 깔아준다. 이름 잘 짓고 기본값으로 초기화해도 무방하다.
Integration: Fleet Server 설정
이건 사실 직접 써야하는건 아니다.
하지만 이 도구들로 인해서 필수적인 프리셋이나 애셋들이 설정되기 때문에 깔아줘야 한다.

대충 만들고

이런저런 템플릿들이 잘 설정된걸 봤다면 된 것이다.
APM 서버 구성
그러면 이제 apm 서버를 또 띄워줘야 한다.
이게 agent에게서 trace 정보를 받으면, 그걸 잘 가공해서 elasticsearch에 쌓아주는 역할을 한다.
apm-server:
image: docker.elastic.co/apm/apm-server:8.18.0
container_name: apm-server
command: >
sh -c "
. /config/elastic_password.env
ELASTIC_PASSWORD=$${ELASTIC_PASSWORD}
echo $$ELASTIC_PASSWORD
rm /usr/share/apm-server/apm-server.yml
touch /usr/share/apm-server/apm-server.yml
echo 'apm-server:' >> /usr/share/apm-server/apm-server.yml
echo ' host: \"0.0.0.0:8200\"' >> /usr/share/apm-server/apm-server.yml
echo ' auth:' >> /usr/share/apm-server/apm-server.yml
echo ' secret_token: \"q1w2e3r4\"' >> /usr/share/apm-server/apm-server.yml
echo 'output.elasticsearch:' >> /usr/share/apm-server/apm-server.yml
echo ' enabled: true' >> /usr/share/apm-server/apm-server.yml
echo ' hosts: [\"http://elasticsearch:9200\"]' >> /usr/share/apm-server/apm-server.yml
echo ' username: \"elastic\"' >> /usr/share/apm-server/apm-server.yml
echo \" password: $$ELASTIC_PASSWORD\" >> /usr/share/apm-server/apm-server.yml
echo 'path:' >> /usr/share/apm-server/apm-server.yml
echo ' data: /usr/share/apm-server/data' >> /usr/share/apm-server/apm-server.yml
echo ' home: /usr/share/apm-server' >> /usr/share/apm-server/apm-server.yml
echo ' config: /usr/share/apm-server/config' >> /usr/share/apm-server/apm-server.yml
echo ' logs: /usr/share/apm-server/logs' >> /usr/share/apm-server/apm-server.yml
echo 'logging.level: info' >> /usr/share/apm-server/apm-server.yml
cat /usr/share/apm-server/apm-server.yml
exec apm-server -e
"
volumes:
- ./config:/config:ro
ports:
- "18200:8200"
networks:
- elastic
depends_on:
elasticsearch:
condition: service_healthy
kibana:
condition: service_healthy
이것도 config 관리가 지저분해지긴 한다.
여기서는 에이전트가 쓸 시크릿 토큰을 정의해줘야 한다. elasticsearch와는 연관없는 apm-server 측의 인증 구성이다.
q1w2e3r4을 알아서 잘 고쳐쓸것
큰 오류 없이 잘 실행된다면 되었고
설정한 키로 api도 잘 찔러진다면 또 된 것이다.
저기서 publish_ready가 true여야 한다.
Agent 구성 (Go)
그럼 이제 에이전트 띄워서 쏴보기만 하면 된다.
예제는 go다. 다른것도 다 된다.


sample-app:
build:
context: ./sample-app
dockerfile: Dockerfile
container_name: sample-app
environment:
# Install necessary packages
- ELASTIC_APM_SERVICE_NAME=elastic-apm-sample-app
- ELASTIC_APM_SERVER_URL=http://apm-server:8200
- ELASTIC_APM_ENVIRONMENT=development
- ELASTIC_APM_SECRET_TOKEN=q1w2e3r4
ports:
- "8080:8080"
networks:
- elastic
서비스명, apm-server의 엔드포인트, env, 방금 만든 시크릿까지를 환경변수에 넣어주면 된다.
실행해서 좀 찔러보면
해당 서비스에 해당하는 대시보드가 만들어져있을 것이고

실제 trace나 메트릭도 잘 쌓인 것을 볼 수 있을 것이다.
전체 코드 및 구성 참조
https://github.com/myyrakle/docker-compose/tree/master/elastic-apm
참조
https://www.elastic.co/docs/solutions/observability/apm/get-started
https://stackoverflow.com/questions/71615937/elasticsearch-kibana-docker-compose-value-of-elastic-is-forbidden
https://discuss.elastic.co/t/standalone-apm-server-with-elasticsearch-8-in-docker-not-able-to-connect/319892/2
https://www.elastic.co/guide/en/apm/server/7.15/elasticsearch-output.html
https://www.elastic.co/docs/reference/apm/agents/go/configuration