본문 바로가기

공부방/Elasticsearch

Elasticsearch 모니터링 시스템 구축 일지 - 2편 (Quick start)

APM Guide를 통해서 어떻게 APM을 통하여 모니터링 서비스를 구축할 수 있는지 알아보도록 하겠습니다.

https://www.elastic.co/guide/en/apm/guide/7.17/apm-quick-start.html

 

알아보고자 하는 내용


  • Collect Application Performance Monitoring (APM) data
  • Send APM data to the Elastic Stack
  • Explore and visualize the data in real-time

 

데이터 수집, APM data를 elastic stack에 전송하는 방법, 실시간 시각화 방법을 알아볼 예정입니다.

 

 

 

 

사전 준비


데이터를 저장하고 검색하려면 Elasticsearch가 필요하고 데이터를 시각화하고 관리하려면 Kibana가 필요합니다.

Elasticsearch와 Kibana를 각각 7.17.3 version으로 설치하도록 하겠습니다.

 

Elasticsearch와 Kibana를 각각 설치해줍니다.저는 Windows이기 때문에 windows verison을 다운 받아 압축을 풀어주도록 하겠습니다.

https://www.elastic.co/kr/downloads/past-releases/elasticsearch-7-17-3

https://www.elastic.co/kr/downloads/past-releases/kibana-7-17-3

 

elasticsearch.bat -> kibana.bat 파일을 실행시켜줍니다.

 

 

 

 

 

Fleet 설치전 설정


[ Security 활성화 ]

Fleet을 사용하려면 Security를 활성화 시켜줘야 하는걸로 보입니다.

공식문서를 참고해서 설정을 진행합니다. 

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html

 

기본 및 트라이얼 라이선스를 사용할때 엘라스틱서치 시큐리티 기능은 기본적으로 비활성화되므로 아래 스텝을 따라하여 활성화 해보도록 합니다.  elasticsearch.yml에 xpack.security.enabled을 추가합니다. 기본 및 트라이얼 라이선으를 사용한다면 기본값은 false이다. 만약 골드 혹은 그 이상의 라이선스를 사용한다면 기본값은 true입니다.

 

xpack.security.enabled: true

 

클러스터에 단일 노드가 있는 경우 $ES_PATH_CONF/elasticsearch.yml 파일에 discovery.type 설정을 추가하고 값을 단일 노드로 설정합니다. 이 설정은 노드가 네트워크에서 실행 중일 수 있는 다른 클러스터에 실수로 연결되지 않도록 합니다.

elasticsearch.yml에 discovery.type: single-node를 추가합니다.

 

discovery.type: single-node

 

 

[ 패스워드 생성 ]

클러스터와 통신하려면 기본 제공 사용자의 사용자 이름을 구성해야 합니다. 익명 액세스를 활성화하지 않는 한 사용자 이름과 암호를 포함하지 않는 모든 요청은 거부됩니다. 관리자 권한으로 실행한 powershell에서 ./bin/elasticsearch-setup-passwords auto 명령어를 실행합니다. 패스워드를 자동으로 생성하는 명령어입니다. auto 대신 interactive 옵션을 활용하면 사용자가 원하는 패스워드를 설정할 수 있습니다. 저는 auto옵션을 이용하여 패스워드를 자동으로 생성해보겠습니다.

 

./bin/elasticsearch-setup-passwords auto

 

커맨드가 정상적으로 동작한다면 아래와 같이 패스워드가 생성되는 것을 확인할 수 있습니다.

 

PS D:\tools\elasticsearch-7.17.3> .\bin\elasticsearch-setup-passwords auto
"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME"
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y


Changed password for user apm_system
PASSWORD apm_system = 51dfFXE13FHJ16Nr2mzR

Changed password for user kibana_system
PASSWORD kibana_system = kFdHj26dYhtTFMcnaFUO

Changed password for user kibana
PASSWORD kibana = kFdHj26dYhtTFMcnaFUO

Changed password for user logstash_system
PASSWORD logstash_system = W9Dvxqm63oVFQ6wQDbEm

