2018년 10월 31일 엔지니어링

Elastic APM에서 Logstash나 Kafka를 통해 데이터를 전송하는 방법

By Gil Raphaelli

최신 배포 환경에서 애플리케이션 서버는 수명이 짧거나 메시지 큐 및 데이터베이스와 같은 다른 구성 요소보다 신뢰도가 낮은 하드웨어(비선점성/낮은 우선순위의 VM, 스팟 인스턴스)를 사용하는 경우가 많습니다. 이러한 경우에는 데이터를 신뢰도가 보다 높은 시스템으로 신속하게 전송하는 것이 최선입니다.

6.4.0 릴리즈부터 APM 서버에서 Logstash 또는 Kafka로 데이터를 전송할 수 있으므로, 이러한 시스템 중 하나를 통해 신뢰성 요구사항을 충족시킬 수 있습니다. 또한, Logstash를 사용하면 사용 가능한 여러 Logstash 플러그인 중 하나를 사용하여 APM 데이터를 강화할 기회가 됩니다.

여기에서는 구성 단계를 살펴보고 Elasticsearch로 수집하기 전에 다른 시스템을 통해 데이터를 전송할 때 주의해야 할 몇 가지 사항을 검토하겠습니다.

  1. Elasticsearch로 출력하도록 Logstash를 구성합니다
  2. Logstash에 전송하도록 Elastic APM 서버를 구성합니다
  3. Elasticsearch를 구성합니다
  4. 필요하면 소스 맵을 추가합니다
  5. Kafka를 도입합니다

Logstash를 구성합니다

먼저, beats/lumberjack 프로토콜을 사용하여 APM 서버에서 이벤트를 수신하고 Elasticsearch로 보낼 수 있도록 파이프라인을 추가하여 Logstash를 구성합니다.

