Metric Name(标指名称) + Labels(标签) + Timestamp(时间戳) + Value/Sample(监控值/样品)Metric Name(指标名称)/Labels(标签) 只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。 Counter/Gauge/Historgram/Summary 四种指标类型,每种指标类型说明可参考下文。更多说明请参考 Prometheus 官网 METRIC TYPES。Counter 来监控订单数:package orderimport ("github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promauto")// 定义需要监控 Counter 类型对象var (opsProcessed = promauto.NewCounterVec(prometheus.CounterOpts{Name: "order_service_processed_orders_total",Help: "The total number of processed orders",}, []string{"status"}) // 处理状态)// 订单处理func makeOrder() {opsProcessed.WithLabelValues("success").Inc() // 成功状态// opsProcessed.WithLabelValues("fail").Inc() // 失败状态// 下单的业务逻辑}
rate(order_service_processed_orders_total[5m])
Gauge 来监控订单队列大小:package orderimport ("github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promauto")// 定义需要监控 Gauge 类型对象var (queueSize = promauto.NewGaugeVec(prometheus.GaugeOpts{Name: "order_service_order_queue_size",Help: "The size of order queue",}, []string{"type"}))type OrderQueue struct {queue chan string}func newOrderQueue() *OrderQueue {return &OrderQueue{queue: make(chan string,100),}}// 产生订单消息func (q *OrderQueue)produceOrder() {// 产生订单消息// 队列个数加1queueSize.WithLabelValues("make_order").Inc() // 下单队列// queueSize.WithLabelValues("cancel_order").Inc() // 取消订单队列}// 消费订单消息func (q *OrderQueue)consumeOrder() {// 消费订单消息// 队列个数减1queueSize.WithLabelValues("make_order").Dec()}
order_service_order_queue_size
Bucket 来计算样本的分布情况,后期可以再加工,一般多用于耗时的监控,通过 Histogram 可以计算出 P99/P95/P50等耗时,同时也可以监控处理的个数,如果用上 Histogram 就不需要再用 Counter 统计个数。可以用 Histogram 来监控接口响应时间/数据库访问耗时等。Summary 来监控订单处理耗时:package orderimport ("net/http""time""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promauto""github.com/prometheus/client_golang/prometheus/promhttp")// 定义需要监控 Summary 类型对象var (opsProcessCost = promauto.NewSummaryVec(prometheus.SummaryOpts{Name: "order_service_process_order_duration",Help: "The order process duration",}, []string{"status"}))func makeOrder() {start := time.Now().UnixNano()// 下单逻辑处理结束,记录处理耗时defer opsProcessCost.WithLabelValues("success").Observe((float64)(time.Now().UnixNano() - start))// 下单的业务逻辑time.Sleep(time.Second) // 模拟处理耗时}
order_service_processed_order_duration_sum / order_service_processed_order_duration_count
promhttp.Handler() 把监控埋点数据暴露到 HTTP 服务上。package mainimport ("net/http""github.com/prometheus/client_golang/prometheus/promhttp")func main() {// 业务代码// 把 Prometheus 指标暴露在 HTTP 服务上http.Handle("/metrics", promhttp.Handler())// 业务代码}
Explore 来查看监控指标数据,如下图,也可以 自定义 Grafana 监控大盘。

Prometheus 和 云监控告警 的能力可以对自定义监控指标进行实时告警,详情请参见 告警介绍及使用。文档反馈