[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