[스프링]APM을 시각화해보기 Prometheus + Grafana사용(windows)

allnight5·2023년 4월 11일
0

스프링

목록 보기
58/62

윈도우를 사용하여 합니다.

우선 하고 계신다면~~
build.gradle에 의존성을 추가해줍시다.

    //prometheus
    implementation 'io.micrometer:micrometer-registry-prometheus:1.10.5'

저는 도커를 이용해서 할것이기 때문에.. 도커를 키신다음에

prom/prometheus 도커 이미지를 pull 받습니다.
터미널에서 입력해주시면됩니다.
docker pull prom/prometheus

prometheus.yml 파일을 생성하고 원하는 공간에 저장합니다.

prometheus.yml 라는 것을 만들어야해요
IntelliJ시라면 그냥 new -> file 하고 이름을 prometheus.yml로 지어주시면됩니다.
만들지 못하겠다하시면 아래 링크로 가셔서 만드시면 됩니다.
https://codebeautify.org/yaml-validator

#기본적인 전역 설정
global:
  scrape_interval: 15s
  evaluation_interval: 1m

rule_files: # 규칙을 로딩하고 evaluation_interval 설정에 따라 정기적으로 평가한다.
# - "first.rules"
# - "second.rules"

#메트릭을 수집할 엔드포인트를 설정 여기서는 Prometheus 서버 자신을 가르키는 설정을 했다.
scrape_configs:
  #이 설정 에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
  - job_name : 'prometheus'
    # 'metrics_path'라는 설정의 기본값은 '/meterics'이고
    #'scheme'라는 설정의 기본 값은 'http'이다.
    metrics_path: '/actuator/prometheus' #메트릭을 수집할 path설정
    static_configs:
      - targets: ['host.docker.internal:8080']

이제 prometheus를 도커에 실행 시켜야겠지요

docker run -p 9090:9090 -v {yml 파일이 저장된 상위 경로}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

이런식으로 yml의 저장된 위치를 입력하셔서
터미널에 입력 하시면 됩니다.

docker run -p 9090:9090 -v D:/java/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

1.이제 http://localhost:9090 으로 가서 확인해 봅시다.

2.status -> target을 눌러서 이동합시다.


3.Status가 UP이라면 정상 작동중인겁니다.Down일때는 오류 라서 설정을 다시해줘야합니다.

4.이게 하고나면.. 종료가 안되는 문제가있어요.. 저는요?
그러니까 터미널을 끄고 나서 다시 터미널을 켜서 run(실행시켜) 줘야 하는데.

docker ps

로 지금 컨테이너에 있는것을 확인합니다.

prometheus의 컨테이너 이름 대부분 맨 위에있는게 길탠데 그것을 저기 컨테이너 이름에 적어주시면 됩니다.

docker start {prometheus컨테이너이름}

docker start my-prometheus

http_server_requests_seconds_count

발생할 수 있는 오류

첫번째 오류 이유

Error reading Prometheus: Post "http://localhost:9090/api/v1/query": dial tcp 127.0.0.1:9090: connect: connection refused

host.docker.internal:8080이 자리에 localhost:8080을 넣어주면 아래와 오류가 납니다. 도커랑 서버는 호스트네임이 다르기 때문에 이런 오류가 발생합니다. 그렇기 때문에 도커와 서버의 위치에 따라서. 호스트네임에 따라서 작성 해줘야 합니다.

서버를 뛰우고 도커를 켜서 실행했다면 이런식으로 하시면 됩니다. 하지만 이제 aws로 Ec2 서버를 사용하게 되셨다 혹은 그 Ec2서버를 가비아나 다른곳에서 호스트 네임을 사셔서 연결하셨다 하신다면

    static_configs:
      - targets: ['docker.site']

이런식으로 사이트 호스트네임을 작성해주시면 됩니다.
naver.com 처럼 이부분이 호스트 네임이에여

두번째 오류이유

