微服务全链路跟踪: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配置 将 ...