Grafana Tempo 在 HashiCorp Nomad 上的单二进制(Monolithic)部署指南
Grafana Tempo 在 HashiCorp Nomad 上的单二进制Monolithic部署指南【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo本指南基于仓库 example/nomad/tempo-monolith 目录下的 Nomad 作业定义系统讲解如何用一条nomad job run命令在 HashiCorp Nomad 集群中以单二进制monolithic模式部署 Grafana Tempo 并使用 S3 兼容对象存储作为后端。读完本文你将掌握tempo.hcl中每个变量与配置段的含义、端口与健康检查的编排方式以及-targetall、-config.expand-env等启动参数在 Tempo 源码中的真实作用可直接照搬到自己的 Nomad 环境。一、部署模式与适用场景Tempo 支持多种部署形态本示例采用的是monolithic mode单体模式即把全部功能组件打包进一个进程运行。在 cmd/tempo/app/modules.go 中可以看到Tempo 用SingleBinary常量标识该模式其值就是字符串allSingleBinary string all func IsSingleBinary(target string) bool { return target SingleBinary }从同一文件的模块依赖关系cmd/tempo/app/modules.go可以确认all这个复合目标实际组合了以下全部组件SingleBinary: {BackendScheduler, BackendWorker, QueryFrontend, Querier, Distributor, MetricsGenerator, LiveStore}也就是说分发器Distributor、查询前端QueryFrontend、查询器Querier、指标生成器MetricsGenerator等职责全部收敛在单一进程内。这种模式的优势是部署简单、依赖少、资源占用低适合开发环境、演示环境以及中小规模写入量的场景需要横向扩展时再切换到多进程的微服务模式。⚠️重要提示原文档原文本示例基于 Tempo2.x架构创建尚未针对 3.x 更新因为维护者并未在 Nomad 上部署。该示例目前处于deprecated废弃状态如果社区不更新它未来可能被移除。3.x 中新增了 LiveStore、PartitionRing 等组件部署形态与 2.x 已有差异请结合你实际使用的 Tempo 版本审慎参考。二、前置条件与作业文件结构2.1 前置条件原文档明确要求的唯一硬性前提是S3 兼容对象存储本示例的 trace 后端使用 S3因此需要一个可访问的 S3 兼容服务如 AWS S3、MinIO、Ceph RGW 等并准备好endpoint、access key、secret key。另外按仓库实际情况补充的环境前提一个可用的HashiCorp Nomad 集群或单节点 dev 模式且客户端节点安装了Docker 驱动——因为tempo.hcl中的 task 使用driver docker见 example/nomad/tempo-monolith/tempo.hcl节点能访问grafana/tempo:${var.version}镜像仓库如使用示例默认的 Prometheus Remote Write 地址http://prometheus.service.consul/api/v1/write则环境中应有 Consul DNS 服务发现及可用的 Prometheus否则请通过变量覆盖。2.2 文件清单example/nomad/tempo-monolith目录下只有两个文件文件作用tempo.hclNomad 作业定义HCL内含 Tempo 配置模板README.md原文档说明用法与变量其中 Tempo 自身的 YAML 配置并没有单独成文件而是以Nomadtemplate内联模板的形式嵌在tempo.hcl中渲染后写入local/config.yml。三、tempo.hcl 逐段详解3.1 变量定义可参数化配置作业顶部定义了 4 个variable与原文档中的变量表一一对应variable version { type string description Tempo version default 2.7.1 } variable prometheus_remote_write_url { type string description Prometheus Remote Write URL default http://prometheus.service.consul/api/v1/write } variable s3_url { type string description S3 URL default s3.dummy.url } variable s3_access_key_id { type string description S3 Access Key ID default any } variable s3_secret_access_key { type string description S3 Secret Access Key default any }变量速查表变量名默认值说明version2.7.1Tempo 镜像版本grafana/tempo:${var.version}s3_urls3.dummy.urlS3 存储 endpoint 地址注意tempo.hcl中默认值为s3.dummy.urlREADME 中写的是s3.dummy.url.com以 hcl 文件实际值为准s3_access_key_idanyS3 Access Key IDs3_secret_access_keyanyS3 Secret Access Keyprometheus_remote_write_urlhttp://prometheus.service.consul/api/v1/write指标生成器metrics_generatorRemote Write 目标any等占位默认值表明生产部署必须通过-var显式覆盖仅当你的 S3 恰好不需要校验凭据如本地 MinIO 关闭认证时才可沿用默认。3.2 作业骨架与网络端口job tempo { datacenters [*] group tempo { count 1 network { port http { to 3200 } port grpc {} port otlp { to 4317 } }datacenters [*]允许调度到任意数据中心可按需改成具体 DC 名count 1单实例部署符合单体模式语义三个端口映射http容器内3200端口——Tempo 的 HTTP API查询、/ready健康检查等grpc不固定to由容器默认监听——Tempo 内部 gRPC查询前端与查询器之间通信otlp容器内4317端口——OpenTelemetry 协议 gRPC 接收端点。3.3 服务发现与健康检查service { name tempo-http port http tags [] check { name tempo-http port http type http path /ready interval 20s timeout 1s } } service { name tempo-grpc port grpc tags [] check { port grpc type grpc interval 20s timeout 1s grpc_use_tls false tls_skip_verify true } } service { name tempo-otlp port otlp tags [] }tempo-http注册到 Consul并用HTTP 探活/ready每 20 秒检查一次超时 1 秒tempo-grpc使用gRPC 健康检查协议并显式关闭 TLSgrpc_use_tls false因为本示例是纯内网明文部署tempo-otlp仅注册服务供采集器通过服务发现找到 OTLP 端点不做健康检查。/ready探针并非任意占位路径。在 cmd/tempo/app/app.go 中Tempo 启动时会注册/ready处理器其实现同文件readyHandler见 cmd/tempo/app/app.go会逐个检查 Generator、Query Frontend、LiveStore 等模块的就绪状态全部就绪才返回200 OK否则返回503。因此这个探针能真实反映“服务可对外服务”而非仅仅是“进程存活”。3.4 task 定义与启动参数task tempo { driver docker user nobody kill_timeout 90s config { image grafana/tempo:${var.version} ports [http, grpc, otlp] args [ -targetall, -config.file/local/config.yml, -config.expand-envtrue, ] }要点user nobody以非 root 用户运行容器符合最小权限原则kill_timeout 90s给 Tempo 留出优雅关闭flush WAL、落盘 block的时间三个启动参数-targetall显式指定以单二进制模式启动。实际上在 cmd/tempo/app/config.go 中该 flag 的默认值就是SingleBinary即all这里显式写出更清晰-config.file/local/config.yml指定配置文件路径由下方template渲染生成-config.expand-envtrue允许在配置文件中展开环境变量。其实现位于 cmd/tempo/main.go读取配置文件原文后调用envsubst.EvalEnv做环境变量替换再以yaml.UnmarshalStrict严格解析。这意味着配置里可以放心使用$NOMAD_*这类 Nomad 注入的环境变量。3.5 内联 Tempo 配置模板template块把一段 YAML 渲染为容器内的local/config.ymlexample/nomad/tempo-monolith/tempo.hcl这是整个作业的核心server: log_level: info http_listen_port: {{ env NOMAD_PORT_http }} grpc_listen_port: {{ env NOMAD_PORT_grpc }} distributor: receivers: # this configuration will listen on all ports and protocols that tempo is capable of. otlp: protocols: http: grpc: endpoint: 0.0.0.0:{{ env NOMAD_PORT_otlp }} metrics_generator: processor: service_graphs: max_items: 10000 storage: path: {{ env NOMAD_ALLOC_DIR }}/tempo/wal remote_write: - url: ${var.prometheus_remote_write_url} send_exemplars: true storage: trace: backend: s3 wal: path: {{ env NOMAD_ALLOC_DIR }}/tempo/wal local: path: {{ env NOMAD_ALLOC_DIR }}/tempo/blocks s3: bucket: tempo # how to store data in s3 endpoint: ${var.s3_url} insecure: true access_key: ${var.s3_access_key_id} secret_key: ${var.s3_secret_access_key} overrides: defaults: metrics_generator: processors: - service-graphs - span-metrics逐段说明serverHTTP 与 gRPC 监听端口直接取自 Nomad 分配的动态端口环境变量NOMAD_PORT_http/NOMAD_PORT_grpc保证与 3.2 节的端口映射一致distributor.receivers启用 OTLP 接收器同时开放HTTP4318 语义与 gRPC协议gRPC 端点绑定0.0.0.0:NOMAD_PORT_otlp4317。注释点明这会“监听 Tempo 所支持的所有端口与协议”metrics_generator开启service-graphs处理器服务拓扑图max_items: 10000限制内存中的服务图条目数存储路径位于分配目录下的 WAL并通过 Remote Write 把指标发给 Prometheussend_exemplars: true会附带 exemplarstorage.trace后端选s3WAL 与本地缓存路径都放在NOMAD_ALLOC_DIRNomad 为每个分配提供的本地磁盘目录重启后即被清理适合缓存类数据S3 配置中insecure: true表示走HTTP 而非 HTTPS自建 S3 常用bucket 固定为tempoendpoint 与凭据来自变量overrides租户默认覆盖配置——为所有租户默认启用service-graphs与span-metrics两个指标生成处理器。3.6 资源限制resources { cpu 300 memory 1024 }CPU 300 MHz、内存 1024 MB。单体模式把全部组件塞进一个进程内存主要消耗在接收与批量写、WAL 缓冲、service-graphs 的max_items条目、以及查询时的 block 索引。生产环境建议根据实际写入量与查询量上调并观察/ready与日志再行调整。四、运行作业4.1 基本运行在包含tempo.hcl的目录下执行nomad job run tempo.hcl4.2 覆盖版本变量作业默认拉取grafana/tempo:2.7.1对应variable.version默认值。要换版本可以改 hcl 里的 default或直接命令行覆盖nomad job run -varversion2.7.1 tempo.hcl4.3 覆盖 S3 与 Prometheus 变量同理S3 与 Remote Write 参数务必显式指定例如nomad job run \ -vars3_urlminio.example.internal:9000 \ -vars3_access_key_idtempo \ -vars3_secret_access_keysecret \ -varprometheus_remote_write_urlhttp://prometheus.service.consul/api/v1/write \ tempo.hcl运行后可在 Consul 中发现tempo-http、tempo-grpc、tempo-otlp三个服务向 OTLP gRPC 端点4317写入 trace即可通过 HTTP API3200查询。五、验证与排障健康检查curl http://node-ip:http-port/ready返回200表示各模块就绪503 响应体会指出是哪个模块未就绪Generator / Query Frontend / LiveStore指标生成链路确认metrics_generator的 Remote Write 目标可达否则service-graphs/span-metrics生成的指标无法送达 Prometheus服务拓扑图与 RED 指标会缺失存储验证写入若干 trace 后检查 S3 buckettempo下是否出现 block 数据compact 任务会周期性把 WAL 落盘为 block 并上传模板渲染如果配置有误可先在本机渲染模板检查产物替换{{ env ... }}与${var.*}后执行tempo -config.fileconfig.yml -config.verifyTempo 支持-config.verify只校验配置不启动见 cmd/tempo/main.go。六、注意事项与局限以仓库为准版本适配示例面向 2.x 架构默认2.7.1。当前仓库源码已演进到包含 LiveStore、PartitionRing、BlockBuilder 等 3.x 组件的版本见 cmd/tempo/app/modules.go若用新版本镜像建议对照相应版本官方配置模板更新overrides与storage段S3 凭据安全凭据通过-var传入并最终进入作业定义注意保护 Nomad 作业定义与 Consul KV 的访问权限生产建议改用 Nomad 的template Vault 集成注入密钥而非明文变量单点形态count 1无副本、无多可用区冗余NOMAD_ALLOC_DIR中的数据随分配销毁而丢失已上传 S3 的 block 不受影响WAL/本地缓存可重建生产高可用请参考仓库 example/nomad/tempo-distributed 或分布式部署文档废弃状态如原文档所述此示例可能被移除建议以官方 Helm 或 example/docker-compose 中的单二进制示例作为长期维护的部署参考。七、参考资料本示例作业文件example/nomad/tempo-monolith/tempo.hcl原文档含变量表与用法example/nomad/tempo-monolith/README.md单二进制模式与-target定义cmd/tempo/app/modules.go、cmd/tempo/app/config.go配置加载与-config.expand-env实现cmd/tempo/main.go/ready就绪探针实现cmd/tempo/app/app.go【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

