Springboot + prometheus + grafana 모니터링 시스템 구축

25gStroy·2022년 8월 4일
2

Springboot

목록 보기
25/41

Spring boot 설정

의존성 추가

    implementation 'org.springframework.boot:spring-boot-starter-actuator:2.7.2'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation 'io.micrometer:micrometer-core'

yml 설정

management:
  endpoints:
    web:
      exposure:
        include:
          - info
          - health
          - loggers  
          - mappings
          - metrics
          - shutdown
          - prometheus

위 설정을 해주고 엔트포인트로 /actuator 로 접속되면 application/json+hal 타입에 해당 주소와 연관된 주소 리스트가 다음과 같이 나온다. 그리고 해당 리소스로 들어가면 실시간 어플리케이션 정보를 볼 수 있다.

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    },
    "info": {
      "href": "http://localhost:8080/actuator/info",
      "templated": false
    },
    "loggers-name": {
      "href": "http://localhost:8080/actuator/loggers/{name}",
      "templated": true
    },
    "loggers": {
      "href": "http://localhost:8080/actuator/loggers",
      "templated": false
    },
    "prometheus": {
      "href": "http://localhost:8080/actuator/prometheus",
      "templated": false
    },
    "metrics": {
      "href": "http://localhost:8080/actuator/metrics",
      "templated": false
    },
    "metrics-requiredMetricName": {
      "href": "http://localhost:8080/actuator/metrics/{requiredMetricName}",
      "templated": true
    },
    "mappings": {
      "href": "http://localhost:8080/actuator/mappings",
      "templated": false
    }
  }
}

어플리케이션의 모든 정보를 공개하는것은 좋지 않기때문에 위 yml 설정에서 필요한 부분만 열어주는 것이 중요하다.
그리고 SpringSecurity 를 사용하고있다면 해당 엔드포인트에 권한을 줄 수도 있다.

     http.authorizeRequests().antMatchers("/actuator/**")
                .access("hasRole('ADMIN')")

prometheus

해당 글에서는 로컬 컴퓨터에서 docker 로 프로메테우스 컨테이너를 띄어서 사용하는 방법을 시도하였습니다.
먼저 Yml 설정에서 위에서처럼 /actuator/prometheus 해당 리소스 허용을 해줍니다.
그리고 docker 컨테이너를 생성할 것인데 생성하기 전에 프로메테우스의 yml 파일을 생성시켜 줍니다.

prometheus.yml

global:
  scrape_interval: 10s # 10초 마다 Metric을 Pulling
  evaluation_interval: 10s
scrape_configs:
  - job_name: 'jobName'
    metrics_path: '/actuator/prometheus' # Application prometheus endpoint
    static_configs:
      - targets: ['![](https://velog.velcdn.com/images/fj2008/post/da117393-48c8-4179-acc6-1b7deeba7349/image.png)
'] # Application host:port
    bearer_token: jwtToken

호스트에서 docker 컨테이너에 접근하기 위해서는 host.docker.internal는 특별한 DNS name으로 사용되며 docker를 실행하는 host를 가리킨다. 개발용으로만 사용해야 하며, Docker Desktop(Mac) 외부의 환경에서는 동작하지 않는다.

그리고 해당 yml 파일과 프로메테우스에서 뱉어내는 데이터를 저장하기위해서 도커 컨테이너생성시 볼륨설정을 잊으면 안됩니다.

docker run --name prometheus \ 
-p 9090:9090 \                                                                  -v /Users/ihogyeom/Desktop/test:/opt/bitnami/prometheus/data \
-v 호스트에yml파일주소:/opt/bitnami/prometheus/conf/prometheus.yml \
bitnami/prometheus:latest

docker 컨테이너가 잘 생성 됐다면 localhost:9090 포트로 들어가면 잘 실행 돼있을 겁니다.
이때 서버에따라서 인증을 거쳐서 테스트하고 싶은데 yml 에 인증하는 설정을 해 주면 됩니다.
해당 서버는 jwt토큰으로 인증/인가를 하기 때문에 bearer_token 에 토큰을 넣어주는 방법을 선택했습니다.

잘 설정 돼서 서버와 통신이 된다면 다음과같이 실행됩니다.

다음과같이 쿼리를 날려서 연결된 어플리케이션의 데이터를 시각화 또는 테이블로 볼수 있도록 돼있다.

grafana 연동

그라파나또한 로컬pc 에서 docker로 띄어서 사용할 것이다 (이것저것 맥북에 깔기 싫은 마음...)

docker run -d --name=grafana -p 3000:3000 grafana/grafana

컨테이너가 잘 띄어졌다면 localhost:3000 포트로 접속해 보면 그라파나 로그인화면이 나옵니다.
초기 설정 id/pw 는 admin/admin 입니다.

컨테이너가 사라져도 저장내용 유지하고 싶을땐

아래 경로를 볼륨 또는 호스트에 마운트 해야합니다.

/var/lib/grafana

docker-compose 예시

  grafana:
    image: grafana/grafana:7.4.3-ubuntu
    container_name: grafana
    ports:
      - 3000:3000
    volumes:
      - data-grafana:/var/lib/grafana
    restart: always
volumes:
  data-grafana:

그라파나 기본 사용법

홈 -> add user first data source

해당 탭에서 프로메테우스 선택

URL 에 프로메테우스 URL 연결

대시보드 -> new dashboard 선택후
보고싶은 데이터 쿼리를 입력하고 쿼리를 날려가면서 원하는 데이터가 조회되면 해당 대시보드를 사용하면됩니다.

설정은 별개 없는데 앞으로 그라파나를 어떻게 써야 내 애플리케이션이 어떤부분에서 부하를받고 어떤 상황인지에 대한 적절한 매트릭정보를 불러오고 시각화를 하는것이 진짜 기술인것 같습니다.

profile
애기 개발자

0개의 댓글