2、引入Actuator相关的包与配置 3、引入Prometheus接口端点,吐出监控指标。 4、增加调用监控指标采集。 5、增加调用日志输出,根据LogId进行绑定。 6、调整启动的扫描路径,去除重复注册。 7、调整现有MonitorData数据,修改为LRUMap,避免内存数据过大。 8、调整拦截器异常时的日志输出。pull/5/head
parent
f5048a76ca
commit
ea1f45d14c
@ -0,0 +1,105 @@ |
|||||||
|
package com.gitee.sop.gatewaycommon.interceptor; |
||||||
|
|
||||||
|
import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil; |
||||||
|
import com.gitee.sop.gatewaycommon.param.ApiParam; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
||||||
|
import org.springframework.cloud.client.ServiceInstance; |
||||||
|
import org.springframework.cloud.gateway.route.Route; |
||||||
|
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.web.server.ServerWebExchange; |
||||||
|
|
||||||
|
import java.net.URI; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.LinkedHashSet; |
||||||
|
|
||||||
|
/** |
||||||
|
* . |
||||||
|
* |
||||||
|
* @author linzhiqiang |
||||||
|
* @version Revision 1.0.0 |
||||||
|
* @版权: 版权所有 (c) 2011 |
||||||
|
* @see: |
||||||
|
* @创建日期: 2020/9/11 |
||||||
|
* @功能说明: |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
@ConditionalOnProperty(prefix = "sop.route.logger", name = "enabled", havingValue = "true", matchIfMissing = true) |
||||||
|
public class LoggerRouteInterceptor implements RouteInterceptor { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger("ROUTELOGGER"); |
||||||
|
|
||||||
|
@Override |
||||||
|
public void preRoute(RouteInterceptorContext context) { |
||||||
|
ApiParam apiParam = context.getApiParam(); |
||||||
|
ServerWebExchange serverWebExchange = (ServerWebExchange) context.getRequestContext(); |
||||||
|
String logId = serverWebExchange.getAttribute(ServerWebExchange.LOG_ID_ATTRIBUTE); |
||||||
|
logger.info( |
||||||
|
"requestId_#$#_{}_|$|_requestIp_#$#_{}_|$|_interface_#$#_{}_|$|_requestParam_#$#_{}_|$|_requestHeaders_#$#_{}", |
||||||
|
logId, apiParam.fetchIp(), apiParam.fetchNameVersion(), apiParam.toJSONString(), |
||||||
|
serverWebExchange.getRequest().getHeaders().toString()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterRoute(RouteInterceptorContext context) { |
||||||
|
ApiParam apiParam = context.getApiParam(); |
||||||
|
ServerWebExchange serverWebExchange = (ServerWebExchange) context.getRequestContext(); |
||||||
|
String logId = serverWebExchange.getAttribute(ServerWebExchange.LOG_ID_ATTRIBUTE); |
||||||
|
String routeId = apiParam.fetchNameVersion(); |
||||||
|
long spendTime = context.getFinishTimeMillis() - context.getBeginTimeMillis(); |
||||||
|
ServerWebExchange exchange = (ServerWebExchange) context.getRequestContext(); |
||||||
|
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); |
||||||
|
URI uri = null; |
||||||
|
LinkedHashSet<URI> hashSet = (LinkedHashSet<URI>) exchange |
||||||
|
.getAttribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR); |
||||||
|
if (hashSet != null) { |
||||||
|
Iterator<URI> it = hashSet.iterator(); |
||||||
|
if (it.hasNext()) { |
||||||
|
uri = it.next(); |
||||||
|
} |
||||||
|
} |
||||||
|
String oriUrl = StringUtils.trim(uri == null ? "" : uri.toString()); |
||||||
|
|
||||||
|
URI dest = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); |
||||||
|
String destUrl = "unknown"; |
||||||
|
if (dest != null) { |
||||||
|
destUrl = dest.toString(); |
||||||
|
if (destUrl.indexOf("?") > 0) { |
||||||
|
destUrl = destUrl.substring(0, destUrl.indexOf("?")); |
||||||
|
} |
||||||
|
} |
||||||
|
String gRouteId = "unknown"; |
||||||
|
String routeUri = "unknown"; |
||||||
|
if (route != null) { |
||||||
|
gRouteId = route.getId(); |
||||||
|
routeUri = route.getUri().toString(); |
||||||
|
} |
||||||
|
ServiceInstance serviceInstance = context.getServiceInstance(); |
||||||
|
String serviceId = "unknown"; |
||||||
|
String instanceId = "unknown"; |
||||||
|
if (serviceInstance != null) { |
||||||
|
serviceId = context.getServiceInstance().getServiceId(); |
||||||
|
instanceId = context.getServiceInstance().getInstanceId(); |
||||||
|
} |
||||||
|
Throwable throwable = ServerWebExchangeUtil.getThrowable(exchange); |
||||||
|
String exceptionMsg = ""; |
||||||
|
if (throwable != null) { |
||||||
|
exceptionMsg = throwable.getMessage(); |
||||||
|
} |
||||||
|
String errorMsg = context.getServiceErrorMsg(); |
||||||
|
logger.info( |
||||||
|
"requestId_#$#_{}_|$|_requestResult_#$#_{}_|$|_coastTime_#$#_{}_|$|_interface_#$#_{}_|$|_gatewayRouteId_#$#_{}_|$|_oriUrl_#$#_{}_|$|_destUrl_#$#_{}_|$|_routeUri_#$#_{}_|$|_serviceId_#$#_{}_|$|_instanceId_#$#_{}_|$|_responeStatus_#$#_{}_|$|_responeResult_#$#_{}_|$|_responseHeaders_#$#_{}_|$|_error_#$#_{}", |
||||||
|
logId, context.isSuccessRequest(), spendTime, routeId, gRouteId, oriUrl, destUrl, |
||||||
|
routeUri, serviceId, instanceId, context.getResponseStatus(), |
||||||
|
context.getServiceResult(), serverWebExchange.getResponse().getHeaders().toString(), |
||||||
|
StringUtils.isNotBlank(exceptionMsg) ? exceptionMsg : StringUtils.isEmpty(errorMsg) ? "" : errorMsg); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getOrder() { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,124 @@ |
|||||||
|
package com.gitee.sop.gatewaycommon.interceptor; |
||||||
|
|
||||||
|
import com.gitee.sop.gatewaycommon.param.ApiParam; |
||||||
|
import io.micrometer.core.instrument.DistributionSummary; |
||||||
|
import io.micrometer.core.instrument.MeterRegistry; |
||||||
|
import io.micrometer.core.instrument.Timer; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.cloud.gateway.route.Route; |
||||||
|
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.web.server.ServerWebExchange; |
||||||
|
|
||||||
|
import java.net.URI; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.LinkedHashSet; |
||||||
|
import java.util.Objects; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* . |
||||||
|
* |
||||||
|
* @author linzhiqiang |
||||||
|
* @version Revision 1.0.0 |
||||||
|
* @版权: 版权所有 (c) 2011 |
||||||
|
* @see: |
||||||
|
* @创建日期: 2020/9/11 |
||||||
|
* @功能说明: |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
//@ConditionalOnClass(name = {"io.micrometer.core.instrument.MeterRegistry"})
|
||||||
|
public class MetricRouteInterceptor implements RouteInterceptor { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(MetricRouteInterceptor.class); |
||||||
|
@Autowired |
||||||
|
private MeterRegistry meterRegistry; |
||||||
|
|
||||||
|
public MetricRouteInterceptor() { |
||||||
|
logger.info("初始化MetricRouteInterceptor"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void preRoute(RouteInterceptorContext context) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterRoute(RouteInterceptorContext context) { |
||||||
|
ApiParam apiParam = context.getApiParam(); |
||||||
|
String routeId = apiParam.fetchNameVersion(); |
||||||
|
long spendTime = context.getFinishTimeMillis() - context.getBeginTimeMillis(); |
||||||
|
ServerWebExchange exchange = (ServerWebExchange) context.getRequestContext(); |
||||||
|
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); |
||||||
|
URI uri = null; |
||||||
|
LinkedHashSet<URI> hashSet = (LinkedHashSet<URI>) exchange |
||||||
|
.getAttribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR); |
||||||
|
if (hashSet != null) { |
||||||
|
Iterator<URI> it = hashSet.iterator(); |
||||||
|
if (it.hasNext()) { |
||||||
|
uri = it.next(); |
||||||
|
} |
||||||
|
} |
||||||
|
String oriUrl = StringUtils.trim(uri == null ? "" : uri.toString()); |
||||||
|
if (oriUrl.indexOf("?") > 0) { |
||||||
|
oriUrl = oriUrl.substring(0, oriUrl.indexOf("?")); |
||||||
|
} |
||||||
|
|
||||||
|
URI dest = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); |
||||||
|
String destUrl = dest.toString(); |
||||||
|
if (destUrl.indexOf("?") > 0) { |
||||||
|
destUrl = destUrl.substring(0, destUrl.indexOf("?")); |
||||||
|
} |
||||||
|
String gRouteId = route.getId(); |
||||||
|
String routeUri = route.getUri().toString(); |
||||||
|
boolean isSuc = context.isSuccessRequest(); |
||||||
|
if (meterRegistry != null) { |
||||||
|
Timer timer = Timer.builder("sop.route.timer").description("SOP路由耗时统计") |
||||||
|
.tag("requestUri", exchange.getRequest().getURI().getRawPath()) |
||||||
|
.tag("routeId", routeId).tag("gRouteId", gRouteId).tag("routeUri", routeUri) |
||||||
|
.tag("oriUrl", oriUrl).tag("destUrl", destUrl).tag("serviceId", |
||||||
|
context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getServiceId() : |
||||||
|
"").tag("instanceId", context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getInstanceId() : |
||||||
|
"").tag("status", Objects.toString(context.getResponseStatus())) |
||||||
|
.tag("isSuccess", Objects.toString(isSuc)).publishPercentileHistogram() |
||||||
|
.register(meterRegistry); |
||||||
|
timer.record(spendTime, TimeUnit.MILLISECONDS); |
||||||
|
|
||||||
|
DistributionSummary request = DistributionSummary.builder("sop.route.request.size") |
||||||
|
.scale(100).tag("requestUri", exchange.getRequest().getURI().getRawPath()) |
||||||
|
.tag("routeId", routeId).tag("gRouteId", gRouteId).tag("routeUri", routeUri) |
||||||
|
.tag("oriUrl", oriUrl).tag("destUrl", destUrl).tag("serviceId", |
||||||
|
context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getServiceId() : |
||||||
|
"").tag("instanceId", context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getInstanceId() : |
||||||
|
"").tag("status", Objects.toString(context.getResponseStatus())) |
||||||
|
.tag("isSuccess", Objects.toString(isSuc)).register(meterRegistry); |
||||||
|
request.record(context.getRequestDataSize()); |
||||||
|
|
||||||
|
DistributionSummary response = DistributionSummary.builder("sop.route.response.size") |
||||||
|
.scale(100).tag("requestUri", exchange.getRequest().getURI().getRawPath()) |
||||||
|
.tag("routeId", routeId).tag("gRouteId", gRouteId).tag("routeUri", routeUri) |
||||||
|
.tag("oriUrl", oriUrl).tag("destUrl", destUrl).tag("serviceId", |
||||||
|
context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getServiceId() : |
||||||
|
"").tag("instanceId", context.getServiceInstance() != null ? |
||||||
|
context.getServiceInstance().getInstanceId() : |
||||||
|
"").tag("status", Objects.toString(context.getResponseStatus())) |
||||||
|
.tag("isSuccess", Objects.toString(isSuc)).publishPercentileHistogram() |
||||||
|
.register(meterRegistry); |
||||||
|
response.record(context.getResponseDataSize()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getOrder() { |
||||||
|
return -2; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue