[{"data":1,"prerenderedAt":694},["ShallowReactive",2],{"content:\u002Fposts\u002Ftruenas-prometheus-grafana-monitoring":3,"surround:\u002Fposts\u002Ftruenas-prometheus-grafana-monitoring":684},{"id":4,"title":5,"body":6,"categories":658,"date":660,"description":661,"draft":662,"extension":663,"image":664,"meta":665,"navigation":667,"path":668,"permalink":664,"pinned":662,"published":664,"readingTime":669,"recommend":664,"references":664,"seo":674,"sitemap":675,"stem":676,"tags":677,"type":682,"updated":660,"__hash__":683},"content\u002Fposts\u002Fposts\u002Ftruenas-prometheus-grafana-monitoring.md","TrueNAS 全方位监控实战：Prometheus + Grafana 方案",{"type":7,"value":8,"toc":631},"minimark",[9,19,27,32,35,46,86,89,92,95,99,102,112,137,140,144,153,159,167,193,197,203,209,227,231,234,242,253,260,271,278,296,300,323,330,349,353,356,382,393,397,401,409,419,423,491,495,537,541,544,554,557,622,625],[10,11,15],"alert",{"type":12,"title":13,"icon":14},"info","AI 迁移提示","tabler:robot",[16,17,18],"p",{},"本文由 AI 协助从旧站迁移，尚未完成逐篇人工审校；内容如有疏漏，将在复核后修订。",[16,20,21,22,26],{},"TrueNAS 自带的 Reporting 模块能看当前状态，但",[23,24,25],"strong",{},"历史数据保留有限、无法配置告警","，遇到磁盘温度异常、ZFS 池容量缓慢增长、网络流量突增这类场景就不够用了。本文搭建一套独立的 Prometheus + Grafana 监控，对 TrueNAS 做长期采集与可视化。",[28,29,31],"h2",{"id":30},"_1-架构概览","1. 架构概览",[16,33,34],{},"整条数据链路：",[36,37,42],"pre",{"className":38,"code":40,"language":41},[39],"language-text","TrueNAS ──(Graphite 协议 @ 9109)──▶ graphite-prometheus ──(\u002Fmetrics @ 9108)──▶ Prometheus ──(查询)──▶ Grafana\n","text",[43,44,40],"code",{"__ignoreMap":45},"",[47,48,49,56,74,80],"ul",{},[50,51,52,55],"li",{},[23,53,54],{},"TrueNAS","：原生支持以 Graphite 协议向外推送系统指标（CPU、磁盘、ZFS、网络等）。",[50,57,58,61,62,69,70,73],{},[23,59,60],{},"graphite-prometheus","：由 ",[63,64,68],"a",{"href":65,"rel":66},"https:\u002F\u002Fgithub.com\u002FSupporterino\u002Ftruenas-graphite-to-prometheus",[67],"nofollow","Supporterino\u002Ftruenas-graphite-to-prometheus"," 提供，把 Graphite 推送协议转换为 Prometheus 可抓取的 ",[43,71,72],{"code":72},"\u002Fmetrics"," 端点。",[50,75,76,79],{},[23,77,78],{},"Prometheus","：时序数据库，按间隔主动抓取转换器暴露的指标。",[50,81,82,85],{},[23,83,84],{},"Grafana","：从 Prometheus 查询数据并可视化。",[16,87,88],{},"::alert{type=\"info\" title=\"为什么需要一个\"转换器\"\"}",[16,90,91],{},"TrueNAS 只会 Graphite（推送模型），Prometheus 只认 HTTP pull（拉取模型）。两者协议和方向都不兼容，必须在中间夹一层 graphite-prometheus 做翻译。",[16,93,94],{},"::",[28,96,98],{"id":97},"_2-前置条件","2. 前置条件",[16,100,101],{},"在 TrueNAS Web UI 中启用 Graphite 上报：",[16,103,104,107,108,111],{},[23,105,106],{},"System Settings → Reporting → Exporters","（或旧版 ",[23,109,110],{},"Reporting → Settings","）",[47,113,114,123,131],{},[50,115,116,119,120],{},[23,117,118],{},"Type","：",[43,121,122],{"code":122},"Graphite",[50,124,125,119,128],{},[23,126,127],{},"Destination",[43,129,130],{"code":130},"\u003C监控主机 IP>:9109",[50,132,133,136],{},[23,134,135],{},"Separate Instances","：建议开启，便于多主机时按实例区分",[16,138,139],{},"开启后 TrueNAS 会以约 10 秒一次的频率向目标地址推送指标。",[28,141,143],{"id":142},"_3-编写-docker-composeyaml","3. 编写 docker-compose.yaml",[10,145,146],{"type":12},[16,147,148,149],{},"Docker Compose 安装与使用参见：",[63,150,152],{"href":151},"\u002Fposts\u002Fdocker-compose-setup","Docker Compose 安装配置",[16,154,155,156,119],{},"在准备部署的宿主机上创建一个空目录，新建 ",[43,157,158],{"code":158},"docker-compose.yaml",[36,160,165],{"className":161,"code":163,"language":164,"meta":45},[162],"language-yaml","services:\n  # 时序数据库：存储监控指标\n  prometheus:\n    image: prom\u002Fprometheus:latest\n    container_name: prometheus\n    restart: unless-stopped\n    volumes:\n      - .\u002Fprometheus.yml:\u002Fetc\u002Fprometheus\u002Fprometheus.yml\n      - prometheus-data:\u002Fprometheus\n    command:\n      - '--config.file=\u002Fetc\u002Fprometheus\u002Fprometheus.yml'\n      - '--storage.tsdb.retention.time=365d'\n    ports:\n      - \"9090:9090\"\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http:\u002F\u002Flocalhost:9090\u002F-\u002Fhealthy\"]\n      interval: 30s\n      timeout: 5s\n      retries: 3\n\n  # 可视化面板：看硬盘和 ZFS 状态\n  grafana:\n    image: grafana\u002Fgrafana:latest\n    container_name: grafana\n    restart: unless-stopped\n    environment:\n      - GF_SECURITY_ADMIN_PASSWORD=Aa123456\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - grafana-data:\u002Fvar\u002Flib\u002Fgrafana\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fhealth\"]\n      interval: 30s\n      timeout: 5s\n      retries: 3\n\n  # TrueNAS Graphite → Prometheus 转换服务\n  graphite-prometheus:\n    image: ghcr.io\u002Fsupporterino\u002Ftruenas-graphite-to-prometheus:latest\n    container_name: graphite-prometheus\n    restart: unless-stopped\n    ports:\n      - \"9109:9109\u002Ftcp\"   # Graphite 接收端（TrueNAS 推送，TCP）\n      - \"9109:9109\u002Fudp\"   # Graphite 接收端（TrueNAS 推送，UDP）\n      - \"9108:9108\u002Ftcp\"   # Prometheus 抓取端\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http:\u002F\u002Flocalhost:9108\u002Fmetrics\"]\n      interval: 30s\n      timeout: 5s\n      retries: 3\n\nvolumes:\n  prometheus-data:\n  grafana-data:\n","yaml",[43,166,163],{"__ignoreMap":45},[10,168,171],{"type":169,"title":170},"tip","关于镜像加速",[16,172,173,174,177,178,177,181,184,185,188,189,192],{},"上面使用的都是官方镜像地址（",[43,175,176],{"code":176},"prom\u002F...","、",[43,179,180],{"code":180},"grafana\u002F...",[43,182,183],{"code":183},"ghcr.io\u002F...","）。在国内网络环境下如果拉取缓慢或失败，可使用你自己的镜像加速服务，把域名前缀加在 image 前即可，例如：",[43,186,187],{"code":187},"your-accel.example.com\u002Fprom\u002Fprometheus:latest","。",[23,190,191],{},"请不要直接使用别人的私有加速域名","，可能随时失效或泄露他人 token。",[28,194,196],{"id":195},"_4-编写-prometheusyml","4. 编写 prometheus.yml",[16,198,199,200,119],{},"在同一目录下创建 ",[43,201,202],{"code":202},"prometheus.yml",[36,204,207],{"className":205,"code":206,"language":164,"meta":45},[162],"global:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: 'truenas'\n    scrape_interval: 10s\n    static_configs:\n      - targets: ['10.0.0.16:9108']\n    relabel_configs:\n      - target_label: instance\n        replacement: 'truenas'\n",[43,208,206],{"__ignoreMap":45},[10,210,212],{"type":12,"title":211},"请替换为你的实际 IP",[16,213,214,215,218,219,222,223,226],{},"把 ",[43,216,217],{"code":217},"10.0.0.16"," 替换为",[23,220,221],{},"运行 graphite-prometheus 容器的宿主机 IP","。如果 Prometheus 与 graphite-prometheus 在同一个 compose 网络里，也可以直接用 ",[43,224,225],{"code":225},"graphite-prometheus:9108"," 服务名互访。",[28,228,230],{"id":229},"_5-配置项说明","5. 配置项说明",[16,232,233],{},"下面逐项解释上述配置背后的考量，遇到问题或要做调整时可以对照。",[235,236,238,239],"h3",{"id":237},"_51-storagetsdbretentiontime365d","5.1 ",[43,240,241],{"code":241},"storage.tsdb.retention.time=365d",[16,243,244,245,248,249,252],{},"Prometheus 默认只保留 15 天数据。这里保留 ",[23,246,247],{},"365 天（一整年）","，方便做磁盘温度、SMART、ZFS 容量等长周期趋势分析。一年的数据大约占用 10–30 GB（视指标数量和抓取频率），需要为 ",[43,250,251],{"code":251},"prometheus-data"," 卷预留足够磁盘空间。如果磁盘紧张可以酌情缩短到 90d \u002F 180d。",[235,254,256,257],{"id":255},"_52-scrape_interval-10s","5.2 ",[43,258,259],{"code":259},"scrape_interval: 10s",[16,261,262,263,266,267,270],{},"Prometheus 全局 ",[43,264,265],{"code":265},"scrape_interval"," 用官方推荐的 15s，但对 TrueNAS 这个 job ",[23,268,269],{},"单独覆盖为 10s","，对齐 TrueNAS Graphite 上报频率——更高的频率（比如 1s）会产生大量重复值、白白撑大 TSDB；更低则会漏点。",[235,272,274,275],{"id":273},"_53-镜像均固定为-latest","5.3 镜像均固定为 ",[43,276,277],{"code":277},":latest",[16,279,280,281,283,284,287,288,291,292,295],{},"所有镜像都显式写了 ",[43,282,277],{"code":277},"，不省略 tag。省略 tag 虽然默认也是 ",[43,285,286],{"code":286},"latest","，但显式写出更清晰，避免与工具链（如 Watchtower、Renovate）交互时产生歧义。",[23,289,290],{},"生产环境","建议进一步固定到具体版本号（如 ",[43,293,294],{"code":294},"prom\u002Fprometheus:v2.54.0","），防止上游突然大版本升级带来破坏性变更。",[235,297,299],{"id":298},"_54-端口协议9109-9108","5.4 端口协议（9109 \u002F 9108）",[16,301,302,303,306,307,310,311,322],{},"graphite-prometheus 的 9109 是 Graphite 协议接收端，Graphite 协议",[23,304,305],{},"同时支持 TCP 明文和 UDP 明文","。Docker Compose 的 ",[43,308,309],{"code":309},"\"9109:9109\""," 默认只映射 TCP——如果 TrueNAS 配的是 UDP 推送，会出现\"TrueNAS 发得出去但转换器收不到\"的隐蔽问题。",[23,312,313,314,317,318,321],{},"这里同时显式映射 ",[43,315,316],{"code":316},"\u002Ftcp"," 和 ",[43,319,320],{"code":320},"\u002Fudp","，一次避免两种场景的坑","。9108 是 Prometheus 抓取端，只走 HTTP\u002FTCP。",[235,324,326,327],{"id":325},"_55-grafana-默认密码-aa123456","5.5 Grafana 默认密码 ",[43,328,329],{"code":329},"Aa123456",[16,331,332,333,336,337,340,341,344,345,348],{},"这个密码",[23,334,335],{},"仅为演示方便","，强度非常弱。部署完成后请",[23,338,339],{},"立即登录 Grafana 改成复杂密码","（推荐 16 位以上、包含大小写字母 + 数字 + 符号）。更规范的做法是把密码放在 ",[43,342,343],{"code":343},".env"," 文件并用 ",[43,346,347],{"code":347},"${GF_SECURITY_ADMIN_PASSWORD}"," 从 compose 读取，避免明文写入版本库。",[235,350,352],{"id":351},"_56-healthcheck","5.6 Healthcheck",[16,354,355],{},"三个服务都加了 healthcheck，每 30 秒探测一次：",[47,357,358,367,375],{},[50,359,360,119,363,366],{},[23,361,362],{},"prometheus",[43,364,365],{"code":365},"\u002F-\u002Fhealthy"," 端点",[50,368,369,119,372,366],{},[23,370,371],{},"grafana",[43,373,374],{"code":374},"\u002Fapi\u002Fhealth",[50,376,377,119,379,381],{},[23,378,60],{},[43,380,72],{"code":72}," 端点（能返回即视为存活）",[16,383,384,385,388,389,392],{},"配合 ",[43,386,387],{"code":387},"restart: unless-stopped","，容器进程挂掉或卡死时能被自动重启。可以用 ",[43,390,391],{"code":391},"docker compose ps"," 查看每个服务的健康状态。",[28,394,396],{"id":395},"_6-启动与验证","6. 启动与验证",[235,398,400],{"id":399},"_61-启动容器","6.1 启动容器",[36,402,407],{"className":403,"code":405,"language":406,"meta":45},[404],"language-bash","docker compose up -d\ndocker compose ps\n","bash",[43,408,405],{"__ignoreMap":45},[16,410,411,412,415,416,188],{},"三个容器的 ",[43,413,414],{"code":414},"STATUS"," 列应当显示为 ",[43,417,418],{"code":418},"running (healthy)",[235,420,422],{"id":421},"_62-端口与访问地址","6.2 端口与访问地址",[424,425,426,442],"table",{},[427,428,429],"thead",{},[430,431,432,436,439],"tr",{},[433,434,435],"th",{},"端口",[433,437,438],{},"服务",[433,440,441],{},"用途",[443,444,445,459,469,481],"tbody",{},[430,446,447,451,453],{},[448,449,450],"td",{},"3000",[448,452,84],{},[448,454,455,456,111],{},"可视化 Web UI（默认用户 ",[43,457,458],{"code":458},"admin",[430,460,461,464,466],{},[448,462,463],{},"9090",[448,465,78],{},[448,467,468],{},"Prometheus Web UI（查询 + 查看 target 状态）",[430,470,471,474,476],{},[448,472,473],{},"9108",[448,475,60],{},[448,477,478,480],{},[43,479,72],{"code":72}," 端点，Prometheus 从这里抓",[430,482,483,486,488],{},[448,484,485],{},"9109",[448,487,60],{},[448,489,490],{},"Graphite 协议接收端，TrueNAS 推到这里",[235,492,494],{"id":493},"_63-确认数据链路通了","6.3 确认数据链路通了",[496,497,498,512,526],"ol",{},[50,499,500,501,504,505,508,509,188],{},"浏览器打开 ",[43,502,503],{"code":503},"http:\u002F\u002F\u003C服务器 IP>:9090\u002Ftargets","，",[43,506,507],{"code":507},"truenas"," job 的 state 应当为 ",[23,510,511],{},"UP",[50,513,514,515,518,519,522,523,525],{},"打开 ",[43,516,517],{"code":517},"http:\u002F\u002F\u003C服务器 IP>:9090\u002Fgraph","，在查询框搜 ",[43,520,521],{"code":521},"truenas_","，能看到一堆以 ",[43,524,521],{"code":521}," 开头的指标，说明转换器在正常工作。",[50,527,528,529,532,533,536],{},"如果 target 一直 ",[43,530,531],{"code":531},"DOWN","：先看 graphite-prometheus 的日志 ",[43,534,535],{"code":535},"docker logs graphite-prometheus","，通常是 TrueNAS 没推数据、或目标 IP\u002F端口写错。",[28,538,540],{"id":539},"_7-导入推荐的-grafana-仪表板","7. 导入推荐的 Grafana 仪表板",[16,542,543],{},"项目作者提供了一份现成的 TrueNAS SCALE 仪表板：",[16,545,546,547],{},"👉 ",[23,548,549],{},[63,550,553],{"href":551,"rel":552},"https:\u002F\u002Fgithub.com\u002FSupporterino\u002Ftruenas-graphite-to-prometheus\u002Fblob\u002Fmain\u002Fdashboards\u002Ftruenas_scale.json",[67],"truenas_scale.json",[16,555,556],{},"导入步骤：",[496,558,559,602,607,616],{},[50,560,561,562,565,566,569,570],{},"登录 Grafana (",[43,563,564],{"code":564},"http:\u002F\u002F\u003C服务器 IP>:3000",")。",[23,567,568],{},"首次使用需要添加 Prometheus 数据源","：\n",[47,571,572,578,591],{},[50,573,574,575],{},"侧栏 → ",[23,576,577],{},"Connections → Data sources → Add data source → Prometheus",[50,579,580,583,584,587,588],{},[23,581,582],{},"URL","：填 ",[43,585,586],{"code":586},"http:\u002F\u002Fprometheus:9090","（同 compose 网络内访问）或 ",[43,589,590],{"code":590},"http:\u002F\u002F\u003C服务器 IP>:9090",[50,592,593,594,597,598,601],{},"拉到底点 ",[23,595,596],{},"Save & test","，显示 ",[43,599,600],{"code":600},"Successfully queried"," 即可",[50,603,574,604],{},[23,605,606],{},"Dashboards → New → Import",[50,608,609,610,613,614],{},"选择 ",[23,611,612],{},"Upload JSON file","，上传下载好的 ",[43,615,553],{"code":553},[50,617,618,619],{},"在导入界面的数据源下拉里选刚才创建的 Prometheus，点 ",[23,620,621],{},"Import",[16,623,624],{},"导入后即可看到 TrueNAS 的 CPU、内存、ZFS 池、磁盘温度、网络流量等面板。后续可在此基础上按需调整 Panel，或在 Prometheus \u002F Grafana 里按指标配置告警规则。",[10,626,628],{"type":12,"title":627},"作者注",[16,629,630],{},"本文在 TrueNAS SCALE 24.x 上验证过；Core 版本的 Graphite 上报路径略有差异，但配置项名称一致，按 Web UI 提示操作即可。",{"title":45,"searchDepth":632,"depth":632,"links":633},4,[634,636,637,638,639,652,657],{"id":30,"depth":635,"text":31},2,{"id":97,"depth":635,"text":98},{"id":142,"depth":635,"text":143},{"id":195,"depth":635,"text":196},{"id":229,"depth":635,"text":230,"children":640},[641,644,646,648,649,651],{"id":237,"depth":642,"text":643},3,"5.1 storage.tsdb.retention.time=365d",{"id":255,"depth":642,"text":645},"5.2 scrape_interval: 10s",{"id":273,"depth":642,"text":647},"5.3 镜像均固定为 :latest",{"id":298,"depth":642,"text":299},{"id":325,"depth":642,"text":650},"5.5 Grafana 默认密码 Aa123456",{"id":351,"depth":642,"text":352},{"id":395,"depth":635,"text":396,"children":653},[654,655,656],{"id":399,"depth":642,"text":400},{"id":421,"depth":642,"text":422},{"id":493,"depth":642,"text":494},{"id":539,"depth":635,"text":540},[659],"虚拟化","2026-03-08","通过 Graphite 协议采集 TrueNAS SCALE \u002F Core 指标，经 graphite-prometheus 转换后交由 Prometheus 存储、Grafana 可视化，搭建一套独立于 TrueNAS 自带报告的长期监控。",false,"md",null,{"slots":666},{},true,"\u002Fposts\u002Ftruenas-prometheus-grafana-monitoring",{"text":670,"minutes":671,"time":672,"words":673},"8 min read",7.82,469200,1564,{"title":5,"description":661},{"loc":668},"posts\u002Fposts\u002Ftruenas-prometheus-grafana-monitoring",[54,678,78,84,122,679,680,681],"TrueNAS SCALE","Docker Compose","HomeLab","ZFS","tech","yjt8aP-gt1csQa4IydLczGifQfuImd1X_ZBIRed63cM",[685,689],{"title":686,"path":687,"stem":688,"date":660,"type":682,"children":-1},"NAS 碎文件存储优化：VHDX 虚拟磁盘方案","\u002Fposts\u002Fnas-vhdx-storage-solution","posts\u002Fposts\u002Fnas-vhdx-storage-solution",{"title":690,"path":691,"stem":692,"date":693,"type":682,"children":-1},"如何在 Ubuntu Server 上快速部署 Clash","\u002Fposts\u002Fubuntu-server-clash-setup","posts\u002Fposts\u002Fubuntu-server-clash-setup","2026-03-10",1788712223073]