微服务全链路跟踪: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 就能解决这个问题. 由 ...
随机推荐
- 使用python+pytesseract实现图片中文字的识别
一.安装tesseract 1.下载链接 https://digi.bib.uni-mannheim.de/tesseract/ 2.网盘下载地址 链接:https://pan.baidu.com/s ...
- Simple WPF: WPF 透明窗体和鼠标事件穿透
一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能.可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应. 这个方法不一定是制 ...
- ubuntu 同时安装python2 和 python3 版本的 gunicorn
前言 最近在学习使用 gunicorn 部署 flask 项目.发现使用 pip3 安装完 gunicorn后,如如果再使用 pip2 安装 gunicorn,后安装的 gunicorn 就会覆盖掉原 ...
- 微调 Florence-2 - 微软的尖端视觉语言模型
Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型.该模型极具吸引力,因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色. Floren ...
- django 信号第一个 raise ValidationError出现后,还会继续下一个if吗
在你提供的代码片段中,如果第一个 raise ValidationError 触发,会抛出异常并停止执行当前函数或代码块.这是因为异常(Exception)会中断正常的代码流程,将控制权传递给调用堆栈 ...
- 变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用
巴图自动化Profinet转Modbus模块(BT-MDPN10)是一种用于不同通讯协议之间互连的设备,它可以将Profinet与Modbus这两种不同的通讯协议进行转换,从而实现设备之间的通讯和数据 ...
- C# 泛型SQLHelper<T>类
示例[1] 1.创建SQLHelper类 using System.Collections.Generic; using System.Configuration; using System.Data ...
- Jenkins 添加Linux固定代理节点
实践环境 Jenkins 2.304 jdk-8u131-linux-x64.rpm centos-release-7-9.2009.1.el7.centos.x86_64 操作步骤 安装JDK 在预 ...
- 如何让 MGR 不从 Primary 节点克隆数据?
问题 MGR 中,新节点在加入时,为了与组内其它节点的数据保持一致,它会首先经历一个分布式恢复阶段.在这个阶段,新节点会随机选择组内一个节点(Donor)来同步差异数据. 在 MySQL 8.0.17 ...
- 【服务器】Ubuntu虚拟内存设置
引子 最近服务器内存老是爆掉,64G的内存对于四五个人同时使用还是有点勉强,上网查询了一下虚拟内存的教程,本博客记录一下方法. swap内存设置 假设你想将swap文件放在/mnt/data/mem目 ...