示例#1
0
        private void LogHttpRequestStats(RavenBaseApiController controller, LogHttpRequestStatsParams logHttpRequestStatsParams, string databaseName, long curReq)
        {
            if (Logger.IsDebugEnabled == false)
            {
                return;
            }

            if (controller is StudioController || controller is HardRouteController || controller is SilverlightController)
            {
                return;
            }

            var message = string.Format(CultureInfo.InvariantCulture, "Request #{0,4:#,0}: {1,-7} - {2,5:#,0} ms - {5,-10} - {3} - {4}",
                                        curReq,
                                        logHttpRequestStatsParams.HttpMethod,
                                        logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
                                        logHttpRequestStatsParams.ResponseStatusCode,
                                        logHttpRequestStatsParams.RequestUri,
                                        databaseName);

            Logger.Debug(message);
            if (string.IsNullOrWhiteSpace(logHttpRequestStatsParams.CustomInfo) == false)
            {
                Logger.Debug(logHttpRequestStatsParams.CustomInfo);
            }
        }
示例#2
0
        private void TraceTraffic(IResourceApiController controller, LogHttpRequestStatsParams logHttpRequestStatsParams, string resourceName, HttpResponseMessage response)
        {
            if (HasAnyHttpTraceEventTransport() == false)
            {
                return;
            }

            RavenJObject timingsJson = null;

            if (controller is IndexController)
            {
                var jsonContent = response.Content as JsonContent;
                if (jsonContent != null && jsonContent.Data != null)
                {
                    timingsJson = jsonContent.Data.Value <RavenJObject>("TimingsInMilliseconds");
                }
            }

            NotifyTrafficWatch(
                string.IsNullOrEmpty(resourceName) == false ? resourceName : Constants.SystemDatabase,
                new TrafficWatchNotification()
            {
                RequestUri          = logHttpRequestStatsParams.RequestUri,
                ElapsedMilliseconds = logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
                CustomInfo          = logHttpRequestStatsParams.CustomInfo,
                HttpMethod          = logHttpRequestStatsParams.HttpMethod,
                ResponseStatusCode  = logHttpRequestStatsParams.ResponseStatusCode,
                TenantName          = NormalizeTennantName(resourceName),
                TimeStamp           = SystemTime.UtcNow,
                InnerRequestsCount  = logHttpRequestStatsParams.InnerRequestsCount,
                QueryTimings        = timingsJson
            }
                );
        }
示例#3
0
        private void LogHttpRequestStats(RavenBaseApiController controller, LogHttpRequestStatsParams logHttpRequestStatsParams, string databaseName, long curReq)
        {
            if (Logger.IsDebugEnabled == false)
            {
                return;
            }

            if (controller is StudioController || controller is HardRouteController || controller is SilverlightController)
            {
                return;
            }

            // we filter out requests for the UI because they fill the log with information
            // we probably don't care about them anyway. That said, we do output them if they take too
            // long.
            if (logHttpRequestStatsParams.Headers["Raven-Timer-Request"] == "true" &&
                logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds <= 25)
            {
                return;
            }

            var message = string.Format(CultureInfo.InvariantCulture, "Request #{0,4:#,0}: {1,-7} - {2,5:#,0} ms - {5,-10} - {3} - {4}",
                                        curReq,
                                        logHttpRequestStatsParams.HttpMethod,
                                        logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
                                        logHttpRequestStatsParams.ResponseStatusCode,
                                        logHttpRequestStatsParams.RequestUri,
                                        databaseName);

            Logger.Debug(message);
            if (string.IsNullOrWhiteSpace(logHttpRequestStatsParams.CustomInfo) == false)
            {
                Logger.Debug(logHttpRequestStatsParams.CustomInfo);
            }
        }