StarRocks DAYOFYEAR 函数详解:获取日期在一年中的第几天

StarRocks DAYOFYEAR 函数详解:获取日期在一年中的第几天

StarRocks DAYOFYEAR 函数详解:获取日期在一年中的第几天 【免费下载链接】starrocks The worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks prov…

2026/9/18 21:37:55 阅读更多 →
PyQt/PySide QTableWidget排序全攻略:从默认机制到自定义规则与性能优化

PyQt/PySide QTableWidget排序全攻略:从默认机制到自定义规则与性能优化

做PyQt/PySide项目,QTableWidget绝对是最常用的表格控件,没有之一。而“点击表头排序”这个需求几乎出现在每一个管理后台、数据看板和工具软件里。我第一次接这个需求的时候,天真的以为一行setSortingEnabled(True)就完事了,结果…

2026/9/18 21:37:55 阅读更多 →
QMK Nearfield 键盘矩阵深度解析:ASCII 矩阵图、行列引脚分配与键位布局映射

QMK Nearfield 键盘矩阵深度解析:ASCII 矩阵图、行列引脚分配与键位布局映射

QMK Nearfield 键盘矩阵深度解析:ASCII 矩阵图、行列引脚分配与键位布局映射 【免费下载链接】qmk_firmware Open-source keyboard firmware for Atmel AVR and Arm USB families 项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware 本文以 QMK…

