Prometheus監控實踐:使用Prometheus監控Java應用

以前在《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 JVM Client

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_hotspotsimpleclient_spring_bootweb

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_hotspotsimpleclient_httpserverapp

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應用暴露的監控指標。

Prometheus的服務發現

當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

Grafana Dashboard和告警規則

關於Java應用中JVM的監控的Dashboard,目前尚未在網上找到太好的,下圖是目前咱們本身畫的一個:

java-grafana.jpg

收集到了監控數據後,告警規則根據須要配置就能夠了。

參考

相關文章
相關標籤/搜索