示例#4
0
        private void FinalizeRequestProcessing(RavenBaseApiController controller, HttpResponseMessage response, Stopwatch sw)
        {
            LogHttpRequestStatsParams logHttpRequestStatsParam = null;

            try
            {
                StringBuilder sb = null;
                if (controller.CustomRequestTraceInfo != null)
                {
                    sb = new StringBuilder();
                    foreach (var action in controller.CustomRequestTraceInfo)
                    {
                        action(sb);
                        sb.AppendLine();
                    }
                    while (sb.Length > 0)
                    {
                        if (!char.IsWhiteSpace(sb[sb.Length - 1]))
                        {
                            break;
                        }
                        sb.Length--;
                    }
                }
                logHttpRequestStatsParam = new LogHttpRequestStatsParams(
                    sw,
                    GetHeaders(controller.InnerHeaders),
                    controller.InnerRequest.Method.Method,
                    response != null ? (int)response.StatusCode : 500,
                    controller.InnerRequest.RequestUri.ToString(),
                    sb != null ? sb.ToString() : null
                    );
            }
            catch (Exception e)
            {
                Logger.WarnException("Could not gather information to log request stats", e);
            }

            if (logHttpRequestStatsParam == null || sw == null)
            {
                return;
            }

            sw.Stop();

            controller.MarkRequestDuration(sw.ElapsedMilliseconds);

            LogHttpRequestStats(controller, logHttpRequestStatsParam, controller.TenantName);

            TraceRequest(logHttpRequestStatsParam, controller.TenantName);
        }
示例#5
0
        private void RememberRecentRequests(LogHttpRequestStatsParams requestLog, string databaseName)
        {
            if (string.IsNullOrWhiteSpace(databaseName))
            {
                databaseName = Constants.SystemDatabase;
            }

            var traces = tracedRequests.GetOrAdd(databaseName, new ConcurrentQueue <LogHttpRequestStatsParams>());

            LogHttpRequestStatsParams _;

            while (traces.Count > 50 && traces.TryDequeue(out _))
            {
            }

            traces.Enqueue(requestLog);
        }
示例#6
0
        private void TraceTraffic(RavenBaseApiController controller, LogHttpRequestStatsParams logHttpRequestStatsParams, string resourceName)
        {
            if (HasAnyHttpTraceEventTransport() == false)
            {
                return;
            }

            NotifyTrafficWatch(string.IsNullOrEmpty(resourceName) == false ? resourceName : Constants.SystemDatabase,
                               new TrafficWatchNotification()
            {
                RequestUri          = logHttpRequestStatsParams.RequestUri,
                ElapsedMilliseconds = logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
                CustomInfo          = logHttpRequestStatsParams.CustomInfo,
                HttpMethod          = logHttpRequestStatsParams.HttpMethod,
                ResponseStatusCode  = logHttpRequestStatsParams.ResponseStatusCode,
                TenantName          = NormalizeTennantName(resourceName),
                TimeStamp           = SystemTime.UtcNow,
                InnerRequestsCount  = logHttpRequestStatsParams.InnerRequestsCount
            }
                               );
        }
示例#7
0
        private void TraceTraffic(RavenBaseApiController controller, LogHttpRequestStatsParams logHttpRequestStatsParams, string databaseName)
        {
            if (HasAnyHttpTraceEventTransport() == false)
            {
                return;
            }



            NotifyTrafficWatch(
                new TrafficWatchNotification()
            {
                RequestUri          = logHttpRequestStatsParams.RequestUri,
                ElapsedMilliseconds = logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
                CustomInfo          = logHttpRequestStatsParams.CustomInfo,
                HttpMethod          = logHttpRequestStatsParams.HttpMethod,
                ResponseStatusCode  = logHttpRequestStatsParams.ResponseStatusCode,
                TenantName          = NormalizeTennantName(databaseName),
                TimeStamp           = SystemTime.UtcNow
            }
                );
        }
