Prometheus 监控 Traefik 全栈实战:从边缘路由到微服务调用的实时可观测性
1. 边缘路由的监控盲区为什么 Traefik 指标链路总差最后一公里很多团队已经把 Prometheus Grafana 这套组合拳用得很熟node_exporter 盯着主机 CPUcAdvisor 看着容器内存业务服务自己埋点的/metrics也抓得稳稳当当。可一旦线上出现「用户说页面转圈」「某个接口偶发 502」排查时却常常卡在同一个地方——流量从公网进来经过 Traefik 这一层之后到底发生了什么没人说得清。Traefik 作为云原生边缘路由器动态发现服务、自动签发证书、无缝对接 Kubernetes 和 Docker这些自动化能力确实省心。但自动化一旦失去监控就等于盲飞。入口 QPS 突然掉了一半、后端服务 5xx 比例悄悄爬升、TLS 握手失败、请求延迟从 80ms 抖到 800ms这些信号如果没人采集故障就只能靠用户投诉来发现。问题的根源在于Traefik 的指标端点是独立暴露的默认并不开启。它不像业务服务那样天生带一个/metrics而是需要你在静态配置里显式声明一个 metrics EntryPoint再挂上 Prometheus provider。很多团队装完 Traefik 就跑起来了压根没意识到这一层还空着。于是 Prometheus 里能看到后端服务的延迟却看不到请求在边缘层排队了多久能看到某个 Pod 重启却看不到是哪个 router 把流量打到了不健康的实例上。这篇内容面向的正是这种场景你已经有一套跑着的 Prometheus想打通 Traefik 从边缘路由到微服务调用的完整指标链路。我会从开启 metrics 端点讲起给出可直接复制的 YAML/TOML 配置、Prometheus 抓取规则、核心 PromQL再到 Grafana 面板和告警规则最后用一组端到端验证动作帮你定位延迟和错误到底出在哪一层。全程小白友好配置都能直接抄。2. 开启 Traefik Prometheus 指标端点静态配置与 Kubernetes 两种姿势Traefik v2.x 及以上版本内置了 Prometheus 指标提供者它本质上是一个 Metrics 中间件可以挂在全局或特定 EntryPoint 上。暴露出来的指标使用标准 Counter/Histogram 类型前缀统一是traefik_监听在一个独立的端口上和你的业务流量端口完全分开。这样做的好处是安全隔离——metrics 端口只给 Prometheus 抓不对外网开放。先看静态配置文件的方式。如果你用的是 YAML 格式的traefik.yml需要做两件事定义一个专用于 metrics 的 EntryPoint然后配置 prometheus provider 指向它。entryPoints: web: address: :80 metrics: address: :8082 # 专用于 Prometheus 抓取的端口 metrics: prometheus: entryPoint: metrics addEntryPointsLabels: true # 为指标添加 entrypoint 标签 addRoutersLabels: true # 添加 router 标签定位到具体路由 addServicesLabels: true # 添加 service 标签定位到后端服务 buckets: [0.1, 0.3, 1.2, 5.0] # 自定义延迟直方桶单位秒如果你习惯 TOML 格式的traefik.toml等价写法是这样[entryPoints] [entryPoints.web] address :80 [entryPoints.metrics] address :8082 [metrics] [metrics.prometheus] entryPoint metrics buckets [0.1, 0.3, 1.2, 5.0] addEntryPointsLabels true addRoutersLabels true addServicesLabels true这里有个细节值得展开buckets决定了直方图的精度。默认桶可能不适合你的业务比如你的接口 P99 在 200ms 左右那桶里应该有 0.1、0.2、0.5 这些值否则histogram_quantile算出来的 P99 会失真。我一般会先观察一周真实延迟分布再回头调整桶边界。addRoutersLabels和addServicesLabels建议都打开虽然会增加一点指标基数但排查问题时能直接定位到是哪个 router、哪个 service 出的问题非常值。如果你是用命令行启动 Traefik参数形式如下traefik \ --entrypoints.web.address:80 \ --entrypoints.metrics.address:8082 \ --metrics.prometheus.entrypointmetrics \ --metrics.prometheus.addEntryPointsLabelstrue \ --metrics.prometheus.addRoutersLabelstrue \ --metrics.prometheus.addServicesLabelstrue \ --metrics.prometheus.buckets0.1,0.3,1.2,5.0重启 Traefik 后直接访问http://traefik-host:8082/metrics你应该能看到一大段以traefik_开头的文本里面包含traefik_entrypoint_requests_total、traefik_service_request_duration_seconds_bucket等指标。看到这些就说明端点通了。Kubernetes 环境稍微不同。如果你用的是 Traefik Helm Chart在values.yaml里配置metrics: prometheus: entryPoint: metrics addEntryPointsLabels: true addRoutersLabels: true addServicesLabels: true ports: metrics: port: 8082 expose: true exposedPort: 8082Chart 会自动创建一个 metrics Service。如果你用 Prometheus Operator接下来用 ServiceMonitor 或 PodMonitor 抓取即可不用手动写 static_configs。这里要注意 Service 的 label 要和你的 Prometheus 实例的serviceMonitorSelector匹配否则 Operator 不会认领它。3. Prometheus 抓取配置与 Grafana 面板从 scrape_config 到 Dashboard JSON指标端点通了下一步是让 Prometheus 把它抓进来。如果你用的是静态配置的 Prometheus在prometheus.yml里加一段 jobscrape_configs: - job_name: traefik scrape_interval: 15s static_configs: - targets: [traefik-host:8082] labels: env: production role: edge-routerscrape_interval设 15s 是个平衡点太短会增加 Traefik 和 Prometheus 的负担太长则告警延迟高。如果你的入口 QPS 很高指标基数大可以适当放宽到 30s。Kubernetes 环境下用 ServiceMonitor 更优雅apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: traefik labels: release: prometheus spec: endpoints: - port: metrics interval: 15s path: /metrics selector: matchLabels: app.kubernetes.io/name: traefik注意selector.matchLabels必须和 Traefik Service 上的 label 完全一致endpoints.port要写 Service 里定义的端口名这里是metrics不是数字端口。这两个地方写错是 ServiceMonitor 不生效的最常见原因。抓取配好之后去 Prometheus 的/targets页面确认 traefik 这个 job 的状态是 UP。如果显示 DOWN先看错误信息通常是网络不通或端口没暴露。接下来是 Grafana 面板。Traefik 官方和社区有几个现成的 Dashboard导入后基本能直接用Dashboard 名称ID适用场景Traefik Official Dashboard4479Traefik 2.x最常用入口流量服务延迟状态码Traefik 2.x Dashboard11462更现代含 router 和 service 维度Traefik Kubernetes Ingress12567K8s Ingress 场景导入方式Grafana 左侧菜单 → Dashboards → Import → 输入 ID → 选择你的 Prometheus 数据源 → 设置变量instance为 Traefik metrics 地址。导入后你会看到入口 QPS、状态码分布、P95/P99 延迟、TLS 证书剩余天数等面板。不过现成面板有个通病变量和你的实际 label 对不上。比如面板里用instance变量但你的 Prometheus 抓取时打的是role标签那就得手动改面板变量。我一般会复制一份官方面板把变量查询改成自己环境里真实存在的 label再保存成团队专用版本。这样后续别人导入也不会踩坑。如果你想要一个最小可用的自定义面板核心就四个图入口 QPSsum(rate(traefik_entrypoint_requests_total[1m]))、入口错误率、入口 P99 延迟、后端服务健康状态。这四个图能覆盖 80% 的日常排查需求。4. 核心指标与 PromQL 实战定位延迟到底出在边缘还是后端Traefik 的指标围绕三层结构组织EntryPoint入口、Router路由、Service后端服务。理解这三层才能精准定位问题。打个比方EntryPoint 是小区大门Router 是楼栋门牌Service 是具体住户。用户进不来可能是大门堵了也可能是门牌指错了还可能是住户不在家。先看 EntryPoint 层这是流量进入 Traefik 的第一站指标含义traefik_entrypoint_requests_total各 entrypoint 接收的请求总数Countertraefik_entrypoint_request_duration_seconds请求处理时长Histogramtraefik_entrypoint_open_connections当前打开的连接数常用的 PromQL# 入口总 QPS sum(rate(traefik_entrypoint_requests_total[1m])) # 入口 5xx 错误率 sum(rate(traefik_entrypoint_requests_total{code~5..}[5m])) / sum(rate(traefik_entrypoint_requests_total[5m])) # 入口 P99 延迟 histogram_quantile(0.99, sum(rate(traefik_entrypoint_request_duration_seconds_bucket[5m])) by (le))Router 层需要addRoutersLabels: true才有数据它能告诉你具体是哪个路由规则出了问题# 某个 router 的 QPS rate(traefik_router_requests_total{routermy-app-router}[1m]) # 某个 router 的错误比例 sum(rate(traefik_router_requests_total{routermy-app-router, code~5..}[5m])) / sum(rate(traefik_router_requests_total{routermy-app-router}[5m]))Service 层是最关键的因为它直接反映后端微服务的健康状况指标含义traefik_service_requests_total到后端服务的请求总数traefik_service_request_duration_seconds后端服务响应时间Histogramtraefik_service_open_connections到后端服务的开放连接数traefik_service_server_up后端服务器是否健康1UP, 0DOWN# 服务 QPS rate(traefik_service_requests_total{servicebackend-api}[1m]) # 后端服务平均延迟 rate(traefik_service_request_duration_seconds_sum{servicebackend-api}[5m]) / rate(traefik_service_request_duration_seconds_count{servicebackend-api}[5m]) # 后端服务不可用 traefik_service_server_up 0这里有个非常实用的排查技巧当用户反馈「接口慢」时先对比 EntryPoint 延迟和 Service 延迟。如果 EntryPoint P99 是 2s但 Service P99 只有 200ms那说明时间花在了 Traefik 内部——可能是 TLS 握手、中间件处理、或者连接池排队。如果两者接近那问题就在后端服务本身。这个对比能帮你快速缩小排查范围不用一上来就翻业务代码。TLS 证书指标也值得单独盯# 证书剩余天数 (traefik_tls_certs_not_after_timestamp_seconds - time()) / 86400这个指标配合告警规则能在证书过期前 30 天就提醒你避免半夜被叫起来手动续期。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth 问题配置过程中最容易卡在几个典型报错上我按出现频率排一下。401 UnauthorizedPrometheus 抓取时返回 401通常是 Traefik metrics 端点被加了 Basic Auth但 Prometheus 的 scrape_config 里没配认证信息。解决方式是在 job 里加scrape_configs: - job_name: traefik basic_auth: username: metrics password: your-password static_configs: - targets: [traefik-host:8082]如果你用的是 Kubernetes Secret 管理密码可以用password_file指向挂载的文件避免明文写在配置里。local proxy failed这个报错一般出现在你通过本地代理访问 Traefik metrics 端点时。比如你在开发机上用kubectl port-forward转发端口但 Prometheus 跑在集群内它抓的是 Service 地址而不是 localhost。检查你的 target 地址是不是写成了127.0.0.1:8082在集群内应该用 Service 名或 Pod IP。另外如果 Traefik 的 metrics EntryPoint 绑定的是127.0.0.1而不是0.0.0.0集群内其他 Pod 也访问不到需要改成:8082或0.0.0.0:8082。reading choices 相关错误这类报错通常和指标基数爆炸有关。当你开启了addRoutersLabels和addServicesLabels而集群里有大量动态创建的路由比如每个 PR 一个预览环境指标数量会急剧膨胀Prometheus 抓取时可能报reading choices或内存飙升。解决办法是限制标签维度或者用metric_relabel_configs丢弃不需要的指标scrape_configs: - job_name: traefik metric_relabel_configs: - source_labels: [__name__] regex: traefik_router_requests_total action: keep只保留你真正关心的指标能显著降低基数。OAuth 认证失败如果你在 Traefik 前面挂了 OAuth 中间件Prometheus 抓取 metrics 时可能会被中间件拦截返回 302 跳转到登录页。这是因为 metrics EntryPoint 和业务 EntryPoint 共用了中间件链。正确做法是给 metrics 单独定义一个 EntryPoint不挂任何认证中间件只在内网暴露。如果你用的是 Traefik 的 ForwardAuth确认 metrics 路由没有匹配到那个 middleware。CC Switch / Cline MCP / Codex auth.json 场景如果你在本地用 AI 编码工具比如 Claude Code、Cline通过 MCP 连接 Traefik 的管理接口做调试需要确保三件套齐全——Base URL 指向你的 Traefik API 地址、Key 用正确的认证 token、Model ID 匹配你实际调用的模型。缺任何一个都会导致连接失败。具体来说Base URL 填https://taotoken.net/apiKey 在控制台生成Model ID 根据你用的模型填。这三者不一致是 MCP 连接报错的头号原因。6. 告警规则与端到端验证让边缘故障在萌芽时触发指标抓到了、面板看到了最后一步是让系统主动告诉你出问题了。下面这组告警规则可以直接放进 Prometheus 的 rules 文件groups: - name: traefik_alerts rules: - alert: TraefikDown expr: up{jobtraefik} 0 for: 1m labels: severity: critical annotations: summary: Traefik 实例 {{ $labels.instance }} 不可达 - alert: TraefikHigh5xxRate expr: | sum(rate(traefik_entrypoint_requests_total{code~5..}[5m])) by (entrypoint) / sum(rate(traefik_entrypoint_requests_total[5m])) by (entrypoint) 0.01 for: 5m labels: severity: critical annotations: summary: 入口 {{ $labels.entrypoint }} 5xx 错误率超过 1% - alert: TraefikHighLatency expr: | histogram_quantile(0.99, sum(rate(traefik_entrypoint_request_duration_seconds_bucket[5m])) by (le, entrypoint)) 2 for: 5m labels: severity: warning annotations: summary: 入口 {{ $labels.entrypoint }} P99 延迟超过 2 秒 - alert: TraefikBackendDown expr: traefik_service_server_up 0 for: 2m labels: severity: critical annotations: summary: 后端服务 {{ $labels.service }} 健康检查失败 - alert: TraefikCertificateExpiry expr: (traefik_tls_certs_not_after_timestamp_seconds - time()) / 86400 30 for: 1h labels: severity: warning annotations: summary: TLS 证书将在 30 天内过期阈值别照抄根据你业务的真实基线调整。比如 5xx 错误率 1% 对金融类接口可能太宽松对内部工具可能太严格。建议先跑一周只告警不通知观察误报率再收紧。配置完成后做一组端到端验证确认整条链路真的通了第一步确认 Prometheus target 状态。访问 Prometheus/targets找到 traefik job状态应该是 UPLast Scrape 时间在 15s 内。第二步在 Prometheus 查询框输入traefik_entrypoint_requests_total应该能看到带entrypoint、code、method标签的时间序列。如果为空说明指标没抓到回去检查 scrape_config。第三步制造一次真实请求。用 curl 打你的业务入口curl -s -o /dev/null -w %{http_code} %{time_total}s\n https://your-domain.com/api/health然后回到 Prometheus查rate(traefik_entrypoint_requests_total[1m])应该能看到 QPS 有一个小尖峰。同时查traefik_service_requests_total{serviceyour-backend}确认请求确实被转发到了后端。第四步验证延迟分层。查histogram_quantile(0.99, sum(rate(traefik_entrypoint_request_duration_seconds_bucket[5m])) by (le))和对应的 service 层 P99对比两者差值。如果入口 P99 明显高于 service P99说明 Traefik 内部有开销可以进一步查 TLS 握手和中间件耗时。第五步触发一次告警。手动把某个后端服务停掉等 2 分钟看traefik_service_server_up 0是否触发 TraefikBackendDown 告警。恢复服务后告警应该自动解除。这一步能验证告警规则和通知渠道都是通的。整套跑下来你的 Traefik 就从黑盒变成了透明面板。入口 QPS、错误率、后端健康、延迟百分位、证书有效期所有关键信号实时汇聚到 Prometheus呈现在 Grafana故障在萌芽阶段就能被捕获。无论你是单台反向代理还是大规模 K8s Ingress 集群这套配置都能直接复用。指标端点的开启只需要几行配置但它带来的可观测性提升在每一次线上排查里都会回报你。