Changed password for user beats_system
PASSWORD beats_system = gp18uHBFB7eXqGZhaPBG

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = QZq2E6PfVovuzb1o6sk4

Changed password for user elastic
PASSWORD elastic = thbbJuh1spM7ad0bVkMm

 

 

 

[ Elasticsearch와 Kibana 연결 ]

이전에 생성하였던 패스워드 정보를 이용하여 elasticsearch와 kibana를 연결해봅니다. 우선 kibana.yml 파일에 elasticsearch.username: "kibana_system"을 추가합니다.

 

elasticsearch.username: "kibana_system"

 

Kibana를 설치한 디렉터리에서 다음 명령을 실행하여 Kibana 키 저장소를 만들고 보안 설정을 추가합니다. ./bin/kibana-keystore create 명령어를 실행합니다. keystore라는 명령어를 통해서 알 수 있듯이 비밀번호 저장소를 생성하는 명령어입니다.

 

./bin/kibana-keystore create

 

keystore에 이전에 생성해 놓았던 비밀번호를 저장합니다. 저장할 비밀번호는 kibana_system 사용자의 비밀번호입니다.

 

PS D:\tools\elasticsearch-7.17.3> cd ..
PS D:\tools> cd .\kibana-7.17.3\
PS D:\tools\kibana-7.17.3> .\bin\kibana-keystore.bat create
Created Kibana keystore in D:\tools\kibana-7.17.3\config\kibana.keystore
PS D:\tools\kibana-7.17.3> .\bin\kibana-keystore.bat add elasticsearch.password
Enter value for elasticsearch.password: ********************

 

 

 

 

[ Setup Fleet ]

localhost:5601 로 kibana를 접속합니다. 접속하면 아래와 같이 계정을 입력하는 칸이 보일 것입니다. kibana_system 계정을 입력하였지만 접근 권한이 없다고 합니다. kibana_system 은 Elasticsearch에 연결하는 데 사용되는 계정이며. Kibana에 로그인하기 위한 것이 아니라고합니다. elastic 계정을 이용하여 로그인을 할 수 있었습니다.

 

계정정보를 입력해야합니다.

 

 

Fleet을 처음 사용하는 경우 Fleet 서버를 설정하고 추가해야 할 수 있습니다.

Kibana에서 Fleet을 사용하여 APM 데이터를 Elastic Stack으로 가져올 수 있다고 합니다. Fleet 서버를 설정해 보도록 하겠습니다. 

Fleet 설정은 kibana에서 할 수 있습니다. Management > Fleet 으로 이동합니다. Fleet을 사용하기 위해서는

elasticsearch.yml과 kibana.yml에 옵션을 추가해줘야합니다. 아래 설정을 elasticsearch.yml에 추가해줍니다.

 

// elasticsearch.yml
xpack.security.authc.api_key.enabled: true

 

아래 설정을 kibana.yml 파일에 추가해줍니다.

 

//kibana.yml
xpack.security.enabled: true
xpack.encryptedSavedObjects.encryptionKey: "something_at_least_32_characters"

 

[ Set up Fleet ]


Kibana에서 Fleet을 사용하여 APM 데이터를 Elastic stack으로 가져옵니다.

 

To deploy a self-managed Fleet Server, install an Elastic Agent and enroll it in an agent policy containing the Fleet Server integration.

self-managed Fleet Server를 배포하려면 Elastic agent를 설치하고 Fleet Server integration을 포함하는 agent policy에 등록해야합니다.

 

[ process 확인 ]

실행 중인 elastic-agent가 있는지 확인하기 위함입니다. elastic-agent를 실행하지 않았기 때문에 당연히 실행중인 프로세스가 없을 것입니다. window에서는 아래 명령어를 통하여 실행중인 elastic-agent 프로세스를 확인할 수 있습니다.

 

tasklist | findstr elastic

 