示例#8
0
		private void LogHttpRequestStats(LogHttpRequestStatsParams logHttpRequestStatsParams)
		{
			if (logger.IsDebugEnabled == false)
				return;

			// we filter out requests for the UI because they fill the log with information
			// we probably don't care about them anyway. That said, we do output them if they take too
			// long.
			if (logHttpRequestStatsParams.Headers["Raven-Timer-Request"] == "true" &&
				logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds <= 25)
				return;

			var curReq = Interlocked.Increment(ref reqNum);
			logger.Debug("Request #{0,4:#,0}: {1,-7} - {2,5:#,0} ms - {5,-10} - {3} - {4}",
							   curReq,
							   logHttpRequestStatsParams.HttpMethod,
							   logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
							   logHttpRequestStatsParams.ResponseStatusCode,
							   logHttpRequestStatsParams.RequestUri,
							   currentTenantId.Value);
		}
示例#9
0
		private void FinalizeRequestProcessing(IHttpContext ctx, Stopwatch sw, bool ravenUiRequest)
		{
			LogHttpRequestStatsParams logHttpRequestStatsParam = null;
			try
			{
				logHttpRequestStatsParam = new LogHttpRequestStatsParams(
					sw,
					ctx.Request.Headers,
					ctx.Request.HttpMethod,
					ctx.Response.StatusCode,
					ctx.Request.Url.PathAndQuery);
			}
			catch (Exception e)
			{
				logger.WarnException("Could not gather information to log request stats", e);
			}

			ctx.FinalizeResponse();

			if (ravenUiRequest || logHttpRequestStatsParam == null || sw == null)
				return;

			sw.Stop();

			LogHttpRequestStats(logHttpRequestStatsParam);
			ctx.OutputSavedLogItems(logger);
		}
示例#10
0
        private void FinalizeRequestProcessing(RavenBaseApiController controller, HttpResponseMessage response, Stopwatch sw)
        {
            LogHttpRequestStatsParams logHttpRequestStatsParam = null;

            try
            {
                StringBuilder sb = null;
                if (controller.CustomRequestTraceInfo != null && controller.CustomRequestTraceInfo.Count > 0)
                {
                    sb = new StringBuilder();
                    foreach (var action in controller.CustomRequestTraceInfo)
                    {
                        try
                        {
                            action(sb);
                        }
                        catch (Exception e)
                        {
                            Logger.WarnException("Could not gather information to log request stats custom info, so far got " + sb, e);
                        }
                        sb.AppendLine();
                    }
                    while (sb.Length > 0)
                    {
                        if (!char.IsWhiteSpace(sb[sb.Length - 1]))
                        {
                            break;
                        }
                        sb.Length--;
                    }
                }
                var innerRequest       = controller.InnerRequest;
                var httpRequestHeaders = innerRequest.Headers;
                var httpContentHeaders = innerRequest.Content == null ? null : innerRequest.Content.Headers;
                logHttpRequestStatsParam = new LogHttpRequestStatsParams(
                    sw,
                    new Lazy <HttpHeaders>(() => RavenBaseApiController.CloneRequestHttpHeaders(httpRequestHeaders, httpContentHeaders)),
                    controller.InnerRequest.Method.Method,
                    response != null ? (int)response.StatusCode : 500,
                    controller.InnerRequest.RequestUri.ToString(),
                    sb != null ? sb.ToString() : null,
                    controller.InnerRequestsCount
                    );
            }
            catch (Exception e)
            {
                Logger.WarnException("Could not gather information to log request stats", e);
            }

            if (logHttpRequestStatsParam == null || sw == null)
            {
                return;
            }

            sw.Stop();

            if (landlord.IsDatabaseLoaded(controller.TenantName ?? Constants.SystemDatabase))
            {
                controller.MarkRequestDuration(sw.ElapsedMilliseconds);
            }

            var curReq = Interlocked.Increment(ref reqNum);

            LogHttpRequestStats(controller, logHttpRequestStatsParam, controller.TenantName, curReq);

            if (controller.IsInternalRequest == false)
            {
                TraceTraffic(controller, logHttpRequestStatsParam, controller.TenantName);
            }

            RememberRecentRequests(logHttpRequestStatsParam, controller.TenantName);
        }
