CloudWatch X Grafana X Prometheus

Huiji Kim·2023년 6월 2일
0

cloudwatch에서 매트릭을 prometheus로 보낸 후 grafana에서 시각화하는 실습을 해볼 것입니다.

Granana를 docker를 통해 띄워줍니다.

C:\Users\fmti0\Downloads\grafana-enterprise-9.5.2.windows-amd64\grafana-9.5.2\bin>docker pull grafana/grafana
C:\Users\fmti0\Downloads\grafana-enterprise-9.5.2.windows-amd64\grafana-9.5.2\bin>docker run --name grafana -d -p 3000:3000 grafana/grafana

http://localhost:3000을 통해 제대로 접속이 되는지 확인해줍니다.

Prometheus를 docker를 통해 띄워줍니다.

docker pull prom/prometheus

vi ./prometheus.yml

# my global config
global:
  # 매트릭을 수집할 주기를 설정할 수 있습니다.
  scrape_interval: 15s 
  # 규칙을 평가할 주기를 설정할 수 있습니다
  evaluation_interval: 15s 

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# 규칙을 로딩하고 evaluation_interval  설정에 따라 주기적으로 평가합니다.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# 메트릭을 수집할 엔드포인트에 대해 설정할 수 있습니다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 대해 'job=<job_name>'으로 라벨을 추가합니다.
  - job_name: "prometheus"

    # 타겟(엔드포인트)과 타겟에 대한 라벨을 지정해 줄 수 있습니다.
    static_configs:
      # 메트릭을 수집할 엔드포인트를 지정해 줄 수 있습니다.
      # - targets: ["localhost:9090"]
      - targets: ['host.docker.internal:8888']

docker로 실행할 때는 targets를 변경해줍니다.

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

http://localhost:9090에 접속하여 잘 되었는지 확인해줍니다.

Granafa와 Prometheus 연동

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


에러가 발생했다. http://localhost:9090은 접속이 잘 되는데 위와 같은 에러가 발생했다.

시도1
다시

scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 대해 'job=<job_name>'으로 라벨을 추가합니다.
  - job_name: "prometheus"

    # 타겟(엔드포인트)과 타겟에 대한 라벨을 지정해 줄 수 있습니다.
    static_configs:
      # 메트릭을 수집할 엔드포인트를 지정해 줄 수 있습니다.
      - targets: ["localhost:9090"]
      # - targets: ['host.docker.internal:8888']

으로 변경하고

docker run -p 9090:9090 -v .\prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
.\prometheus.exe

를 실행해보았지만 실패했다.

http url을 prometheus.yml의 target과 동일하게 변경해주었더니 해결됐다.

http://host.docker.internal:9090

CloudWatch와 연동

CloudWatch Expoter

Cloudwatch Exporter는 AWS CloudWatch에서 데이터를 가져와 Prometheus 서버에서 사용할 수 있는 형식으로 변환하는 오픈소스 소프트웨어입니다. Prometheus는 시간 기반 데이터를 저장하고 모니터링 및 알람 처리하는데 사용되는 인기 있는 시스템입니다.
Cloudwatch Exporter는 주로 AWS 리소스의 성능 및 이용률 메트릭을 모니터링하는 데 사용됩니다. 이 도구는 AWS에서 생성된 메트릭을 Prometheus 호환 형식으로 수집하여, AWS 인프라와 관련된 디버깅, 최적화 및 성능 모니터링 작업에 도움이 됩니다.
결론적으로 Cloudwatch Exporter는 AWS CloudWatch에서 메트릭을 가져와서 Prometheus를 사용하여 모니터링할 수 있게 해주는 연결 다리 역할을 합니다. 이를 통해 사용자들은 AWS 인프라 및 서스의 사용률과 관련된 데이터를 쉽게 추적하고 관리할 수 있습니다.

설치

java 11이상과 mvn이 설치되어 있어야 함

C:\Users\fmti0>java -version
java version "11.0.18" 2023-01-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.18+9-LTS-195)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.18+9-LTS-195, mixed mode)

C:\Users\fmti0>mvn -version
Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)
Maven home: C:\Users\fmti0\OneDrive\문서\apache-maven-3.9.2-bin\apache-maven-3.9.2
Java version: 11.0.18, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-11
Default locale: ko_KR, platform encoding: MS949
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

prometheus/cloudwatch_exporter 레포지토리를 다운

git clone https://github.com/prometheus/cloudwatch_exporter.git

mvn 빌드

cd cloudwatch_exporter
mvn clean package

cloudwatch exporter 실행

java -jar target/cloudwatch_exporter-<version>-SNAPSHOT-jar-with-dependencies.jar 9106 test.yml

version은 target cloudwatch/target 폴더에 들어가면 확인할 수 있다.

test.txt

region: ap-northeast-2
access_key: access_key
secret_key: secret_key
metrics:
 - aws_namespace: AWS/EC2
   aws_metric_name: CPUUtilization
   aws_dimensions: [InstanceId]
   aws_dimension_select:
     InstanceId: [i-1234, i-5678]
   aws_statistics: [SampleCount, Average, Sum]
   range_seconds: 600
   period_seconds: 60
   delay_seconds: 300
   set_timestamp: false