elasticsearch와 kibana를 재시작하고, kibana > Management > Fleet 페이지로 이동합니다.  우측 상단에 있는 Fleet setting 버튼을 클릭하고 Fleet server hosts 필드에 Elastic agenet가 Fleet 서버에 연결하는 데 사용할 URL을 지정합니다. Fleet Server를 설치할 호스트 IP를 입력해주면 됩니다.

예 ) http://localhost:8220

 

다음은 Elasticsearch hosts 필드에 Elastic Agent가 데이터를 보낼 Elasticsearch URL을 지정합니다.

예) http://localhost:9200

 

Agents 탭에서 지침에 따라서 Fleet 서버를 추가합니다.

 

 

[ Elastic-agent 프로그램 설치 ]

Fleet Server는 Elastic Agent에서 실행됩니다. 모니터링하려는 다른 호스트가 연결할 수 있도록 중앙 집중식 호스트에 이 에이전트를 설치합니다. 프로덕션에서는 하나 이상의 전용 호스트를 사용하는 것이 좋습니다. 

 

 

[ deployment mode 설정 선택 ]

연습용이기 때문에 간단하게 quick start 모드로 설정해줍니다. 이후 실전에서는 deployment mode를 production 타입으로 진행해 보도록 하겠습니다.

 

 

[ service token 생성 ]

AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODUyNDA5OTA2NDM6UFFVWXdNbldUOS1WcXR1dVZVYk9PZw

 

 

[ Fleet 서버 실행 ]

