5 回答
TA贡献2080条经验 获得超4个赞
您将无法在过滤器中执行此操作,因为过滤器是在处理程序之前执行的。
您可以实现一个 HandlerInterceptor 并获得如下所示的路径映射
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
String path = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
System.out.println("path : " + path);
return true;
}
}
TA贡献1804条经验 获得超2个赞
做这个
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} finally {
String patternMatch = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
}
}
在尝试调用 request.getAttribute 之前,您需要先执行 filterChain.doFilter,因为该属性直到请求生命周期的后期才会设置。
TA贡献1872条经验 获得超3个赞
你可以试试这个:
String path = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
TA贡献1942条经验 获得超3个赞
我怀疑您能否通过现有 API 将其放入过滤器中。但是,您可以预扫描所有 @RequestMapping 注释,保留它,然后在过滤器中匹配模式以获得所需的结果。
TA贡献1805条经验 获得超10个赞
Spring Boot Admin - 易于使用 GUI
另一种方法是使用Spring Boot Admin。为此,我们必须配置客户端-服务器。为避免错误,请确保客户端-服务器依赖项的版本相同。我们可以从下拉列表中添加所需的指标,如图所示。
您可以将 uri:/user/getEmployee/{employeeId} 的 TOTAL_TIME 计数为 3, 0.2264027
客户端:
pom.xml
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.4</version>
</dependency>
application.properties
spring.boot.admin.api-path=/instances
spring.boot.admin.client.url=http://localhost:6699
management.endpoints.web.exposure.include=*
服务器端:
application.properties
server.port = 6699
spring.boot.admin.server.url=http://localhost:8889
pom.xml
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>
添加@EnableAdminServer
import de.codecentric.boot.admin.server.config.EnableAdminServer;
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
界面 http://localhost:6699/#/applications
程序化方法
如果你想实现这个如果你想以编程方式实现这个。
@RequestMapping(path="/admin/count",method=RequestMethod.POST)
public JSONObject count(@RequestParam(name="url") final String url)//@PathVariable(name="url") final String url
{
String finalURL = "http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:" + url + "";
return sendRequestToURL(finalURL);
}
我们可以使用 Spring Boot/actuator/metrics/http.server.requests获取所有执行的端点及其计数、异常、结果、状态、总时间等,如下所示。
如果您想查看特定端点的详细信息,则可以通过调用请求来完成,如下所示
localhost:8889/actuator/metrics/http.server.requests?tag=uri:<endPoint>
localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets
localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets&tag=status:200
您将获得COUNT特定端点被调用的次数
您将获得具有特定状态的特定端点被 调用的COUNT次数
要获得执行 endPoint 的平均时间,您可以 TOTAL_TIME/COUNT为特定的 endPoint 以及整个应用程序执行
更详细的解释
本地主机:8889/actuator/metrics/http.server.requests
{
"name": "http.server.requests",
"description": null,
"baseUnit": "seconds",
"measurements": [
{
"statistic": "COUNT",
"value": 3
},
{
"statistic": "TOTAL_TIME",
"value": 0.21817219999999998
},
{
"statistic": "MAX",
"value": 0.1379249
}
],
"availableTags": [
{
"tag": "exception",
"values": [
"MethodArgumentTypeMismatchException",
"None"
]
},
{
"tag": "method",
"values": [
"GET"
]
},
{
"tag": "uri",
"values": [
"/{id}.*",
"/user/asset/getAsset/{assetId}",
"/user/asset/getAllAssets"
]
},
{
"tag": "outcome",
"values": [
"CLIENT_ERROR",
"SUCCESS"
]
},
{
"tag": "status",
"values": [
"400",
"404",
"200"
]
}
]
}
添加回答
举报