zoukankan      html  css  js  c++  java
  • WebApi 服务监控

    原文:http://www.cnblogs.com/lc-chenlong/p/4241204.html

    本文主要介绍在请求WebApi时,监控Action执行的时间,及Action传递的参数值,以及Http请求头信息。采用log4net记录监控日志,通过日志记录的时间方便我们定位哪一个Action执行的时间过长,进而采取优化的手段。

    监控日志监控的指标如下图

    监控程序实现

    改监控程序主要继承ActionFilterAttribute类,在命名空间:System.Web.Http.Filters中,重写OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 和OnActionExecuting(HttpActionContext actionContext)两个方法。在上一篇文章介绍MVC的监控也是重写ActionFilterAttribute类,但是MVC的ActionFilterAttribute在System.Web.Mvc命名空间下。

    1、监控日志对象
      /// <summary>
        /// 监控日志对象
        /// </summary>
        public class WebApiMonitorLog
        {
            public string ControllerName
            {
                get;
                set;
            }
            public string ActionName
            {
                get;
                set;
            }
    
            public DateTime ExecuteStartTime
            {
                get;
                set;
            }
            public DateTime ExecuteEndTime
            {
                get;
                set;
            }
            /// <summary>
            /// 请求的Action 参数
            /// </summary>
            public Dictionary<string, object> ActionParams
            {
                get;
                set;
            }
            /// <summary>
            /// Http请求头
            /// </summary>
            public string HttpRequestHeaders
            {
                get;
                set;
            }
    
            /// <summary>
            /// 请求方式
            /// </summary>
            public string HttpMethod
            {
                get;
                set;
            }
            /// <summary>
            /// 请求的IP地址
            /// </summary>
            public string IP
            {
                get;
                set;
            }
    
            /// <summary>
            /// 获取监控指标日志
            /// </summary>
            /// <param name="mtype"></param>
            /// <returns></returns>
            public string GetLoginfo()
            {
                string Msg = @"
                Action执行时间监控:
                ControllerName:{0}Controller
                ActionName:{1}
                开始时间:{2}
                结束时间:{3}
                总 时 间:{4}秒
                Action参数:{5}
                Http请求头:{6}
                客户端IP:{7},
                HttpMethod:{8}
                        ";
                return string.Format(Msg,
                    ControllerName,
                    ActionName,
                    ExecuteStartTime,
                    ExecuteEndTime,
                    (ExecuteEndTime - ExecuteStartTime).TotalSeconds,
                    GetCollections(ActionParams),
                     HttpRequestHeaders,
                    IP,
                    HttpMethod);
            }
    
            /// <summary>
            /// 获取Action 参数
            /// </summary>
            /// <param name="Collections"></param>
            /// <returns></returns>
            public string GetCollections(Dictionary<string, object> Collections)
            {
                string Parameters = string.Empty;
                if (Collections == null || Collections.Count == 0)
                {
                    return Parameters;
                }
                foreach (string key in Collections.Keys)
                {
                    Parameters += string.Format("{0}={1}&", key, Collections[key]);
                }
                if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&"))
                {
                    Parameters = Parameters.Substring(0, Parameters.Length - 1);
                }
                return Parameters;
            }
    
            /// <summary>
            /// 获取IP
            /// </summary>
            /// <returns></returns>
            public string GetIP()
            {
                string ip = string.Empty;
                if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"]))
                    ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
                if (string.IsNullOrEmpty(ip))
                    ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
                return ip;
            }
    
    
        }
    2、监控程序
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
        public class WebApiTrackerAttribute : ActionFilterAttribute//, ExceptionFilterAttribute  
        {
            private readonly string Key = "_thisWebApiOnActionMonitorLog_";
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                base.OnActionExecuting(actionContext);
                WebApiMonitorLog MonLog = new WebApiMonitorLog();
                MonLog.ExecuteStartTime = DateTime.Now;
                //获取Action 参数
                MonLog.ActionParams = actionContext.ActionArguments;
                MonLog.HttpRequestHeaders = actionContext.Request.Headers.ToString();
                MonLog.HttpMethod = actionContext.Request.Method.Method;
               
                actionContext.Request.Properties[Key] = MonLog;
                var form=System.Web.HttpContext.Current.Request.Form;
                #region 如果参数是实体对象,获取序列化后的数据
                Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result;
                Encoding encoding = Encoding.UTF8;
                stream.Position = 0;
                string responseData = "";
                using (StreamReader reader = new StreamReader(stream, encoding))
                {
                    responseData = reader.ReadToEnd().ToString();
                }
                if (!string.IsNullOrWhiteSpace(responseData) && !MonLog.ActionParams.ContainsKey("__EntityParamsList__"))
                {
                    MonLog.ActionParams["__EntityParamsList__"] = responseData;
                }
                #endregion
            }
    
            public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
            {
                WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as WebApiMonitorLog;
                MonLog.ExecuteEndTime = DateTime.Now;
                MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
                MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                Log.Info(MonLog.GetLoginfo());
                if (actionExecutedContext.Exception != null)
                {
                    string Msg = string.Format(@"
                    请求【{0}Controller】的【{1}】产生异常:
                    Action参数:{2}
                   Http请求头:{3}
                    客户端IP:{4},
                    HttpMethod:{5}
                        ", MonLog.ControllerName, MonLog.ActionName, MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod);
                    Log.Error(Msg, actionExecutedContext.Exception);
                }
            }
    
        }
    3、引用监控

    我们可以在每个WebApiController类上或Action上直接引用 [WebApiTracker]即可完成对该WebApiController或Action的监控。

    我们也可以在Global.asax中注册全局监控,这样我们就可以监控每一个WebApiController中的Action,代码如下:

     protected void Application_Start()
            {
                
                GlobalConfiguration.Configuration.Filters.Add(new WebApiTrackerAttribute());
                AreaRegistration.RegisterAllAreas();
            }

    LoggerHelper 参考下面文章

    MVC监控:http://www.cnblogs.com/lc-chenlong/p/4228639.html

  • 相关阅读:
    希尔排序-Python
    顺序表为什么要在定义时分配空间大小
    pip install -r requirements.txt安装问题
    python小白系列2—python常用工具:pycharm
    python小白系列1—python安装,初识Anaconda
    Python Traceback模块:捕获更详细的异常报错信息
    pycharm项目中的.idea文件夹是干什么用的?可以删除吗?
    python多线程使用
    《统计学习方法》自学笔记—1.概论
    JAVA项目中的常用的异常处理情况
  • 原文地址:https://www.cnblogs.com/lizhigang/p/7285345.html
Copyright © 2011-2022 走看看