개발스토리지😃

[스프링] 스프링서버 도커를 활용한 프로메테우스, 그라파나 연동 (3) mysql, redis 연동 본문

모니터링/프로메테우스 + 그라파나

[스프링] 스프링서버 도커를 활용한 프로메테우스, 그라파나 연동 (3) mysql, redis 연동

believekim 2025. 7. 4. 20:05

 

mysql과 redis를 연동하면서 지난번에 연결한 것이 스프링부트가 아니라 서버였다는 것을 깨달았다.
글을 하나 더 써서 스프링부트와 JVM모니터링을 다음 포스팅에 작성해보려고 한다.

 

 

 

1. mysql 접속 권한 부여 설정파일

  • mysql 컨테이너에 접속해 metric을 수집하려면 접속 권한이 필요하기에 작성한 설정파일이다
  • 위치는 그림과 같고 내용은 아래와 같다

 

  • testpass부분이 비밀번호 설정이며 임의대로 작성이 가능하다. docker-compose로 실행되는 부분에서 비밀번호가 맞아야 한다.
CREATE USER IF NOT EXISTS 'exporter'@'%' IDENTIFIED BY 'testpass';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

 

 

2. docker-compose.yml

  • 지난 포스팅에 이어서 작성하기에 전체 파일을 공유했다.
version: "3.9"

services:
  mysql:
    image: mysql:latest
    container_name: hansabal_mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'hansabal'
      MYSQL_USER: 'testuser'
      MYSQL_PASSWORD: 'testpass'
      MYSQL_ROOT_PASSWORD: 'root'
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./config/init-exporter.sql:/docker-entrypoint-initdb.d/init-exporter.sql
    networks:
      - promnet
  redis:
    image: redis:latest
    container_name: hansabal_redis
    ports:
      - 6379:6379
    volumes:
      - ./redis/data:/data
      - ./redis/conf/redis.conf:/usr/local/conf/redis.conf
    labels:
      - "name=hansabal_redis"
      - "mode=standalone"
    restart: always
    command: redis-server /usr/local/conf/redis.conf
    networks:
      - promnet

  prometheus:
    user: "root"
    image: prom/prometheus
    container_name: hansabal_prometheus
    volumes:
      - ./prometheus/config:/etc/prometheus
      - ./prometheus/volume:/prometheus/data
    ports:
      - 9090:9090
    command:
      - '--web.enable-lifecycle'
      - '--config.file=/etc/prometheus/prometheus.yml'
    restart: always
    networks:
      - promnet

  grafana:
    user: "root"
    image: grafana/grafana
    container_name: hansabal_grafana
    ports:
      - 3000:3000
    volumes:
      - ./grafana/volume:/var/lib/grafana
    restart: always
    networks:
      - promnet

  # 그라파나 대쉬보드 ID 1860
  node-exporter:
    image: prom/node-exporter
    container_name: hansabal_node_exporter
    restart: always
    ports:
      - 9100:9100
    networks:
      - promnet

  # 그라파나 대쉬보드 ID 7362
  mysql-exporter:
    image: prom/mysqld-exporter
    container_name: hansabal_mysql_exporter
    ports:
      - 9104:9104
    command:
      - "--mysqld.username=exporter:testpass"
      - "--mysqld.address=hansabal_mysql:3306"
    networks:
      - promnet
    depends_on:
      - mysql

  # 그라파나 대쉬보드 11835
  redis-exporter:
    image: oliver006/redis_exporter
    container_name: hansabal_redis_exporter
    restart: always
    ports:
      - 9121:9121
    networks:
      - promnet
    depends_on:
      - redis
    command:
      - '--redis.addr=redis://hansabal_redis:6379'

networks:
  promnet:
    driver: bridge

 

 

3. mysql-exporter 트러블슈팅

  • .my.cnf 파일이 없는데도 mysqld_exporter가 기본적으로 해당 파일을 참조하려다 실패한 경우에 아래 오류메세지를 받았다.
  • infra라는 폴더 아래에서 파일을 만들어 문제를 해결하고 싶었기에 infra/config/init-exporter.sql을 만들게 되었다.
failed to validate config" section=client err="no user specified in section or parent"

 

  • 다른 해결방법으로 .my.cnf파일을 무시하는 내용을 추가해보기도 했지만 여전히 같은 오류에 직면했다.
command:
  - "--config.my-cnf="

 

  • 권한부여는 init-exporter.sql로 하고 접속은 아래의 형식에 맞추어 입력한 다음 접속하여 해결하였다.
  • username에서 exporter는 고정값이라고 생각해도 무방하다.
command:
  - "--mysqld.username=exporter:<설정한 비밀번호>"
  - "--mysqld.address=<mysql이름>:<포트번호>"

 

 

4. 프로메테우스 확인

  • http://localhost:9090/targets 접속 후 Up상태 확인


 

5. 그라파나 연결

  • docker-compose.yml파일에 주석으로 그라파나 대쉬보드 ID를 적어놓았다. 다른걸 사용해도 무방하다.
  • 연결은 저번 포스팅을 참고하면 된다.(왼쪽 Dashboard를 클릭 -> new dashboard -> import dashboard 클릭)
  • mysql은 7362, redis는 11835이다.


 

 

현재 redis는 비밀번호가 설정되어 있지 않다. 그래서 비밀번호가 있다면 수정이 필요하다.
다음 포스팅에서는 스프링부트서버와 JVM 모니터링을 추가해보도록 하겠다.