如何判断当前请求的是健康检查API
生活随笔
收集整理的這篇文章主要介紹了
如何判断当前请求的是健康检查API
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
為了性能監控的目的,我們使用了Middleware記錄所有請求的Log。實現代碼如下:
public?class?RequestLoggingMiddleware {...public?async?Task?Invoke(HttpContext?context){try{await?_next(context);}finally{//Log}} }同時,我們在服務中加入了健康檢查API,用于定時訪問檢查服務狀態。
這就導致Log中記錄了大量健康檢查API的日志,需要有方法判斷出這類請求,并忽略日志寫入。
判斷路由地址
健康檢查API的實現代碼如下:
public?void?ConfigureServices(IServiceCollection?services) {...services.AddHealthChecks(); }public?void?Configure(IApplicationBuilder?app,?IWebHostEnvironment?env) {???????...app.UseEndpoints(endpoints?=>{endpoints.MapHealthChecks("/health");endpoints.MapControllers();}); }因此,可以根據路由地址是否以/health開頭來判斷。
判斷DisplayName
上面的方法雖然可以實現要求,但是感覺太low了!
而且,如果把Middleware做成公共組件,那就不能限制健康檢查API的路由地址的格式。
需要重新找到一個不變的數據值用于判斷。
查看Maphealthchecks的實現代碼,發現這樣一句代碼:
private?static?IEndpointConventionBuilder?MapHealthChecksCore(IEndpointRouteBuilder?endpoints,?string?pattern,?HealthCheckOptions??options)? {?...return?endpoints.Map(pattern,?pipeline).WithDisplayName(DefaultDisplayName);? }而DisplayName是個常量:
private?const?string?DefaultDisplayName?=?"Health?checks";因此,我們只需判斷Endpoint的DisplayName即可:
public?class?RequestLoggingMiddleware {...public?async?Task?Invoke(HttpContext?context){try{await?_next(context);}finally{if?(context.GetEndpoint()?.DisplayName?==?"Health?checks"){?}else{//Log}}} }結論
現在,我們已經可以輕松識別出健康檢查API請求。
推薦使用DisplayName方式,容錯性更高。
總結
以上是生活随笔為你收集整理的如何判断当前请求的是健康检查API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins file一行代码部署.N
- 下一篇: 基于事件驱动架构构建微服务第10部分:在