zoukankan      html  css  js  c++  java
  • ASP.NET Web API 接口执行时间监控

    ASP.NET Web API 接口执行时间监控

     

    软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥。如何快速有效地找到软件产品的性能瓶颈,则是我们感兴趣的内容之一。

    在本文中,我将解释我如何清理和替换重复、 混乱遍布许多方法在应用程序中的代码使用ASP.NET Web API 的筛选器来完成ASP.NET Web API 接口执行时间监控。我们的项目中有如下的需求:我的工作相关的项目 (使用 ASP.NET Web API 框架) 要求记录下服务接口的调用执行时间以及请求延迟、 故障率每秒的请求总数,以帮助运营团队。 

    Web API 筛选器是你放到Action上的自定义属性方法 (或Controller) 添加常用功能。 Web API 筛选使您得以添加预处理和后处理的行为,本文的代码来自于How to intercept all the ASP.NET WebApi controller action methods calls with Ninject interception for logging? 和 Log duration of an ASP Web API action 。

    下面是详细的代码

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Web;
    using System.Web.Http.Controllers;
    using System.Web.Http.Filters;
    using log4net;

    namespace HQ.Job.WebApi
    {
        public class TimingActionFilter : ActionFilterAttribute
        {
            private const string Key = "__action_duration__";
            private static readonly ILog Logger = LogManager.GetLogger(typeof(TimingActionFilter));
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                if (SkipLogging(actionContext))
                {
                    return;
                }
                var stopWatch = new Stopwatch();
                actionContext.Request.Properties[Key] = stopWatch;
                stopWatch.Start();
            }

            public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
            {
                if (!actionExecutedContext.Request.Properties.ContainsKey(Key))
                {
                    return;
                }

                var stopWatch = actionExecutedContext.Request.Properties[Key] as Stopwatch;
                if (stopWatch != null)
                {
                    stopWatch.Stop();
                    var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
                    var controllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                    Debug.Print(string.Format("[Execution of{0}- {1} took {2}.]", controllerName, actionName, stopWatch.Elapsed));
                    Logger.Info(string.Format("[Execution of{0}- {1} took {2}.]", controllerName, actionName, stopWatch.Elapsed));
                }
            }

            private static bool SkipLogging(HttpActionContext actionContext)
            {
                return actionContext.ActionDescriptor.GetCustomAttributes<NoLogAttribute>().Any() ||
                        actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<NoLogAttribute>().Any();
            }
        }


        [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true)]
        public class NoLogAttribute : Attribute
        {

        }
    }

    然后在代码里注册 GlobalConfiguration.Configuration.Filters.Add(new TimingActionFilter());

  • 相关阅读:
    Redis为什么使用单进程单线程方式也这么快
    数据库表设计五大范式所解决的问题
    数据库范式那些事
    线上Java程序导致服务器CPU占用率过高的问题排除过程
    对分布式事务及两阶段提交、三阶段提交的理解
    About the diffrence of wait timed_wait and block in java
    Linux io Model
    阻塞与非阻塞,同步与异步
    深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
    真正的Maven经常使用命令
  • 原文地址:https://www.cnblogs.com/simadi/p/5733168.html
Copyright © 2011-2022 走看看