新闻详情

新闻详情

首页 / 资讯中心 / 详情

Prometheus + Grafana 监控栈搭建实战:从Docker Compose部署到告警接入

发布时间:2026/10/1 1:18:22来源:尧图网络
Prometheus + Grafana 监控栈搭建实战:从Docker Compose部署到告警接入
第一次真正把这套组合部署到生产环境是在一个周五的晚上。当时团队用的还是老式监控方案告警全靠邮件排队服务器一多面板就乱成一锅粥。我花了一个周末的时间把Prometheus Grafana 这套开源监控栈完整搭起来从那以后就再也没换回去过。这篇文章打算把实际的监控搭建过程和 Grafana 界面基础配置完整记录下来——包括 Docker Compose 方案选型、Node Exporter 和 OpenTelemetry Collector 的数据采集链路、告警规则怎么写、Alertmanager 怎么接以及我在使用中踩过的几个典型坑和对应的排查套路。无论是刚接触监控的新手还是想从零搭建一套可靠监控体系的小团队这篇都能给你一套可以直接抄作业的底子。1. 为什么开源监控方案里偏偏是 Prometheus 和 Grafana1.1 开源协议和生态位置决定了这套组合的生命力先说个很多人会问到的问题Prometheus 是开源的吗是的而且不是那种挂着开源名字、核心功能全收费的开源。Prometheus 采用 Apache 2.0 协议目前由云原生计算基金会CNCF维护是继 Kubernetes 之后第二个从 CNCF 毕业的项目。这意味着它的代码你可以放心用也意味着它的社区活跃度、版本迭代节奏、周边生态都有大厂和大量开发者在持续贡献。Grafana 走的是不一样的路线。Grafana 本身是开源的遵循 AGPLv3 协议核心功能完全免费企业版则是额外的高级功能和服务。对我们大多数场景来说开源版已经足够。真正让 Prometheus 有优势的是它的exporter 生态。几乎你能想到的每一种中间件、数据库、硬件设备都有现成的 exporter 可以直接接入Node Exporter 管主机MySQL Exporter 管数据库Redis Exporter 管缓存SNMP Exporter 管网络设备。我在同一个监控面板里既看到 Kubernetes 集群的 Pod 状态又看到几台老交换机的端口流量靠的就是这套统一采集格式整个监控体系不用造轮子所有指标都长成一个样子。1.2 Pull 模型为什么监控端要主动去抓而不是等数据送Prometheus 的数据采集模型是Pull拉取模型也就是监控端主动向被监控对象的某个 HTTP 端点发起请求周期性获取指标。这和传统的 Agent 主动上报Push模型有本质区别。这个设计带来的好处在实际运维里非常明显被监控对象不需要知道监控端存在只要暴露一个/metrics端点即可。监控端可以从自己的视角判断目标是否存活up指标就是这个用途。数据采集行为是可控的监控端可以随时调整抓取频率或不抓取某些目标。在 Kubernetes 场景下新的 Pod 一创建Prometheus 通过服务发现就能自动找到并开始采集。Pull 模型也有它的缺点最典型的是跨网络区域的场景。比如你要采集一个位于隔离网段的服务器的指标监控端访问不到它这时候就需要一个Pushgateway作为中间层让被监控端主动把指标推送到 Pushgateway再由 Prometheus 去抓取。我一般只在 cron 任务、批处理这类短命任务里用 Pushgateway常驻服务还是直接暴露端点更干净。1.3 什么场景下适合这套组合什么场景不适合按我自己的实践经验Prometheus Grafana 最适合这几类场景场景适配程度原因单机或少量服务器的基础监控非常适合部署简单Node Exporter 一个面板就够中小团队的应用和中间件监控非常适合exporter 生态丰富Grafana 面板成熟可用Kubernetes 集群监控当前事实标准服务发现、Pod 指标、容器监控天然契合超大规模、超长期指标存储不太适合本地存储有容量上限需要扩展 Thanos 或 Cortex很多人上来就问这套能不能替代 XX我的回答是得看你的数据规模和你愿意投入的运维成本。Prometheus 单实例本地存储默认只保留 15 天即使你调大保留时间单机磁盘和查询性能早晚会成为瓶颈。真到了那个量级需要引入 Thanos 做对象存储归档或者用 Cortex/Mimir 做多租户方案。但在绝大多数中小规模场景下Prometheus Grafana 就是性价比最高的答案。2. Docker Compose 一条龙部署从目录结构到验证监控2.1 为什么选择 Docker Compose 而非直接装二进制我当时做选型时对比过两种方案直接下载二进制文件分别部署或者用 Docker Compose 编排出整套环境。最终选了 Compose原因是它把一个系统的多个组件封装成了统一的编排文件启动、停止、重启都是同一条命令升级时改镜像标签再up -d就行回滚也快。二进制部署的好处是性能损耗小、故障排查更直接但代价是你要自行管理 systemd 服务、配置文件路径、日志轮转四个组件下来重复劳动非常多。Docker Compose 比较适合中小环境而且 Prometheus 官方镜像本身就是为容器场景打造的配合数据目录挂载完全能满足持久化要求。还有一个很实际的问题四个组件分别部署的话端口、网络、依赖关系都要记在脑子里。用 Compose 后所有服务都在同一个自定义网络里Prometheus 可以直接通过服务名访问 Grafana 和 Alertmanager不用记 IP 地址。2.2 项目目录规划与镜像版本说明我先建一个干净的目录把每个组件的数据目录和配置分离将来备份、迁移、排查都省事monitor-stack/ ├── docker-compose.yml ├── prometheus/ │ ├── prometheus.yml │ ├── rules/ │ │ └── node-alerts.yml │ └── data/ ├── grafana/ │ └── data/ └── alertmanager/ └── alertmanager.yml镜像版本我也建议一开始就固定下来。踩过不少次latest 镜像行为突变的坑之后我的习惯是明确到小版本。比如我用的是prom/prometheus:v2.53.0、grafana/grafana:11.1.0、prom/alertmanager:v0.27.0、prom/node-exporter:v1.8.2。拉镜像时如果下载速度不理想可以给 Docker 配置镜像加速器或者换用其他连接方式解决不必在版本选择上将就。2.3 Docker Compose 配置与端口规划下面是完整的docker-compose.yml里面包含了 Prometheus、Grafana、Alertmanager 和 Node Exporter 四个核心组件version: 3.8 networks: monitor: services: prometheus: image: prom/prometheus:v2.53.0 container_name: prometheus restart: always volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus/rules:/etc/prometheus/rules - ./prometheus/data:/prometheus command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus - --storage.tsdb.retention.time30d ports: - 9090:9090 networks: - monitor grafana: image: grafana/grafana:11.1.0 container_name: grafana restart: always volumes: - ./grafana/data:/var/lib/grafana ports: - 3000:3000 networks: - monitor alertmanager: image: prom/alertmanager:v0.27.0 container_name: alertmanager restart: always volumes: - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml ports: - 9093:9093 networks: - monitor node-exporter: image: prom/node-exporter:v1.8.2 container_name: node-exporter restart: always command: - --path.rootfs/host volumes: - /:/host:ro,rslave ports: - 9100:9100 networks: - monitor端口规划上我习惯保持 Prometheus 的 9090、Grafana 的 3000、Alertmanager 的 9093 不变因为这些是各组件默认端口面板、API、文档里的默认写法都基于这些端口硬要改反而会增加不必要的成本。Node Exporter 的 9100 在容器里映射出来后宿主机上的指标也能被采集到。注意node-exporter容器里挂载宿主机根目录的写法这是为了让容器内看到宿主机真实的/proc和/sys文件系统信息否则采集到的 CPU、内存、磁盘数据是容器自己那一套参考价值不大。--path.rootfs/host告诉 Node Exporter 从挂载位置读取宿主机底层的数据。2.4 Prometheus 主配置文件解析与首次启动prometheus/prometheus.yml是整个监控的数据入口核心内容如下global: scrape_interval: 15s evaluation_interval: 15s rule_files: - /etc/prometheus/rules/*.yml scrape_configs: - job_name: prometheus static_configs: - targets: [localhost:9090] - job_name: node-exporter static_configs: - targets: [node-exporter:9100] labels: host: monitor-server这里最关键的一个参数是scrape_interval它决定 Prometheus 多久来采集一次数据。15 秒对绝大多数监控场景足够既不会产生太大存储压力也能及时感知故障。如果你监控的是核心支付链路可能需要调到 5 秒但这会直接放大磁盘写入量我一般不轻易动全局配置。启动时在monitor-stack目录下执行docker compose up -d等几十秒逐一验证# 查看容器状态 docker compose ps # 验证 Prometheus 自身指标端点 curl http://localhost:9090/metrics | head -20 # 验证 Node Exporter 是否提供了宿主机指标 curl http://localhost:9100/metrics | head -20然后打开浏览器访问http://localhost:9090/targets正常情况下能看到prometheus和node-exporter两个 target 的状态都是 UP。这个页面是整个 Prometheus 数据链路是否健康的晴雨表后面排查问题时第一步一定会来这里。3. 数据从哪来从 Node Exporter 到 OpenTelemetry Collector 的采集链路3.1 Node Exporter 是主机监控的地基部署完之后的第一个数据源绝大多数是我们自己的主机。Node Exporter 通过读取操作系统的/proc、/sys等虚拟文件系统把 CPU、内存、磁盘、网络、文件系统等指标暴露出来Prometheus 每 15 秒抓取一次形成时间序列。常用的指标我列几个刚上手的人可以拿这些去 Grafana 里练手指标名含义常见用途up目标抓取状态判断被监控对象是否存活node_cpu_seconds_totalCPU 累计使用秒数计算 CPU 使用率node_memory_MemTotal_bytes内存总量内存使用率node_filesystem_avail_bytes文件系统可用空间磁盘容量告警node_network_receive_bytes_total网卡累计接收字节网卡流量看这几个指标名你会发现一个规律Prometheus 的指标名后缀常常是_total代表它是一个计数器Counter只增不减。CPU 累计时间、网卡累计流量这些指标本身没有直接意义要在查询里用rate()函数计算出每秒的变化速率才是有意义的使用率。这是 Prometheus 查询和传统监控区别最大的一点后面写查询表达式时会反复遇到。3.2 OpenTelemetry Collector 和 Prometheus 是怎么对接的现在很多应用都在接入 OpenTelemetry 进行链路追踪和指标采集随之而来一个问题Prometheus 是如何从 otel-collector 收取数据的这里的关键是 OpenTelemetry Collector 的prometheus exporter。它的作用是把 Collector 从各种应用那里收集来的指标转换成 Prometheus 格式然后暴露一个/metrics端点。Prometheus 端只需要把这个端点当成一个普通的 target 来抓取即可。一个最小的 otel-collector 配置片段如下receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 processors: batch: exporters: prometheus: endpoint: 0.0.0.0:9464 namespace: app service: pipelines: metrics: receivers: [otlp] processors: [batch] exporters: [prometheus]在这个配置里应用通过 OTLP 协议把指标数据推到 Collector 的 4317 端口Collector 经过 batch 处理后通过 prometheus exporter 在 9464 端口把指标暴露出去。后续在 Prometheus 的scrape_configs里增加这一段- job_name: otel-collector static_configs: - targets: [otel-collector:9464] labels: service: otel-demo数据链路就是应用 → otel-collector → Prometheus → Grafana。这里有个容易混淆的点Prometheus 也能通过 remote write 协议把数据推送给其他后端或者让其他采集器以 remote write 方式写入它。但在Prometheus 从 otel-collector 收数据这个方向正式的对接方式就是上面这种——otel-collector 通过 prometheus exporter 暴露端点Prometheus 主动拉取。把这个关系理清楚排查Collector 收到了数据但 Prometheus 里查不到这类问题时就知道该去哪一端查。3.3 特殊情况交换机、数据库等不在默认采集范围内的设备服务器监控靠 Node Exporter应用监控靠 otel-collector那交换机、路由器这类网络设备怎么办答案是SNMP Exporter。SNMP Exporter 需要一份生成好的snmp.yml配置文件告诉它设备上每个 OID 对应什么指标。官方仓库里已经内置了常用设备厂商的配置模板比如思科、华为、H3C 等。实际使用时用snmp_exporter的 generator 工具根据设备的 MIB 库生成自定义配置然后把 Prometheus 的 target 指向网络设备的 IP 和 SNMP 端口端口流量、CPU 利用率、温度传感器都能采集上来。数据库和中间件也是同样的套路MySQL 用mysqld_exporterRedis 用redis_exporterKafka 用kafka_exporter。你会发现这套监控体系的扩展方式出奇一致——跑一个 exporter暴露一个端口Prometheus 里加一个 job。这也是它的生态能滚雪球一样壮大的核心原因。3.4 搞懂数据模型查询表达式才写得出来用 Grafana 画图前一定要先理解 Prometheus 的数据模型。它本质上是把每个指标组织成一条条带标签的时间序列metric_name{label1value1, label2value2} value timestamp标签的作用是维度。比如up{jobnode-exporter, instancenode-exporter:9100}这个job和instance不是写在指标里的是 Prometheus 在抓取时自动附加的标签用来标识数据的来源。你在 Grafana 里最常见到的下拉筛选本质就是对标签的过滤。PromQL 的核心逻辑可以浓缩成三步先选指标再过滤标签最后用函数计算。比如查询某个主机的 CPU 使用率表达式长这样100 - avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100先用rate()算出 CPU 空闲状态的每秒变化量求平均后转成百分比再用 100 减去它得到的就是过去 5 分钟的 CPU 使用率。刚开始写复杂表达式时容易懵我的建议是从单指标、单函数的简单查询开始先在 Prometheus 的 Graph 页面里看结果确认没问题再搬到 Grafana 面板里。4. Grafana 界面基础配置数据源、导入面板与变量联动4.1 添加 Prometheus 数据源的三个易错点打开 Grafana默认账号密码是admin/admin首次登录会让你修改密码这个不难。真正容易出错的是添加数据源这一步。路径是Connections - Data sources - Add data source选择 Prometheus在 HTTP URL 一栏填http://prometheus:9090。注意这里填的一定是容器网络内的服务名prometheus而不是localhost。如果填localhost:9090Grafana 容器内访问的是它自己的回环地址那里并没有 Prometheus 在监听结果必然是 Connection refused。填完后点Save test看到绿色提示才算配好。我见过不少人在这一步卡住多半是网络配置或者 URL 填错进容器的docker exec -it grafana sh里用wget测一下就能定位。4.2 导入仪表盘和拷贝整个面板的正确姿势Grafana 里最爽的一点是海量的现成仪表盘。打开 Dashboards 页点New - Import输入一个面板 ID 就能从 Grafana.com 拉取。比如 Node Exporter 的常用面板 ID 是1860输入后选择数据源导入就能看到一张很完整的主机监控面板。那拷贝整个面板是怎么回事我遇到过这样的场景在一个环境里精心调好了一张面板想原封不动搬到另一个 Grafana 实例。直接拖拽显然不行标准做法是在源面板右上角Share - Export选择Save to file拿到一个 JSON 文件。在目标 Grafana 里New - Import - Upload dashboard JSON file上传这个文件。这里有个隐藏问题面板 JSON 里会记录源实例的datasource信息包括数据源的 UID。如果目标实例的数据源 UID 不一样导入后图表会显示Data source not found或找不到数据。解决办法有两个导入时注意选择目标数据源或者直接编辑 JSON 文件把datasource字段里的uid替换成目标数据源的真实 UID。后者处理几十个面板的批量迁移时效率高得多。4.3 模板变量让一张面板管所有机器一次性监控一台主机很容易但生产环境往往有几十台机器。如果每台机器都建一张独立面板你会发现维护成本直线上升加一台新机器就要复制改一遍。Grafana 的模板变量Template Variables就是用来解决这个问题的。在面板右上角Settings - Variables里新增一个变量类型选 Query查询语句写成label_values(up, instance)这个变量会把当前 Prometheus 里所有up指标的instance标签值拉出来形成下拉框选项。然后在面板所有查询里把写死的 instance 替换成$instance比如100 - avg(rate(node_cpu_seconds_total{instance$instance, modeidle}[5m])) * 100这样一张面板就能同时服务所有机器下拉框选谁就显示谁的监控。新机器加入后只要在 Prometheus 配置里加了 target面板下拉框自动就会多出这个实例不需要任何额外操作。4.4 Grafana 升级后的老大难legacy queries 报错用 Grafana 的人应该都见过这类报错failed to upgrade legacy queries datasource im7_otuvz was not found这个错误通常在从 Grafana 9.x 升级到更高版本后出现。老版本面板里的查询是旧格式升级后 Grafana 会把它们自动迁移到新格式但迁移时找不到原本引用的数据源。报错信息里的im7_otuvz是老数据源的 UID而这个数据源在升级后被重建或删除了于是查询就无法完成迁移。碰到这个问题最直接的解决方法是重新指定数据源进入面板编辑模式把每个查询面板的数据源重新选一遍。如果面板数量多可以在面板 JSON 里全局替换uid字段把旧 UID 全部改成当前实际使用的数据源 UID再重新导入。这算是一个经验教训大规模升级 Grafana 前最好先把所有面板 JSON 备份升级后在测试环境先验证一遍。5. 告警别再只看面板Prometheus 规则与 Alertmanager 接入5.1 告警规则配置详解从一条规则看透核心字段Grafana 面板解决的是看得见问题但监控真正有价值的是看得早。这里的核心是告警规则。Prometheus 的规则文件放在prometheus/rules/目录下格式是 YAML。一个典型的实例存活告警如下groups: - name: host_alerts rules: - alert: InstanceDown expr: up 0 for: 1m labels: severity: critical annotations: summary: 实例 {{ $labels.instance }} 已下线 description: {{ $labels.job }} 的实例 {{ $labels.instance }} 已不可达超过1分钟四个核心字段分别负责不同的事expr告警触发的条件表达式up 0表示 Prometheus 抓取不到目标。for该条件需要持续多久才触发告警这里设置 1 分钟。它的价值是过滤抖动机短期波动避免网络抖动导致告警轰炸。labels给告警附加的标签常用于标记严重级别、所属团队后续 Alertmanager 路由也依赖这些标签。annotations告警的具体描述模板里可以使用{{ $labels.xxx }}动态带入实例名、job 名让告警消息可读性大幅提高。for字段是我特别想强调的。新手容易忽略它结果系统刚重启时到处都是InstanceDown的误报设置合理的for时间后这类问题明显少很多。它不会让告警变慢只是让告警更可靠。磁盘空间告警也是常用的例子注意过滤掉 tmpfs 等临时文件系统- alert: DiskSpaceWarning expr: (node_filesystem_avail_bytes{fstype!~tmpfs|overlay} / node_filesystem_size_bytes{fstype!~tmpfs|overlay} * 100) 10 for: 10m labels: severity: warning annotations: summary: 磁盘剩余空间不足10% description: 实例 {{ $labels.instance }} 挂载点 {{ $labels.mountpoint }} 剩余空间已不足10%写好之后在主配置prometheus.yml的rule_files里引入规则文件然后执行docker compose restart prometheus。修改任何 Prometheus 配置后都建议用promtool先做一次静态检查docker exec prometheus promtool check config /etc/prometheus/prometheus.yml这个习惯能帮我拦截掉一大半语法错误尤其是 YAML 缩进问题。5.2 Alertmanager 接入路由、分组与接收Prometheus 负责生成告警但真正把告警发出去给相关人是 Alertmanager 的工作。它接收 Prometheus 推送来的告警然后根据路由规则决定发到哪个接收者。一份基础alertmanager.ymlglobal: resolve_timeout: 5m route: receiver: ops-notify group_by: [alertname, instance] group_wait: 30s group_interval: 5m repeat_interval: 4h receivers: - name: ops-notify email_configs: - to: opsexample.com from: monitorexample.com smarthost: smtp.example.com:465 auth_username: monitorexample.com auth_password: xxxxxxxx这里的核心机制是路由和分组。group_by按告警标签分组同一组内的多条告警会合并通知避免一个实例挂了所有相关告警同时刷屏。repeat_interval: 4h控制同一告警的重发频率防止半夜持续骚扰。group_wait是分组后等待的时间保证同一组的多条告警能聚成一条消息。配置好后需要在 Prometheus 主配置文件里指定 Alertmanager 地址alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093之后可以在 Alertmanager 的 9093 端口 Web UI 里直接看到收到的告警、当前是否分组、发往哪个接收者。5.3 Grafana 侧怎么接入 Alertmanager 查看告警热词里有个grafana 接入 alertmanager 告警很多人的理解有偏差。Grafana 自己的统一告警系统和 Prometheus 的 Alertmanager 是两个独立体系它们的接入方式主要有两种理解维度。第一种是 Grafana 把 Alertmanager 作为数据源添加从而在 Grafana 里统一查看来自 Prometheus 的告警和静默状态。添加方式是在 Grafana 的Connections - Data sources - Add data source里选 Alertmanager填入它的地址。配好后可以在 Grafana 的 Alerting 页面查看告警列表、创建静默。第二种是只使用 Grafana 自己的告警规则功能它可以直接查询 Prometheus 数据源生成告警并通过 Contact Points 发通知完全绕过 Alertmanager。团队如果已经习惯了 Grafana 的操作界面直接用它内置告警也挺顺手。两种方案都可行我个人在大多数场景偏好保留 Prometheus Alertmanager 这套链路因为规则用文件管理更清晰也方便用 Git 做版本管理Grafana 内置告警则适合更偏可视化操作的团队。5.4 告警状态流转从 pending 到 firingPrometheus 里告警有三种状态inactive未触发、pending条件满足但还在等待for时间、firing确认触发并推送给 Alertmanager。在 Prometheus 的Alerts页面可以看到这些状态这是排障时的重要参考。测试告警最简单的方式是直接把某个 node-exporter 容器停掉docker stop node-exporter等一两分钟刷新 Prometheus Alerts 页应该能看到InstanceDown先进入 pending再变成 firing。此时 Alertmanager 的 UI 里也应该出现一条通知记录。测试完把容器启动起来验证恢复逻辑是否正常——告警恢复后Prometheus 会向 Alertmanager 发送一个 resolve 通知消息会以 resolved 的状态出现。6. 部署和使用中踩过的坑完整的排查链路与操作经验6.1 告警不触发从规则到路由的逐层排查思路配置了告警但一直不响应该排在监控运维问题榜第一位。我的排查路径基本固定每次都能快速收敛到问题所在。第一步看Prometheus Alerts 页面。如果一条规则都没显示说明规则文件没有被加载检查主配置里的rule_files路径是否正确用promtool check config验证。如果规则显示为灰色且状态是 inactive说明条件本身不满足点击规则展开详情可以看到当前计算结果和标签。第二步看Targets 页面。拿up 0这条规则举例如果 Targets 里显示的状态是 UP表达式结果自然是 0告警不会触发。这种情况要么真的是目标在线没有问题要么是配置的抓取地址错了——比如填成了localhost:9100但 Prometheus 在容器里访问不到宿主机的 9100。地址错误时 Targets 页会显示 DOWN原因一清二楚。第三步看Alertmanager UI。Prometheus 已经 firing但 Alertmanager 没收到需要检查alerting.alertmanagers配置中的地址以及docker compose logs alertmanager里的日志。Alertmanager 收到了但没通知出去要检查路由是否匹配rule 里labels打的标签能否匹配上 route 里的match或 receiver以及 SMTP 配置是否有误。最基础的配置里所有告警都走默认 route这是最简单的兜底。6.2 面板显示无数据最常见的三个原因Grafana 面板一片空白这是新手上路最打击信心的事。按出现频率排序原因通常是这三个。一是数据源 URL 填错。最典型的就是写了localhost前面说过改成容器网络内的prometheus或者宿主机可达的 IP 就行。二是时间范围问题。刚建好的面板默认显示最近 15 分钟如果你的 Prometheus 里确实没有这个时间段的指标图表自然为空。把右上角时间调整到Last 6 hours或者Last 24 hours常常就能看到数据了。三是查询表达式错误或标签筛选过严。比如 Node Exporter 面板里查询条件写了instance192.168.1.10:9100但实际指标文本里 instance 可能是node-exporter:9100筛选结果就为空。不熟悉的话可以先去 Prometheus 的 Graph 页面用浏览器自动补全功能输入指标名确认有哪些标签和值存在再回 Grafana 里调整筛选条件。6.3 存储、性能和保留周期的现实问题Prometheus 默认只在本地磁盘保留 15 天数据这个参数由启动命令里的--storage.tsdb.retention.time控制。如果你需要保留更长时间改大它但要注意磁盘空间因为 Prometheus 的存储算是写多读少的重负载类型尤其在高采集频率下一天的写入量可能有几 GB。查看当前数据目录占用最直接的方式du -sh prometheus/data/如果数据持续增长导致磁盘吃紧除了缩短保留时间外还可以考虑配置远程存储比如 Thanos 的 sidecar 模式把历史数据上传到对象存储但我自己的建议是在单实例阶段30 天保留期足够绝大多数场景超过这个量级再去考虑扩展不要一开始就背上高成本架构。还有一个容易忽略的点是容器的内存和打开文件数限制。Prometheus 在做大量查询时内存占用会明显上升节点资源紧张时甚至会被 OOM Killer 干掉导致监控自己先挂了。我通常会设置容器资源限制并给 Prometheus 单独预留资源deploy: resources: limits: memory: 2G这不奢求一次配到位但你至少要知道 Prometheus 在什么情况下资源占用会飙升心里才有个底。6.4 我现在的固定习惯让这套监控可维护、可治理用过一段时间后我沉淀了几个固定的配置习惯全部是为了降低日后的维护成本。第一所有静态 target 都用file_sd_configs替代直接写在主配置里。主配置保持精简target 列表放在独立的 YAML 文件里这样 Prometheus 配置改 target 时不需要重启它会自动监听文件变更并加载。对于经常上下线的测试环境或新服务这个机制简直是救命的。scrape_configs: - job_name: node-exporter file_sd_configs: - files: - /etc/prometheus/targets/node-exporter.yml refresh_interval: 30s第二每个 exporter 都打上清晰的标签统一命名规范。标签是 Prometheus 数据模型的核心规范混乱会直接导致告警路由和面板变量的失效。我常用env、service、team这类自定义标签来区分环境归属查询时按标签过滤比按 instance 过滤可靠得多。第三所有面板和规则文件都放进目录做版本管理。面板 JSON 导出后放进仓库规则文件本身就是 YAMLGit 管起来之后谁能改了什么、回滚到哪一版都清清楚楚。监控配置的管理标准和代码一样严格长期协作时才不会变成没人敢动的黑盒。第四Grafana 里按团队或项目分文件夹数据源和面板做好命名分区。多人协作时避免互相覆盖配置权限也能分开控制。虽然一个人维护监控系统时不需要很严格但团队变大的第一天就会感谢这个习惯。这套组合我已经在多个环境里跑了一两年从最初几台服务器的小集群到后来包含几十个节点、几十个 exporter 的中型环境它的稳定性和扩展性经受住了考验。配置过程中踩过的每一个坑最后都成了排查手册里最实用的一页。监控搭建的门槛并不高真正有价值的是你对自己系统数据流的理解——知道指标从哪来、去了哪、如何变成通知这套体系才算真正跑通了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot+Vue微服务高并发简历招聘系统架构设计与实践 2026/10/1 2:11:00

SpringBoot+Vue微服务高并发简历招聘系统架构设计与实践

先说个场景:求职者在周五晚上集中投简历,HR周一早上集中筛选,这两个时间段里服务器要扛住的是几百人同时写投递记录、上传简历附件、刷新职位浏览量的瞬时流量。如果还是单体架构加一台MySQL硬撑,大概率会出现投递成功但记录丢失、…

阅读更多 →
删繁就简:从断舍离到活出自我格调的实操指南 2026/10/1 2:11:00

删繁就简:从断舍离到活出自我格调的实操指南

删繁就简,活成自己喜欢的格调我第一次正视“删繁就简”这件事,不是因为我突然领悟了什么高深的人生哲学,而是因为家里实在堆不下了。去年搬家前,我统计了一下自己住了五年的房子的物品总量——光是不穿的衣服就有三百多件&#xf…

阅读更多 →
Ubuntu下OpenMP并行计算配置实战:从编译指令到性能优化 2026/10/1 2:11:00

Ubuntu下OpenMP并行计算配置实战:从编译指令到性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
SpringBoot露营装备租赁系统毕设指南:核心技术与实战拆解 2026/10/1 2:11:00

SpringBoot露营装备租赁系统毕设指南:核心技术与实战拆解

这两年帮不少学弟学妹参谋毕业设计,发现“基于SpringBoot的XX管理系统”几乎成了默认选项,而露营装备租赁这个方向尤其多。你可能看过类似标题:计算机毕业设计springboot露营装备租赁系统、基于SpringBoot的户外露营装备共享租赁平台、基于Sp…

阅读更多 →
汽车电子全产业链图谱:从车规芯片到整车功能安全的工程实践 2026/10/1 2:11:00

汽车电子全产业链图谱:从车规芯片到整车功能安全的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
不死之酒马德拉:从意外海难到极致陈年的葡萄酒科普 2026/10/1 2:10:53

不死之酒马德拉:从意外海难到极致陈年的葡萄酒科普

1. 马德拉酒的初印象:这只“不死之酒”到底是什么我第一回认真喝马德拉酒,是在一位老藏家家里。他开了一瓶70年代的马尔维萨,倒出来时所有人都屏着气,颜色深得像浓缩的茶汤,但香气一散开,焦糖、陈皮、烤坚果…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