相关新闻

告别满世界找协议配置:用 TaoToken 统一 Key 打通 MCP 服务与 AI Agent 导航站

告别满世界找协议配置:用 TaoToken 统一 Key 打通 MCP 服务与 AI Agent 导航站

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

2026/10/15 21:28:45 阅读更多 →
LabWindows/CVI入门实战:按钮控制LED亮灭与回调机制详解

LabWindows/CVI入门实战:按钮控制LED亮灭与回调机制详解

简介:这份资源是一个面向LabWindows/CVI初学者与上位机开发入门者的简易工程,围绕按钮控件与LED控件的联动展开,帮助读者理解虚拟仪器界面中事件响应与状态显示的基本逻辑。工程共包含25个文件,压缩包约133KB,以C源码、…

2026/10/15 21:28:45 阅读更多 →
springboot启动过程笔记

springboot启动过程笔记

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

2026/10/15 21:28:45 阅读更多 →

最新新闻

wow.js滚动触发动画原理与实战:IntersectionObserver轻量封装

wow.js滚动触发动画原理与实战:IntersectionObserver轻量封装

简介:这是一份轻量级网页滚动动画实现方案,面向前端初学者与网页设计师,解决网站静态内容缺乏视觉动效、用户交互体验平淡的问题。资源基于流行的wow.js库封装,通过CSS类绑定实现元素进入视口时的自动动画触发,支持淡入…

