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();
}
}