간단하게 설명하면 프로메테우스는 대상 시스템으로부터 모니터링 지표를 수집하는 역활을 수행하고 그라파나는 프로메테우스가 모집한 데이터를 시각화하는 모니터링 툴이다.
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
개발자가 애플레케이션을 개발할 때 기능 요구사항만 개발하는 것은 아니다. 실제 운영 단계에 올리게 되면 개발자들이 해야하는 또 다른 중요한 업무가 있다.
운영 환경에서 서비스할 때 필요한 이른 기능들을 프로덕션 준비 기능이라고 한다.
지표(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
}
}
}
만약에 up으로 나오면 health는 정상적으로 동작하고 있다고 의미한다.
이후 모든것을 노출하기 위해서는 yaml에 다음과 같이 설정을 해야된다.
management:
endpoints:
web:
exposure:
include: "*"
앤드포인트를 사용하려면 다음과 같은 2가지 과정이 필요하다.
엔드포인트는 기본적으로 활성화가 되어져 있다. ( 그런데 shutdown만 비활성화 - 실행하면 서버가 내려가기 때문에 )
따라서 어떤 엔드포인트를 노출할지 선택하면 된다. 보통 HTTP로 노출한다.
management:
endpoints:
shutdotn:
enable: true
web:
exposure:
include: "*"
management:
endpoints:
web:
exposure:
include: "*"
exclude: "info"
각각의 엔드포인트를 통해서 개발자는 애플리케이션 내부의 수 많은 기능을 모니터링 할 수 있다.
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
id 'com.gorylenko.gradle-git-properties' version '2.4.1'
management: info: git: mod : “full”로 처리하면 더 자세한 정보 공유
보안 주의
액츄에이터가 제공하는 기능은 너무 많아서 외부 인터넷 망이 공개된 곳에 노출은 좋은 방식이 아니다. 외부 접근을 막고 내부망에서 사용하는게 안전하다.
외부 인터넷 망을 통해서 8080포트에만 접근할 수 있다. 다른 포트는 내부망에서만 접근할 수 있으면 다른 포트에서 설정하면 된다.
액츄에이터의 기능을 애플리케이션 서버와는 다른 포트에서 실행하려면 다음과 같이 설정하면 된다.
managerment.server.port = 9292
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
actuator는 실제 운영에서는 보안적인 부분을 신경을 써야합니다. 하지만 이번에는 간단한 프로젝트에서 기록하기 위해서 가장 간단한 버전으로 작성을 하겠습니다.
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
포트에 접근하면 프로메테우스에 접근할 수 있습니다.