1. 개요
일단 프로메테우스를 설치해보는 것에 의의를 두는 문서이다.
2. 프로메테우스란?
2.1. 소개
Prometheus는 오픈 소스 모니터링 솔루션으로 크게 다음과 같이 구성되어 있다.
- Prometheus 서버
- Export 노드 (메트릭 정보를 export)
일반적인 모니터링 툴과의 차이점이 있는데 대부분의 모니터링 방식이 개별 서버에서 중앙 서버로 push하는 방식인데 반해, Prometheus는 중앙 서버에서 메트릭을 polling하는 방식이다. 이 방식의 장점은 모든 메트릭을 중앙 서버로 보내지 않아도 된다는 것이다. 특히 부하가 많은 상황에서 메트릭 전송이 더해진다면 문제가 더 커질 수 있다. Prometheus는 중앙에서 일정 주기(디폴트는 15초)로 메트릭을 수집하기 때문에 좀 더 낫다고 할 수 있다.
하지만 단점도 있다. Scale-out이 안된다는 점인데 근본적인 고가용성을 제공한다기 보다는 여러 Prometheus를 연결해서 Hierachy 구조로 사용할 수 있다는 정도이다.
2.2. 구성요소
다음은 Prometheus 내부 구성 요소이다.
Retrival
HTTP로 접근하여 메트릭을 가져오거나 Pushgateway를 통하여 접근할 수 없는 곳에 있는 데이터를 가져오는 역할을 한다. Pushgateway는 접근할 수 없는 곳에 데이터가 존재하는 경우에 Port forward를 통해 사용할 수 있다. 예를 들면 사내망에 데이터가 있어서 외부에서 scrape가 안되는 경우 등이다.
TSDB (Time-series Database)
Prometheus에는 수집한 데이터를 저장하고 시간에 흐름에 따라 조회를 할 수 있도록 시계열(Time-series) 데이터를 저장할 수 있는 저장소가 내장되어 있다. 데이터를 저장하는 방법은 Local Storage와 Remote Storage를 이용하는 방법이 있다. 대부분은 Local Storage를 사용하겠지만 원격지에 있는 서버에 데이터를 저장하는 방법도 사용할 수 있다.
HTTP Server
Prometheus는 내부에 저장된 데이터 조회 기능을 제공하기 위한 HTTP Server를 내장하고 있다.
Web UI
자체 Dashboard를 제공한다. 물론 별도의 시각화 도구를 붙여 보는 것이 더 좋다.
Alert manager
문제가 발생하면 이를 알람으로 보내는 기능을 제공한다.
3. 다운로드
페이지 : https://prometheus.io/download
적당히 필요한 버전을 다운한다.
예: https://github.com/prometheus/prometheus/releases/download/v2.13.1/prometheus-2.13.1.linux-amd64.tar.gz
4. 설치
설치랄 것도 없다. tar 파일을 풀면 디렉토리가 나오고 디렉토리에 들어가면 파일들이 있다.
가장 빨리 실행하는 방법은 기본 내장된 prometheus.yml을 물로 실행하는 것이다. 파일 구조는 대략 다음과 같다.
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090']
눈썰미가 있다면 9090포트로 접근해야 한다는 것쯤은 알 수 있겠다.
이제 다음과 같이 실행한다.
$ ./prometheus --config.file=prometheus.yml level=info ts=2019-11-11T10:32:33.439Z caller=main.go:296 msg="no time or size retention was set so using the default time retention" duration=15d level=info ts=2019-11-11T10:32:33.439Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.13.1, branch=HEAD, revision=6f92ce56053866194ae5937012c1bec40f1dd1d9)" level=info ts=2019-11-11T10:32:33.439Z caller=main.go:333 build_context="(go=go1.13.1, user=root@88e419aa1676, date=20191017-13:15:01)" level=info ts=2019-11-11T10:32:33.439Z caller=main.go:334 host_details="(Linux 4.15.0-1044-aws #46-Ubuntu SMP Thu Jul 4 13:38:28 UTC 2019 x86_64 ip-172-31-6-133 (none))" level=info ts=2019-11-11T10:32:33.439Z caller=main.go:335 fd_limits="(soft=1024, hard=1048576)" level=info ts=2019-11-11T10:32:33.440Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)" level=info ts=2019-11-11T10:32:33.442Z caller=main.go:657 msg="Starting TSDB ..." level=info ts=2019-11-11T10:32:33.443Z caller=web.go:450 component=web msg="Start listening for connections" address=0.0.0.0:9090 level=info ts=2019-11-11T10:32:33.445Z caller=head.go:514 component=tsdb msg="replaying WAL, this may take awhile" level=info ts=2019-11-11T10:32:33.449Z caller=head.go:562 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=1 level=info ts=2019-11-11T10:32:33.450Z caller=head.go:562 component=tsdb msg="WAL segment loaded" segment=1 maxSegment=1 level=info ts=2019-11-11T10:32:33.453Z caller=main.go:672 fs_type=EXT4_SUPER_MAGIC level=info ts=2019-11-11T10:32:33.453Z caller=main.go:673 msg="TSDB started" level=info ts=2019-11-11T10:32:33.453Z caller=main.go:743 msg="Loading configuration file" filename=prometheus.yml level=info ts=2019-11-11T10:32:33.463Z caller=main.go:771 msg="Completed loading of configuration file" filename=prometheus.yml level=info ts=2019-11-11T10:32:33.463Z caller=main.go:626 msg="Server is ready to receive web requests."
이제 이 호스트의 9090포트로 붙으면 된다. 하지만 뭐가 없다.