1. 데이터 수집 방식
1.1 데이터 수집 방식
1.1.1 파일을 이용한 수집
어플리케이션에서는 로그를 파일로만 남김
App과는 별도로 파일로부터 수집해서 전송하는 프로세스를 만들어서 전송하는 방식
단점은 서로 다른 것들을 관리하는 대상은 많아지기 때문에 운영 난이도가 높아짐
장점
- App과 Log collector 관심사의 분리(SoC, seperate of concern)가 됨
아키텍처 상으로 역할과 동작이 구분되므로 유연성이 높아짐 - 컨테이너 환경을 이용해서 Log collector 리소스를 분리하면, 수집기 때문에 App에 부하를 주지 않음
단점
- App, Log collector를 별도로 관리해야 함
ex) App은 정상인데, Log collector의 이상으로 App의 이상으로 판단될 수도 있음
1.1.2 Network를 이용한 Push
App에서 직접 Log collector로 TCP, HTTP등의 프로토콜을 이용해서 전송하는 방법
앱에서 네트워크를 직접 Push 하는 방법
필요한 것은 로그파일에 남김
장점
- 로그 전송의 성공, 실패 여부를 App에서 판단할 수 있음
단점
- App의 로직과 로그 전송을 같은 process에서 수행하므로 서로 영향을 미칠 수 있음
- 로그 전송 때문에 App의 부하나 bottleneck 이 있을 수 있음
- 문제를 디버깅하기 복잡해짐
1.1.3 Network를 이용한 polling
App은 시스템의 정보, 로그 정보 등에 대해서 scrap 할 수 있는 채널(network, port, path)만 열어두고,
수집기에 주기적으로 polling 으로 scrap 하는 방식
Log 보다는 Metric(통계정보, 상태정보에 대한 snapshot, 이벤트 발생에 대한 정보X) 수집이 더 적합
장점
- App과 메트릭 수집에 대한 관심사의 분리(SoC)가 이루어짐
- App에서 개발자가 수집에 대한 관리를 할 필요가 없음
- 분산환경, 컨테이너 환경, 자동화된 인프라 환경에서 사용성이 편하고, 확장성이 높음
단점
- Polling 주기나 scrap 시점에 따라서 interval 이 생겨 값이 바뀌므로 특정 순간(이벤트)의 정확한 정보를 보는데는 적합X
1.1.4 어떤 방식을 쓰는 것이 좋을까?
🗣️ : 어차피 파일로 남기는 Warning, Error log를 수집하고 싶어요.
나중에 로그 내용(text)를 찾아서 보고 싶어요.
👩💻 : 로그내용이라면 Metric은 아니고,, 그럼 Polling을 이용한 방식은 탈락!
따라서 파일을 이용한 push 수집 방법이 적절합니다.
🗣️ : 즉시 알람이 와야하는 중요한 이벤트(로그) 또는 로직을 보내야 해요.
👩💻 : 네트워크를 이용한 push 방식이 적절합니다.
🗣️ : 얼마나 요청이 많이 왔는지 통계 정보(Metric)를 보고 싶어요.
👩💻 : 파일 또는 네트워크를 이용한 polling 방식이 적절합니다.
🗣️ : 현재 메모리 사용율, 스레드의 수, 어플리케이션 상태를 보고 싶어요.
👩💻 : 이벤트 자체가 중요한 것이 아니기 때문에 파일 또는 네트워크를 이용한 polling 방식이 적절합니다.
1.2 데이터 수집 Architecture
IT 시스템이 복잡해지고, 분산된 환경, 리소스 매니저를 사용하는 환경이 겹치면서 polling 방식의 활용도가 높아짐
또한 polling을 이용해서 데이터를 수집하기 쉬운 오픈소스인 prometheus(format 과 storage)의 대두가
이 방식을 가속화 시킴
현재 가장 쉽게 무료로 구축할 수 있는 모니터링 시스템은 같은 아키텍처로 구성함
따라서 최근에는 실제 내용의 검색이 필요한 데이터는 파일을 이용한 수집으로,
Metric 정보는 polling을 이용한 scrap 방식으로 구성한다.
Log 저장소로는 Elasticsearch(Opensearch)를, Metric 저장소로는 Prometheus를,
실시간 모니터링 대시보드는 Grafana를, Log 검색은 Kibana(Opensearch Dashboard)로 구성함
2. Prometheus 이해하기
2.1 Promethus 설치
brew install 명령어로 prometheus를 설치해준다.
Prometheus를 동작시킨 후에는, 동작한 호스트의 9090번 포트에 연결한다.
로컬에 설치하였다면, localhost인 http://localhost:9090/ 에 접속해도 된다.
promethues 데이터를 빠르게 조회할 수 있는 GUI툴
prometheus 서버가 남기는 자기 자신의 prometheus metric들이 남아있음
metric 이름을 검색하면 instance(target 정보), job 정보를 확인할 수 있음
이를 promethues.yml에서 확인해보면
prometheus 는 주기적으로 polling, scraping을 하게 됨
파일 정보로 알 수 있듯이 이는 15초단위로 진행됨
evaluation은 모든 룰을 15초 마다 확인하겠다는 것
룰은 여러개의 파일로 관리할 수 있음
하위에있는 파일을 수정하면 인터벌 마다 파일을 긁어서 업데이트된 룰을 반영해줌
scrap config는 스크랩할 대상을 지정해주는 데 job(논리적인 대상의 이름) 단위로 인식하게 됨
localhost:9090으로 스크랩하면 된다고 지정해둠
2.1.1 promethus systemctl 등록
prometheus 를 서비스로 생성하여 관리하는 방법은 이를 systemd로 등록해야한다.
이 부분 잘 모르겠다.. 다시 천천히 도전해보고 작성 예정
2.2 Prometheus Pushgateway 설치하기
2.2.1 다운로드 및 설치
해당 파일을 다운로드 해준다.
linux-amd.64파일은 mac m1칩에서 동작하지 않아서 darwin-amd64로 설치해주었더니 정상적으로 작동한다!
파일이름을 pushgateway로 변경해준다.
push gateway는 http://localhost:9091/에 뜬다. -web ui를 확인할 수 있다.
아직 아무 데이터도 넣지 않았기 때문에 빈 창인 것을 확인할 수 있다.
2.2.3 확인
현재 저장된 메트릭 정보는 /metric path를 활용함
다음 명령어로 some_metric{job="some_job"을 pushgateway에 전송하면
echo "some_metric 3.14" | curl -XPOST --data-binary @- http://localhost:9091/metrics/job/some_job
해당 IP주소에서 데이터를 확인할 수 있다.
2.2.4 pushgateway systemctl 로 등록
prometheus 시스템 등록할때랑 같은 오류가 발생한다ㅠㅠ
원인을 찾아보니 파일이름이 유효하지않거나 파일을 수정할 권한이 없어서 생기는 문제라고 한다.
💡 해결 💡
sudo vi pushgateway.service 명령어로 들어가면 root권한으로 파일을 수정할 수 있다.
해당 옵션을 추가해준 후 :wq! 명령어로 저장한 후 나온다.
Description=Pushgateway
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/pushgateway
--web.listen-address=":9091" \
--web.telemetry-path="/metrics" \
--persistence.interval=5m \
--log.level="info" \
[Install]
WantedBy=multi-user.target
systemctl 명령어로 pushgateway를 실행하려는데.. 여기서부터 막혔다.. 😇
이 부분 해결 후 scrap 세팅을 진행해야겠다
2.2.5 prometheus에서 pushgateway를 scrap 하도록 세팅
누군가 push한 것을 pushgateway자신이 가지고 있기 때문에 프로메테우스가 이를 scrap 하도록 설정해준다.
그렇게 되면 push한 내용도 prometheus가 알게 된다.
📎 참고자료:
mac homebrew 설치 오류해결 : https://psip31.tistory.com/119
VI 에디터 메뉴얼 : https://enginius.tistory.com/82
프로메테우스 systemctl 설정 방법 : https://hippogrammer.tistory.com/256
해당 포스터는 패스트캠퍼스 <한 번에 끝내는 데이터 엔지니어링 초격자 패키지 Online> 강의를 기반으로 작성되었습니다.
'데이터 > 데이터 엔지니어링' 카테고리의 다른 글
[Chapter07] OpenSearch CRUD 실습 (1) | 2023.10.07 |
---|---|
[Chapter 06] 분산시스템의 이해, Zookeeper (1) | 2023.10.01 |
[Chapter 05 | Observability] Grafana로 대시보드 구축하기 (0) | 2023.09.23 |
[Chatper 05 | Observability] Prometheus 이해하기 (0) | 2023.09.23 |
[Chapter 05 | Observability] Observability 기초 개념 (0) | 2023.09.20 |