Modulo의 현재 아키텍처
k6로 부하 테스트를 진행하기 전에, 먼저 프로메테우스와 그라파나를 사용하여 모니터링을 구축하기로 하였다.
왜?
현재 Nginx, Spring Server, RDS 등 여러 서버로 분산된 환경에서 통합적인 모니터링의 필요성을 느꼈다. 향후 서비스 규모가 확장될 것을 고려하여(제발 확장하게 해줘), 중앙 집중식 모니터링 시스템 구축이 운영 효율성 측면에서 더 적합하다고 판단했다.
S3는 왜 모니터링 안해?
S3는 정적 파일 저장소로만 사용되고 있어 AWS CloudWatch의 기본 메트릭 모니터링으로 충분하다고 판단하여, 프로메테우스와 그라파나 모니터링 대상에서 제외했다.
서버에 배포를 해야하는 이유?
가장 큰 이유는 백엔드에 나 혼자 있다라는 것이다. 나 혼자 있어서 이걸 배포할 이유를 크게 찾지 못했고, ec2를 하나 더 띄우면 돈이 돈인지라 로컬에서 띄우기로 했다.
원래는 로컬에서 메트릭을 수집해서 시각하려고 했으나, 로컬 컴퓨터가 꺼져있으면 프로메테우스가 메트릭을 pull해오지 않아 그 시간동안의 메트릭이 유실된다는 문제가 생겼다. 프론트가 완성되기 전까지는 로컬에서 사용하다가, 실제 운영 환경이 오면 그때 EC2에 배포할 예정이다
모니터링 환경 구축하기
#docker-compose.yml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
restart: unless-stopped
networks:
- monitoring
depends_on:
- mysqld_exporter
- nginx_exporter
mysqld_exporter:
image: prom/mysqld-exporter:latest
container_name: mysqld_exporter
ports:
- "9104:9104"
command:
- "--mysqld.username={username}:{password}"
- "--mysqld.address={database url}"
restart: unless-stopped
networks:
- monitoring
nginx_exporter:
image: nginx/nginx-prometheus-exporter:0.10.0
container_name: nginx_exporter
ports:
- "9113:9113"
command:
- "-nginx.scrape-uri={nginx base url}/metrics"
restart: unless-stopped
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3001:3000"
# volumes:
# - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources
# - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards # 서버에 올리기 전까지는 volume에 저장 안함
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_SECURITY_ADMIN_USER=admin
- GF_USERS_ALLOW_SIGN_UP=false
restart: unless-stopped
networks:
- monitoring
depends_on:
- prometheus
networks:
monitoring:
driver: bridge
# grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
# prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'mysqld'
static_configs:
- targets: ['mysqld_exporter:9104']
scrape_interval: 5s
- job_name: 'nginx'
static_configs:
- targets: ['nginx_exporter:9113']
scrape_interval: 5s
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['{spring server base url}:8080']
scrape_interval: 5s
위와 같이 설정하고, docker compose up을 하고, 대시보드를 구성하면 localhost:3001에 접속하면 다음과 같은 화면이 나오는 것을 볼 수 있다.
마주쳤던 에러
- failed to validate config" section=client err="no user specified in section or parent"
알고보니 DATA_SOURCE_NAME이 무시되서 에러가 발생한 경우였다. 다음 링크를 참고하여 오류를 해결할 수 있었다.
https://github.com/prometheus/mysqld_exporter/issues/750 - 다음과 같은 화면이 나옴
No Data여서 메트릭이 수집되지 않는줄 알았는데, 아무리 생각해도 문제가 될것이 없었다. 프로메테우스에서도 확인해보니 State가 UP이기도 했고,, 마지막 방법으로 쿼리를 날려봤더니 바로 처음 사진처럼 된 것을 볼 수 있었다.
'[프로젝트] Modulo' 카테고리의 다른 글
운영환경, 개발환경 분리하기 (0) | 2025.01.07 |
---|---|
MAU 측정하기(비관락, 낙관락, Write back) (0) | 2025.01.05 |
[TEST] Domain 계층의 테스트를 작성하며 (2) | 2024.12.17 |
[TEST] 테스트 커버리지 측정( 100% 달성 목표) (1) | 2024.12.15 |
Modulo 기획을 시작하다 (1) | 2024.12.12 |