2026/9/18 21:37:55 阅读更多 →

最新新闻

开源可审计的AI代码审查方法论:CLI+Git+LLM轻量级落地实践

开源可审计的AI代码审查方法论:CLI+Git+LLM轻量级落地实践

1. 项目概述:这不是一个“工具”,而是一套可落地的开源代码审查方法论open-code-review 这个名字乍看像某个 GitHub 仓库或 CLI 工具,但实际它代表的是一类正在快速演进的工程实践——基于开源原则、开放协议、可审计流程的自动化代码审查范式…

2026/9/20 2:00:37 阅读更多 →
一加手机Bootloader解锁与Magisk Root完整教程:从解锁到OTA维护

一加手机Bootloader解锁与Magisk Root完整教程:从解锁到OTA维护

一加这个牌子,玩机圈子里的口碑一直挺特殊——官方对解锁相对宽容,社区资源也够多,但真到自己动手的时候,很多人还是卡在几个关键节点上:解锁码怎么拿、fastboot 认不认设备、Magisk 刷完不开机、OTA 之后 root 掉了怎…

2026/9/20 2:00:37 阅读更多 →
高斯光束Matlab仿真:从参数设计到可视化的完整实践指南

高斯光束Matlab仿真:从参数设计到可视化的完整实践指南

