EC2 기반 애플리케이션의 프로메테우스 지표를 수집하고, 그라파나로 시각화해볼 예정이다.

 

프로메테우스, 그라파나 서버 인스턴스 생성

 

프로메테우스와 그라파나를 docker 컨테이너로 돌릴 예정이다. EC2 인스턴스 하나를 준비하자. 

 

이름을 지정해준다. 이때 이름은 자동으로 Name 태그로 들어간다. 

 

보안 그룹은 다음과 같이 해준다.

 

 

3000 포트: 그라파나 대시보드 접근 포트

9090 포트: 프로메테우스 접근 포트 (테스트가 끝나면 닫아도 됨)

8080 포트: 애플리케이션 포트 (같은 인스턴스 내에서 애플리케이션을 돌릴 예정)

22 포트: 해당 cidr은 AWS instance connect를 사용할 때 AWS 측의 IP range다. (key pair 없이 사용할 수 있음)

 

서버 인스턴스 설정

 

EC2 연결 -> EC2 Instance Connect 연결 사용하여 연결하면 접속된다. 

 

 

sudo su를 해서 루트 권한을 얻고, 필요한 것들을 설치해 주면 된다. 

필요한 것들은 docker, git이 끝이다. 해당 설명은 생략한다. 

 

애플리케이션을 미리 백그라운드로 돌린다. 본인의 경우 Springboot Application이라서 아래의 명령어를 사용한다.

 

nohup java -jar -Dspring.profiles.active=[프로파일] [jar이름] &

 

 

프로메테우스 디렉터리와 tsl에 사용할 디렉터리를 만들어주고, 권한을 준다. 

 

mkdir prometheus
mkdir certs

chmod a+rw prometheus
chmod a+rw certs

 

 

EC2를 기반으로 지표를 수집할 때는 EC2를 조회할 수 있는 권한이 필요한데, AccessKey를 등록해 줘도 되지만 인스턴스 프로파일을 등록해 주는 것이 가장 좋다. 

 

IAM으로 이동해서, EC2 ReadOnly 역할을 하나 만들어준다.

 

 

해당 역할을 만든 인스턴스에 할당해 주면 된다.

 

 

생성한 EC2를 선택하고, IAM 역할 수정을 해준다. 

Docker Network 생성

 

docker network를 이용해서 내부 컨테이너들끼리 통신할 수 있도록 네트워크를 생성해 주고, 프로메테우스와 그라파나 컨테이너에 할당해서 통신할 수 있도록 할 예정이다.

docker network create monitoring-network

 

할당한 이후에는 http://{컨테이너 이름}:{포트}로 통신이 가능하다.

 

그라파나 컨테이너 생성

 

여기서 볼륨을 생성하고, 컨테이너에 할당하게 되는데, 볼륨은 /var/lib/docker/volumes/로 마운트 된다. 컨테이너가 사라져도 데이터 유지가 가능해진다. 

 

docker volume create grafana-storage
docker volume inspect grafana-storage 
        
docker run -d -p 3000:3000 --name=grafana \
--network monitoring-network \
--volume grafana-storage:/var/lib/grafana \
grafana/grafana-enterprise

 

정상적으로 생성됐다면, EC2 public IP:3000으로 접속이 가능하다.

 

 

처음 시작하면 아이디와 비밀번호는 admin, admin이고 로그인했을 때 변경할 수 있다. 

 

 

여기까지 왔다면, 그라파나 컨테이너 생성은 완료고 프로메테우스 컨테이너를 완성하고 연결해주겠다.

 

프로메테우스 컨테이너 생성

 

프로메테우스 컨테이너는 총 2가지를 준비해야 한다. web.yml과 prometheus.yml이다. 

 

두 개를 작성하기 전에 openssl을 사용해서 사설 인증서를 만들어야 한다. 

 

openssl req \
-x509 -newkey rsa:4096 \
-nodes \
-keyout private.key -out certificate.crt

 

그리고 certs로 두 파일을 옮겨준다. 

프로메테우스가 사용할 수 있도록 권한을 줘야 한다. 

 

chmod 644 $(pwd)/certs/private.key

 

Web.yml 작성

 

web.yml에는 다양한 설정이 있지만, 여기서는 tsl설정과 프로메테우스에 접근하기 위해 아이디와 패스워드를 지정한다.