2026/10/15 22:26:22 阅读更多 →
手机日志分析实战:从Android底层采集到行为漏斗建模

手机日志分析实战:从Android底层采集到行为漏斗建模

1. 项目概述:从手机屏幕亮起的那一刻,数据就开始说话了 “大数据项目实践——手机日志分析”,这十个字背后不是PPT里的抽象概念,而是一整套可触摸、可验证、可复现的工程闭环。我带过三届某高校数据科学方向的实训项目&#xff0c…

2026/10/15 22:26:22 阅读更多 →
TensorFlow Lite边缘部署实战:模型量化与现场推理调优指南

TensorFlow Lite边缘部署实战:模型量化与现场推理调优指南

这个系列写到第三篇,终于要开始聊真正能在现场设备上跑起来的方案了。前两篇更多是把TensorFlow编程基础过了一遍,而这一篇要解决的问题很具体:当你在做一个边缘计算应用时,手里的算力不再是几百瓦的显卡,而是一块电池…

2026/10/15 22:26:22 阅读更多 →
康耐视扫码枪接线配置与参数调优实战指南

康耐视扫码枪接线配置与参数调优实战指南

简介:康耐视扫码枪使用说明书是一份面向产线调试、设备维护等现场工程师的PDF操作手册,系统讲解如何让扫码枪在物流、仓储、制造等场景下稳定准确地读取条码与二维码。文档从Dataman软件连接读码器入手,覆盖IP网段匹配、自动曝光关闭、曝光与…

2026/10/15 22:26:22 阅读更多 →
微信图文分享+App唤醒闭环实战:服务端重定向方案详解

微信图文分享+App唤醒闭环实战:服务端重定向方案详解

1. 项目概述:一次真实场景下的“图文分享App唤醒”闭环实践最近在帮某高校实验室做一套轻量级教学资源分发系统,核心需求很具体:老师在网页端编辑好一份带图解的实验操作指南,点击“一键分享”,内容要能以图文卡片形式…

2026/10/15 22:26:22 阅读更多 →
代码库变成书:AiReadCode从源码生成结构化阅读指南

代码库变成书:AiReadCode从源码生成结构化阅读指南

1. 为什么要做“代码库变成书”这件事先交代一个背景:有段时间我一直在啃 Spring AI Alibaba 的源码。这个项目体量不算夸张,但牵扯到模型接入、工具调用、Agent 编排、Spring 生态集成,读起来经常是“翻开一个类,跳转三个依赖&am…

2026/10/15 22:25:16 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →