普羅米修斯 -- 快速構建你的業務監控平臺
Prometheus是什麼
Prometheus(普羅米修斯)是一個名字非常酷的開源監控系統。
它支援多維度的指標資料模型,服務端通過HTTP協議定時拉取資料後,通過靈活的查詢語言,實現監控的目的。
如上圖,客戶端記錄相關指標資料,對外提供查詢介面。Prometheus服務端通過伺服器發現機制找到客戶端,並定時抓取儲存為時間序列資料。最後通過Grafana等圖表工具整合展示。
Prometheus可以做什麼
-
在業務層用作埋點系統
Prometheus支援各個主流開發語言(Go,java,python,ruby官方提供客戶端,其他語言有第三方開源客戶端)。我們可以通過客戶端方面的對核心業務進行埋點。如下單流程、新增購物車流程。 -
在應用層用作應用監控系統
一些主流應用可以通過官方或第三方的匯出器,來對這些應用做核心指標的收集。如redis,mysql。 -
在系統層用作系統監控
除了常用軟體, prometheus也有相關係統層和網路層exporter,用以監控伺服器或網路。 -
整合其他的監控
prometheus還可以通過各種exporte,整合其他的監控系統,收集監控資料,如AWS CloudWatch,JMX,Pingdom等等。
不要用Prometheus做什麼
prometheus也提供了Grok exporter等工具可以用來讀取日誌,但是prometheus是監控系統,不是日誌系統。應用的日誌還是應該走ELK等工具棧。
Prometheus 和 spring boot整合
- Prometheus中配置服務發現
- job_name: 'consul' consul_sd_configs: - server: '192.168.1.248:8500' relabel_configs: - source_labels: [__meta_consul_service] regex: .*,prometheus.* target_label: job metrics_path: '/prometheus'
-
maven中新增相關依賴
<!-- The client --> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient</artifactId> </dependency> <!-- Exposition servlet--> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_servlet</artifactId> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_spring_boot</artifactId> </dependency>
-
關閉spring boot原生metrics
spring.metrics.servo.enabled: false
-
Application類添加註解
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector -
業務類定義埋點
static final Counter orderCount = Counter.build()
.name("b2c_order_count").help("order count.").labelNames("shop","siteUid").register(); -
業務埋點
orderCount.labels("shein","mus").inc();
Prometheus監控nginx
使用起來也非常簡單:
lua_shared_dict prometheus_metrics 10M;
lua_package_path "/path/to/nginx-lua-prometheus/?.lua";
init_by_lua '
prometheus = require("prometheus").init("prometheus_metrics")
metric_requests = prometheus:counter(
"nginx_http_requests_total", "Number of HTTP requests", {"host", "status"})
metric_latency = prometheus:histogram(
"nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
metric_connections = prometheus:gauge(
"nginx_http_connections", "Number of HTTP connections", {"state"})
';
log_by_lua '
local host = ngx.var.host:gsub("^www.", "")
metric_requests:inc(1, {host, ngx.var.status})
metric_latency:observe(ngx.now() - ngx.req.start_time(), {host})
';
但是,通過基準測試,發現使用了histogram型別的指標後,吞吐量會有5%-10%左右的降低。
總結
藉助Prometheus,我們可以快速搭建一個業務監控系統,同時還能增加核心應用的監控手段。豐富我們的監控渠道,配合zabbix、zipkin、ELK、Grafana等工具,讓你全方位掌控你的系統。
相關資料: