1
th
유원조 wonjo.yoo@oracle.com 2020.05.15
11 th Oracle Developer
Meetup
Monitoring with
Prometheus
Prometheus 알아보기
Agenda
1
2 OKE에서Prometheus 와 Grafana로 모니터링
© 2019 Oracle and/or its affiliates. All rights reserved.
2
Prometheus 알아보기
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 3
Prometheus란
Prometheus는 오픈 소스 모니터링
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 4
Metric기반 지표를 수집하여 저장,검색
쉬운 운영, 강력한 쿼리 기능, Grafana를 통한 시각화, 많은 Integration CNCF Graduate, 폭넓은 CNCF 생태계
모니터링의 범주
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 5
Profiling : 제한된 기간의 일부 리소스 분석 (예: tcpdump)
Tracing : 특정 이벤트를 추적, HTTP요청->Database -> Cache Server (타이밍)
분산 트레이싱 : Zipkin, Jaeger
Logging : Transaction, Request, Application
Metric : 다양한 유형의 이벤트를 시간별로 집계 예) HTTP요청 횟수,처리시간
Prometheus 아키텍처
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 6
Metric 수집
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 7
클라이언트 라이브러리
공식 : Go, Java, Python, Ruby
Unofficial
Bash, C, C++, Common Lisp, Dart, Elixir, Erlang, Haskell, .NET / C#, Node.js, Perl, PHP, R, Rust
Application
Exporter
3r’d Party SW
Prometheus
데이터 수집 서비스 검색 클라이언트
라이브러리
저장장치 Direct Instrument
pull
local on-disk time series database
Prometheus 실행
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 8
https://prometheus.io/download/
다운로드 tar -xzf prometheus-*.linux-amd64.tar.gzcd prometheus-*.linux-amd64 ./prometheus
설정파일 : prometheus.yml global:
scrape_interval: 15s scrape_timeout: 10s scrape_configs:
- job_name: 'prometheus' metrics_path: /metrics scheme: http
static_configs:
- targets: ['localhost:9090']
http://localhost:9090/metrics
Prometheus GUI
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 9
Prometheus 자체 프로세스에 대해서 metric을 계속 수집 중
Value는 float64 라벨(Label) : 동일한 데이터에서 종류를 구분하기 위한 식별자
조회할 메트릭 선택 PromQL
Prometheus 데이터
Metric 이름 Label 이름=Label Value, …
PromQL
PromQL
[1m] : 현재 시간 기준으로 이전 1분 동안의 데이터 조회
prometheus_http_requests_total[1m]
s, m, h, d, w, y
정규 표현식
{job=~".*",method="get"}
가장 많이 사용하는 함수 : sum, avg, rate
sum(prometheus_http_requests_total)
Prometheus GUI
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 13
Status à Target 클릭 현재 모니터링 대상으로 Prometheus 자체
Prometheus GUI – 측정 metric 확인
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 14
Prometheus자체도
metrics으로 계측이 되고 있음.
scrape_configs:
- job_name: 'prometheus' metrics_path: /metrics scheme: http
static_configs:
- targets: ['localhost:9090']
Prometheus GUI – Graph
Gauge
메모리 사용량과 같이 현재 값을 표시
Prometheus GUI – Graph
Counter
총 요청수 처럼 지속적으로 증가하는 값
다양한 Exporter 제공
Databases
•Aerospike exporter
•ClickHouse exporter
•Consul exporter(official)
•Couchbase exporter
•CouchDB exporter
•ElasticSearch exporter
•EventStore exporter
•Memcached exporter(official)
•MongoDB exporter
•MSSQL server exporter
•MySQL router exporter
•MySQL server exporter(official)
•OpenTSDB Exporter
•Oracle DB Exporter
•PgBouncer exporter
•PostgreSQL exporter
•Presto exporter
•ProxySQL exporter
•RavenDB exporter
•Redis exporter
•RethinkDB exporter
•SQL exporter
•Tarantool metric library
•Twemproxy
Hardware related
•apcupsd exporter
•BIG-IP exporter
•Collins exporter
•Dell Hardware OMSA exporter
•IBM Z HMC exporter
•IoT Edison exporter
•IPMI exporter
•knxd exporter
•Modbus exporter
•Netgear Cable Modem Exporter
•Netgear Router exporter
•Node/system metrics exporter(official)
•NVIDIA GPU exporter
•ProSAFE exporter
•Ubiquiti UniFi exporter Storage
•Ceph exporter
•Ceph RADOSGW exporter
•Gluster exporter
•Hadoop HDFS FSImage exporter
•Lustre exporter
•ScaleIO exporter
Issue trackers and continuous integration
•Bamboo exporter
•Bitbucket exporter
•Confluence exporter
•Jenkins exporter
•JIRA exporter Messaging systems
•Beanstalkd exporter
•EMQ exporter
•Gearman exporter
•IBM MQ exporter
•Kafka exporter
•NATS exporter
•NSQ exporter
•Mirth Connect exporter
•MQTT blackbox exporter
•RabbitMQ exporter
•RabbitMQ Management Plugin exporter
•RocketMQ exporter
•Solace exporter HTTP
•Apache exporter
•HAProxy exporter(official)
•Nginx metric library
•Nginx VTS exporter
•Passenger exporter
•Squid exporter
•Tinyproxy exporter
•Varnish exporter
•WebDriver exporter
APIs
•AWS ECS exporter
•AWS Health exporter
•AWS SQS exporter
•Azure Health exporter
•BigBlueButton
•Cloudflare exporter
•DigitalOcean exporter
•Docker Cloud exporter
•Docker Hub exporter
•GitHub exporter
•InstaClustr exporter
•Mozilla Observatory exporter
•OpenWeatherMap exporter
•Pagespeed exporter
•Rancher exporter
•Speedtest exporter
•Tankerkönig API Exporter Logging
•Fluentd exporter
•Google's mtail log data extractor
•Grok exporter
Node Exporter
https://prometheus.io/download/
에서 다운로드 tar -xzf node_exporter*.linux-amd64.tar.gzcd node_exporter-*.linux-amd64 ./node_exporter
노드의 Metric을 수집
CPU,메모리,디스크공간,I/O, 네트워크 대역폭
설정파일(prometheus.yml)에 아래 추가 global:
scrape_interval: 15s scrape_timeout: 10s scrape_configs:
- job_name: 'prometheus' metrics_path: /metrics scheme: 'http'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node' static_configs:
- targets: ['localhost:9100']
Node Exporter
Node 1개가 모니터링 Target으로 새롭게 추가됨
Node Exporter의 metric 정보
PromQL 을 사용한 Graph
Node_exporter에 의해 추가된 값 network interface별로 수신된 데 이터를 표시하는 Counter
PromQL의 rate() 함수: 증가율
클라이언트 Library를 이용한 Direct Instrument (Python)
import http.server
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200) self.end_headers()
self.wfile.write(b"Hello World") if __name__ == "__main__":
server = http.server.HTTPServer(('localhost', 8001), MyHandler) server.serve_forever()
클라이언트 Library를 이용한 Direct Instrument (Python)
Application
클라이언트 라이브러리
Direct Instrument 라이브러리 설치 : pip install prometheus_client
import http.server
from prometheus_client import start_http_server
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200) self.end_headers()
self.wfile.write(b"Hello World") if __name__ == "__main__":
start_http_server(8000)
server = http.server.HTTPServer(('localhost', 8001), MyHandler) server.serve_forever()
클라이언트 Library를 이용한 Direct Instrument (Python)
prometheus.yml 에 job 추가
global:
scrape_interval: 15s scrape_timeout: 10s scrape_configs:
- job_name: 'prometheus' metrics_path: /metrics scheme: http
static_configs:
- targets:
- localhost:9090 - job_name: 'example'
static_configs:
- targets: ['localhost:8000'] python_info 조회 가능
클라이언트 Library를 이용한 Direct Instrument(Python) – Counter 추가
import http.server
from prometheus_client import start_http_server from prometheus_client import Counter
REQUESTS = Counter('hello_worlds_total’, 'Hello Worlds requested.')
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
REQUESTS.inc()
self.send_response(200) self.end_headers()
self.wfile.write(b"Hello World") if __name__ == "__main__":
start_http_server(8000)
server = http.server.HTTPServer(('localhost', 8001), MyHandler) server.serve_forever()
Metric 정의. Counter 설명
Instrument 부분: Metric이 사용(호출) 됨 Inc()는 카운터 값 1 증가. Thread Safe 보장 URL 호출 시 마다 값이 1씩 증가됨
Metric 종류
CounterGauge : 현재 상태 표시. 예) 현재 대기열 수, 캐시 메모리 사용량, 활성 Thread수 주요 메소드 : inc, dec, set
Summary : 측정된 값을 전부 합한 값. 주로 대기 시간을 측정하는데 사용 Histogram : 분포도 값 반환
클라이언트 Library를 이용한 Direct Instrument(Java)
import io.prometheus.client.Counter;
import io.prometheus.client.hotspot.DefaultExports;
import io.prometheus.client.exporter.HTTPServer;
public class Example {
private static final CountermyCounter = Counter.build() .name("my_counter_total")
.help("An example counter.").register();
public static void main(String[] args) throws Exception { DefaultExports.initialize();
HTTPServer server = new HTTPServer(8000);
while (true) { myCounter.inc();
Thread.sleep(1000);
}} }
DEMO
Node exporter + Custom exporter
OKE에서
Prometheus 와 Grafana로 모니터링
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 28
Service Discovery를 통한 Kubernetes monitoring
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 29
Target Auto Discovery Pull Datasource
Pull
Kubernetes Nodes
Kubernetes Master API Server
Grafana Dashboard kubernetes_sd_config
Prometheus Operator
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted
30 Source:prometheus-operator
Kubernetes Operator를 사용하여 Prometheus 용 모니터링 인스턴스를 자동으로 생성/관리
Kubernetes 에 Prometheus Operator 설치 Prometheus Pod를 생성
대상 scrape config 를 자동으로 생성 어떤 그룹의 서비스를 모니터링 할지
Prometheus ServiceMonitor PodMonitor
PrometheusRule Alertmanager
OKE(Container Engine for Kubernetes) 에 설치 – Demo 구성도
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 31
Oracle Kubernetes Engine
Monitoring namespace Private
Subnet Public
Subnet
Prometheus Service (Type=LoadBalancer)
Grafana Service (Type=LoadBalancer)
Prometheus Pod
Grafana Pod
Load Balancer
VCN
prometheus-kube-state-metrics
prometheus-node-exporter
alertmanager
OKE(Oracle Kubernetes Engine) 사용하기
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 32
1. OCI CLI 설치
2. Local에 Kube config 설정 (Cluster서버 정보 및 인증서, region) 3. oke-admin 계정 생성 및 RBAC 권한 부여
4. kubectl proxy 로 Local에서 Kubernetes dashboard 실행 à Local에 8001 포트로 Listen하고 Remote로 forwarding
kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.0.10.2 Ready node 127m v1.15.7 OCI CLI
./kube/config kubectl 생성
Oracle Cloud OKE
Kubernetes Cluster
Helm 이란?
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 33
Helm Client
Helm Server Tiller RepositoryHelm
Chart Chart
Release
Tiller는 v3에서 제거됨.
Oracle OCI는 Helm v2를 지원함.
• Helm Repository 관리
• Chart 개발
• Tiller와 통신하여
Kubernetes의 Chart 관리
gRPC Docker
Image Repository
Github / ChartMuseum
OKE 에 Prometheus 설치 순서
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 34
1. Helm chart repository update
helm repo add stable https://kubernetes-charts.storage.googleapis.com helm repo update
2. Helm으로 Prometheus + Grafana 설치
helm install --name kube-prometheus --namespace monitoring stable/prometheus-operator 3. 설치된 Pod 확인
kubectl --namespace monitoring get pods -l "release=kube-prometheus"
https://github.com/helm/charts/tree/master/stable/prometheus-operator
OKE 에 설치 – Load Balancer에 연결하기
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 35
> kubectl edit svc kube-prometheus-prometheus-prometheus -n monitoring
apiVersion: v1 kind: Service metadata:
name: kube-prometheus-prometheus-prometheus namespace: monitoring
resourceVersion: "48861"
spec:
clusterIP: 10.96.160.249 ports:
- name: web port: 9090 protocol: TCP targetPort: 9090 selector:
app: prometheus
prometheus: kube-prometheus-prometheus-prometheus sessionAffinity: None
type: ClusterIP status:
loadBalancer: {}
annotations:
service.beta.kubernetes.io/oci-load-balancer-shape: "100Mbps"
service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "HTTP"
spec:
type: LoadBalancer 추가
변경
> kubectl edit svc kube-prometheus-grafana -n monitoring
1. Prometheus 서비스 OCI Load Balancer 로 연결하기 2. Grafana 서비스 OCI Load balancer 로 연결하기
서비스 확인
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 36
kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 167m
kube-prometheus-grafana LoadBalancer 10.96.120.86 129.213.68.145 80:32149/TCP 167m kube-prometheus-kube-state-metrics ClusterIP 10.96.18.114 <none> 8080/TCP 167m
kube-prometheus-prometheus-alertmanager ClusterIP 10.96.93.30 <none> 9093/TCP 167m kube-prometheus-prometheus-node-exporter ClusterIP 10.96.64.239 <none> 9100/TCP 167m kube-prometheus-prometheus-operator ClusterIP 10.96.185.165 <none> 8080/TCP,443/TCP 167m
kube-prometheus-prometheus-prometheus LoadBalancer 10.96.86.59 150.136.188.146 9090:31284/TCP 167m prometheus-operated ClusterIP None <none> 9090/TCP 166m
서비스 확인
Confidential – © 2020 Oracle Internal/Restricted/Highly Restricted 37
DEMO
OKE + Prometheus + Grafana
Thank you
Confidential – © 2019 Oracle Internal/Restricted/Highly Restricted 39