elastic-agent 폴더에서 아래의 명령어를 실행합니다. 아래의 명령어는 위에서 생성한 service token과 자체 self-signed certificate (자체 서명 인증서?)를 사용하여 Elastic Agent를 Fleet Server로 시작합니다. production deployment 배포를 위해 자체 인증서를 사용하는 방법에 대한 지침은 플릿 및 Elastic Agent 가이드를 참조하면 된다고 합니다.(https://www.elastic.co/guide/en/fleet/7.17/add-a-fleet-server.html

 

.\elastic-agent.exe install   `
  --fleet-server-es=http://localhost:9200 `
  --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODUyNDA5OTA2NDM6UFFVWXdNbldUOS1WcXR1dVZVYk9PZw `
  --fleet-server-policy=499b5aa7-d214-5b5d-838b-3cd76469844e `
  --fleet-server-insecure-http

 

이제 실행중인 elastic-agent가 있는지 확인하기 위해 tasklist | findstr elastic 명령어를 입력해봅니다.

 

tasklist | findstr elastic

 

실행중인 프로세스가 있는 것을 확인할 수 있습니다.

 

 

elastic-agent에 policy를 등록하면 elastic-agent도 실행되고, 폴더도 하나 생성되는 것을 확인할 수 있습니다. 저는 C:prografiles 폴더에 Elastic 이라는 폴더가 생성되었고, 여기에 정보가 저장되어 있는 것 같습니다.

 

 

Kibana를 통해서 Fleet 페이지를 확인하면 Policy가 등록된 것을 확인할 수 있습니다.

 

 

 

 

 

APM integration 추가


다음으로 Elastic Agent에서 사용하는 기본 정책에 APM Integration을 추가합니다. 정책은 Elastic agent 그룹 전체에서 설정을 관리하고 호스트에서 실행되는 다양한 서비스에서 관찰 가능성 데이터를 수집하기 위한 통합을 얼마든지 포함할 수 있습니다.

 

아래와 같은 과정으로 진행하면 됩니다. 총 네가지 스텝을 통해 APM Integration을 추가할 수 있으며 각각의 과정은 아래 그림을 통하여 자세히 확인할 수 있습니다.

Kibana > 1. Add integrations > 2. Elastic APM > 3. APM Integration > 4. Add Elastic APM 

 

1. Add integration 버튼을 클릭합니다.

 

Add integrations 버튼을 클릭합니다.

 

2. Elastic APM 버튼을 클릭합니다.

 

Elastic APM을 클릭합니다.

 

3. APM integrations 버튼을 클릭합니다.

 

APM Integrations를 클릭합니다.

 

Add Elastic APM 버튼을 클릭합니다.

 

Add Elastic APM 버튼을 클릭합니다.

 

 

Elastic APM 통합 추가 페이지에서 APM Server가 수신할 호스트와 포트를 정의합니다. 저는 기본 설정으로 그대로 두었습니다. APM Server가 수신해야할 host와 포트 정보를 추가해주면 됩니다. (APM agent의 domain 주소와 port를 작성하시면 될 것 같습니다.)

 

 

Apply to agent policy 카테고리에는 Default fleet server policy을 선택합니다. (이전에 default fleet server policy로 만들었기 때문에 )저장하고 계속하기를 클릭합니다. Elastic APM integration이 추가되었다는 안내표시가 나타납니다.

 

 

새로 업데이트한 policy를 확인하려면 Fleet > Agent policies > Default policy에 들어가면 확인할 수 있습니다. 제가 설정한 policy는 apm-1 이라는 이름으로 생성된 것을 확인할 수 있습니다.

 

 

 

 

APM agents 설치


APM agent는 서비스와 동일한 언어로 작성됩니다. spring boot 프로젝트로 만들었다면 java 언어로 작성된다는 말인 것 같습니다. 서비스를 모니터링하려면 에이전트를 설치하고 service name, APM Server host 및 Secret token으로 구성해야 합니다.

 

  • service name : APM 통합은 각 APM 에이전트의 구성에 정의된 계측 서비스의 이름을 해당 데이터가 Elasticsearch에 저장되는 인덱스에 매핑합니다. 서비스 이름은 대소문자를 구분하지 않으며 고유해야 합니다. 예를 들어 Foo라는 이름의 서비스와 foo라는 다른 이름의 서비스를 가질 수 없습니다. 서비스 이름에서 특수 문자가 제거되고 밑줄(_)로 대체됩니다.
  • APM server url : APM server가 이벤트를 수신 대기하는 호스트 및 포트입니다. 이는 APM integration을 설정할 때 정의된 호스트 및 포트와 일치해야 합니다.
  • secret token : APM 에이전트와 APM 서버 통신을 위한 인증 방식입니다. 이는 APM Integration을 설정할 때 정의된 비밀 토큰과 일치해야 합니다. (저는 secret token 설정을 추가하지 않았습니다)

 

APM agent를 다운받으라고합니다. dependency로 추가하지말고 반드시 다운로드 받으라고합니다. 가이드 해준것 과 같이 다운로드를 받고 실행해봅니다. 우선 다운로드 받는 방법을 살펴봅니다.  가이드에서 제공해준 링크로 들어가봅니다.

https://central.sonatype.com/search?q=elastic-apm-agent&smo=true 

 

아래와 같은 페이지가 나타날 것인데요 version 버튼을 클릭하고 Browse 링크로 들어가서 ftp에서 jar파일을 다운로드 받아봅시다.

 

version -> Browse 버튼 클릭

 

elastic-apm-agent-1.380.jar 파일을 다운로드 받습니다.

 

jar 파일을 받아봅시다.

 

jar 파일을 실행합니다. elastic-apm-agent는 실행할 프로젝트를 입력해줘야합니다. 간단한 spring boot 프로젝트를 만들어서 같은 폴더에 위치시켜줬습니다. elastic-apm-agent를 아래와 같은 명령어를 실행하려면 폴더 구조는 다음과 같아야 할 것입니다.

 

elastic-apm-agent jar 파일과 my-application jar 파일이 동일한 위치에 존재

 

 

elastic-apm-agent를 실행해줍니다.

 

java -javaagent:./elastic-apm-agent-1.38.0.jar -Delastic.apm.service_name=my-application -Delastic.apm.server_urls=http://localhost:8200 -Delastic.apm.secret_token=abcd -Delastic.apm.application_packages=com.example.springstudy -jar my-application.jar

 

모니터링 결과를 확인해볼 때입니다. kibana > Observability > APM에서 어플리케이션의 상태를 확인할 수 있습니다.