public void TimerFlush_MultipleEventsQueued_EmitsExpectedEvents() { object eventHandle = _metricsLogger.BeginEvent("Event1"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event3"); Thread.Sleep(25); _metricsLogger.EndEvent(eventHandle); Assert.Equal(3, _metricsEventManager.QueuedEvents.Count); _metricsEventManager.TimerFlush(null); Assert.Equal(3, _events.Count()); SystemMetricEvent evt = _events.Single(p => p.EventName == "event1"); Assert.True(evt.Average > 0); Assert.True(evt.Minimum > 0); Assert.True(evt.Maximum > 0); Assert.Equal(1, evt.Count); evt = _events.Single(p => p.EventName == "event2"); Assert.Equal(3, evt.Count); evt = _events.Single(p => p.EventName == "event3"); Assert.Equal(1, evt.Count); Assert.Equal(0, _metricsEventManager.QueuedEvents.Count); }
public MetricsEventManagerTests() { _functionExecutionEventArguments = new List <FunctionExecutionEventArguments>(); var mockEventGenerator = new Mock <IEventGenerator>(); mockEventGenerator.Setup(e => e.LogFunctionExecutionEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <bool>())) .Callback((string executionId, string siteName, int concurrency, string functionName, string invocationId, string executionStage, long executionTimeSpan, bool success) => { _functionExecutionEventArguments.Add(new FunctionExecutionEventArguments(executionId, siteName, concurrency, functionName, invocationId, executionStage, executionTimeSpan, success)); }); _events = new List <SystemMetricEvent>(); mockEventGenerator.Setup(p => p.LogFunctionMetricEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <DateTime>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>())) .Callback((string subscriptionId, string appName, string functionName, string eventName, long average, long min, long max, long count, DateTime eventTimestamp, string data, string runtimeSiteName, string slotName) => { var evt = new SystemMetricEvent { FunctionName = functionName, EventName = eventName, Average = average, Minimum = min, Maximum = max, Count = count, Data = data, RuntimeSiteName = runtimeSiteName, SlotName = slotName }; _events.Add(evt); }); var mockMetricsPublisher = new Mock <IMetricsPublisher>(); var testAppServiceOptions = new Mock <IOptionsMonitor <AppServiceOptions> >(); testAppServiceOptions.Setup(a => a.CurrentValue).Returns(new AppServiceOptions { AppName = "RandomAppName", SubscriptionId = Guid.NewGuid().ToString() }); _metricsEventManager = new MetricsEventManager(testAppServiceOptions.Object, mockEventGenerator.Object, MinimumLongRunningDurationInMs / 1000, mockMetricsPublisher.Object); _metricsLogger = new WebHostMetricsLogger(_metricsEventManager); }
public void BeginEvent_ReturnsEventHandle() { object eventHandle = _metricsLogger.BeginEvent("Event1"); SystemMetricEvent evt = (SystemMetricEvent)eventHandle; Assert.Equal("event1", evt.EventName); Assert.True((DateTime.UtcNow - evt.Timestamp).TotalSeconds < 15); }
public MetricsEventManagerTests() { _functionExecutionEventArguments = new List <FunctionExecutionEventArguments>(); var mockEventGenerator = new Mock <IEventGenerator>(); mockEventGenerator.Setup(e => e.LogFunctionExecutionEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <bool>())) .Callback((string executionId, string siteName, int concurrency, string functionName, string invocationId, string executionStage, long executionTimeSpan, bool success) => { _functionExecutionEventArguments.Add(new FunctionExecutionEventArguments(executionId, siteName, concurrency, functionName, invocationId, executionStage, executionTimeSpan, success)); }); _events = new List <SystemMetricEvent>(); mockEventGenerator.Setup(p => p.LogFunctionMetricEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <DateTime>(), It.IsAny <string>(), It.IsAny <string>())) .Callback((string subscriptionId, string appName, string functionName, string eventName, long average, long min, long max, long count, DateTime eventTimestamp, string data, string runtimeSiteName) => { var evt = new SystemMetricEvent { FunctionName = functionName, EventName = eventName, Average = average, Minimum = min, Maximum = max, Count = count, Data = data, RuntimeSiteName = runtimeSiteName }; _events.Add(evt); }); var mockMetricsPublisher = new Mock <IMetricsPublisher>(); _metricsEventManager = new MetricsEventManager(new TestEnvironment(), mockEventGenerator.Object, MinimumLongRunningDurationInMs / 1000, mockMetricsPublisher.Object); _metricsLogger = new WebHostMetricsLogger(_metricsEventManager); }
public void SystemEvent_DebugValue_ReturnsExpectedValue() { PropertyInfo debugValueProp = typeof(SystemMetricEvent).GetProperties(BindingFlags.Instance | BindingFlags.NonPublic).Single(p => p.Name == "DebugValue"); var evt = new SystemMetricEvent { EventName = "Event1", Count = 123 }; Assert.Equal("(Event: Event1, Count: 123)", debugValueProp.GetValue(evt)); evt.FunctionName = "Function1"; Assert.Equal("(Function: Function1, Event: Event1, Count: 123)", debugValueProp.GetValue(evt)); }
public void EndEvent_CompletesPendingEvent() { object eventHandle = _metricsLogger.BeginEvent("Event1"); Thread.Sleep(25); _metricsLogger.EndEvent(eventHandle); Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); SystemMetricEvent evt = _metricsEventManager.QueuedEvents.Values.Single(); Assert.Equal("event1", evt.EventName); Assert.Equal(1, evt.Count); Assert.True(evt.Maximum > 0); Assert.True(evt.Minimum > 0); Assert.True(evt.Average > 0); }
public MetricsEventManagerTests() { _settingsManager = ScriptSettingsManager.Instance; _functionExecutionEventArguments = new List <FunctionExecutionEventArguments>(); var mockEventGenerator = new Mock <IEventGenerator>(); mockEventGenerator.Setup(e => e.LogFunctionExecutionEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <bool>())) .Callback((string executionId, string siteName, int concurrency, string functionName, string invocationId, string executionStage, long executionTimeSpan, bool success) => { _functionExecutionEventArguments.Add(new FunctionExecutionEventArguments(executionId, siteName, concurrency, functionName, invocationId, executionStage, executionTimeSpan, success)); }); _events = new List <SystemMetricEvent>(); mockEventGenerator.Setup(p => p.LogFunctionMetricEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>())) .Callback((string subscriptionId, string appName, string eventName, long average, long min, long max, long count) => { var evt = new SystemMetricEvent { EventName = eventName, Average = average, Minimum = min, Maximum = max, Count = count }; _events.Add(evt); }); _metricsEventManager = new MetricsEventManager(_settingsManager, mockEventGenerator.Object, MinimumLongRunningDurationInMs / 1000); _metricsLogger = new WebHostMetricsLogger(_metricsEventManager); }
public void LogEvent_QueuesPendingEvent() { _metricsLogger.LogEvent("Event1"); Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); SystemMetricEvent evt = _metricsEventManager.QueuedEvents.Values.Single(); Assert.Equal("event1", evt.EventName); // case is normalized to lower Assert.Equal(1, evt.Count); Assert.Equal(0, evt.Average); Assert.Equal(0, evt.Minimum); Assert.Equal(0, evt.Maximum); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event3"); Assert.Equal(3, _metricsEventManager.QueuedEvents.Count); }
public void EndEvent_AggregatesIntoExistingEvent() { long prevMin = 123; long prevMax = 456; long prevAvg = 789; SystemMetricEvent initialEvent = new SystemMetricEvent { EventName = "Event1", Minimum = prevMin, Maximum = prevMax, Average = prevAvg, Count = 1 }; _metricsEventManager.QueuedEvents[initialEvent.EventName] = initialEvent; Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); for (int i = 0; i < 10; i++) { SystemMetricEvent latencyEvent = (SystemMetricEvent)_metricsLogger.BeginEvent("Event1"); Thread.Sleep(50); _metricsLogger.EndEvent(latencyEvent); Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); // verify the new event was aggregated into the existing Assert.Equal(2 + i, initialEvent.Count); long latencyMS = (long)latencyEvent.Duration.TotalMilliseconds; Assert.Equal(initialEvent.Average, prevAvg + latencyMS); Assert.Equal(initialEvent.Minimum, Math.Min(prevMin, latencyMS)); Assert.Equal(initialEvent.Maximum, Math.Max(prevMax, latencyMS)); prevMin = initialEvent.Minimum; prevMax = initialEvent.Maximum; prevAvg += latencyMS; } Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); }
public void LogEvent_AggregatesIntoExistingEvent() { SystemMetricEvent initialEvent = new SystemMetricEvent { EventName = "Event1", Count = 1 }; _metricsEventManager.QueuedEvents[initialEvent.EventName] = initialEvent; Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); for (int i = 0; i < 10; i++) { _metricsLogger.LogEvent("Event1"); Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); // verify the new event was aggregated into the existing Assert.Equal(2 + i, initialEvent.Count); } Assert.Equal(1, _metricsEventManager.QueuedEvents.Count); }
public MetricsEventManagerTests() { _loggerFactory = new LoggerFactory(); _testLoggerProvider = new TestLoggerProvider(); _loggerFactory.AddProvider(_testLoggerProvider); _functionExecutionEventArguments = new List <FunctionExecutionEventArguments>(); _mockEventGenerator = new Mock <IEventGenerator>(); _mockEventGenerator.Setup(e => e.LogFunctionExecutionEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <bool>())) .Callback((string executionId, string siteName, int concurrency, string functionName, string invocationId, string executionStage, long executionTimeSpan, bool success) => { if (_throwOnExecutionEvent && executionStage == ExecutionStage.InProgress.ToString()) { _throwOnExecutionEvent = false; throw new Exception("Kaboom!"); } lock (_syncLock) { _functionExecutionEventArguments.Add(new FunctionExecutionEventArguments(executionId, siteName, concurrency, functionName, invocationId, executionStage, executionTimeSpan, success)); } }); _events = new List <SystemMetricEvent>(); _mockEventGenerator.Setup(p => p.LogFunctionMetricEvent( It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <DateTime>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>())) .Callback((string subscriptionId, string appName, string functionName, string eventName, long average, long min, long max, long count, DateTime eventTimestamp, string data, string runtimeSiteName, string slotName) => { var evt = new SystemMetricEvent { FunctionName = functionName, EventName = eventName, Average = average, Minimum = min, Maximum = max, Count = count, Data = data, RuntimeSiteName = runtimeSiteName, SlotName = slotName }; lock (_syncLock) { _events.Add(evt); } }); _mockEventPublisher = new Mock <IMetricsPublisher>(); _mockAppServiceOptions = new Mock <IOptionsMonitor <AppServiceOptions> >(); _mockAppServiceOptions.Setup(a => a.CurrentValue).Returns(new AppServiceOptions { AppName = "RandomAppName", SubscriptionId = Guid.NewGuid().ToString() }); _linuxFunctionExecutionActivityPublisher = new Mock <ILinuxContainerActivityPublisher>(); var logger = _loggerFactory.CreateLogger <MetricsEventManager>(); _metricsEventManager = new MetricsEventManager(_mockAppServiceOptions.Object, _mockEventGenerator.Object, MinimumLongRunningDurationInMs / 1000, _mockEventPublisher.Object, _linuxFunctionExecutionActivityPublisher.Object, logger); _metricsLogger = new WebHostMetricsLogger(_metricsEventManager); }
public async Task TimerFlush_MultipleEventsQueued_EmitsExpectedEvents() { object eventHandle = _metricsLogger.BeginEvent("Event1"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event2"); _metricsLogger.LogEvent("Event3"); _metricsLogger.LogEvent("Event4", "Function1"); _metricsLogger.LogEvent("Event4", "Function2"); _metricsLogger.LogEvent("Event4", "Function2"); _metricsLogger.LogEvent("Event4", "Function2"); _metricsLogger.LogEvent("Event5", "Function1"); _metricsLogger.LogEvent("Event5", "Function1"); _metricsLogger.LogEvent("Event5", "Function2", "TestData1"); await Task.Delay(25); _metricsLogger.EndEvent(eventHandle); var latencyEvent = _metricsLogger.BeginEvent("Event6", "Function1"); await Task.Delay(25); _metricsLogger.EndEvent(latencyEvent); latencyEvent = _metricsLogger.BeginEvent("Event6", "Function1"); await Task.Delay(25); _metricsLogger.EndEvent(latencyEvent); latencyEvent = _metricsLogger.BeginEvent("Event6", "Function2", "TestData2"); await Task.Delay(25); _metricsLogger.EndEvent(latencyEvent); int expectedEventCount = 9; Assert.Equal(expectedEventCount, _metricsEventManager.QueuedEvents.Count); _metricsEventManager.TimerFlush(null); Assert.Equal(expectedEventCount, _events.Count()); SystemMetricEvent evt = _events.Single(p => p.EventName == "event1"); Assert.True(evt.Average > 0); Assert.True(evt.Minimum > 0); Assert.True(evt.Maximum > 0); Assert.Equal(1, evt.Count); evt = _events.Single(p => p.EventName == "event2"); Assert.Equal(3, evt.Count); evt = _events.Single(p => p.EventName == "event3"); Assert.Equal(1, evt.Count); evt = _events.Single(p => p.EventName == "event4" && p.FunctionName == "Function1"); Assert.Equal(1, evt.Count); evt = _events.Single(p => p.EventName == "event4" && p.FunctionName == "Function2"); Assert.Equal(3, evt.Count); evt = _events.Single(p => p.EventName == "event5" && p.FunctionName == "Function1"); Assert.Equal(2, evt.Count); Assert.Equal(evt.Data, string.Empty); evt = _events.Single(p => p.EventName == "event5" && p.FunctionName == "Function2"); Assert.Equal(1, evt.Count); Assert.Equal(evt.Data, "TestData1"); evt = _events.Single(p => p.EventName == "event6" && p.FunctionName == "Function1"); Assert.True(evt.Average > 0); Assert.True(evt.Minimum > 0); Assert.True(evt.Maximum > 0); Assert.Equal(2, evt.Count); evt = _events.Single(p => p.EventName == "event6" && p.FunctionName == "Function2"); Assert.True(evt.Average > 0); Assert.True(evt.Minimum > 0); Assert.True(evt.Maximum > 0); Assert.Equal(evt.Data, "TestData2"); Assert.Equal(1, evt.Count); Assert.Equal(0, _metricsEventManager.QueuedEvents.Count); }
protected internal virtual void WriteMetricEvents(SystemMetricEvent[] metricEvents) { if (metricEvents == null) { throw new ArgumentNullException(nameof(metricEvents)); } foreach (SystemMetricEvent metricEvent in metricEvents) { _eventGenerator.LogFunctionMetricEvent( subscriptionId, appName, metricEvent.EventName.ToLowerInvariant(), metricEvent.Average, metricEvent.Minimum, metricEvent.Maximum, metricEvent.Count, metricEvent.Timestamp); } }