글을 쓰게 된 이유
https://c-king.tistory.com/entry/monitoring-local에서-filebeat-elasticsearch-grafana를-통해-모니터링-구축해보기
위 글과 이어지는 글입니다.
Prolog 모니터링 시스템을 구축하기 위해 먼저 로컬에서 해보았습니다.
이 글을 썼을 때가 7월 6일이어서 방학 이전부터 학습해 왔기 때문에 아마 그전부터 계속해서 학습해 왔습니다.
브라운이 이전 기수 분께 말씀해 주셔서 운이 좋게 모니터링을 구축하면서 질문할 수 있었습니다. 그때 첫 슬랙이 5/30 이어서 그때부터 천천히 해보았던 것 같아요.
레벨 3 프로젝트를 병행하다 보니 저녁 시간에 틈틈이 작업하는 거라 시간이 많이 걸렸던 것 같네요,, 그리고 제 실력 이슈도 있습니다.
지금 7/29일인데 드디어 구축한 모니터링 시스템이 제대로 동작하고 있습니다.
두 달 만에 성공해서 기쁘기도 하고, 이 과정을 기록하지 않으면 바로 휘발될 것 같더라고요.
그래서 이 글을 작성하면서 무엇을 배웠는지 어떻게 문제들을 해결해 나갔는지 작성해보려고 합니다.
현재 상황
현재 프롤로그는 로깅 xml이 작성이 되어 있고,
톰캣은 Prolog-env-dev(이하 DEV), ES는 Prolog-elk-es01-dev(이하 ES)에 떠있습니다.
GitHub Actions에서 테스트 및 빌드를 하여. jar와. ebextensions를 zip 하여 elastic beanstalk을 통해 배포하고 있습니다.
저는 filebeat를 톰캣이 배포된 DEV에 설치하고, ES에 로그를 보낸 뒤, 그라파나가 ES의 로그 인덱스를 읽어서 화면에 보여주게 됩니다.
배포될 때마다 filebeat를 재실행해줘야 하기 때문에. ebextensions에 관련 스크립트를 작성하여 배포해야 합니다.
최종적으로 기능이 완성된다면 아래와 같은 시스템으로 구성될 것입니다.
filebeat 설치
wget <https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.1-linux-x86_64.tar.gz>
tar xzvf filebeat-7.14.1-linux-x86_64.tar.gz
로그 수집기는 각 서버에 발생하는 로그들을 수집하여 ES에 보내줘야 하기 때문에 filebeat는 로그가 저장된 애플리케이션에 존재해야 합니다.
즉, DEV 서버에 설치해야 합니다.
이제 filebeat.yml을 설정해줘야 합니다.
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/app/current/logs/*/*.log
output.elasticsearch:
hosts: [ES서버:포트번호]
이제 백그라운드로 filebeat를 실행해 보겠습니다.
nohup ./filebeat -e &
filebeat가 잘 실행됐는지 로그를 봐야 하는데, 이때 계속해서 업데이트되는 파일을 읽기 위해서 새로운 명령어를 하나 알 수 있었습니다.
vi -c "set autoread" nohup.out
문제 발생
filebeat 로그를 보면 401 에러와 함께 ES에 접근할 수 없다는 로그가 있게 됩니다.
해결
ES에 접근 시도 또는 ES에 rest api를 보낼 경우에는 username, password가 필요합니다.
ES도 하나의 DB이기 때문에 우리가 사용하는 MySQL에 접근할 때도 username, password를 입력하듯이 ES에서도 사용됩니다.
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/app/current/logs/*/*.log
output.elasticsearch:
hosts: <es 서버:<포트번호>>
username: <username> // 추가된 내용
password: <password> // 추가된 내용
그래서 filebeat.yml 에 ES 관련 username, password도 입력해 줍시다.
filebeat의 yml을 수정하게 된다면 재실행해줘야 합니다.
하지만 이미 filebeat가 실행되고 있는데 다시 실행하려면 에러가 발생하기 때문에 기존에 filebeat 프로세스를 kill 하고 나서 재실행해야 합니다.
이때 새로운 명령어 하나를 배웁니다.
ps aux | grep filebeat
ES에 filebeat가 제대로 인덱싱 됐는지 확인
curl -X GET "<http://localhost:9200/_cat/indices?v&pretty>"
ES에 api를 보내며 인덱스를 조회할 수 있습니다.
하지만 여기에서도 ES에 api 를 찌를 때, username, password가 필요하기 때문에 앞에 명시해줘야 합니다.
curl -u <username>:<password> -X GET "<http://localhost:9200/_cat/indices?v&pretty>"
기록을 위해서 인덱스 삭제 명령어도 적어놓겠습니다.
curl -u <username>:<password> -X DELETE "<http://localhost:9200/my_index_name>"
인덱스를 조회했을 때 filebeat ~~ 로 시작하는 인덱스가 있으면 성공한 것입니다.
그라파나 설치
wget https://dl.grafana.com/oss/release/grafana_8.2.6_amd64.deb
sudo dpkg -i grafana_8.2.6_amd64.deb
sudo systemctl start grafana-server
그라파나 재시작
sudo systemctl enable grafana-server.service
그라파나 상태 확인
sudo systemctl status grafana-server
그라파나 설정
URL 은 [private ip]:[포트 번호]로 입력,
그리고 DEV ES는 basic auth를 사용하고 있으므로 user와 password를 입력해야 합니다.
MySQL username, password처럼요.
filebeat의 인덱스와 버전, Time field name에는 시간을 나타내는 Key를 입력해 주면 됩니다.
지금까지 운영서버, ES서버에서 직접 명령어를 통해 filebeat, ES, grafana를 설치한 후에 연결시켜 보았습니다.
다음에는 이제 프롤로그에서 사용하고 있는 elastic beanstalk를 통해 자동 배포를 해보도록 하겠습니다.
'Infra' 카테고리의 다른 글
[prolog] prolog 에 로그 모니터링 시스템 구축기(2) (2) | 2023.08.02 |
---|---|
[monitoring] local에서 filebeat + elasticsearch + grafana를 통해 모니터링 시스템 구축해보기 (2) | 2023.07.06 |
[Flyway] Flyway 사용해보기 (0) | 2023.06.07 |
[GitHub Actions] GitHub Actions + Docker를 이용하여 CI/CD (0) | 2022.05.22 |