Skip to content

Commit bfecdc2

Browse files
Update function execution event log with invocation details (#8315)
1 parent 71c6243 commit bfecdc2

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public LinuxAppServiceEventGenerator(LinuxAppServiceFileLoggerFactory loggerFact
2727

2828
public static string AzureMonitorEventRegex { get; } = $"{ScriptConstants.LinuxAzureMonitorEventStreamName} (?<Level>[0-6]),(?<ResourceId>[^,]*),(?<OperationName>[^,]*),(?<Category>[^,]*),(?<RegionName>[^,]*),\"(?<Properties>[^,]*)\",(?<EventTimestamp>[^,]+)";
2929

30+
public static string ExecutionEventRegex { get; } = "(?<executionId>[^,]*),(?<siteName>[^,]*),(?<concurrency>[^,]*),(?<functionName>[^,]*),(?<invocationId>[^,]*),(?<executionStage>[^,]*),(?<executionTimeSpan>[^,]*),(?<success>[^,]*),(?<dateTime>[^,]*)";
31+
3032
public override void LogFunctionTraceEvent(LogLevel level, string subscriptionId, string appName, string functionName, string eventName,
3133
string source, string details, string summary, string exceptionType, string exceptionMessage,
3234
string functionInvocationId, string hostInstanceId, string activityId, string runtimeSiteName, string slotName, DateTime eventTimestamp)
@@ -66,7 +68,8 @@ public override void LogFunctionExecutionEvent(string executionId, string siteNa
6668
{
6769
var logger = _loggerFactory.GetOrCreate(FunctionsExecutionEventsCategory);
6870
string currentUtcTime = DateTime.UtcNow.ToString();
69-
WriteEvent(logger, $"{currentUtcTime}");
71+
string log = string.Join(",", executionId, siteName, concurrency.ToString(), functionName, invocationId, executionStage, executionTimeSpan.ToString(), success.ToString(), currentUtcTime);
72+
WriteEvent(logger, log);
7073
}
7174

7275
private static void WriteEvent(LinuxAppServiceFileLogger logger, string evt)

test/WebJobs.Script.Tests/Diagnostics/LinuxAppServiceEventGeneratorTests.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Text.RegularExpressions;
8+
using Microsoft.Azure.WebJobs.Script.Tests.Workers;
89
using Microsoft.Azure.WebJobs.Script.WebHost;
910
using Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics;
1011
using Microsoft.Extensions.Logging;
@@ -36,7 +37,9 @@ public LinuxAppServiceEventGeneratorTests()
3637
[LinuxEventGenerator.FunctionsMetricsCategory] =
3738
new MockLinuxAppServiceFileLogger(LinuxEventGenerator.FunctionsMetricsCategory, string.Empty, null),
3839
[LinuxEventGenerator.FunctionsDetailsCategory] =
39-
new MockLinuxAppServiceFileLogger(LinuxEventGenerator.FunctionsDetailsCategory, string.Empty, null)
40+
new MockLinuxAppServiceFileLogger(LinuxEventGenerator.FunctionsDetailsCategory, string.Empty, null),
41+
[LinuxEventGenerator.FunctionsExecutionEventsCategory] =
42+
new MockLinuxAppServiceFileLogger(LinuxEventGenerator.FunctionsExecutionEventsCategory, string.Empty, null)
4043
};
4144

4245
var loggerFactoryMock = new Mock<LinuxAppServiceFileLoggerFactory>(MockBehavior.Strict);
@@ -171,5 +174,32 @@ public void ParseAzureMonitoringEvents(LogLevel level, string resourceId, string
171174
p => Assert.Equal(properties, UnNormalize(p)),
172175
p => Assert.True(DateTime.TryParse(p, out DateTime dt)));
173176
}
177+
178+
[Theory]
179+
[MemberData(nameof(LinuxEventGeneratorTestData.GetFunctionExecutionEvents), MemberType = typeof(LinuxEventGeneratorTestData))]
180+
public void ParseFunctionExecutionEvents(string executionId, string siteName, int concurrency, string functionName, string invocationId,
181+
string executionStage, long executionTimeSpan, bool success)
182+
{
183+
_generator.LogFunctionExecutionEvent(executionId, siteName, concurrency, functionName, invocationId, executionStage, executionTimeSpan, success);
184+
string evt = _loggers[LinuxEventGenerator.FunctionsExecutionEventsCategory].Events.Single();
185+
186+
Regex regex = new Regex(LinuxAppServiceEventGenerator.ExecutionEventRegex);
187+
var match = regex.Match(evt);
188+
189+
Assert.True(match.Success);
190+
Assert.Equal(10, match.Groups.Count);
191+
192+
var groupMatches = match.Groups.Cast<Group>().Select(p => p.Value).Skip(1).ToArray();
193+
Assert.Collection(groupMatches,
194+
p => Assert.Equal(executionId, p),
195+
p => Assert.Equal(siteName, p),
196+
p => Assert.Equal(concurrency.ToString(), p),
197+
p => Assert.Equal(functionName, p),
198+
p => Assert.Equal(invocationId, p),
199+
p => Assert.Equal(executionStage, p),
200+
p => Assert.Equal(executionTimeSpan.ToString(), p),
201+
p => Assert.True(Convert.ToBoolean(p)),
202+
p => Assert.True(DateTime.TryParse(p, out DateTime dt)));
203+
}
174204
}
175205
}

test/WebJobs.Script.Tests/Diagnostics/LinuxEventGeneratorTestData.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,10 @@ public static IEnumerable<object[]> GetAzureMonitorEvents()
3232
yield return new object[] { LogLevel.Information, "TestResourceId", "TestOperationName", "TestCategory", "TestRegionName", "TestProperties" };
3333
yield return new object[] { LogLevel.Information, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty };
3434
}
35+
36+
public static IEnumerable<object[]> GetFunctionExecutionEvents()
37+
{
38+
yield return new object[] { "testexecution", "testSite", 1, "testFunction", "testInvocation", "testStage", 1, true };
39+
}
3540
}
3641
}

0 commit comments

Comments
 (0)