简介:面向激光原理课程学习者与Matlab初学者的实验仿真文档,围绕高斯光束在谐振腔中的归一化强度分布及传播特性展开。文档先建立高斯光束数学模型,随后演示用imread读取CCD采集的实际光斑照片,提取光斑直径方向强度数据绘制二维分…

2026/9/20 2:00:37 阅读更多 →
鼠标指针自定义指南:从光标文件原理到换装与制作全攻略

鼠标指针自定义指南:从光标文件原理到换装与制作全攻略

前阵子有朋友问我,有没有那种“改变鼠标指针和光标的网站”,他想把Windows里千篇一律的白色小箭头换掉。这一下勾起了我早几年折腾桌面的回忆——那时候逛光标站、下载一套套动态光标、再挨个替换系统指针,几乎是每个喜欢折腾电脑的人都会干的…

2026/9/20 2:00:37 阅读更多 →
彻底删除Edge浏览器账户和Windows邮箱账户的完整指南

彻底删除Edge浏览器账户和Windows邮箱账户的完整指南

上个月帮一个朋友处理二手电脑,他跟我说已经把Edge里登录的账户“退出”了,邮箱也删了,结果买家拿回去打开浏览器,头像还在、邮箱地址还挂在账户菜单里,甚至Word打开还弹出他名字的授权信息。他一头雾水,问…

2026/9/20 2:00:37 阅读更多 →
飞机燃油系统仿真:Flowmaster一维CFD稳态与瞬态分析实战

飞机燃油系统仿真:Flowmaster一维CFD稳态与瞬态分析实战

简介:这份PDF白皮书聚焦Flowmaster在飞机燃油系统仿真中的基础应用,面向航空燃油系统设计人员、热流体仿真工程师及航空院校相关专业学习者,帮助读者理解如何用一维CFD工具在系统级别评估压力、温度与流量等关键性能。内容以典型客机燃油系统…

2026/9/20 1:59:36 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →