微服务全链路跟踪:grpc集成zipkin

微服务全链路跟踪:grpc集成jaeger

微服务全链路跟踪:springcloud集成jaeger

微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3

微服务全链路跟踪:jaeger集成hystrix

微服务全链路跟踪:jaeger增加tag参数

前言

> 微服务全链路跟踪: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&amp;&amp;tracer.activeSpan()!=null&amp;&amp;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参数的更多相关文章

  1. Go微服务全链路跟踪详解

    在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪. 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链. 该ID称为Correlati ...

  2. Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin

    Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google ...

  3. 微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh

    微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh 微服务架构   本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧 ...

  4. 微服务之分布式跟踪系统(springboot+zipkin+mysql)

    通过上一节<微服务之分布式跟踪系统(springboot+zipkin)>我们简单熟悉了zipkin的使用,但是收集的数据都保存在内存中重启后数据丢失,不过zipkin的Storage除了 ...

  5. SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能

    首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...

  6. SpringBoot之微服务日志链路追踪

    SpringBoot之微服务日志链路追踪 简介 在微服务里,业务出现问题或者程序出的任何问题,都少不了查看日志,一般我们使用 ELK 相关的日志收集工具,服务多的情况下,业务问题也是有些难以排查,只能 ...

  7. SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践

    一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...

  8. 全链路跟踪skywalking简介

    该文章主要包括以下内容: skywalking的简介 skywalking的使用,支持多种调用中间件(httpclent,springmvc,dubbo,mysql等等) skywalking的tra ...

  9. 详解ElasticAPM实现微服务的链路追踪(NET)

    前言 Elastic APM实现链路追踪,首先要引用开源的APMAgent(APM代理),然后将监控的信息发送到APMServer,然后在转存入ElasticSearch,最后有Kibana展示:具体 ...

  10. 微服务 Zipkin 链路追踪原理(图文详解)

    一个看起来很简单的应用,可能需要数十或数百个服务来支撑,一个请求就要多次服务调用. 当请求变慢.或者不能使用时,我们是不知道是哪个后台服务引起的. 这时,我们使用 Zipkin 就能解决这个问题. 由 ...

随机推荐

  1. 在System身份运行的.NET程序中以指定的用户身份启动可交互式进程

    今天在技术群里,石头哥向大家提了个问题:"如何在一个以System身份运行的.NET程序(Windows Services)中,以其它活动的用户身份启动可交互式进程(桌面应用程序.控制台程序 ...

  2. UIButton选择状态下长按时会变回原始状态

    问题大概就像这样 (请无视那红字) 一般而言这是高亮状态的设置有所缺乏.完善代码如下: [_pupilBtn setImage:[UIImage imageNamed:@"a1"] ...

  3. MYSQL8-快速生成表结构(用于生成文档)

    各种工具都有,没有特别趁手的.不如自己用sql处理. SELECT column_name AS CODE, CASE WHEN column_comment IS NULL OR TRIM(colu ...

  4. 用基础Array数组实现动态数组、链表、栈和队列

    代码地址: https://gitee.com/Tom-shushu/Algorithm-and-Data-Structure.git 一.ArrayList自定义封装 package com.zho ...

  5. .NET Core MVC基础之返回文件类型

    .NET Core MVC基础之返回文件类型 前言 上一篇文章讲了基础的返回类型,这篇文章讲解如何返回文件类型给浏览器下载. 系列文章 .NET MVC基础之页面传值方式 通过图片流来返回图片 返回类 ...

  6. Android系统启动:3-zygote篇

    Android系统启动:zygote篇 原文:http://gityuan.com/2016/02/13/android-zygote/ 基于Android 6.0的源码剖析, 分析Android启动 ...

  7. 3568F-麒麟KylinOS国产操作系统演示案例

  8. Http基础协议

    浏览器请求方法 http1.0定义了三种: GET: 向服务器获取资源,比如常见的查询请求 POST: 向服务器提交数据而发送的请求 Head: 和get类似,返回的响应中没有具体的内容,用于获取报头 ...

  9. 还在困惑需要多少数据吗?来看看这份估计指南 | CVPR 2022

    论文基于实验验证,为数据需求预测这一问题提供了比较有用的建议,详情可以直接看看Conclusion部分. 来源:晓飞的算法工程笔记 公众号 论文: How Much More Data Do I Ne ...

  10. 解决阿里云redis监听6379,配置规则也将6379端口开放,但是外网仍无法连接6379的问题

    首先确保阿里云配置规则和服务器防火墙已开发6379端口 阿里云linux安装完成redis,并且已经运行,检测6379端口,显示redis-server正在监听,如图 修改redis.conf配置 将 ...