Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ internal class LinuxAppServiceEventGenerator : LinuxEventGenerator
private readonly HostNameProvider _hostNameProvider;
private readonly IOptions<FunctionsHostingConfigOptions> _functionsHostingConfigOptions;
private readonly IOptions<AzureMonitorLoggingOptions> _azureMonitorLoggingOptions;
private readonly int _pid = Environment.ProcessId;
private ILinuxAppServiceFileLogger _functionsExecutionEventsCategoryLogger;
private ILinuxAppServiceFileLogger _functionsLogsCategoryLogger;
private ILinuxAppServiceFileLogger _functionsMetricsCategoryLogger;
Expand Down Expand Up @@ -45,9 +46,9 @@ public LinuxAppServiceEventGenerator(

internal ILinuxAppServiceFileLogger FunctionsDetailsCategoryLogger => _functionsDetailsCategoryLogger;

public static string TraceEventRegex { get; } = "(?<Level>[0-6]),(?<SubscriptionId>[^,]*),(?<HostName>[^,]*),(?<AppName>[^,]*),(?<FunctionName>[^,]*),(?<EventName>[^,]*),(?<Source>[^,]*),\"(?<Details>.*)\",\"(?<Summary>.*)\",(?<HostVersion>[^,]*),(?<EventTimestamp>[^,]+),(?<ExceptionType>[^,]*),\"(?<ExceptionMessage>.*)\",(?<FunctionInvocationId>[^,]*),(?<HostInstanceId>[^,]*),(?<ActivityId>[^,\"]*)";
public static string TraceEventRegex { get; } = "(?<Level>[0-6]),(?<SubscriptionId>[^,]*),(?<HostName>[^,]*),(?<AppName>[^,]*),(?<FunctionName>[^,]*),(?<EventName>[^,]*),(?<Source>[^,]*),\"(?<Details>.*)\",\"(?<Summary>.*)\",(?<HostVersion>[^,]*),(?<EventTimestamp>[^,]+),(?<ExceptionType>[^,]*),\"(?<ExceptionMessage>.*)\",(?<FunctionInvocationId>[^,]*),(?<HostInstanceId>[^,]*),(?<ActivityId>[^,\"]*),(?<Pid>[^,\"]*)";

public static string MetricEventRegex { get; } = "(?<SubscriptionId>[^,]*),(?<AppName>[^,]*),(?<FunctionName>[^,]*),(?<EventName>[^,]*),(?<Average>\\d*),(?<Min>\\d*),(?<Max>\\d*),(?<Count>\\d*),(?<HostVersion>[^,]*),(?<EventTimestamp>[^,]+),(?<Details>[^,\"]*)";
public static string MetricEventRegex { get; } = "(?<SubscriptionId>[^,]*),(?<AppName>[^,]*),(?<FunctionName>[^,]*),(?<EventName>[^,]*),(?<Average>\\d*),(?<Min>\\d*),(?<Max>\\d*),(?<Count>\\d*),(?<HostVersion>[^,]*),(?<EventTimestamp>[^,]+),(?<Details>[^,\"]*),(?<Pid>[^,\"]*)";

public static string DetailsEventRegex { get; } = "(?<AppName>[^,]*),(?<FunctionName>[^,]*),\"(?<InputBindings>.*)\",\"(?<OutputBindings>.*)\",(?<ScriptType>[^,]*),(?<IsDisabled>[0|1])";

Expand All @@ -64,15 +65,15 @@ public override void LogFunctionTraceEvent(LogLevel level, string subscriptionId
var hostName = _hostNameProvider.Value;
using (FunctionsSystemLogsEventSource.SetActivityId(activityId))
{
WriteEvent(_functionsLogsCategoryLogger, $"{(int)ToEventLevel(level)},{subscriptionId},{hostName},{appName},{functionName},{eventName},{source},{NormalizeString(details)},{NormalizeString(summary)},{hostVersion},{formattedEventTimestamp},{exceptionType},{NormalizeString(exceptionMessage)},{functionInvocationId},{hostInstanceId},{activityId}");
WriteEvent(_functionsLogsCategoryLogger, $"{(int)ToEventLevel(level)},{subscriptionId},{hostName},{appName},{functionName},{eventName},{source},{NormalizeString(details)},{NormalizeString(summary)},{hostVersion},{formattedEventTimestamp},{exceptionType},{NormalizeString(exceptionMessage)},{functionInvocationId},{hostInstanceId},{activityId},{_pid}");
}
}

public override void LogFunctionMetricEvent(string subscriptionId, string appName, string functionName, string eventName, long average,
long minimum, long maximum, long count, DateTime eventTimestamp, string data, string runtimeSiteName, string slotName)
{
var hostVersion = ScriptHost.Version;
WriteEvent(_functionsMetricsCategoryLogger, $"{subscriptionId},{appName},{functionName},{eventName},{average},{minimum},{maximum},{count},{hostVersion},{eventTimestamp.ToString(EventTimestampFormat)},{data}");
WriteEvent(_functionsMetricsCategoryLogger, $"{subscriptionId},{appName},{functionName},{eventName},{average},{minimum},{maximum},{count},{hostVersion},{eventTimestamp.ToString(EventTimestampFormat)},{data},{_pid}");
}

public override void LogFunctionDetailsEvent(string siteName, string functionName, string inputBindings, string outputBindings,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class LinuxAppServiceEventGeneratorTests

private readonly LinuxAppServiceEventGenerator _generator;
private readonly List<string> _events;
private readonly int _pid = Environment.ProcessId;
private IOptions<FunctionsHostingConfigOptions> _functionsHostingConfigOptions;
private IOptions<AzureMonitorLoggingOptions> _azureMonitorOptions;

Expand Down Expand Up @@ -66,7 +67,7 @@ public void ParseLogEvents(LogLevel level, string subscriptionId, string appName
var match = regex.Match(evt);

Assert.True(match.Success);
Assert.Equal(17, match.Groups.Count);
Assert.Equal(18, match.Groups.Count);

DateTime dt;
var groupMatches = match.Groups.Cast<Group>().Select(p => p.Value).Skip(1).ToArray();
Expand All @@ -86,7 +87,8 @@ public void ParseLogEvents(LogLevel level, string subscriptionId, string appName
p => Assert.Equal(exceptionMessage, LinuxContainerEventGeneratorTests.UnNormalize(p)),
p => Assert.Equal(functionInvocationId, p),
p => Assert.Equal(hostInstanceId, p),
p => Assert.Equal(activityId, p));
p => Assert.Equal(activityId, p),
p => Assert.Equal(_pid.ToString(), p));
}

[Theory]
Expand All @@ -102,7 +104,7 @@ public void ParseMetricEvents(string subscriptionId, string appName, string func
var match = regex.Match(evt);

Assert.True(match.Success);
Assert.Equal(12, match.Groups.Count);
Assert.Equal(13, match.Groups.Count);

DateTime dt;
var groupMatches = match.Groups.Cast<Group>().Select(p => p.Value).Skip(1).ToArray();
Expand All @@ -117,7 +119,8 @@ public void ParseMetricEvents(string subscriptionId, string appName, string func
p => Assert.Equal(count, long.Parse(p)),
p => Assert.Equal(ScriptHost.Version, p),
p => Assert.True(DateTime.TryParse(p, out dt)),
p => Assert.Equal(data, p));
p => Assert.Equal(data, p),
p => Assert.Equal(_pid.ToString(), p));
}

[Theory]
Expand Down