Skip to content

Commit 5fb6f4d

Browse files
committed
Categorized logs into system logs and user logs.
1 parent 062edad commit 5fb6f4d

File tree

5 files changed

+120
-2
lines changed

5 files changed

+120
-2
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using Microsoft.Azure.WebJobs.Script.Eventing.Rpc;
5+
using static Microsoft.Azure.WebJobs.Script.Grpc.Messages.RpcLog.Types;
6+
using MessageType = Microsoft.Azure.WebJobs.Script.Grpc.Messages.StreamingMessage.ContentOneofCase;
7+
8+
namespace Microsoft.Azure.WebJobs.Script
9+
{
10+
public static class InboundEventExtensions
11+
{
12+
public static bool IsMessageOfType(this InboundEvent inboundEvent, MessageType typeToCheck)
13+
{
14+
return inboundEvent.MessageType.Equals(typeToCheck);
15+
}
16+
17+
public static bool IsLogOfCategory(this InboundEvent inboundEvent, RpcLogCategory categoryToCheck)
18+
{
19+
return inboundEvent.Message.RpcLog.LogCategory.Equals(categoryToCheck);
20+
}
21+
}
22+
}

src/WebJobs.Script/Rpc/LanguageWorkerChannel.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
using Microsoft.Azure.WebJobs.Script.ManagedDependencies;
2121
using Microsoft.Extensions.Logging;
2222
using Microsoft.Extensions.Options;
23-
23+
using static Microsoft.Azure.WebJobs.Script.Grpc.Messages.RpcLog.Types;
2424
using FunctionMetadata = Microsoft.Azure.WebJobs.Script.Description.FunctionMetadata;
2525
using MsgType = Microsoft.Azure.WebJobs.Script.Grpc.Messages.StreamingMessage.ContentOneofCase;
2626

@@ -81,9 +81,13 @@ internal LanguageWorkerChannel(
8181
.Where(msg => msg.WorkerId == _workerId);
8282

8383
_eventSubscriptions.Add(_inboundWorkerEvents
84-
.Where(msg => msg.MessageType == MsgType.RpcLog)
84+
.Where(msg => msg.IsMessageOfType(MsgType.RpcLog) && !msg.IsLogOfCategory(RpcLogCategory.System))
8585
.Subscribe(Log));
8686

87+
_eventSubscriptions.Add(_inboundWorkerEvents
88+
.Where(msg => msg.IsMessageOfType(MsgType.RpcLog) && msg.IsLogOfCategory(RpcLogCategory.System))
89+
.Subscribe(SystemLog));
90+
8791
_eventSubscriptions.Add(_eventManager.OfType<FileEvent>()
8892
.Where(msg => _workerConfig.Extensions.Contains(Path.GetExtension(msg.FileChangeArguments.FullPath)))
8993
.Throttle(TimeSpan.FromMilliseconds(300)) // debounce
@@ -362,6 +366,40 @@ internal void Log(RpcEvent msg)
362366
}
363367
}
364368