만약 서버에 시큐리티가 있으시다면 설정하시는 방식과 버전에 따라서 /actuator/** actuator과 연관된것을 모두 허용해 주겠다고.. 해주시면 됩니다.
아래중에 하나만 하시면되여.. 자기꺼에 맞게요

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
        .antMatchers("/actuator/**");
}
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
        .requestMatchers("/actuator/**");
}
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        // 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.authorizeHttpRequests()//요청에 대한 권한을 지정할 수 있다.
  
.requestMatchers("/actuator/**").permitAll()
.anyRequest().authenticated()//인증이 되어야 한다는 이야기이다.          

세번째 오류 생성할때 나오는 오류

docker run -p 9090:9090 -v D:/java/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

prometheus를 실행할때 발생할 수 있는 오류

Failed to run image. Error invoking remote method 'docker-run-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:9090 -> 0.0.0.0:0: listen tcp 0.0.0.0:9090: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

이미 돌아가는게 있거나 관리자 콘솔이 아니라면 발생할수있는 오류라고하는데

netstat -ano | findstr :9090

위의 것을 관리자 콜솔에 작성하여 아무것도 나오지 않는다.? 내가 이름이 봤는데 틀리지 않았다. 내용도 틀리지 않았다?

컴퓨터를 한번 재부팅 해보시기 바랍니다. 그럼 됩니다. 그래도 안된다면.. 새로운검색을 하시길 바라며 그럼 이만.

Expoter의 API 별 초당 Request를 조회하는

http_server_requests_seconds_count metric

을 수집하는 PromQL을 작성하여
수집한 메트릭을 시계열 그래프 형태로 보여주는 모습입니다.

프로메테우스 메인 페이지 메트릭에 http_server_requests_seconds_max를 입력하면 그래프로

이제 Prometheus와 Grafana 를 연동해봅시다.

  1. grafana/grafana 이미지를 pull 받습니다.

docker pull grafana/grafana

  1. 받은 이미지를 통해 grafana를 실행해줍니다.

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

  1. localhost:3000에 접속합니다.

  2. 로그인을 합시다
    초기 계정은
    Id : admin
    password : admin이며
    최초 로그인 시 비밀번호를 변경하는 창이 뜹니다.
    원하시는 비밀번호를 입력하고 로그인하시면 됩니다.

    복사해서 넣으실때 앞부분이나 뒷부분에 띄어쓰기가 있는지 면밀히 살피기 바랍니다. 이거때문에 로그인이 안될수있습니다.

  3. 이제 Prometheus와 연동해봅시다. 보기위해서 하고있잖아요?

추가를 해줍시다.

만약 prometheus가 보이시지 않으시다면
검색하셔서 찾으시면됩니다. 찾으셔서 클릭하신다면

아래와 같이 나오는데 거기다가 prometheus.yml에 작성하신 targets를 써주시면 되는데 대신에 이번에 포트번호는 9090입니다. prometheus의 내용을 가져와야하니까요
그리고 아래로 쭉~~ 내리시면

이런게 나옵니다.

여기서 save&test하셨을때

이렇게 되신다면 정상적으로 연결되신겁니다~

이제 대시보드를 선택하셔서 원하는 내용만 볼수있게 할수도 있습니다. 하지만.. 잘 모르니 우선은

SpringBoot 메트릭을 보여주는 유명한 대시보드로 JVM dashboard가 있으며 이를 import 해주도록 하겠습니다.
아래를 복사하시면 됩니다.

https://grafana.com/grafana/dashboards/4701-jvm-micrometer/

다를수 있어요

돋보기 창아래 + 형태로 되어있어서 거기에 dashboard/folder/import 이 3개가 들어있을수 있으니 저기 없으면 + 가 있는지 보시기 바랍니다.

이제 import로 이동하셨다면
json파일을 넣으시던가 url주소를 입력해서 파일을 가져오도록합시다.

Load하시면 아래로 이동하는데

prometheus를 만드셔서 연결 하셨다면 저기에~~~ 그것이 나올겁니다 여러개라면 자신이 보고싶은 것을 선택하셔서 연결하시면 됩니다.

이제 import 해봅시다.

짜잔 이렇게 나와요
처음에는 Quick facts가 안나올수있는데 조금 지나면 나올거에여
저는 그랬거든여
그래도 나머지가 안나온다거나 우측 상단에 오류가 있다거나 하시면.. 찾아보셔야 됩니다 모두 즐거운 개발되시길

profile
공부기록하기

0개의 댓글