首页 > 其他分享 >网关和业务服务traceId打通记录

网关和业务服务traceId打通记录

时间:2023-07-05 16:44:42浏览次数:41  
标签:打通 网关 traceId TRACE MDC request put ID

        项目里面使用的是skywalking通过tid来记录一次请求的调用链的,但是发现在网关层的tid显示是N/A.网关处skywalking由于权限问题没办修改,我就想着使用MDC的方式来修改吧。

       第一步:

       因为网关处使用的是ServerWebExchange来接受参数的,但是在业务层的拦截器里面使用的是HttpServletRequest,首先需要在网关处的header里面添加一个traceId的属性,这样在业务层的拦截器处就能拦截到。

     

public void logRequest(ServerWebExchange exchange, ServerHttpRequest mutatedRequest) {
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders headers = request.getHeaders();
        if(Objects.isNull(request.getHeaders().getFirst(TraceUtils.TRACE_ID))){
            request.mutate().header(TraceUtils.TRACE_ID,TraceUtils.createTraceId());
        }
        String curIp = exchange.getRequest().getHeaders().getFirst(Constant.H_KEY_IP);
        JSONObject json = getHeaderJson(headers);
        json.put("method",request.getMethodValue());
        json.put("ip",curIp);
        json.put("path",request.getPath().toString());

        //请求参数,post从请求里获取请求体
        if (request.getMethod() == HttpMethod.POST) {

        } else if (request.getMethod() == HttpMethod.GET) {
            json.put("body",request.getQueryParams().toString());
        } else if (request.getMethod() == HttpMethod.PUT) {
            json.put("body",request.getQueryParams().toString());
        }
        logger.info("request-info:{}",json.toString());
    }

 

public class TraceUtils {
    public static final String TRACE_ID = "traceId";

    public static synchronized String createTraceId() {
        String traceId = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
        MDC.put(TRACE_ID, traceId);
        return traceId;
    }

    public static void destroyTraceId() {
        MDC.remove(TRACE_ID);
        MDC.clear();
    }


}

 

之后需要在日志里面将traceId记录起来:

 

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %tid [%-5level] [%thread] [%logger{15}:%line] %X{traceId} --- %msg%n</pattern>
            </layout>
        </encoder>

 

3.在业务层的拦截器处

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String gatewayTraceId = request.getHeader(TRACE_ID);
        log.info("gateway traceId:" + gatewayTraceId + ",MDC:" + MDC.get(TRACE_ID));
        if(Objects.isNull(gatewayTraceId)){
            request.setAttribute(TRACE_ID, TraceUtils.createTraceId());
        }else {
            request.setAttribute(TRACE_ID,gatewayTraceId);
            MDC.put(TRACE_ID,gatewayTraceId);
        }
//其他业务逻辑 }

 

同时在业务代码层也需要在日志添加好:

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %tid [%-5level] [%thread] [%logger{15}:%line] %X{traceId} --- %msg%n</pattern>
            </layout>
        </encoder>

 

标签:打通,网关,traceId,TRACE,MDC,request,put,ID
From: https://www.cnblogs.com/thinkingandworkinghard/p/17528964.html

相关文章

  • 网关下,通信原理
    现在有两台机器要通信,他们分别是在不同的网段内,假如ip地址分别为PC2:192.168.1.1/24PC3:192.168.2.1/24由于是在不同的网段下,所以需要配置网关地址,(网关是在现实中物理存在的)网关网段必须与主机在同一网段下,所以PC2网关为192.168.1.0~255    全0和全1是不可以使用的,顾PC......
  • maven 网关应用:[NACOS ConnectException httpPost] currentServerAddr: http://localh
    网关应用运行忽然报错:[NACOSConnectExceptionhttpPost]currentServerAddr:http://localhost:8848,虽然调整了代码逻辑,但是nacos的配置没有变更过,之前也还能正常跑,网上查了一些,有说是配置优先级的问题,说是Nacos默认的配置优先级最高,覆盖了本地了,但是我遇到的情况是虽然一直......
  • EtherCAT 转CCLINK网关连接三菱plc应用案例
    EtherCAT现场总线协议是由德国倍福公司在2003年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构。捷米特JM-ECT-CCLK 是自主研发的一款CCLINK从站功能的通讯网关。该产品主要功能是将各种CCLINK总线和ETHERCAT网络连接起来。本网......
  • 一键上阿里云可采集多种设备网关BL110
    BL110是一款功能强大的PLC协议支持网关。它具有多种协议转换能力,包括ModbusRTU、ModbusTCP、DL/T645、IEC101、IEC104、BACnetIP、BACnetMS/TP等。随着物联网技术的不断发展,PLC设备之间的互联和通信变得日益重要。然而,不同的PLC设备通常采用不同的通信协议,这就给PLC系统的集成......
  • Gateway网关
    1.SpringCloudGatewaySpringCloudGateway作为SpringCloud生态系统中的网关,目标是替代NetflixZuul,其不仅提供统-的路由方式,并且还基于Filter链的方式提供了网关基本的功能。目前最新版SpringCloud中引用的还是Zuul1.x版本,而这个版本是基于过滤器的,是阻塞10,不支持长......
  • 网关搭建【黑马头条】
    一、导入依赖<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><group......
  • 微服务网关搭建
    依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
     西门子S7-1500PLC(profinet)与ABPLC以太网通讯(EtherNet/IP)。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7-1500PLC与ABPLC通讯的配置过程,供大家参考。 1,新建工程:运行RSLogix5000程序,选择菜单File->New,弹出对话框:2,在“Type”中选择控......
  • CANopen转ProfiNet网关在大跨径门机起重设备同步纠偏控制应用案例
     大型门机起重设备纠偏控制系统采用CanOpen通讯协议,而PLC使用的是ProfiNet协议,看似不兼容的两种协议如何实现互通?今天我们来看一下这个案例。通过捷米特JM-COP-PN设置纠偏系统的参数,同时采集门机左右双轨的轮子多点同步控制,速度、位置等信息。在经过简单的配置后,用户可以很轻......
  • 传奇M2网关提示人物数据保存失败怎么办?
    关于M2里面一直提示[人物数据保存失败]这个错误,我们技术在教学的时候有提到过,但是很多GM都没有留意这个问题,还是会出现,到底什么原因导致的呢?每次出现这个错误,我和GM都非常的难受,难受的原因有两个第一、这个区白搞了;第二、玩家数据归0了为什么会数据没了呢?开新区的时候,复制正在开区......