Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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);
            }
        }