369+
internal void SystemLog(RpcEvent msg)
370+
{
371+
RpcLog systemLog = msg.Message.RpcLog;
372+
LogLevel logLevel = (LogLevel)systemLog.Level;
373+
switch (logLevel)
374+
{
375+
case LogLevel.Warning:
376+
_workerChannelLogger.LogWarning(systemLog.Message);
377+
break;
378+
379+
case LogLevel.Information:
380+
_workerChannelLogger.LogInformation(systemLog.Message);
381+
break;
382+
383+
case LogLevel.Error:
384+
{
385+
if (systemLog.Exception != null)
386+
{
387+
RpcException exception = new RpcException(systemLog.Message, systemLog.Exception.Message, systemLog.Exception.StackTrace);
388+
_workerChannelLogger.LogError(exception, systemLog.Message);
389+
}
390+
else
391+
{
392+
_workerChannelLogger.LogError(systemLog.Message);
393+
}
394+
}
395+
break;
396+
397+
default:
398+
_workerChannelLogger.LogInformation(systemLog.Message);
399+
break;
400+
}
401+
}
402+
365403
internal void HandleWorkerStartStreamError(Exception exc)
366404
{
367405
_workerChannelLogger.LogError(exc, "Starting worker process failed");
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Microsoft.Azure.WebJobs.Script.Eventing.Rpc;
6+
using Xunit;
7+
using static Microsoft.Azure.WebJobs.Script.Grpc.Messages.RpcLog.Types;
8+
9+
namespace Microsoft.Azure.WebJobs.Script.Tests
10+
{
11+
public class InboundEventExtensionsTests
12+
{
13+
[Theory]
14+
[InlineData(RpcLogCategory.System)]
15+
[InlineData(RpcLogCategory.User)]
16+
public void TestLogCategories(RpcLogCategory categoryToTest)
17+
{
18+
InboundEvent inboundEvent = new InboundEvent(Guid.NewGuid().ToString(), new Grpc.Messages.StreamingMessage
19+
{
20+
RpcLog = new Grpc.Messages.RpcLog
21+
{
22+
LogCategory = categoryToTest,
23+
}
24+
});
25+
26+
Assert.True(inboundEvent.IsLogOfCategory(categoryToTest));
27+
}
28+
}
29+
}

test/WebJobs.Script.Tests/Rpc/LanguageWorkerChannelTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace Microsoft.Azure.WebJobs.Script.Tests.Rpc
2121
public class LanguageWorkerChannelTests
2222
{
2323
private static string _expectedLogMsg = "Outbound event subscribe event handler invoked";
24+
private static string _expectedSystemLogMessage = "Random system log message";
2425

2526
private Mock<ILanguageWorkerProcess> _mockLanguageWorkerProcess = new Mock<ILanguageWorkerProcess>();
2627
private string _workerId = "testWorkerId";
@@ -108,6 +109,18 @@ public void SendWorkerInitRequest_PublishesOutboundEvent()
108109
Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, _expectedLogMsg)));
109110
}
110111

112+
[Theory]
113+
[InlineData(RpcLog.Types.Level.Information, RpcLog.Types.Level.Information)]
114+
[InlineData(RpcLog.Types.Level.Error, RpcLog.Types.Level.Error)]
115+
[InlineData(RpcLog.Types.Level.Warning, RpcLog.Types.Level.Warning)]
116+
[InlineData(RpcLog.Types.Level.Trace, RpcLog.Types.Level.Information)]
117+
public void SendSystemLogMessage_PublishesSystemLogMessage(RpcLog.Types.Level levelToTest, RpcLog.Types.Level expectedLogLevel)
118+
{
119+
_testFunctionRpcService.PublishSystemLogEvent(levelToTest);
120+
var traces = _logger.GetLogMessages();
121+
Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, _expectedSystemLogMessage) && m.Level.ToString().Equals(expectedLogLevel.ToString())));
122+
}
123+
111124
[Fact]
112125
public void SendInvocationRequest_PublishesOutboundEvent()
113126
{

test/WebJobs.Script.Tests/Rpc/TestFunctionRpcService.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ public void PublishWorkerInitResponseEvent()
7676
_eventManager.Publish(new InboundEvent(_workerId, responseMessage));
7777
}
7878

79+
public void PublishSystemLogEvent(RpcLog.Types.Level inputLevel)
80+
{
81+
RpcLog rpcLog = new RpcLog()
82+
{
83+
LogCategory = RpcLog.Types.RpcLogCategory.System,
84+
Level = inputLevel,
85+
Message = "Random system log message",
86+
};
87+
88+
StreamingMessage logMessage = new StreamingMessage()
89+
{
90+
RpcLog = rpcLog
91+
};
92+
_eventManager.Publish(new InboundEvent(_workerId, logMessage));
93+
}
94+
7995
public static FunctionEnvironmentReloadResponse GetTestFunctionEnvReloadResponse()
8096
{
8197
StatusResult statusResult = new StatusResult()

0 commit comments

Comments
 (0)