cloudwatch에서 매트릭을 prometheus로 보낸 후 grafana에서 시각화하는 실습을 해볼 것입니다.
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을 통해 제대로 접속이 되는지 확인해줍니다.
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에 접속하여 잘 되었는지 확인해줍니다.
에러가 발생했다. 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 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"
git clone https://github.com/prometheus/cloudwatch_exporter.git
cd cloudwatch_exporter
mvn clean package
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
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
거의 다 온듯 하다!!!!!
창이 뜬다.
자 이제 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로 지정하고
위와 같이 쿼리를 추가하면