input {
   beats {
        id => "apm-server"
        port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

색인은 기본 APM 서버 구성으로 생성되는 것과 같이 이벤트 유형(트랜잭션, 스팬 등)별로 매일 생성됩니다. 소스 맵은 여기에 링클을 도입하는데, 나중에 이 포스트에서 다룰 것입니다.

꼼꼼히 살펴보셨다면, beat가 언급될 때 무슨 의미인지 궁금하실 것입니다. APM 서버는 Beats Framework에 구축되어 이벤트 내에서 동일한 메타데이터를 전달합니다. 이는 다른 Beat 데이터와 동일한 Logstash 인스턴스에서 APM 데이터의 처리가 [@metadata][beat] == "apm-server"와 같은 조건문을 사용하여 완료될 수 있음을 의미합니다.

APM 서버를 구성합니다

이제 Logstash가 구성되었으므로 APM 서버의 ‘apm-server.yml’을 업데이트하여 다음과 같은 이벤트를 출력합니다.

output.elasticsearch:
  enabled: false
output.logstash
  enabled: true
  hosts: ["logstash:5044"]

백오프, 프록시 및 ssl 설정 등의 추가 옵션은 Elastic APM 서버 설명서에 자세히 나와 있습니다.

APM 서버에서 모니터링을 활성화한 경우, 다음과 같이 설정해야 합니다.

xpack.monitoring.elasticsearch:
  enabled: true
  hosts: ["elasticsearch:9200"]

이렇게 하면 APM 서버 자체적으로 모니터링이 지속되어 Elasticsearch로 직접 전달됩니다.

Elasticsearch를 구성합니다

하나의 단계만 더 진행하면 APM 서버를 시작할 준비를 갖추게 됩니다. Elasticsearch는 먼저 APM UI가 예상하는 방식으로 APM 데이터를 저장하는 방법을 파악해야 합니다. 이렇게 하려면 색인 템플릿이 필요합니다. 이 템플릿을 불러오는 옵션으로는 두 가지가 있습니다.

Elasticsearch에서 APM 서버를 임시로 가리킬 수 있는 경우, 이는 다음을 통해 가능합니다.

 apm-server setup --template

그렇지 않으면, 먼저 APM 서버에서 템플릿을 내보냅니다.

apm-server export template > apm-6.4.2.tmpl.json

그리고 나서 Elasticsearch로 불러옵니다. Curl을 사용하면 다음과 같이 완료될 수 있습니다.

curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/apm-6.4.2 -d @apm-6.4.2.tmpl.json

이러한 명령은 각 작업에 대한 성공 또는 실패를 보고합니다. 템플릿을 성공적으로 불러왔는지 확인하려면 _template/apm-*에 대한 쿼리 작업을 합니다. 이렇게 하면 다음과 같은 일련의 문서가 반환됩니다.

{
  "apm-6.4.2": {
    "order": 1,
    "index_patterns": [
      "apm-6.4.2-*"
    ],
...

인덱스 패턴은 이전 Logstash 단계에서 구성된 패턴과 일치하다는 점을 눈여겨 보시기 바랍니다. 거기에 더해, 버전 정보가 포함되어 있는 점에 유의하십시오. 즉, 이 설치 단계는 다음과 같아야 합니다.

  1. Logstash에 연결하는 정확히 동일한 버전의 APM Server로 수행됩니다.
  2. APM 서버의 업그레이드 중에 반복됩니다.

사용 시작

이제 APM 서버를 작동시키고 애플리케이션 행동 분석을 시작하십시오.

소스 맵

소스 맵은 난독 처리된 코드를 원래 소스에 다시 매핑하는 데 사용됩니다. 소스 맵은 축소된 자바스크립트를 전환하는 데 가장 자주 사용되는 것으로 나타납니다.

APM 서버 출력이 Elasticsearch가 아닌 경우에는 소스 맵을 특별히 주의해서 취급해야 합니다. APM 서버가 이를 사용하려면 최종적으로 Elasticsearch에 도달하는 방법에 관계없이 해당 위치에 저장되어야 합니다.
소스 매핑 저장 공간을 구성하려면 다음과 같이 ‘rum.source_mapping.elasticsearch’를 설정하십시오.

apm-server:
  rum:
    source_mapping:
      elasticsearch:
        hosts: ["elasticsearch:9200"]
        index_pattern: "apm-*-sourcemap*"

위 내용은 APM 서버에 ‘apm--sourcemap“과 일치하는 인덱스에서 소스 맵을 찾도록 지시합니다.

소스 맵은 Logstash를 통해 업로드할 수 있긴 하지만, 매핑이 필요한 이벤트가 일어나기 전에 저장되도록 배포 프로세스 중에 Elasticsearch로 직접 전송하는 것이 좋습니다. 해당 옵션을 이용하지 않는 경우, 이 포스트에 나오는 Logstash 구성은 소스 맵을 적용할 때 사용하는 기본 인덱스 패턴과 일치하므로, 추가 변경은 필요하지 않습니다.

Kafka에 흐름 도입하기

Kafka는 Elasticsearch로의 전달을 위한 APM 서버에서의 이벤트 출력을 버퍼할 수도 있습니다. Kafka를 통한 간단한 APM 서버 구성은 다음과 같습니다.

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  topics:
    - default: 'apm'
      topic: 'apm-%{[context.service.name]}'

여기에는 서비스별로 주제를 사용하는 것이 나타나 있지만, 꼭 필요한 것은 아닙니다. 설명서에 추가 구성 옵션에 대해 기술되어 있습니다.

이벤트가 Kafka로 흐르고 나면 Logstash를 구성하여 이벤트를 Elasticsearch로 끌어올 수 있습니다. 예:

input {
  kafka {
    id => "apm-server-kafka"
    bootstrap_servers => ["kafka:9092"]
    topics_pattern => "apm.*"
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

다시 한 번 말씀드리지만, 색인은 기본 APM 서버 구성으로 생성되는 것과 같이 이벤트 유형(트랜잭션, 스팬 등)별로 매일 생성됩니다. Logstash Kafka 입력 플러그인에 대한 추가 옵션은 설명서에 기술되어 있습니다.

시험 사용

APM 서버는 Logstash 또는 Kafka를 사용하여 APM 데이터를 보다 유연하게 전송하게 해 줍니다. 직접 시험해 보고 당사의 토론 포럼에 의견을 보내주시기 바랍니다. 또한 여러분의 도움을 언제나 환영합니다. 그러므로 소스 코드]를 확인하고 문제를 보고하거나 요청을 제출하시기 바랍니다.