以前在《Prometheus監控實踐:Kubernetes集羣監控》一本中總結了咱們目前基於Prometheus對Kubernetes集羣的監控,除了監控Kubernetes集羣自己的關鍵指標以外,也對部署在Kubernetes集羣上應用的狀態作了監控。 對於Kubernetes集羣上Pod, DaemonSet, Deployment, Job, CronJob等各類資源對象,咱們經過kube-state-metrics做爲Prometheus的exporter完成了對這些Kubernetes資源對象的監控。而爲了使監控深刻到應用的內部,就須要應用自身暴露做爲Exporter暴露監控指標,這就和應用的開發語言和技術框架緊密相關了。html
咱們目前部署在Kubernetes上的微服務主要是由Go和Java兩種語言開發的,本篇將總結一下目前咱們使用Prometheus對Java應用的監控實踐。java
Prometheus提供了一個client_java項目能夠很方便的將JVM和自定義的指標暴露出來。目前咱們主要用到了這個項目中的以下幾個庫:git
simpleclient_hotspot
simpleclient_spring_web
simpleclient_spring_boot
simpleclient_httpserver
使用Java能夠開發如下兩種服務:github
第一種是使用spring-boot-starter-web
開發的HTTP Restful API,這類服務要集成Prometheus十分簡單,只須要在項目中依賴管理如引入simpleclient_hotspot
和simpleclient_spring_boot
。web
1 2 |
compile 'io.prometheus:simpleclient_spring_boot:0.1.0' compile 'io.prometheus:simpleclient_hotspot:0.1.0' |
simpleclient_spring_boot
中的io.prometheus.client.spring.boot.PrometheusEndpointConfiguration
會將prometheus exporter註冊爲Spring Boot Actuator的enpoint。啓動這個配置只需在spring boot項目的Appication類上加上@EnablePrometheusEndpoint
的註解,例如:spring
1 2 3 4 5 6 7 8 9 |
@EnablePrometheusEndpoint @EnableSpringBootMetricsCollector @SpringBootApplication public class BootApplication { @PostConstruct public void init() { DefaultExports.initialize(); } ...... |
固然spring boot的配置文件中須要配置如何暴露這個endpoint:api
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
management: port: 8088 security: enabled: false health: defaults: enabled: false endpoints: enabled: false prometheus: enabled: true path: /prometheus health: enabled: true path: /health |
此時http://:8088/prometheus這個端點就是這個Java應用暴露的監控指標。tomcat
第二種是使用最基本的spring-boot-starter
和其餘starter開發的rpc服務(thrift,gRPC等),自己不包含嵌入的tomcat,而Prometheus的exporter須要以HTTP暴露監控指標。須要在項目中依賴管理如引入simpleclient_hotspot
和simpleclient_httpserver
。app
1 2 |
compile 'io.prometheus:simpleclient_httpserver:0.1.0' compile 'io.prometheus:simpleclient_hotspot:0.1.0' |
simpleclient_httpserver
庫包含一個簡單的httpserver,使用其完成監控指標的暴露:框架
1 2 |
DefaultExports.initialize(); new io.prometheus.client.exporter.HTTPServer.HTTPServer(8088); |
http://:8088這個端點就是這個Java應用暴露的監控指標。
當Java應用中集成了Prometheus JVM Client後,就能夠以HTTP的形式暴露監控指標。 若是Java應用以Pod的形式部署在Kubernetes集羣上,爲了使Kubernetes集羣中的Prometheus能夠發現Pod暴露的HTTP監控端點,還須要在Kubernetes manifest文件中加入下面的annotation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
--- kind: Deployment apiVersion: apps/v1beta2 metadata: labels: ...... name: xxx-svc namespace: xx spec: ...... selector: matchLabels: app: xxx-svc template: metadata: labels: app: xxx-svc annotations: prometheus.io/scrape: 'true' prometheus.io/path: /prometheus prometheus.io/port: '8088' spec: containers: ...... |
這樣Prometheus中配置的job kubernetes-pods
就能夠自動發現服務暴露的監控端點:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
- job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] action: replace regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name |
關於Java應用中JVM的監控的Dashboard,目前尚未在網上找到太好的,下圖是目前咱們本身畫的一個:
收集到了監控數據後,告警規則根據須要配置就能夠了。