여기서 패스워드는 bcrypt로 인코드 해서 넣어줘야 한다.

 

tls_server_config:
  cert_file: /etc/prometheus/certs/certificate.crt
  key_file: /etc/prometheus/certs/private.key

basic_auth_users:
  dkim: {인코딩 한것}

 

더욱 많은 옵션을 보고 싶으면 아래의 공식 문서에서 보면 된다.

https://prometheus.io/docs/prometheus/latest/configuration/https/

 

prometheus.yml 작성

 

프로메테우스가 해당 yml을 보고, 어디서 지표를 수집할지 정한다. 각 옵션에 주석으로 설명을 적겠다. 

scrape_configs:
  - job_name: ec2 # 스크랩 하는 작업의 단위
    scheme: http # 스크랩할 때 사용하는 scheme https도 가능
    metrics_path: /custom/prometheus # 애플리케이션의 지표 엔드포인트
    basic_auth: # 지표를 수집할 때 사용하는 auth
      username: # 자신이 애플리케이션에 지정한 것
      password: # 자신이 애플리케이션에 지정한 것
    ec2_sd_configs: # ec2 스크랩하므로 해당 config 사용
      - region: ap-northeast-2 
        port: 8080 # 사용할 포트
        filters: # 태그를 기반으로 스크랩할 지 여부를 정함
          - name: 'tag:Name'
            values:
              - 'monitoring-server'
    relabel_configs: # 프로메테우스의 라벨링을 재정의 할 수 있음
      - source_labels: [__meta_ec2_private_ip]
        regex: '(.*)'
        replacement: 'monitoring-server:${1}'
        target_label: instance
      - source_labels: [__meta_ec2_instance_type]
        target_label: instance_type

 

여기까지 완료하면, 프로메테우스 컨테이너 생성 명령을 실행하면 된다. 

 

docker run \
-p 9090:9090 \
--name prometheus \
--network monitoring-network \
-d \
-v $(pwd)/web.yml:/etc/prometheus/web.yml \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $(pwd)/prometheus:/prometheus \
-v $(pwd)/certs:/etc/prometheus/certs \
prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--web.config.file=/etc/prometheus/web.yml

 

이제 {ec2 publicIp}:9090으로 접속해 보자. (확인을 위해 임시로 보안 그룹을 열어놨다. 확인하고 닫으면 된다.)

 

 

로그인이 필요한데, web.yml에 적은 아이디와 인코딩 전 비밀번호를 적으면 된다.

사설 인증서라서, 신뢰할 수 없다고 뜰 텐데 그냥 접속하면 된다.

 

Status -> Target으로 접근하면 아래와 같이 지표를 수집 중인 것을 볼 수 있다.

 

 

prometheus.yml에서 작성한 라벨 리밸런싱이 제대로 들어간 것을 볼 수 있다. 

 

그라파나 프로메테우스 연동

 

그라파나 페이지로 이동후 Connection -> Add new connection로 이동해서 Prometheus를 선택해 준다. 

 

 

이름은 원하는 걸로 지정하고, url과 Basic Authencation을 지정해 준다. 여기서 Basic Authencation은 web.yml에 적은 auth 값이다. 

 

 

하나 중요한 점은 사설 인증서이기에 Skip TLS certificate validation 옵션을 켜줘야 한다.

 

 

이제 가장 밑으로 내려가서 Save & Test를 눌러보자.

 

 

이렇게 뜨면 성공이다.

 

그라파나 대시보드 임포트 하기

 

그라파나 대시보드 같은 경우 자신이 필요한 값들을 쿼리로 만들어야 하지만 나오는 것만 볼 예정이므로 이미 만들어져 있는 걸 임포트 해서 사용한다.

 

Dashboard -> Import 

 

 

여기서 ID가 필요한데, 아래의 링크에 접속해서 ID를 복사해 온다. JVM 템플릿이다.

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

 

 

 

이전에 생성한 데이터 소스를 선택해 준다.

 

 

이제 생성한 대시보드를 가보면 아래와 같이 임포트 되고, 프로메테우스 지표를 수집한 것을 볼 수 있다.

 

 

 

여기까지 EC2 애플리케이션 모니터링 하는 기본적인 연동이 끝났다.

EKS 파드 프로메테우스 연동까지 끝내고 나서, 프로메테우스를 자세히 살펴보고 활용하는 것을 포스팅할 예정이다.