9-1. 컨테이너화된 애플리케이션에서 사용되는 모니터링 기술 스택
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
hostIP=$(ip route get 1 | awk '{print $NF;exit}') # 컨테이너는 호스트 IP정보가 없기에 환경변수로 지정
docker container run -e DOCKER_HOST=$hostIP -d -p 9090:9090 diamol/prometeus:2.13.1 # -e DOCKER_HOST 옵션으로 호스트 IP직접 전달(-environment 환경변수)
9-2. 애플리케이션의 측정값 출력하기
//Node.js에서 커스텀 프로메테우스 측정값 선언 및 사용
const accessCounter=new prom.Counter({
name: "access_log_total",
help: "Access Log - 총 로그 수"
});
const clientIpGauge=new prom.Gauge({
name: "access_client_ip_current",
help: "Access Log - 현재 접속 중인 IP 주소"
});
accessCounter.inc();
clientIpGauge.set(countOfIpAddress);
9-3. 측정값 수집을 맡을 프로메테우스 컨테이너 실행하기
global:
scrape_interval: 10s #스크래핑 간격 10초
# 컴포넌트 별 스크래핑 작업 설정
scrape_configs:
- job_name: "image-gallery" # 스크래핑 작업의 이름
metrics_path: /metrics # 스크래핑을 진행할 엔드포인트
static_configs: # 대상 컨테이너 지정 # 정적 설정으로 단일 컨테이너를 지정할 때 사용한다.
- targets: ["image-gallery"] # 컴포넌트에서 컨테이너 수 증가 시 모두 측정값 수집.(로드밸런싱 확인까지 가능. 잘 되고있다면 여러 쿼리 시 균등하게 분배될 테니)
- job_name: "iotd-api"
metrics_path: /actuator/prometheus
static_configs:
- targets: ["iotd"]
- job_name: "access-log"
metrics_path: /metrics
dns_sd_configs: # DNS서비스 디스커버리를 통해 여러 컨테이너를 지정할 수 있고, 스케일링에 따라 컨테이너가 확대할 수 있다?
-names:
- accesslog # 모든 컨테이너의 IP주소를 목록을 만들어 측정값 수집?
type: A
port: 80
sum(access_log_total) without(hostname, instance)
sum(image_gallery_requests_total{code="200"}) without(instance)
# image_gallery_request측정값을 통합하고, 응답 코드가 200인 것만 추려 instance 레이블과 무관하게 값을 합하는 쿼리로 응답코드 200인 응답의 총 횟수를 의미한다.
9-4. 측정값 시각화를 위한 그라파나 컨테이너 실행하기
#1. HTTP 응답 코드 200으로 처리된 응답의 누적 개수(카운터)
sum(image_gallery_request_total{code="200"}) without(instance)
#2. 현재 처리 중인 요청 수(게이지)
sum(image_gallery_in_flight_requests) without(instance)
#3. 메모리 사용량. 컨테이너 증가 시 증가.
go_memstats_stack_inuse_bytes{job="image-gallery"}
#4. 활성 고루틴 수. 컴포넌트 부하를 대략적으로 나타내는 지표
sum(go_goroutines{job="image_gallery"}) without(instance)
#5. HTTP 응답 오류 수
sum(image_gallery_requests_total{code="500"}) without(instance)
FROM diamol/grafana:6.4.3 # 측정 버전의 그라파나 이미지를 기반이미지로 사용, 몇가지 YAML과 JSON을 복사.
COPY datasource-prometheus.yaml ${GF_PATHS_PROVISIONING}/datasources/ # 그라파나와 프로메테우스 연결을 위한 정보
COPY dashboard-provider.yaml ${GF_PATHS_PROVISIONING}/dashboards # 대시보드 구성 읽으라는 내용
COPY dashboard.json /var/lib/grafana/dashboards/ # 대시보드 구성 파일을 디렉터리에 복사하는 내용
9-5. 투명성의 수준