【GO】LGTM_Grafana_Tempo(2)_官方用例改后实操
最近在尝试用 LGTM 来实现 Go 微服务的可观测性,就顺便整理一下文档。
Tempo 会分为 4 篇文章:
- Tempo 的架构
- 官网测试实操跑通
- gin 框架发送 trace 数据到 tempo
- go-zero 微服务框架使用发送数据到 tempo
根据官方文档实操跑起来 tempo,中间根据自己需要改了一些,按照纯官网会有些跑不起来。
本文档用 docker-compose 启动,单独启动组件的,会在其他的文档描述。本文档主要目的在于用起来,怎么用得好,我现在也没研究太深。
所有本文档用到的配置文件,均在:zxmfke/lgtm: LGTM可观测性实战 (github.com)
git clone https://github.com/zxmfke/lgtm.git
让架构告诉我们需要什么组件来完成
【GO】LGTM_Grafana_Tempo(1)—架构
第一篇讲了 tempo 的架构,分为 Distributor,Ingester,Quier,Quier Fontend,Stroage,Compator,Matrics Generator/Backend。Distributor 意味着输入,所以得有个东西来发送 traces 数据。我们通过 github,可以找到 grafana 用来测试的 k6-tracing(初次看到,感觉就很吊)。
可能这个地方,有些人会想,好麻烦呀还要造数据,又要写代码。但是这个步骤却又是很重要的一步,相当于自测。开发前,也应该要想要的我要怎么自测,怎么测试我提供给别人的服务。
Ingester,Storage,Comptor 组成(泛) 我们的 tmepo,所以 tempo 肯定是必不可少的了。既然我们把数据发到tempo了,那我们就得做存储,为了测试所以就用 fs 来作为存储。数据存完,tempo 提供 quier,就表示我们可以查。Grafana 必然就是首选,毕竟是其旗下,因此 Grafana 也是需要的。最后一个,Matrics 要记在哪里呢?嗯,还是得要 prometheus 用来监控。不过,不开 matrics 的话,也可以不用 prometheus。
这样,本文档需要用到的所有组件就是,grafana,tempo,prometheus,k6-tracing。
文档使用镜像
-
grafana:grafana/grafana:10.1.0
-
tempo:grafana/tempo:2.2.1
去 docker hub 上看 tempo 的 tag 都是仓库名+commitid,其实直接拉取 github 上面最新 release 版本就行
-
prometheus:prom/prometheus:v2.46.0
-
k6-tracing:ghcr.io/grafana/xk6-client-tracing:v0.0.2
文档使用配置文件地址
都是在一个仓库,可以直接 clone 下来,等下直接 docker-compose 起就好
git clone https://github.com/zxmfke/lgtm.git
组件配置文件说明及重点修改说明
针对我跑的过程中碰到的几个点,简单说明下
grafana
grafana 的是 datasource 文件,这个文件可以减少使用者手动配置 tempo,prometheus 的步骤,这个值得自己在开发的时候借鉴。主要就是配置 tempo 和 prometheus,页面的配置也会在之后文档补上。
用 datasource 文件,创建的 source,在 grafana UI 上是不能编辑的,只能通过文件改了。
tempo
server:http_listen_port: 3200 # tempo 监听端口distributor: # 配置的是允许接入哪些类型的 trace 数据xxxxxingester:xxxxxcompactor:xxxxxmetrics_generator: # 配置的是 metrics 的数据往哪里发,主要就是写 promethus 的 URLregistry:external_labels:source: tempocluster: docker-composestorage:path: /tmp/tempo/generator/walremote_write:- url: http://promethus.ip:9090/api/v1/writesend_exemplars: truestorage:trace:backend: local # backend configuration to usewal:path: /tmp/tempo/wal # where to store the the wal locallylocal:path: /tmp/tempo/blocksoverrides:metrics_generator_processors: [service-graphs, span-metrics]
有看过第一篇架构的朋友,应该对配置文件里面的几个标题都很熟悉了。
解释(看的时候,查的资料)
wal
“wal” 是指 Write-Ahead Log(预写日志)。Write-Ahead Log 是一种持久化数据的技术,在系统发生崩溃或故障时,可以确保数据的可靠性和一致性。对于 Tempo 来说,“wal” 是一个配置项,用于指定预写日志文件的位置和设置。
通过使用 Write-Ahead Log,Tempo 可以将跟踪数据持久化到磁盘,以便在系统故障后能够恢复数据并保持数据的完整性。该日志文件记录了写入 Tempo 的跟踪数据的操作,以及相关的元数据。这种方式可以确保即使在系统崩溃时,跟踪数据也不会丢失,并且可以在系统恢复后重新加载。
overrides
“overrides” 是用于覆盖默认配置的配置项。它允许您对 Tempo 的行为进行细粒度的定制,以满足特定的需求和场景。
通过使用 “overrides” 配置项,您可以在 Tempo 中针对某些特定的组件、服务或操作进行个性化配置。这些覆盖配置可以覆盖全局配置中的默认设置,以便对特定组件或场景进行定制化设置。
Docker Compose YAML
# 如果有 git clone 的话,直接 cd tempo/docker-compose/local 即可
wget https://github.com/zxmfke/lgtm/blob/main/tempo/docker-compose/local/docker-compose.yaml -O docker-compose.yaml
version: "3"
services:tempo:image: grafana/tempo:2.2.1command: [ "-config.file=/etc/tempo.yaml" ]volumes:- ./tempo.yaml:/etc/tempo.yaml- ./tempo-data:/tmp/tempoports:- "14268:14268" # jaeger ingest- "3200:3200" # tempo- "9095:9095" # tempo grpc- "4317:4317" # otlp grpc- "4318:4318" # otlp http- "9411:9411" # zipkink6-tracing:image: ghcr.io/grafana/xk6-client-tracing:v0.0.2environment:- ENDPOINT=tempo:4317restart: alwaysdepends_on:- tempoprometheus:image: prom/prometheus:v2.46.0command:- --config.file=/etc/prometheus.yaml- --web.enable-remote-write-receiver- --enable-feature=exemplar-storagevolumes:- ./prometheus.yaml:/etc/prometheus.yamlports:- "9090:9090"grafana:image: grafana/grafana:10.1.0volumes:- ./grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yamlenvironment:- GF_FEATURE_TOGGLES_ENABLE=traceqlEditorports:- "3000:3000"
注意事项
-
tempo 的 ports 是根据配置文件中 distributor 来的,开放哪些 receiver 就开哪些端口。
单点部署 tempo 的有一个很容易出错的地方,docker run 的时候只知道开放 3200 端口,以为 tempo 就起好了,但是往里面发 traces 数据的时候又写不进去。
-
k6-tracing 是往 tempo 发数据,所以必须得等 tempo 启动好
配置文件改动位置
grafana-dataresources.yaml
# 如果有 git clone 的话,直接 cd tempo/docker-compose/local 即可
wget https://github.com/zxmfke/lgtm/blob/main/tempo/docker-compose/local/grafana-dataresources.yaml -O grafana-dataresources.yaml
L9:prometheus.ip,改成部署的服务器IP
L20:tempo.ip,改成部署的服务器IP
prometheus.yaml
# 如果有 git clone 的话,直接 cd tempo/docker-compose/local 即可
wget https://github.com/zxmfke/lgtm/blob/main/tempo/docker-compose/local/prometheus.yaml -O prometheus.yaml
L11:tempo.ip,改成部署的服务器IP
tempo.yaml
# 如果有 git clone 的话,直接 cd tempo/docker-compose/local 即可
wget https://github.com/zxmfke/lgtm/blob/main/tempo/docker-compose/local/tempo.yaml -O tempo.yaml
L34:promethus.ip,改成部署的服务器IP
我是本地 docker-compose 起,所以改的都是部署的服务器IP地址。后面部署在别的地方 ,或者用创建docker network,都是可以的。
启动
docker-compose 的安装就不在这边描述了,Install Docker Desktop on Debian | Docker Docs,有完整的教程。
docker-compose up -d
启动过程可能会出现如下画面:

