Skip to content

Commit a461f56

Browse files
Adding function start time to metrics publisher (#4740)
* adding function start time to metrics publisher * CR comments
1 parent ccab30c commit a461f56

File tree

7 files changed

+42
-18
lines changed

7 files changed

+42
-18
lines changed

src/WebJobs.Script.WebHost/Diagnostics/MetricsEventManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,9 @@ private void RaiseFunctionMetricEvent(RunningFunctionInfo runningFunctionInfo, i
481481
runningFunctionInfo.ExecutionStage.ToString(),
482482
runningFunctionInfo.Success,
483483
(long)executionTimespan,
484-
currentTime);
484+
_executionId,
485+
currentTime,
486+
runningFunctionInfo.StartTime);
485487
}
486488
}
487489

src/WebJobs.Script.WebHost/Metrics/IMetricsPublisher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ namespace Microsoft.Azure.WebJobs.Script.WebHost.Metrics
88
{
99
public interface IMetricsPublisher
1010
{
11-
void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, DateTime utcNow);
11+
void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, string executionId, DateTime eventTimeStamp, DateTime functionStartTime);
1212
}
1313
}

src/WebJobs.Script.WebHost/Metrics/LinuxContainerMetricsPublisher.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,21 @@ private void OnStandbyOptionsChange()
9595
}
9696
}
9797

98-
public void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, DateTime eventTimeStamp)
98+
public void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, string executionId, DateTime eventTimeStamp, DateTime functionStartTime)
9999
{
100+
Enum.TryParse(executionStage, out FunctionExecutionStage functionExecutionStage);
101+
100102
FunctionActivity activity = new FunctionActivity
101103
{
102104
FunctionName = functionName,
103105
InvocationId = invocationId,
104106
Concurrency = concurrency,
105-
ExecutionStage = executionStage,
107+
ExecutionStage = functionExecutionStage,
108+
ExecutionId = executionId,
106109
IsSucceeded = success,
107110
ExecutionTimeSpanInMs = executionTimeSpan,
108111
EventTimeStamp = eventTimeStamp,
112+
StartTime = functionStartTime,
109113
Tenant = _tenant
110114
};
111115

@@ -166,15 +170,14 @@ private async Task PublishActivity<T>(ConcurrentQueue<T> currentActivities, Bloc
166170
catch (Exception ex) when (!ex.IsFatal())
167171
{
168172
_errorCount++;
169-
_logger.LogError(ex, "Error publishing activites");
170173

171174
if (_errorCount < _maxErrorLimit)
172175
{
173176
_logger.LogWarning(ex, string.Format("Error count {0} within threshold. Will retry this batch later.", _errorCount));
174177
}
175178
else
176179
{
177-
_logger.LogError(string.Format("LinuxContainerMetricsPublisher : Max error limit reached. Draining current activities for {0}", _containerName));
180+
_logger.LogError(ex, string.Format("LinuxContainerMetricsPublisher : Max error limit reached. Draining current activities for {0} for publish path: {1}", _containerName, publishPath));
178181
DrainActivities(currentActivities, activitiesToProcess);
179182
_errorCount = 0;
180183
}
@@ -184,6 +187,7 @@ private async Task PublishActivity<T>(ConcurrentQueue<T> currentActivities, Bloc
184187
internal async Task SendRequest<T>(ConcurrentQueue<T> activitiesToPublish, string publishPath)
185188
{
186189
var request = BuildRequest(HttpMethod.Post, publishPath, activitiesToPublish.ToArray());
190+
_logger.LogDebug($"Publishing {activitiesToPublish.Count()} activities to {publishPath}.");
187191
HttpResponseMessage response = await _httpClient.SendAsync(request);
188192
response.EnsureSuccessStatusCode();
189193
}
@@ -201,7 +205,7 @@ public void Start()
201205
_processMonitorTimer = new Timer(OnProcessMonitorTimer, null, TimeSpan.Zero, _memorySnapshotInterval);
202206
_metricsPublisherTimer = new Timer(OnFunctionMetricsPublishTimer, null, TimeSpan.Zero, _metricPublishInterval);
203207

204-
_logger.LogInformation(string.Format("Starting metrics publisher for container : {0}", _containerName));
208+
_logger.LogInformation(string.Format("Starting metrics publisher for container : {0}. Publishing endpoint is {1}", _containerName, _requestUri));
205209
}
206210

207211
private void OnProcessMonitorTimer(object state)

src/WebJobs.Script.WebHost/Models/ActivityBase.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System;
5-
using System.Collections.Generic;
6-
using System.Linq;
7-
using System.Threading.Tasks;
85

96
namespace Microsoft.Azure.WebJobs.Script.WebHost.Models
107
{

src/WebJobs.Script.WebHost/Models/FunctionActivity.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,25 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Runtime.Serialization;
56

67
namespace Microsoft.Azure.WebJobs.Script.WebHost.Models
78
{
9+
public enum FunctionExecutionStage
10+
{
11+
/// <summary>
12+
/// The function is currently executing.
13+
/// </summary>
14+
[EnumMember]
15+
InProgress,
16+
17+
/// <summary>
18+
/// The function has finished executing.
19+
/// </summary>
20+
[EnumMember]
21+
Finished
22+
}
23+
824
public class FunctionActivity : ActivityBase
925
{
1026
public string FunctionName { get; set; }
@@ -15,10 +31,12 @@ public class FunctionActivity : ActivityBase
1531

1632
public string ExecutionId { get; set; }
1733

18-
public string ExecutionStage { get; set; }
34+
public FunctionExecutionStage ExecutionStage { get; set; }
1935

2036
public bool IsSucceeded { get; set; }
2137

2238
public long ExecutionTimeSpanInMs { get; set; }
39+
40+
public DateTime StartTime { get; set; }
2341
}
2442
}

src/WebJobs.Script.WebHost/NullMetricsPublisher.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ public NullMetricsPublisher(ILogger<NullMetricsPublisher> logger)
1717
_logger.LogDebug("Initializing null metrics publisher");
1818
}
1919

20-
public void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, DateTime utcNow)
20+
public void AddFunctionExecutionActivity(string functionName, string invocationId, int concurrency, string executionStage, bool success, long executionTimeSpan, string executionId, DateTime eventTimeStamp, DateTime functionStartTime)
2121
{
22-
_logger.LogDebug("Ignoring function activity metric: {functionName} {invocationId} {concurrency} {executionStage} {success} {executionTimeSpan}", functionName, invocationId, concurrency, executionStage, success, executionTimeSpan);
22+
_logger.LogDebug("Ignoring function activity metric: {functionName} {invocationId} {concurrency} {executionStage} {success} {executionTimeSpan} {executionId} {eventTimeStamp} {functionStartTime}",
23+
functionName, invocationId, concurrency, executionStage, success, executionTimeSpan, executionId, eventTimeStamp, functionStartTime);
2324
}
2425
}
2526
}

