🧵prometheus为代表的监控构建

type
status
date
slug
summary
category
tags
icon
password
AI summary
Blocked by
Blocking
Category

背景

系统稳定性差,接口p99延时长;队列消费时间久;系统ttft久;亟需一个完整的监控系统来指导线上问题预测与排查。
 
 

相关的基础概念

  • 时间序列(Time series):由固定的 metric name + labels 唯一标识的一组(有时间戳的)样本点序列。
    • 例:http_requests_total{job="api",method="GET",code="200"} 是一条时间序列。
  • 样本(Sample):时间序列在某个时间点的一个数值(value, timestamp)。
  • 指标(Metric / Metric family):同一名称的时间序列集合(可能有不同 label 组合)。
  • Label(标签):键值对,用于给时间序列打维度(如 instance, job, method)。Label 是查询与聚合的基础,但也会带来 cardinality(基数)问题。
  • PromQL:Prometheus 的查询语言,用于选择/聚合/转换时间序列(Grafana 中的大部分面板会用到 PromQL)。
notion image
Prometheus 的生态系统由多个组成部分组成,其中许多是可选的:
  • exporter:用于 HAProxy、StatsD、Graphite 等服务的专用输出程序

Prometheus架构

Prometheus 的核心职责包括:
  1. 采集数据(Scrape)
    1. 定期从各服务的 /metrics 接口抓取最新指标数据。
  1. 存储数据(TSDB)
    1. 将时间序列(time series)存储在它自己的时序数据库中。
  1. 提供查询(PromQL)
    1. Prometheus 内置查询引擎,可通过 PromQL 查询任意时间序列数据。
  1. 触发告警(Alerting)
    1. 结合 Alertmanager 可以发出告警。

Grafana架构

Grafana 不存储指标数据,它的核心工作是:
  1. 从 Prometheus(或其他数据源)读取 Metrics
    1. Grafana 只是对 Prometheus 发起 PromQL 查询。
  1. 渲染可视化面板
    1. 把 PromQL 返回的数据绘制成折线图、柱状图、仪表盘等。
  1. 构建仪表盘(Dashboard)
    1. 让运营人员、研发、SRE 可以快速浏览服务状态。
  1. 提供权限系统、变量、模版
    1. 用于团队协作与面板复用。
 
 

指标分类

Counter(计数器)

  • 含义:单调递增的数值(只能加,不能减,除了重启会重置为 0)。用于记录次数、累计字节等。
  • PromQL 常用
    • rate(http_requests_total[5m]) — 返回每秒速率(用在图上是最常用的)。
    • increase(http_requests_total[1h]) — 返回区间内的增长量(适合展示“过去 1 小时新增多少请求”)。
  • 适用场景:请求数、错误数、处理的字节数、任务完成次数等。
  • Go(client_golang)示例

Gauge(仪表)

  • 含义:可以任意增减的数值(会记录当前值)。适合瞬时值或可上/下浮动的量。
  • 适用场景:当前并发数、内存使用量、队列长度、温度等。
  • Go 示例

Histogram(直方图)

  • 含义:将观测值按预定义的 buckets(桶)统计成分布,同时导出 _bucket(每个桶的累计计数)、_sum(总和)、_count(观测次数)。
  • 重要点
    • Prometheus 本身不直接存储分位数;要通过 histogram_quantile() 在查询端近似计算分位点(基于桶的累积计数)。
    • 直方图更适合服务端对延迟/大小分布的观测(尤其适用于高 QPS 环境)。
  • PromQL 典型用法
    • histogram_quantile(0.99, sum(rate(request_duration_seconds_bucket[5m])) by (le)) — 估算 99% 响应时间。
    • 注意 by (le)le 是桶的上限标签。
  • Go 示例(可选用 Summary):
  • 桶设计注意:桶是固定的、离散的。应该根据你的延迟分布定制(对数/倍数型通常合适)。太多桶影响性能;太少桶影响精度。

Summary(摘要)

  • 含义:直接在客户端(instrumentation)计算分位数(滑动窗口/流式算法)并导出;同时也导出 _sum_count
  • 特性与区别
    • Summary 会在 client 侧计算 quantiles(所以每个实例可能不同,不易合并),不适合在 Prometheus 服务端进行跨实例的精确分位计算。
    • 如果你要跨实例计算整体的 p99,不要只用 Summary;用 Histogram + histogram_quantile 更可合并(推荐后端服务使用 Histogram)。
  • 用例:当你只需要在单个实例上得到精确 quantile(比如某个 host 本地指标)时,Summary 可以用。
  • Go 示例
 

Prometheus与Grafana的关系

Grafana 并没有存储 Metrics 的能力。
Prometheus 本身也不擅长做漂亮图表。
两者结合刚好互补。
 
notion image
 
 
 

具体的案例 tcp连接的可观测性质 TODO

需求分析

对于主机的TCP的连接状态统计

  1. SYN_SENT 连接数
  1. ESTABLISHED 连接数
  1. TIME_WAIT 连接数
  1. CLOSE_WAIT 连接数
  1. LISTEN 状态数
 

对于主机的TCP的流量指标

  1. 发送的字节数
  1. 接受的字节数
  1. 当前活跃的连接数
  1. 每秒新建的连接数
 

对于单个TCP连接的性能指标

  1. 重传率
  1. 连接建立时间
  1. RTT
  1. 丢包率
  1. 连接错误数
 
 

ref

docker-compose file
 
Prev
分词
Next
k8s informer 架构
Loading...
Article List
如果去做,还有一丝希望;但是不去做,就毫无希望
技术分享
个人总结
转发