容器名称可能会不一样,这个没关系。启动完成后,执行 docker ps,就可以看到我们想要启动的 4 个容器。

停止
docker-compose down
页面访问
在通过之前描述,k6-tracing 是定时往 tempo 里面发数据,我们就来看一下 grafana 上面怎么看。
登入 grafana
浏览器请求 IP:3000,访问 grafana 的主页。第一次登入的话,账号密码是 admin/admin。

进入 explore 页面

选择一个 trace 查看

查看 service Graph
详细可看,Service graph view | Grafana Tempo documentation

Metrics
我们在 tempo 的配置项里面开启了 metrics_generator,所以可以通过 explore 里面选择 prometheus 来当做数据源,查看。在筛选器里面的 Metric 里面有非常多可选项。

相关文章:
【GO】LGTM_Grafana_Tempo(2)_官方用例改后实操
最近在尝试用 LGTM 来实现 Go 微服务的可观测性,就顺便整理一下文档。 Tempo 会分为 4 篇文章: Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架使用发送数据到 tempo 根据官方文档实操跑起来 tempo,中间根…...
git 口令
把当前目录变成 Git 可以管理的仓库: git init 下载一个项目和它的整个代码历史 git clone [url] 切换到 develop 分支: git checkout develop 建立并切换到 new 分支 git checkout -b new 查看所有分支: git branch -a 删除 tese …...
【回眸】剑指offer(二)解题思路
题解 | #数字在升序数组中出现的次数# JZ3数字在升序数组中出现的次数 描述 给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数 数据范围:0≤n≤1000,0≤k≤100,数组中每个元素的值满足 0≤val≤100 要求…...
Python 基本文件操作及os库
内置函数文件操作 python内置函数提供了简单的文件操作支持。 open() open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。 语法为: open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdT…...
YOLOv5算法改进(9)— 替换主干网络之ShuffleNetV2
前言:Hello大家好,我是小哥谈。ShuffleNetV2 是一种轻量级的神经网络架构,适用于移动设备和嵌入式设备等资源受限的场景,旨在在计算资源有限的设备上提供高效的计算和推理能力,它通过引入通道重排操作和逐点组卷积来减…...
三、mycat分库分表
第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了&…...
gitlab提交项目Log in with Access Token错误
目录 报错信息 问题描述 解决方案 报错信息 问题描述 在提交项目到gitlab时,需要添加账户信息 ,但是报了这样一个错,原因应该就是路径问题,我在填写server地址的时候,就出现了路径问题,我把多余的几个/…...
openGauss学习笔记-56 openGauss 高级特性-DCF
文章目录 openGauss学习笔记-56 openGauss 高级特性-DCF56.1 架构介绍56.2 功能介绍56.3 使用示例 openGauss学习笔记-56 openGauss 高级特性-DCF DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典…...
Xcode 14 pod init报错
文章目录 1.报错2.解决方法(本人亲测有效) 1.报错 [!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com/CocoaPods/CocoaPods/search?q%5BXcodeproj%5DUnknownobjectversion%2856%29.&typeIs…...
飞腾PSPA可信启动--2 数字签名证书
今天继续第二章,数字签名证书的介绍。 此章节录制了讲解视频,可以在B站进行观看:...
微前端:重塑大型项目的前沿技术
引言 随着互联网技术的飞速发展,前端开发已经从简单的页面制作逐渐转变为复杂的应用开发。在这个过程中,传统的前端开发模式已经难以满足大型项目的需求。微前端作为一种新的前端架构模式,应运而生,它旨在解决大型项目中的前端开…...
官方推荐使用的OkHttp4网络请求库全面解析(Android篇)
作者:cofbro 前言 现在谈起网络请求,大家肯定下意识想到的就是 okhttp 或者 retrofit 这样的三方请求库。诚然,现在有越来越多的三方库帮助着我们快速开发,但是对于现在的程序员来说,我们不仅要学会如何去用ÿ…...
Spooling的原理
脱机技术 程序猿先用纸带机把自己的程序数据输入到磁带中,这个输入的过程是由一台专门的外围控制机实现的。之后CPU直接从快速的磁带中读取想要的这些输入数据。输出也类似。 假脱机技术(Spooling技术) 即用软件的方式来模拟脱机技术。要…...
Homebrew 无法安装过时的PHP版本
使用brew安装过时的PHP版本时,提示“Error: php7.4 has been disabled because it is a versioned formula!”错误。 因为过时的PHP版本官方已经不再维护,所以Hombrew将该PHP版本移出了repository,所以安装不了。 解决方案 # 1. 添加tap fo…...
python爬取bilibili,下载视频
一. 内容简介 python爬取bilibili,下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接:https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…...
java八股文面试[多线程]——进程与线程的区别
定义 1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动。 进程结构…...
SpringBootWeb 登录认证[Cookie + Session + Token + Filter + Interceptor]
目录 1. 登录功能 1.1 需求 1.2 接口文档 1.3 登录 - 思路分析 1.4 功能开发 1.5 测试 2. 登录校验 2.1 问题分析 什么是登录校验? 我们要完成以上登录校验的操作,会涉及到Web开发中的两个技术: 2.2 会话技术 2.2.1 会话技术介绍…...
d3dcompiler_43.dll丢失怎么修复,分享几种修复d3dcompiler_43.dll的方法
不少人可能看到d3dcompiler_43.dll这个文件会感觉到陌生,是的,因为这个文件一般来说是很少丢失的,但是还是会出现d3dcompiler_43.dll丢失的情况的,今天主要是来给大家详细的说说d3dcompiler_43.dll丢失怎么修复的相关方法。 一.分…...
mqtt集群搭建并使用nginx做负载均衡_亲测得结论
mqtt集群搭建 RabbitMQ集群搭建和测试总结_亲测 搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了 nginx配置mqtt负载均衡 #修改rabbitmq1节点ip为1.19的nginx配置 vim /etc/nginx/nginx.confhttp { } #在http外添加如下配置 stream {upstream rabbitmqtt {ser…...
JavaScript—DOM(文档对象模型)
目录 DOM是什么? DOM有什么作用? 一、事件 理解事件 事件怎么写(要做什么就写什么)? 实战演练 1、页面加载完毕以后,打印一句话 2、如果有一个a标签,并给其添加一个点击事件 3、事件默…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
