From e60c8f32792cebc91490428a39859e9160c55db6 Mon Sep 17 00:00:00 2001 From: wulin Date: Fri, 10 Nov 2023 09:35:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90skywalking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 10244 bytes .../iot/base/constans/Log4Constans.java | 5 +- iot-gateway/pom.xml | 12 +++++ .../qiuguo/iot/gateway/filter/AuthFilter.java | 22 +++++++-- iot-modules/iot-box-user-api/pom.xml | 22 ++++++++- .../controller/device/DeviceController.java | 11 +++-- .../user/api/filter/LogMdcConfiguration.java | 21 ++++++++- .../iot/user/api/filter/LogWebFilter.java | 43 ++++++++++++------ .../filter/LogbackMDCPatternConverter.java | 15 ------ .../TraceIdMDCPatternLogbackLayout.java | 10 ---- .../src/main/resources/logback-spring.xml | 4 +- 11 files changed, 111 insertions(+), 54 deletions(-) delete mode 100644 iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogbackMDCPatternConverter.java delete mode 100644 iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/TraceIdMDCPatternLogbackLayout.java diff --git a/.DS_Store b/.DS_Store index 8de5a87145d526a0a2c2fd57219af9567354488c..40c09805c260cf9bd51c66ea1d5fddf1b1b8f18c 100644 GIT binary patch literal 10244 zcmeHMU2GIp6h3FVz+B7E6oD4UwTlH(%hqnUKwCgq+VUr0k?lX|vb!_Dgy~G#ncYP< zkS1#U;V1sY#0UR)@qq{Q!NeveJ}57mK>Q&@BM-(zeKGOH2YvA8+_|$2-Lm>*HF0h- z_slu>p1J#-`Oe)vcL4x<@>)AU1OQ~ZxKtKWcbmq?`8BIazJ(7W`2*;X%M_i7jA>_P z%?=Df1cC?z5eOm>L?DR3e<1?&oz0tED`e0I5eOm>L|{4se1C}0#bv^mlR|o12X$Tv zKr%#TuhBi#0iI99mkD1^3hBAhGez})zAO4A1`2l?kMQXv6TX}jQn&*OcR+t-^eYtf zRwuuRHytn`WY7l@2qG{$0z7Tzg9bKa;Y3CKK9!j;4abeeZlF{Xnm2!eEX%d>Bgx}- zG3ln=ywj7;9pc)6ZJU|$eL6E_=*5(>tk<^Ov|;Hv&%w}insRv9ur#~aW9Kc+@qCkF zKxT}kl!j8NwR_{nXrwcKIvOc;#beP(cUQ;h(@b98)VBFx>V!FN+0O|W=x+tEr~=m6 zN=$`h&N6N57}>c`Ef|E?g;p3RsX-o0Lhjsha`FBwwOQrU%cr?=59$U|$ zw|91v)*g#jf3rBgb20`$7TS3Z_a_&mrC@KJ39Xo^s|2hnloY=j_DM7 z#R*hRO&QLYWd<`=s}2qgkE9eO@8}10Gwm7$y)W(RPD)wg5SjO6ZRMp~nyha(&7|?T?u@wlDVN`kId;zN^(KxODYL6^G%2(c(cHI66-J-=gw!TJH9p(1znx<<6 zp;12{uyaQ`-5iUj*SK}I7i*ekHTW~9G!#>=P58(lP7>6*0M=*m~G%$w_=COch z@M(Mo&*C|J8DGaY@J)Ohr|?7k2(RE(yoR6RXLu98!|(A2{8f^q8Yv{zOAXR0X|2>I zKDkuh3`d1t?j<_posk;;;jA=vyVMBp*tx6YUrCLx7V>1MTYBfR<@Yo-x5hVaPE7Mf zFsw|fTgmG2a|WwDetIvpl3F5bSa^^Kte>iuJjw!2Rrxxf-56nEWgbynsH@kII-lq* z)cab(VMU^>66*bJVW!kj&M?onqlHxTmCi24ln`Z)7~ApyslXFj=-c^|=)1KVE30zy zB3y!ZU<$4fCvU*l@D2O~zrgPpA`Y&=2IAq}7$zPzV+*dsC~m+`?8Z&R%0AqQyKxUb zh)Ep8VI09x;-rQ;9z`2Z5-(k1<{6yCC-6yp3NPUE_yWF&FX5|rv4U~C%Ulx@FWt(x zitn76Qv)rCKoEf-0zm|V2m}$B^9a<46(juoe@FHI|L6R31q%id2qG|d5x`Jivag5M zE7y>fOY^h#2wg|$;*HOn6w-5{&O44L=^e+D!p{}G5}Ry(aqamf$j<#Ig`_)bbN**Q QwMr|f|AYGfe^USd38d%s{{R30 delta 127 zcmZn(XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jG)aU^g=(+h!gCKBmd)0z#8@ zgc4XKs;e!HCr=PkoV;H^Wpk2*A>(3p4h}(Pphh4N;06+|ATu@=erKM{ui^0.0.1-SNAPSHOT compile + + + org.apache.skywalking + apm-toolkit-trace + 8.15.0 + + + + org.apache.skywalking + apm-toolkit-webflux + 8.15.0 + diff --git a/iot-gateway/src/main/java/com/qiuguo/iot/gateway/filter/AuthFilter.java b/iot-gateway/src/main/java/com/qiuguo/iot/gateway/filter/AuthFilter.java index 50f8874..bc43a93 100644 --- a/iot-gateway/src/main/java/com/qiuguo/iot/gateway/filter/AuthFilter.java +++ b/iot-gateway/src/main/java/com/qiuguo/iot/gateway/filter/AuthFilter.java @@ -8,7 +8,12 @@ import com.qiuguo.iot.gateway.config.properties.XssProperties; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.util.Optional; + import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.toolkit.trace.Trace; +import org.apache.skywalking.apm.toolkit.trace.TraceContext; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; @@ -43,16 +48,19 @@ public class AuthFilter implements GlobalFilter, Ordered { @Override + @Trace public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String traceId = WebFluxSkyWalkingOperators.continueTracing(exchange, TraceContext::traceId); + //Optional ss = TraceContext.getCorrelation("traceId"); ServerHttpRequest request = exchange.getRequest(); String url = request.getPath().toString(); String customerIp = request.getRemoteAddress().getAddress().getHostAddress(); - String tracId = StringUtils.getUUID(); ServerWebExchange.Builder ex = exchange.mutate(); - ex.request(getRequest(exchange, customerIp, tracId)); + ex.request(getRequest(exchange, customerIp, traceId)); + ServerWebExchange newEx = ex.build(); if (xssProperties.getExcludeUrls().contains(url)) { - return chain.filter(ex.build()); + return chain.filter(newEx); } String api_token = exchange.getRequest().getHeaders().getFirst(UserAuthContains.API_TOKEN); @@ -60,7 +68,9 @@ public class AuthFilter implements GlobalFilter, Ordered { if (ObjectUtils.isEmpty(api_token) || ObjectUtils.isEmpty(api_type)) { return Mono.error(new RuntimeException("未登录")); } - return chain.filter(ex.build()); + return chain.filter(newEx); + + // String key = RedisConstans.IOT_TOKEN.concat(api_token); // return reactiveRedisTemplate.getExpire(key).map(Duration::getSeconds).flatMap(ttl -> { // if (ttl == -1) { @@ -78,13 +88,15 @@ public class AuthFilter implements GlobalFilter, Ordered { private ServerHttpRequest getRequest(ServerWebExchange exchange, String customerIp, String tracId){ ServerHttpRequest request = exchange.getRequest(); + + exchange.getResponse().getHeaders().set(Log4Constans.HEADER_TRACE_ID, tracId); ServerHttpRequest newRequest = new ServerHttpRequestDecorator(request){ @Override public HttpHeaders getHeaders(){ HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); httpHeaders.set(Log4Constans.CUSTOMER_IP, customerIp); - httpHeaders.set(Log4Constans.PRINT_LOG_ID, tracId); + httpHeaders.set(Log4Constans.HEADER_TRACE_ID, tracId); return httpHeaders; } }; diff --git a/iot-modules/iot-box-user-api/pom.xml b/iot-modules/iot-box-user-api/pom.xml index ad40a9d..8961665 100644 --- a/iot-modules/iot-box-user-api/pom.xml +++ b/iot-modules/iot-box-user-api/pom.xml @@ -70,11 +70,16 @@ reactor-test test - org.apache.skywalking apm-toolkit-logback-1.x - 8.7.0 + + + ch.qos.logback + logback-classic + + + 8.15.0 @@ -83,6 +88,19 @@ hutool-all 5.8.21 + + + + org.apache.skywalking + apm-toolkit-trace + 8.15.0 + + + + org.apache.skywalking + apm-toolkit-webflux + 8.15.0 + diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java index a80ae51..351b13e 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java @@ -23,6 +23,10 @@ import com.qiuguo.iot.data.service.device.DeviceUserTalkRecordService; import com.qiuguo.iot.third.service.TuyaDeviceConnector; import com.qiuguo.iot.data.resp.device.DeviceInitResp; import com.qiuguo.iot.user.api.rest.device.SetDeviceBindInfoRest; +import org.apache.skywalking.apm.toolkit.trace.CarrierItemRef; +import org.apache.skywalking.apm.toolkit.trace.ContextCarrierRef; +import org.apache.skywalking.apm.toolkit.trace.Tracer; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; @@ -72,6 +76,7 @@ public class DeviceController { public Mono deviceInit(@RequestParam String wifiMac, @RequestParam String btMac, @RequestParam Integer type, @RequestParam Long time, @RequestParam String signature){ + //deviceInfoService. Long now = System.currentTimeMillis(); if(checkTimeout && now - time > timeOut){ @@ -95,7 +100,8 @@ public class DeviceController { if (!md5.equals(signature)) { // //验签失败 - log.info("验签失败"); + + log.info("验签失败,{}", md5); BusinessException ex = new BusinessException("验签失败"); return Mono.error(ex); } @@ -103,9 +109,8 @@ public class DeviceController { DeviceInfoRequest request = new DeviceInfoRequest(); request.setWifiMac(wifiMac); request.setBtMac(btMac); - Mono mono = deviceInfoService.selectDeviceInfoByRequest(request); - return mono.defaultIfEmpty(new DeviceInfoEntity()).flatMap(entity -> { + return deviceInfoService.selectDeviceInfoByRequest(request).defaultIfEmpty(new DeviceInfoEntity()).flatMap(entity -> { Mono mono1 = null; if(entity.getId() == null){ entity.setWifiMac(wifiMac); diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogMdcConfiguration.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogMdcConfiguration.java index 643d1ac..739f183 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogMdcConfiguration.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogMdcConfiguration.java @@ -2,6 +2,10 @@ package com.qiuguo.iot.user.api.filter; import com.qiuguo.iot.base.constans.Log4Constans; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.toolkit.trace.Trace; +import org.apache.skywalking.apm.toolkit.trace.TraceContext; +import org.apache.skywalking.apm.toolkit.trace.Tracer; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; import org.reactivestreams.Subscription; import org.slf4j.MDC; import org.springframework.context.annotation.Configuration; @@ -22,14 +26,18 @@ import javax.annotation.PreDestroy; @Configuration @Slf4j public class LogMdcConfiguration { + public int hashcode; @PostConstruct public void contextOperatorHook() { Hooks.onEachOperator(Log4Constans.PRINT_LOG_ID, Operators.lift((r, c) ->{ Context ctx = c.currentContext(); + if(ctx.hasKey(Log4Constans.PRINT_LOG_ID)){ MDC.put(Log4Constans.PRINT_LOG_ID, ctx.get(Log4Constans.PRINT_LOG_ID)); + Tracer.createLocalSpan(Log4Constans.PRINT_LOG_ID); } return new MdcContextSubscriber(c); + })); } @PreDestroy @@ -46,19 +54,28 @@ public class LogMdcConfiguration { @Override public void onComplete() { coreSubscriber.onComplete(); + Tracer.stopSpan(); MDC.remove(Log4Constans.PRINT_LOG_ID); + } @Override public void onError(Throwable throwable) { - log.info("异常{}", throwable); - coreSubscriber.onError(throwable); + int hcode = throwable.hashCode(); + if(hcode != hashcode){ + log.info("异常{}", throwable); + hashcode = hcode; + } + MDC.remove(Log4Constans.PRINT_LOG_ID); + Tracer.stopSpan(); + coreSubscriber.onError(throwable); } @Override public void onSubscribe(Subscription subscription) { + coreSubscriber.onSubscribe(subscription); } diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java index cd81440..5df9f06 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java @@ -2,14 +2,18 @@ package com.qiuguo.iot.user.api.filter; import com.qiuguo.iot.base.constans.Log4Constans; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.toolkit.trace.*; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; import org.hswebframework.web.logger.ReactiveLogger; import org.reactivestreams.Publisher; import org.slf4j.MDC; import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; @@ -18,8 +22,10 @@ import org.springframework.http.server.reactive.ServerHttpResponseDecorator; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; +import org.springframework.web.servlet.ModelAndView; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.core.publisher.SignalType; import reactor.util.context.Context; import java.nio.charset.StandardCharsets; @@ -35,25 +41,24 @@ import java.nio.charset.StandardCharsets; public class LogWebFilter implements WebFilter { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + //Tracer.stopSpan(); long startTime = System.currentTimeMillis(); ServerHttpRequest request = exchange.getRequest(); String requestId = request.getId(); String ip = request.getRemoteAddress().getAddress().getHostAddress(); - if(request.getHeaders().containsKey(Log4Constans.PRINT_LOG_ID)){ + if(request.getHeaders().containsKey(Log4Constans.HEADER_TRACE_ID)){ //网关生成的tracId - requestId = request.getHeaders().get(Log4Constans.PRINT_LOG_ID).get(0); + requestId = request.getHeaders().get(Log4Constans.HEADER_TRACE_ID).get(0); } - if(request.getHeaders().containsKey(Log4Constans.CUSTOMER_IP)){ //网关透传过来的IP ip = request.getHeaders().get(Log4Constans.CUSTOMER_IP).get(0); } - + MDC.put(Log4Constans.PRINT_LOG_ID, requestId); - - String m = request.getMethod().toString(); + String m = request.getMethod().toString(); log.info("api start time:{} ip:{} method:{} url:{} param:{} headers:{}", startTime, ip, @@ -66,36 +71,45 @@ public class LogWebFilter implements WebFilter { ex.response(getResponse(exchange, requestId)); - if(!request.getMethod().equals(HttpMethod.GET) && !request.getMethod().equals(HttpMethod.DELETE)){ - ex.request(getRequest(exchange)); - } + + ex.request(getRequest(exchange)); String tracId = requestId; - return chain.filter(ex.build()) + ServerWebExchange newEx = ex.build(); + + return chain.filter(newEx) .contextWrite(context -> { Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, tracId); - return contextTmp; - }) - .doFinally(signalType -> { + + }).doFinally(signalType -> { long endTime = System.currentTimeMillis(); MDC.put(Log4Constans.PRINT_LOG_ID, tracId); log.info("api end time:{}, total time:{}", endTime, endTime - startTime); MDC.remove(Log4Constans.PRINT_LOG_ID); }); + + + + + } private ServerHttpRequest getRequest(ServerWebExchange exchange){ + ServerHttpRequest request = exchange.getRequest(); return new ServerHttpRequestDecorator(request){ @Override public Flux getBody() { Flux body = this.getDelegate().getBody(); return body.map(dataBuffer -> { - log.info("request:{}", dataBuffer.toString(StandardCharsets.UTF_8)); + if(!request.getMethod().equals(HttpMethod.GET) && !request.getMethod().equals(HttpMethod.DELETE)) { + log.info("request:{}", dataBuffer.toString(StandardCharsets.UTF_8)); + } return dataBuffer; }); } }; + } private ServerHttpResponse getResponse(ServerWebExchange exchange, String requestId){ @@ -126,6 +140,7 @@ public class LogWebFilter implements WebFilter { return super.writeWith(body); } }; + } } diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogbackMDCPatternConverter.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogbackMDCPatternConverter.java deleted file mode 100644 index fa2bae6..0000000 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogbackMDCPatternConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.qiuguo.iot.user.api.filter; - -import ch.qos.logback.classic.pattern.MDCConverter; -import ch.qos.logback.classic.spi.ILoggingEvent; - -public class LogbackMDCPatternConverter extends MDCConverter { - @Override - public void start() { - super.start(); - } - @Override - public String convert(ILoggingEvent iLoggingEvent) { - return super.convert(iLoggingEvent); - } -} diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/TraceIdMDCPatternLogbackLayout.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/TraceIdMDCPatternLogbackLayout.java deleted file mode 100644 index 1da6ef5..0000000 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/TraceIdMDCPatternLogbackLayout.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.qiuguo.iot.user.api.filter; - -import ch.qos.logback.classic.PatternLayout; - -public class TraceIdMDCPatternLogbackLayout extends PatternLayout { - static { - defaultConverterMap.put("X", LogbackMDCPatternConverter.class.getName()); - defaultConverterMap.put("mdc", LogbackMDCPatternConverter.class.getName()); - } -} diff --git a/iot-modules/iot-box-user-api/src/main/resources/logback-spring.xml b/iot-modules/iot-box-user-api/src/main/resources/logback-spring.xml index c91a281..c5702be 100644 --- a/iot-modules/iot-box-user-api/src/main/resources/logback-spring.xml +++ b/iot-modules/iot-box-user-api/src/main/resources/logback-spring.xml @@ -38,7 +38,7 @@ - + ${PATTERN} @@ -47,7 +47,7 @@ - + ${SKY_PATTERN}