微服务全链路跟踪:jaeger增加tag参数
微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3
前言
> 微服务全链路跟踪:grpc集成jaeger中介绍了springboot集成jaeger,在现实使用时很多情况下需要根据业务id来搜索全链路,这里就需要注入tab来方便搜索,
方案
1、直接手动注入
@Controller
@RequestMapping("/demo")
@Api(tags = "demo")
@Slf4j
public class DemoController extends BaseController {
@Autowired
private Tracer tracer;
/**
*
*/
@GetMapping("/getTaskByid")
public ApiResponse getByid(@RequestParam("id") Long id)
{
if (tracer!=null&&tracer.activeSpan()!=null) {
tracer.activeSpan().setTag(“id”, id);
}
return ApiResponse.success(service.selectById(id));
}
}
2、通过注解或者aop自动注入
下面主要介绍注解的方式
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JaegerLog {
String tagName() default "id";
/**
* 操作对象ID
* @return
*/
String objectIdKey() default "";
}
@Slf4j
@Aspect
@Order()
public class JaegerLogAspect {
@Autowired
private Tracer tracer;
@Around("@annotation(jaegerLog)")
@SneakyThrows
public Object around(ProceedingJoinPoint point, JaegerLog jaegerLog) {
Object object = null;
Map<string, object> paramsMap = Maps.newHashMap();
try {
paramsMap .put("args", point.getArgs());
object = point.proceed();
paramsMap .put("response", object);
} catch (BusinessException e) {
throw new Exception(e);
}catch (Exception e) {
throw new Exception(e);
}finally {
try{
if (tracer!=null&&tracer.activeSpan()!=null&&StringUtils.isNotBlank(jaegerLog.objectIdKey())) {
String keyValue = getKeyValue(jaegerLog.objectIdKey(), params);
tracer.activeSpan().setTag(jaegerLog.tagName(), keyValue);
}
}catch (Exception e){
log.error(e.getMessage());
}
}
return object ;
}
private String getKeyValue(String key, Map<string, object> params) {
try {
Object value= JSONPath.eval(params, key);
if (mm != null) {
return value.toString();
}
} catch (Exception e) {
log.error("JSONPath.eval:", e);
}
return null;
}
}
@Controller
@RequestMapping("/demo")
@Api(tags = "demo")
@Slf4j
public class DemoController extends BaseController {
/**
*
*/
@GetMapping("/getByid")
@JaegerLog(objectIdKey = "args[0]")
public ApiResponse getByid(@RequestParam("id") Long id)
{
return ApiResponse.success(service.selectById(id));
}
/**
*
*/
@PostMapping("/add")
@JaegerLog(objectIdKey = "args[0].id")
public ApiResponse add(@RequestBody Map<string,string> parms)
{
return ApiResponse.success(service.add(parms));
}
}
这样就可以自定义参数id来进行jaeger tag注入。
后面就可以根据注入的id来查询全链路结果,如下图:

</string,string></string,></string,>
微服务全链路跟踪:jaeger增加tag参数的更多相关文章
- Go微服务全链路跟踪详解
在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪. 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链. 该ID称为Correlati ...
- Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google ...
- 微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh
微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh 微服务架构 本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧 ...
- 微服务之分布式跟踪系统(springboot+zipkin+mysql)
通过上一节<微服务之分布式跟踪系统(springboot+zipkin)>我们简单熟悉了zipkin的使用,但是收集的数据都保存在内存中重启后数据丢失,不过zipkin的Storage除了 ...
- SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能
首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...
- SpringBoot之微服务日志链路追踪
SpringBoot之微服务日志链路追踪 简介 在微服务里,业务出现问题或者程序出的任何问题,都少不了查看日志,一般我们使用 ELK 相关的日志收集工具,服务多的情况下,业务问题也是有些难以排查,只能 ...
- SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践
一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...
- 全链路跟踪skywalking简介
该文章主要包括以下内容: skywalking的简介 skywalking的使用,支持多种调用中间件(httpclent,springmvc,dubbo,mysql等等) skywalking的tra ...
- 详解ElasticAPM实现微服务的链路追踪(NET)
前言 Elastic APM实现链路追踪,首先要引用开源的APMAgent(APM代理),然后将监控的信息发送到APMServer,然后在转存入ElasticSearch,最后有Kibana展示:具体 ...
- 微服务 Zipkin 链路追踪原理(图文详解)
一个看起来很简单的应用,可能需要数十或数百个服务来支撑,一个请求就要多次服务调用. 当请求变慢.或者不能使用时,我们是不知道是哪个后台服务引起的. 这时,我们使用 Zipkin 就能解决这个问题. 由 ...
随机推荐
- 在System身份运行的.NET程序中以指定的用户身份启动可交互式进程
今天在技术群里,石头哥向大家提了个问题:"如何在一个以System身份运行的.NET程序(Windows Services)中,以其它活动的用户身份启动可交互式进程(桌面应用程序.控制台程序 ...
- UIButton选择状态下长按时会变回原始状态
问题大概就像这样 (请无视那红字) 一般而言这是高亮状态的设置有所缺乏.完善代码如下: [_pupilBtn setImage:[UIImage imageNamed:@"a1"] ...
- MYSQL8-快速生成表结构(用于生成文档)
各种工具都有,没有特别趁手的.不如自己用sql处理. SELECT column_name AS CODE, CASE WHEN column_comment IS NULL OR TRIM(colu ...
- 用基础Array数组实现动态数组、链表、栈和队列
代码地址: https://gitee.com/Tom-shushu/Algorithm-and-Data-Structure.git 一.ArrayList自定义封装 package com.zho ...
- .NET Core MVC基础之返回文件类型
.NET Core MVC基础之返回文件类型 前言 上一篇文章讲了基础的返回类型,这篇文章讲解如何返回文件类型给浏览器下载. 系列文章 .NET MVC基础之页面传值方式 通过图片流来返回图片 返回类 ...
- Android系统启动:3-zygote篇
Android系统启动:zygote篇 原文:http://gityuan.com/2016/02/13/android-zygote/ 基于Android 6.0的源码剖析, 分析Android启动 ...
- 3568F-麒麟KylinOS国产操作系统演示案例
- Http基础协议
浏览器请求方法 http1.0定义了三种: GET: 向服务器获取资源,比如常见的查询请求 POST: 向服务器提交数据而发送的请求 Head: 和get类似,返回的响应中没有具体的内容,用于获取报头 ...
- 还在困惑需要多少数据吗?来看看这份估计指南 | CVPR 2022
论文基于实验验证,为数据需求预测这一问题提供了比较有用的建议,详情可以直接看看Conclusion部分. 来源:晓飞的算法工程笔记 公众号 论文: How Much More Data Do I Ne ...
- 解决阿里云redis监听6379,配置规则也将6379端口开放,但是外网仍无法连接6379的问题
首先确保阿里云配置规则和服务器防火墙已开发6379端口 阿里云linux安装完成redis,并且已经运行,检测6379端口,显示redis-server正在监听,如图 修改redis.conf配置 将 ...