Error 발생

C:\Users\fmti0\cloudwatch_exporter\target>java -jar cloudwatch_exporter-0.15.5-SNAPSHOT-jar-with-dependencies.jar 9106 test.yml
Exception in thread "main" java.lang.IllegalArgumentException: Unknown signal: HUP
        at java.base/jdk.internal.misc.Signal.<init>(Signal.java:148)
        at jdk.unsupported/sun.misc.Signal.<init>(Signal.java:139)
        at io.prometheus.cloudwatch.ReloadSignalHandler.start(ReloadSignalHandler.java:12)
        at io.prometheus.cloudwatch.WebServer.main(WebServer.java:33)

뤼튼에게 물어보니
"이 오류는 Unknown signal: HUP로 인해 발생하며, 주로 Windows 환경에서 발생합니다. SIGHUP 신호는 Unix 계열 운영 체제에서 사용되지만, Windows에서는 지원되지 않습니다. Windows에서 Cloudwatch Exporter를 실행하려면, 일부 코드를 수정해야 합니다."

src/main/java/io/prometheus/cloudwatch/ReloadSignalHandler.java

package io.prometheus.cloudwatch;

import java.util.logging.Level;
import java.util.logging.Logger;
import sun.misc.Signal;
import sun.misc.SignalHandler;

class ReloadSignalHandler {
    private static final Logger LOGGER = Logger.getLogger(CloudWatchCollector.class.getName());

    protected static void start(final CloudWatchCollector collector) {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("win")) {
            // Windows 환경에서 SIGHUP 신호를 처리하지 않습니다.
        } else {
            // 기존 코드를 Unix 환경 용으로 이동합니다.
            Signal.handle(
                new Signal("HUP"),
                new SignalHandler() {
                    public void handle(Signal signal) {
                        try {
                            collector.reloadConfig();
                        } catch (Exception e) {
                            LOGGER.log(Level.WARNING, "Configuration reload failed", e);
                        }
                    }
                });
        }
    }
}

로 수정해준다.

~/cloudwatch_exporter 경로에서 mvn clean package 명령어를
를 실행한다.

C:\Users\fmti0\cloudwatch_exporter>mvn clean package

target 폴더에 test.yml을 다시 추가해준 후

C:\Users\fmti0\cloudwatch_exporter\target>java -jar cloudwatch_exporter-0.15.5-SNAPSHOT-jar-with-dependencies.jar 9106 test.yml
6월 05, 2023 12:42:06 오후 org.eclipse.jetty.server.Server doStart
INFO: jetty-11.0.15; built: 2023-04-11T18:37:53.775Z; git: 5bc5e562c8d05c5862505aebe5cf83a61bdbcb96; jvm 11.0.18+9-LTS-195
6월 05, 2023 12:42:06 오후 org.eclipse.jetty.server.handler.ContextHandler doStart
INFO: Started o.e.j.s.ServletContextHandler@7a356a0d{/,null,AVAILABLE}
6월 05, 2023 12:42:06 오후 org.eclipse.jetty.server.AbstractConnector doStart
INFO: Started ServerConnector@7db0565c{HTTP/1.1, (http/1.1)}{0.0.0.0:9106}
6월 05, 2023 12:42:06 오후 org.eclipse.jetty.server.Server doStart
INFO: Started Server@1a1d3c1a{STARTING}[11.0.15,sto=0] @806ms

거의 다 온듯 하다!!!!!

http://localhost:9106을 들어가면

창이 뜬다.

자 이제 Prometheus에서 메트릭을 확인하려면 promethues.yml 파일을 수정해줘야 한다.

prometheus.yml

# my global config
global:
  # 매트릭을 수집할 주기를 설정할 수 있습니다.
  scrape_interval: 15s 
  # 규칙을 평가할 주기를 설정할 수 있습니다
  evaluation_interval: 15s 
  # external_labels: # 외부 시스템에 표시할 이 서버의 레이블
  #   monitor: ["prometheus"]

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# 규칙을 로딩하고 evaluation_interval  설정에 따라 주기적으로 평가합니다.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# 메트릭을 수집할 엔드포인트에 대해 설정할 수 있습니다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 대해 'job=<job_name>'으로 라벨을 추가합니다.
  - job_name: "cloudwatch"
    scrape_interval: 1m
    metrics_path: /metrics
    static_configs:
      - targets:
          - "localhost:9106"

변경사항을 저장하고 프로메테우스를 재시작 해줍니다.

http://localhost:9090/ 에 접속 한 후 Status -> Targets에 들어갑니다.

위와 같이 뜨면 cloudwatch와 prometheus가 정상적으로 연동이 된 것입니다.

Grafana에 들어가서 data source를 prometheus로 지정하고

위와 같이 쿼리를 추가하면

profile
새로 학습하는 내용을 기록합니다. \n 예전 주소 : https://blog.naver.com/gmlwl0720

0개의 댓글