Thanos不嵌入Go微服务,而是通过Sidecar或Receive采集其暴露的/metrics指标;Sidecar监听Prometheus TSDB并上传至对象存储,Receive则接收远程写入,二者均依赖对象存储冗余、Compactor降采样和Query容错实现容灾。

Thanos 不是直接“集成”到 Go 微服务里的,它不跑在业务进程内,也不依赖 Go 代码修改。真正要做的,是让微服务产生的 Prometheus 指标,能被 Thanos 的 Sidecar 或 Receive 组件稳定采集、上传、长期归档——容灾能力来自对象存储 + 多副本 + Compactor 降采样,不是靠 Go 代码写容错逻辑。
Go 微服务本身只需暴露标准 /metrics 端点
Thanos 对接的前提,是你的 Go 服务已用 prometheus/client_golang 暴露了符合规范的指标。只要满足这点,Thanos 就能通过拉取(scrape)方式获取数据,无需改业务逻辑。
- 确保 HTTP handler 注册了
promhttp.Handler(),路径通常是/metrics - 避免在
/metrics上加鉴权或重定向——Thanos 默认不带认证头,会直接失败 - 若使用
net/http/pprof,别和/metrics共用路径,否则指标格式会被破坏 - 高基数指标(如带 trace_id 标签)要提前过滤或聚合,否则 Sidecar 上传时可能触发
context deadline exceeded错误
Thanos Sidecar 是最常用、最稳妥的归档路径
Sidecar 模式要求每个 Prometheus 实例配一个 thanos-sidecar 容器,它监听 Prometheus 的本地 TSDB,并把压缩后的 block 块上传到对象存储。Go 微服务只负责被 scrape,不参与上传逻辑。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
thanos sidecar启动时必须指定--prometheus.url和--objstore.config-file,后者需含 access_key、bucket、endpoint 等字段 - 对象存储建议启用版本控制(如 S3 Versioning),避免 Compactor 覆盖或误删块文件
- Sidecar 默认每 2 小时上传一次 block;若服务重启频繁,可调小
--upload-delay(但别低于 30m,否则未 compact 的 block 可能不完整) - 上传失败时 Sidecar 会重试,日志里出现
failed to upload block通常意味着凭证过期或网络不通,不是 Go 服务的问题
Receive 模式适合无法部署 Sidecar 的场景(如 Serverless 或多租户环境)
当 Prometheus 不能和业务 Pod 共享网络或生命周期时,可用 thanos-receive 作为远程写入终点。Go 微服务仍不改动,但 Prometheus 配置需加 remote_write 到 Receive 地址。
立即学习“go语言免费学习笔记(深入)”;
-
thanos-receive必须配置--tsdb.path作为本地暂存目录,且该目录需持久化(如挂 PVC),否则重启即丢数据 - Receive 不自动上传对象存储,需额外部署
thanos-compactor和thanos-store-gateway才能实现长期归档 - 生产环境务必设
--label(如--label=cluster=prod-us-east),否则多个 Receive 实例写入同一 bucket 会导致数据冲突 - Receive 的
max_samples_per_send参数需与 Prometheus 的queue_config匹配,否则易触发429 Too Many Requests
容灾能力不在 Go 代码里,而在对象存储与组件协同中
所谓“无限数据容灾”,本质是:对象存储(S3/GCS/MinIO)提供跨 AZ 冗余,Compactor 保证数据可压缩可降级,Query 通过 Quorum 机制容忍部分 Store Gateway 故障。Go 微服务只需保持 /metrics 稳定可用即可。
- 对象存储的 region 要和 Kubernetes 集群物理隔离(比如集群在 cn-north-1,bucket 在 cn-northwest-1),这是真正的地理容灾基线
- Store Gateway 的
--store.gateway.index-cache-size建议设为 512MB+,否则查 90 天前数据时频繁读 S3,延迟飙升 - Compactor 的
--retention.resolution-raw决定原始精度保留多久(默认 30d),之后只留 5m/1h 降采样数据——这不是丢数据,是主动容灾策略 - 不要给 Go 微服务加“备份指标到本地磁盘”的逻辑,那只会制造又一个单点故障,违背 Thanos 设计初衷

















