internal async Task OnPublishMetrics()

in src/WebJobs.Script.WebHost/Metrics/FlexConsumptionMetricsPublisher.cs [96:156]


        internal async Task OnPublishMetrics(DateTime now)
        {
            try
            {
                lock (_lock)
                {
                    if (ActiveFunctionCount > 0)
                    {
                        // at the end of an interval, we'll meter any outstanding activity up to the end of the interval
                        MeterCurrentActiveInterval(now);
                    }
                }

                bool hasActivity = FunctionExecutionCount > 0 || FunctionExecutionTimeMS > 0 || _metricsProvider.HasMetrics();
                bool shouldForcePublish = (now - _lastPublishTime) >= TimeSpan.FromMilliseconds(_options.KeepAliveIntervalMS);

                if (!hasActivity && !shouldForcePublish && !IsAlwaysReady)
                {
                    // No activity and not time for keep-alive publish & not always ready
                    return;
                }

                // we've been accumulating function activity for the entire period
                // publish this activity and reset
                Metrics metrics = null;
                lock (_lock)
                {
                    metrics = new Metrics
                    {
                        TotalTimeMS = (long)_intervalStopwatch.GetElapsedTime().TotalMilliseconds,
                        ExecutionCount = FunctionExecutionCount,
                        ExecutionTimeMS = FunctionExecutionTimeMS,
                        IsAlwaysReady = IsAlwaysReady,
                        InstanceId = _metricsProvider.InstanceId,
                        FunctionGroup = _metricsProvider.FunctionGroup
                    };

                    var scaleMetrics = _metricsProvider.GetHostMetricsOrNull();
                    if (scaleMetrics is not null)
                    {
                        metrics.AppFailureCount = scaleMetrics.TryGetValue(HostMetrics.AppFailureCount, out long appFailureCount) ? appFailureCount : 0;
                        metrics.StartedInvocationCount = scaleMetrics.TryGetValue(HostMetrics.StartedInvocationCount, out long startedInvocationCount) ? startedInvocationCount : 0;
                        metrics.ActiveInvocationCount = scaleMetrics.TryGetValue(HostMetrics.ActiveInvocationCount, out long activeInvocationCount) ? activeInvocationCount : 0;
                    }

                    FunctionExecutionTimeMS = FunctionExecutionCount = 0;
                    _lastPublishTime = now;
                }

                await _metricsFileManager.PublishMetricsAsync(metrics);
            }
            catch (Exception ex) when (!ex.IsFatal())
            {
                // ensure no background exceptions escape
                _logger.LogError(ex, $"Error publishing metrics.");
            }
            finally
            {
                _intervalStopwatch = ValueStopwatch.StartNew();
            }
        }