test/WebJobs.Script.Tests/Metrics/LinuxContainerMetricsPublisherTests.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class LinuxContainerMetricsPublisherTests
3333
FunctionName = string.Empty,
3434
InvocationId = string.Empty,
3535
Concurrency = 1,
36-
ExecutionStage = string.Empty,
36+
ExecutionStage = FunctionExecutionStage.InProgress,
3737
IsSucceeded = true,
3838
ExecutionTimeSpanInMs = 1,
3939
EventTimeStamp = DateTime.UtcNow,
@@ -133,10 +133,12 @@ public void PublishFunctionActivity_SendsRequestHeaders()
133133
_testFunctionActivity.FunctionName,
134134
_testFunctionActivity.InvocationId,
135135
_testFunctionActivity.Concurrency,
136-
_testFunctionActivity.ExecutionStage,
136+
_testFunctionActivity.ExecutionStage.ToString(),
137137
_testFunctionActivity.IsSucceeded,
138138
_testFunctionActivity.ExecutionTimeSpanInMs,
139-
_testFunctionActivity.EventTimeStamp);
139+
_testFunctionActivity.ExecutionId,
140+
_testFunctionActivity.EventTimeStamp,
141+
_testFunctionActivity.StartTime);
140142

141143
Assert.Matches("Added function activity", _testLoggerProvider.GetAllLogMessages().Single().FormattedMessage);
142144
Assert.Equal(LogLevel.Debug, _testLoggerProvider.GetAllLogMessages().Single().Level);
@@ -145,7 +147,7 @@ public void PublishFunctionActivity_SendsRequestHeaders()
145147

146148
_metricsPublisher.OnFunctionMetricsPublishTimer(null);
147149
_metricsPublisher.OnFunctionMetricsPublishTimer(null);
148-
Assert.Empty(_testLoggerProvider.GetAllLogMessages());
150+
Assert.Matches("Publishing", _testLoggerProvider.GetAllLogMessages().Single().FormattedMessage);
149151
}
150152

151153
[Fact]
@@ -158,7 +160,7 @@ public void PublishMemoryActivity_SendsRequestHeaders()
158160

159161
_metricsPublisher.OnFunctionMetricsPublishTimer(null);
160162
_metricsPublisher.OnFunctionMetricsPublishTimer(null);
161-
Assert.Empty(_testLoggerProvider.GetLog());
163+
Assert.Matches("Publishing", _testLoggerProvider.GetAllLogMessages().Single().FormattedMessage);
162164
}
163165

164166
[Fact]

0 commit comments

Comments
 (0)