Grafana, Loki, Prometheus 모니터링 구축

Mugeon Kim·2024년 6월 25일
0
post-thumbnail

서론


  • 시스템을 운영을 하기에 모니터링은 매우 중요합니다. 이것을 해결하기 위한 다양한 모니터링 툴이 있습니다. 저는 개인적으로 취업을 하면 회사에 sentry, datadog등 다양한 모니터링이 있다고 생각했지만 현재 저희 서비스는 모니터링이 없어서 무료로 구축할 수 있는 Grafana, Loki, Prometheus를 이용해서 Was 모니터링, 로그 모니터링을 구축한 내용을 정리를 하였습니다.

본론


1. Grafana, Prometheus WAS 모니터링

  • 프로매테우스와 그라파나를 이용해서 스프링 서버의 모니터링을 구축하려고 한다.

간단하게 설명하면 프로메테우스는 대상 시스템으로부터 모니터링 지표를 수집하는 역활을 수행하고 그라파나는 프로메테우스가 모집한 데이터를 시각화하는 모니터링 툴이다.

1-1. docker-compose

version: '3'
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    environment:
      - GF_SERVER_ROOT_URL=http://localhost:3000
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - loki
    networks:
      - monitoring

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/config:/etc/prometheus/
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    networks:
      - monitoring

  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: always
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - monitoring

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      - ./logs:/logs
      - ./promtail-config.yml:/etc/promtail/config.yml
    networks:
      - monitoring

volumes:
  grafana-data:
  prometheus-data:
  loki-data:

networks:
  monitoring:
    driver: bridge
  • 일단 docker-compose를 통해서 grafana, promethus, loki를 올리고 설명을 하겠다.

스프링에서 프로메테우스로 수집 데이터 전달

Spring Actuator

  • 개발자가 애플레케이션을 개발할 때 기능 요구사항만 개발하는 것은 아니다. 실제 운영 단계에 올리게 되면 개발자들이 해야하는 또 다른 중요한 업무가 있다.

  • 운영 환경에서 서비스할 때 필요한 이른 기능들을 프로덕션 준비 기능이라고 한다.

  • 지표(metric), 추적(trace), 감사(auditung), 모니터링

  • 애플리케이션이 현재 살아있는지, 로그 정보는 정상적으로 설정이 되었는지, 커녁션 풀은 얼마나 사용되고 있는지

의존성 추가

    implementation 'org.springframework.boot:spring-boot-starter-actuator'

실행 결과


{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/actuator/health/{*path}",
"templated": true
}
}
}
  • health
    • 만약에 up으로 나오면 health는 정상적으로 동작하고 있다고 의미한다.

      이후 모든것을 노출하기 위해서는 yaml에 다음과 같이 설정을 해야된다.

      management:
        endpoints:
          web:
            exposure:
              include: "*"
    • 앤드포인트를 사용하려면 다음과 같은 2가지 과정이 필요하다.

    1. 엔드포인트 활성화
    2. 엔드포인트 노출
    • 환성화란 해당 기능을 on, off 설정하는거
    • 엔드 포인트를 노출은 http노출, jmx를 통해 노출할 지 선택을 해야된다.

엔드포인트는 기본적으로 활성화가 되어져 있다. ( 그런데 shutdown만 비활성화 - 실행하면 서버가 내려가기 때문에 )

따라서 어떤 엔드포인트를 노출할지 선택하면 된다. 보통 HTTP로 노출한다.

  • 만약에 shutdown을 처리하고 싶으면 다음과 같이 설정하면 된다.
management:
  endpoints:
		shutdotn:
			enable: true
    web:
      exposure:
        include: "*"

엔드포인트 노출

  • 스프링 공식 메뉴얼이 제공하는 예제를 통해 엔드포인트 노출 설정
management:
  endpoints:
    web:
      exposure:
        include: "*"
				exclude: "info"

다양한 엔드포인트

각각의 엔드포인트를 통해서 개발자는 애플리케이션 내부의 수 많은 기능을 모니터링 할 수 있다.