示例#11
0
        private void FinalizeRequestProcessing(IResourceApiController controller, HttpResponseMessage response, Stopwatch sw)
        {
            LogHttpRequestStatsParams logHttpRequestStatsParam = null;

            try
            {
                StringBuilder sb = null;
                if (controller.CustomRequestTraceInfo != null && controller.CustomRequestTraceInfo.Count > 0)
                {
                    sb = new StringBuilder();
                    foreach (var action in controller.CustomRequestTraceInfo)
                    {
                        try
                        {
                            action(sb);
                        }
                        catch (Exception e)
                        {
                            Logger.WarnException("Could not gather information to log request stats custom info, so far got " + sb, e);
                        }
                        sb.AppendLine();
                    }
                    while (sb.Length > 0)
                    {
                        if (!char.IsWhiteSpace(sb[sb.Length - 1]))
                        {
                            break;
                        }
                        sb.Length--;
                    }
                }
                var innerRequest       = controller.InnerRequest;
                var httpRequestHeaders = innerRequest.Headers;
                var httpContentHeaders = innerRequest.Content == null ? null : innerRequest.Content.Headers;
                logHttpRequestStatsParam = new LogHttpRequestStatsParams(
                    sw,
                    new Lazy <HttpHeaders>(() => RavenBaseApiController.CloneRequestHttpHeaders(httpRequestHeaders, httpContentHeaders)),
                    controller.InnerRequest.Method.Method,
                    response != null ? (int)response.StatusCode : 500,
                    controller.InnerRequest.RequestUri.ToString(),
                    sb != null ? sb.ToString() : null,
                    controller.InnerRequestsCount
                    );
            }
            catch (Exception e)
            {
                Logger.WarnException("Could not gather information to log request stats", e);
            }

            if (logHttpRequestStatsParam == null || sw == null)
            {
                return;
            }

            sw.Stop();

            MarkRequestDuration(controller, sw.ElapsedMilliseconds);

            object requestNumber;

            if (controller.InnerRequest.Properties.TryGetValue("requestNum", out requestNumber) && requestNumber is long)
            {
                LogHttpRequestStats(controller, logHttpRequestStatsParam, controller.ResourceName, (long)requestNumber);
            }

            if (controller.IsInternalRequest == false)
            {
                TraceTraffic(controller, logHttpRequestStatsParam, controller.ResourceName, response);
            }

            RememberRecentRequests(logHttpRequestStatsParam, controller.ResourceName);
        }
示例#12
0
		private void LogHttpRequestStats(LogHttpRequestStatsParams logHttpRequestStatsParams)
		{
			// we filter out requests for the UI because they fill the log with information
			// we probably don't care about them anyway. That said, we do output them if they take too
			// long.
			if (logHttpRequestStatsParams.Headers["Raven-Timer-Request"] == "true" &&
				logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds <= 25)
				return;

			var curReq = Interlocked.Increment(ref reqNum);
			int idx = logHttpRequestStatsParams.RequestUri.IndexOf('?');
			string ur = idx < 0 ? logHttpRequestStatsParams.RequestUri : logHttpRequestStatsParams.RequestUri.Substring(0, idx);
			statLog.Info("{0}_{1}:{2}", logHttpRequestStatsParams.HttpMethod, ur, (int) logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds);
			logger.Debug("Request #{0,4:#,0}: {1,-7} - {2,5:#,0} ms - {5,-10} - {3} - {4}",
							   curReq,
							   logHttpRequestStatsParams.HttpMethod,
							   logHttpRequestStatsParams.Stopwatch.ElapsedMilliseconds,
							   logHttpRequestStatsParams.ResponseStatusCode,
							   logHttpRequestStatsParams.RequestUri,
							   currentTenantId.Value);
			
		}