关于takin-data,你想知道的都在这里(二)trace日志篇
相信大家在使用takin的过程中都见到过压测过程中实时展示的请求流量明细和请求详情了吧,像这样:

还有这样:

这样的请求流量明细和调用链详情是怎么实现的呢,今天就带大家探究下。
在前面的启动命令篇(https://news.shulie.io/?p=3450),我们简单介绍了surge-deploy的启动命令,里面关于IP映射的章节相信大家都还有印象,我们会读取IP映射信息将我们的日志接收服务注册到zk上,供我们的linkAgent读取,并发送日志到上面。发送的是什么日志呢,就是我们今天要说的trace日志。
先来看一下日志的文件路径,在我们的应用接入linkAgent并成功启动后,在我们的/apps/logs_pradar(默认日志输出目录,可以通过agent.properties中simulator.log.path配置进行调整)目录下面将会看到以下内容:

这里面的tank_demo和tank-gateway-demo就是我们接入到linkAgent的应用,打开tank-gateway-demo:

我们能看到以下几个日志文件,不知道大家有没有查看过里面的内容呢,其实我们的trace日志就保存在pradar_trace.log.0这个文件里。
说到这,需要给大家解释下trace日志的含义:我们的LinkAgent采用的是字节码增强的技术,当请求流经各个应用时,将会记录应用代码中的真实的调用关系,包含请求的上下游应用名称,接口名称,服务名称等等信息,其中最重要的就是一个全局的traceId,这个traceId在请求第一次到达时生成,随后不断传递,一直到请求完成的最下游应用,即调用链的底部,这样生成的数据就是我们的trace日志。
接下来,我们来看下pradar_trace.log.0文件里面的内容,我们选取demo应用中的user-center应用:

相信大家初看这个文件,肯定不知从何看起,这里就要给大家介绍下我们的日志格式了:
traceId|startTime|agentId|invokeId|invokeType|appName|cost|middlewareName|serviceName|methodName|resultCode|request|response|flags|callbackMsg|#samplingInterval|@attributes|@localAttributes
日志的每个字段之间用竖线|进行分割,每一行日志则是用换行符(\r\n)进行分割。有了这个,相信大家再入手肯定不难了。我们以图片中最后一条为例,给大家解读下:

用一句通俗的话说,这条trace日志的含义就是,部署在127.0.0.1上,进程号为33212的easy-demo-usercenter-1.0.0应用在1628712100533这个时间收到了一条/user-center/user/shadow_data#POST的请求,应用的容器为tomcat,请求参数为空,响应码为200,没有返回具体的响应信息。哈哈,这样一来大家是不是好理解了!
但是还有一些同学肯定更好学,想知道各个字段在不同中间件下的含义,没关系,这个我们也有!!!
下面就是关于我们的trace日志的各个字段解释:
traceId:关联一次请求相关的日志,全局唯一,在各个系统间传递,组成:
IP 地址(8位):ip地址16进制压缩
创建时间(13):在存储时用于分区
顺序数(4):用于链路采样
标志位(1):可选,用于调试和标记
进程号(4):可选,单机多进程的应用使用
startTime:方法调用开始时间
agentId:一般为ip+进程号
invokeId:标识日志埋点顺序和嵌套关系,也在各个系统间传递
顺序编号:1、2、3…
多级编号:0、0.1、0.2、0.2.1…
invokeType:
web的server端 TYPE_WEB_SERVER = 0
远程调用 TYPE_RPC = 1
MQ调用 TYPE_MQ = 3
数据库调用 TYPE_DB = 4
缓存调用 TYPE_CACHE = 5
搜索调用 TYPE_SEARCH = 6
job类型调用 TYPE_JOB = 7
文件系统调用 TYPE_FS = 8
本地方法调用 TYPE_LOCAL = 9
未知调用 TYPE_UNKNOW = -1
appName:应用名称
cost:方法耗时(ms)
middlewareName:中间件名称
serviceName:
web的server端:url, 不带参数,不带协议、域名和端口
远程调用:类名
MQ调用:topic/ueueq
数据库调用:库名
缓存调用:库名
搜索调用:索引名
job类型调用:jobClassName / job 名称
文件系统调用:服务地址
本地方法调用:类名
methodName:
web的server端:http method,统一大写
远程调用:方法名(参数列表)、如 test(String,int)、test()
MQ调用:group/group|tags/routingKey
数据库调用:表名
缓存调用:方法 如 add/pop/spop/delete等等
搜索调用:操作的方法名
job类型调用:jobType
文件系统调用:文件路径
本地方法调用:方法名(参数列表)、如 test(String,int)、test()
resultCode:00(成功)/01(失败)/02(业务错误)/03(超时)/04(未知)/05(断言失败)
request:
web的server端:请求体内容
缓存调用:key
response:
web的server端:响应体内容
flags:
位标签,用~分割(第一位标记压测标、第二位标记debug流量、第3位标记是否是trace入口、第4位标记是否是server、第5位标记是否是流量引擎日志)
例:truefalsefalsetruefalse
callbackMsg:
web的server端:响应码
数据库调用:sql
缓存调用:redis客户端名称(例:redis-redisson)
samplingInterval:采样率
例:#1
@attributes:包括 traceAppName(入口应用名称)、traceServiceName(入口服务名)、traceMethod(入口方法名称)、taskId(压测报告ID)
例:@easydemo/getPOST~14
@localAttributes:包括 upAppName(上游应用名称)、remoteIp(主机ip)、remotePort(主机端口)、requestSize(请求大小)、responseSize(响应大小)
例:@easydemo127.17.0.1330600
那知道了trace日志的含义和组成后,我们回到开始的问题:请求详情和调用链是怎么实现的?相信有不少小伙伴也已经猜到了:linkAgent会将我们的trace日志推送给surge-deploy,由我们的大数据写入到clickhouse中,最后再从clickhouse中查询得到这些信息!
下面,再附上clickhouse的连接命令,小伙伴们也可以直接查询clickhouse来查询自己的请求数据:
- 登录容器
docker exec -it ${containerid} bash
- 登录clikhouse
clickhouse-client -h 0.0.0.0 --password='rU4zGjA/'
- 查询t_trace_all表
select * from t_trace_all limit 10;
t_trace_all的表结构,小伙伴们也可以看一下:

想要了解更多开源产品信息,扫码小树入群交流!

关于takin-data,你想知道的都在这里(二)trace日志篇的更多相关文章
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- Swift具体解释之三----------函数(你想知道的都在这里)
函数(你想知道的都在这里) 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正.一起学习. 1. 函数的简单定义和调用 简单的无參函数就不再赘述 , ...
- 关于MySQL慢日志,你想知道的都在这
关于MySQL慢日志,你想知道的都在这 https://mp.weixin.qq.com/s/Ifbq0Dk13SO3WVghqWVUbA 作者介绍邹鹏,现任职于腾讯云数据库团队,负责腾讯云数据库My ...
- CYDIA装了个插件,想删除怎么都删除,电脑如何删除插件?
http://bbs.weiphone.com/read-htm-tid-3670917.html 装了个插件,想删除怎么都删除不掉不要跟我说在CYDIA里面删除.,在CYDIA里点击该插件就会闪退C ...
- 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(上) 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(下)
微信.QQ.新浪微博等第三方登录,你想知道的都在这了(上):https://www.jianshu.com/p/133d84042483 微信.QQ.新浪微博等第三方登录,你想知道的都在这了(下):h ...
- python学习之路------你想要的都在这里了
python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...
- KMP算法,你想知道的都在这里!
简洁 我相信很多人都听说过KMP算法(PS:在上数据结构的时候,这个算法自始至终都没想明白) 大家也知道KMP算法是用来寻找目标子串的算法,但是都没有真正搞懂KMP.之前,我也是如此,我疑惑的有: N ...
- 【高热FAQ】关于智慧康养物联网加速器 ,你想知道的都在这
摘要:从软硬件解决方案.设备接入到资源扶持,一文梳理智慧康养物联网加速器中ISV最关心的问题. 本文分享自华为云社区<[高热FAQ]关于智慧康养物联网加速器 ,你想知道的都在这>,作者:技 ...
- CYQ.Data V5 分布式自动化缓存设计介绍(二)
前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但 ...
随机推荐
- Python - typing 模块 —— Union
前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...
- wireshark 解密加密报文
wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...
- 小白也能看懂的dubbo3应用级服务发现详解
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...
- 写了一年golang,来聊聊进程、线程与协程
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 进程 在早期的单任务计算机中,用户一次只能提交一个作业,独享系统的全部资源,同时也只能干一件事 ...
- 【第四篇】-Git 工作区、暂存区和版本库之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 工作区.暂存区和版本库 基本概念 我们先来理解下 Git 工作区.暂存区和版本库概念: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫 stage 或 index.一般存放在 .git ...
- 完全分布式Hadoop2.X的搭建
准备工作: 安装jdk 克隆2台虚拟机完成后:新的2台虚拟机,请务必依次修改3台虚拟机的ip地址和主机名称[建议三台主机名称依次叫做:master.node1.node2 ](虚拟机的克隆,前面的博客 ...
- Wpf读写Xaml文件
前言 本文主要介绍Wpf读写Xaml文件. 读写实现 首先我们使用XamlWriter将Wpf的对象转换为Xaml字符串,代码如下: var btn = sender as Button; strin ...
- 【PHP数据结构】树和二叉树
树的概念其实非常地广泛,也非常地常见,大家见到这个词千万不要惊慌,因为真的每天你都能见到树结构在我们生活中的应用.比如说公司的组织结构: 另外像我们家里的族谱,或者说是我们的家庭结构,也是一个典型的树 ...
- express 路由匹配和数据获取
express配置路由只需要通过app.method(url,func)来配置,其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get(&q ...
- python三种导入模块的方法
做为python初学者,有时候搞不清楚导入模块的作用. 直接导入模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py"." ...