엔드포인트 목록

  • bean : 스프링 컨테이너에 등록된 빈을 보여준다.
  • conditions : condition을 통해서 빈을 등록할 때 평가 조건과 일치하거나 일치하지 않는 이유 표시
  • configprops : configurationProperties를 보여준다.
  • env : evniroment정보를 보여준다.
  • health : 애플리케이션 헬스 정보 보여준다.
  • httpexchanges : http 호출 응답 정보를 보여준다. httpexchangerepository를 구현한 빈을 별도로 등록해야 한다.
  • info : 애플리케이션 정보를 보여준다.
  • loggers : 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.
  • metrics : 애플리케이션의 메트릭 정보를 보여준다.
  • mappings : @requestmappging의 정보를 보여준다.
  • threaddump : 쓰레드 덤프를 실행해서 보여준다.
  • shutdown : 애플리케이션을 종료한다. 이 기능은 기본적으로 비활성화가 되어져 있다.

health 정보

  • 애플리케이션이 문제가 발생하면 빠르게 알 수 있다.
  • 애플리케이션이 사용하는 데이터베이스가 응답하는지 디스크 사용량에는 문제가 없는지 판단하여 정보를 보여준다.
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: "*"
  • 다음과 같이 설정하면 다음과 같이 나오게 된다.
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "H2",
"validationQuery": "isValid()"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 494384795648,
"free": 423133499392,
"threshold": 10485760,
"path": "/Users/mugeon/IdeaProjects/mybatis/.",
"exists": true
}
},
"ping": {
"status": "UP"
}
}
}
  • 만약에 이렇게 정보가 부담스러우면 다음과 같이 바꾸면 된다.
show-components: always
  • 이렇게 바뀌면 up, down만 출력이 된다.

애플리케이션 정보

  • info 엔드포인트는 애플리케이션의 기본 정보를 노출한다.
    • java : 자바 런타임 정보
    • os
    • env
    • build :빌드 정보, meta-inf/build-info.properties파일이 필요하다.
    • git :git정보, git.properties 파일이 필요하다.
id 'com.gorylenko.gradle-git-properties' version '2.4.1'  

management: info: git: mod : “full”로 처리하면 더 자세한 정보 공유

  • 기본적으로 java, env, os는 비활성화 되어여 짔다.

로거

  • loggers 엔드포인트를 사용하면 로깅과 관련된 정보를 확인하고, 실시간으로 변경할 수 있다.

HTTP 요청 응답 기록

  • HTTP 요청과 응답 과거 기록을 확인하고 싶으면 httpexchanges 엔드포이트로 확인이 가능하다.
  • httpexchangerepository 인터페이스를 빈으로 등록하면 사용할 수 있다. 기본적으로 스프링 부트는 InMemoryHttpExchangeRepository를 제공한다.

액츄에이터와 보안

보안 주의

  • 액츄에이터가 제공하는 기능은 너무 많아서 외부 인터넷 망이 공개된 곳에 노출은 좋은 방식이 아니다. 외부 접근을 막고 내부망에서 사용하는게 안전하다.

  • 외부 인터넷 망을 통해서 8080포트에만 접근할 수 있다. 다른 포트는 내부망에서만 접근할 수 있으면 다른 포트에서 설정하면 된다.

  • 액츄에이터의 기능을 애플리케이션 서버와는 다른 포트에서 실행하려면 다음과 같이 설정하면 된다.

managerment.server.port = 9292
  • 스프링에서 actuatorm promethus를 추가한다.
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'io.micrometer:micrometer-registry-prometheus'

actuator는 실제 운영에서는 보안적인 부분을 신경을 써야합니다. 하지만 이번에는 간단한 프로젝트에서 기록하기 위해서 가장 간단한 버전으로 작성을 하겠습니다.

  • spring actuator를 추가를 하여 빌드를 하였으면 yml에 설정을 해야합니다.
management:
  info:
    java:
      enabled: true
    os:
      enabled: true
    env:
      enabled: true
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: "*"
  • 이후 spring서버를 실행시키고 localhost:8080/actuator를 살펴보면 다양한 정보가 보이는데 여기서 http://localhost:8080/actuator/prometheus을 살펴보면 관련 데이터가 나오는데 이것을 프로메테우스에게 전달하는 데이터이다.

  • 프로메테우스에 접속하기 위해서는 9090포트에 접근하면 프로메테우스에 접근할 수 있습니다.

  • 현재 endpoint를 살펴보면 정상적으로 연결이 됩니다.
profile
빠르게 실패하고 자세하게 학습하기

0개의 댓글