Container Monitoring

컨테이너 화 된 애플리케이션에서 사용되는 모니터링 기술 스택

Screenshot 2023-06-12 at 11.17.57 PM.png

{
	"metrics-addr" : "0.0.0.0:9323",
	"experimental" : true
}
실습

  • 프로메테우스를 컨테이너에서 실행해 현재 docker를 실행 중인 컴퓨터의 정보를 수집해보자

# 로컬 컴퓨터의 IP 주소를 확인해 환경 벼수로 정의하기(리눅스)
$hostIP = $(Get-NetIPConfigure | Where-Object {$_.IPv4DefaultGateway-ne})

# 로컬 컴퓨터의 IP 주소를 확인해 환경 변수로 정의하기(리눅스)
hostIP = $(ip route get 1 | awk '{print $NF;exit}')

# 로컬 컴퓨터의 IP주소를 확인해 환경 변수로 정의하기(macOS)
hostIP=$(ifconfig ebn0 | grep -e 'init\s')

# 환경 변수로 로컬 컴퓨터의 IP 주소를 전달해 컨테이너를 실행
docker container run -e DOCKER_HOST=$hostIP -d -p 9090:9090 diamol/prometheus:2.13.1
웹 브라우저에서 http://localhost:9090에 접근 해 프로메테우스의 웹 인터페이스를 살펴보자

애플리케이션의 측정값 출력하기

프로메테우스 클라이언트가 적용된 새로운 버전을 사용하는 docker compose 파일을 통해 애플리케이션 실행시 측정값을 제공하는 엔드포인트에 접근해보자
cd ./ch09/exercises

# 모든 컨테이너를 제거한다.
docker container rm -f $(docker container ls -aq)

# 도커 네트워크 nat을 생성한다.
# 같은 이름의 기존 네트워크가 있다면, 경고 메시지가 나오지만, 무시해도 좋다.
docker-compose up -d

# 웹 브라우저에서 http:localhost:8081에 접근하면 애플리케이션 화면이 나타난다.
# http://localhost:8010/metrics에서 측정값을 볼 수있다.

IMG_09F840D078F6-1.jpeg

// 측정값 선언
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(countOfIpAddresses);
지난 실습에서 실행됐던 image-gallery 애플리케이션이 아직 실행 중이며, 측정 값이 수집되는 중이다.

  • 애플리케이션에 조금 부하를 가한 다음, 해당 애플리케이션의 측정ㄱ밧이 출력되는 엔드포인트에 접근해보자

# 반복문을 돌려 다섯번의 HTTP GET 요청을 보낸다.(윈도)
for($i=1; $i -le 5; $i++){ iwr -useb http://lcoalshot:8010 | Out-Null }

# 반복문을 돌며 다섯 번의 HTTP GET 요청을 보낸다.(리눅스)
for i in {1..5}; do curl http://localhost:8010 > /dev/null; done

# 웹 브라우저에서 http://localhost:8012/metrics에 접근한다.
상세 모니터링 추가 참고 사항

  • (만약 있다면) 외부 시스템과의 통신에 걸린 시간과 성공적으로 응답을 받았는지 여부에 대한 기록
    • 이 측정값으로 외부 시스템이 애플리케이션의 속도나 이상 상태에 영향을 줬는지 알 수 있다.
  • 로그로 남길 가치에 있는 모든 정보.
    • 로그로 남기는 것보다 측정값으로 수집하는 편이 메모리, 디스크 용량, CPU 시간 면에서 저렴하고, 추세를 볼 수 있도록 시각화하기도 쉽다.
  • 사업 부서에서 필요로하는 애플리케이션의 상태 및 사용자 행동에 관한 모든 정보.
    • 측정값을 활용하면 과거 정보를 수고를 들여 보고하는 대신 실시간 정보로 대시보드를 구성할 수 있다.

측정값 수집을 맡을 프로메테우스 컨테이너 실행하기

global:
	scrape_interval: 10s
scrape_configs:
	- job_name : "image-gallery"
	  metrics_path : /metrics
	  static_configs:
		- targets:["image-gallery"]

	- job_name: "iotd-api"
	  metrics_path: /actuator/prometheus
	  static_configs:
		- tagets:["iotd"]

	- job_name: "access-log"
	  metrics_path: /metrics
	  dns_sd_configs:
		  - names:
			- accesslog
				type: A
				port: 80

#Docker