Skip to content

Commit fec815b

Browse files
author
Josie Messa
authored
Feat: Server logs metrics (#956)
1 parent 3d0b462 commit fec815b

File tree

8 files changed

+136
-3
lines changed

8 files changed

+136
-3
lines changed

com.unity.multiplayer.mlapi/Runtime/Logging/NetworkLog.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using MLAPI.Configuration;
2-
using MLAPI.Messaging;
32
using MLAPI.Serialization.Pooled;
43
using MLAPI.Transports;
54
using UnityEngine;
@@ -67,6 +66,7 @@ private static void LogServer(string message, LogType logType)
6766
writer.WriteStringPacked(message);
6867

6968
NetworkManager.Singleton.MessageSender.Send(NetworkManager.Singleton.ServerClientId, NetworkConstants.SERVER_LOG, NetworkChannel.Internal, buffer);
69+
NetworkManager.Singleton.NetworkMetrics.TrackServerLogSent(NetworkManager.Singleton.ServerClientId, (uint)logType, (ulong)buffer.Length);
7070
}
7171
}
7272
}

com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,9 @@ public void HandleNetworkLog(ulong clientId, Stream stream)
380380
{
381381
using (var reader = PooledNetworkReader.Get(stream))
382382
{
383+
var length = stream.Length;
383384
var logType = (NetworkLog.LogType)reader.ReadByte();
385+
m_NetworkManager.NetworkMetrics.TrackServerLogReceived(clientId, (uint)logType, (ulong)length);
384386
string message = reader.ReadStringPacked();
385387

386388
switch (logType)

com.unity.multiplayer.mlapi/Runtime/Metrics/INetworkMetrics.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public interface INetworkMetrics
3838

3939
void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string rpcName, ulong bytesCount);
4040

41+
void TrackServerLogSent(ulong receiverClientId, uint logType, ulong bytesCount);
42+
43+
void TrackServerLogReceived(ulong senderClientId, uint logType, ulong bytesCount);
44+
4145
void DispatchFrame();
4246
}
4347
}

com.unity.multiplayer.mlapi/Runtime/Metrics/NetworkMetrics.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#if MULTIPLAYER_TOOLS
2-
32
using System.Collections.Generic;
43
using Unity.Multiplayer.MetricTypes;
54
using Unity.Multiplayer.NetStats.Dispatch;
@@ -25,6 +24,8 @@ public class NetworkMetrics : INetworkMetrics
2524
private readonly EventMetric<ObjectSpawnedEvent> m_ObjectSpawnReceivedEvent = new EventMetric<ObjectSpawnedEvent>(MetricNames.ObjectSpawnedReceived);
2625
private readonly EventMetric<ObjectDestroyedEvent> m_ObjectDestroySentEvent = new EventMetric<ObjectDestroyedEvent>(MetricNames.ObjectDestroyedSent);
2726
private readonly EventMetric<ObjectDestroyedEvent> m_ObjectDestroyReceivedEvent = new EventMetric<ObjectDestroyedEvent>(MetricNames.ObjectDestroyedReceived);
27+
private readonly EventMetric<ServerLogEvent> m_ServerLogSentEvent = new EventMetric<ServerLogEvent>(MetricNames.ServerLogSent);
28+
private readonly EventMetric<ServerLogEvent> m_ServerLogReceivedEvent = new EventMetric<ServerLogEvent>(MetricNames.ServerLogReceived);
2829

2930
readonly EventMetric<RpcEvent> m_RpcSentEvent = new EventMetric<RpcEvent>(MetricNames.RpcSent);
3031
readonly EventMetric<RpcEvent> m_RpcReceivedEvent = new EventMetric<RpcEvent>(MetricNames.RpcReceived);
@@ -41,6 +42,7 @@ public NetworkMetrics(NetworkManager networkManager)
4142
.WithMetricEvents(m_ObjectSpawnSentEvent, m_ObjectSpawnReceivedEvent)
4243
.WithMetricEvents(m_ObjectDestroySentEvent, m_ObjectDestroyReceivedEvent)
4344
.WithMetricEvents(m_RpcSentEvent, m_RpcReceivedEvent)
45+
.WithMetricEvents(m_ServerLogSentEvent, m_ServerLogReceivedEvent)
4446
.Build();
4547

4648
Dispatcher.RegisterObserver(MLAPIObserver.Observer);
@@ -161,6 +163,16 @@ public void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string
161163
m_RpcReceivedEvent.Mark(new RpcEvent(new ConnectionInfo(senderClientId), networkObjectIdentifier, rpcName, bytesCount));
162164
}
163165

166+
public void TrackServerLogSent(ulong receiverClientId, uint logType, ulong bytesCount)
167+
{
168+
m_ServerLogSentEvent.Mark(new ServerLogEvent(new ConnectionInfo(receiverClientId), (LogLevel)logType, bytesCount));
169+
}
170+
171+
public void TrackServerLogReceived(ulong senderClientId, uint logType, ulong bytesCount)
172+
{
173+
m_ServerLogReceivedEvent.Mark(new ServerLogEvent(new ConnectionInfo(senderClientId), (LogLevel)logType, bytesCount));
174+
}
175+
164176
public void DispatchFrame()
165177
{
166178
Dispatcher.Dispatch();
@@ -177,5 +189,4 @@ public class MLAPIObserver
177189
public static IMetricObserver Observer { get; } = MetricObserverFactory.Construct();
178190
}
179191
}
180-
181192
#endif

com.unity.multiplayer.mlapi/Runtime/Metrics/NullNetworkMetrics.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ public void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string
7272
{
7373
}
7474

75+
public void TrackServerLogSent(ulong receiverClientId, uint logType, ulong bytesCount)
76+
{
77+
}
78+
79+
public void TrackServerLogReceived(ulong senderClientId, uint logType, ulong bytesCount)
80+
{
81+
}
82+
7583
public void DispatchFrame()
7684
{
7785
}

com.unity.multiplayer.mlapi/Tests/Runtime/Metrics/ServerLogs.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System.Collections;
2+
using System.Linq;
3+
using MLAPI.Logging;
4+
using MLAPI.Metrics;
5+
using NUnit.Framework;
6+
using Unity.Multiplayer.NetworkProfiler;
7+
using Unity.Multiplayer.NetworkProfiler.Models;
8+
using UnityEngine;
9+
using UnityEngine.TestTools;
10+
11+
namespace MLAPI.RuntimeTests.Metrics.ServerLogs
12+
{
13+
public class ServerLogsMetricTests
14+
{
15+
NetworkManager m_Server;
16+
NetworkManager m_Client;
17+
NetworkMetrics m_ClientMetrics;
18+
NetworkMetrics m_ServerMetrics;
19+
20+
21+
[UnitySetUp]
22+
public IEnumerator SetUp()
23+
{
24+
if (!MultiInstanceHelpers.Create(1, out m_Server, out var clients))
25+
{
26+
Debug.LogError("Failed to create instances");
27+
Assert.Fail("Failed to create instances");
28+
}
29+
30+
var playerPrefab = new GameObject("Player");
31+
var networkObject = playerPrefab.AddComponent<NetworkObject>();
32+
33+
MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
34+
35+
m_Server.NetworkConfig.PlayerPrefab = playerPrefab;
36+
37+
foreach (var client in clients)
38+
{
39+
client.NetworkConfig.PlayerPrefab = playerPrefab;
40+
}
41+
42+
if (!MultiInstanceHelpers.Start(true, m_Server, clients))
43+
{
44+
Debug.LogError("Failed to start instances");
45+
Assert.Fail("Failed to start instances");
46+
}
47+
48+
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients));
49+
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(m_Server));
50+
51+
m_Client = clients.First();
52+
m_ClientMetrics = m_Client.NetworkMetrics as NetworkMetrics;
53+
m_ServerMetrics = m_Server.NetworkMetrics as NetworkMetrics;
54+
}
55+
56+
[UnityTearDown]
57+
public IEnumerator TearDown()
58+
{
59+
MultiInstanceHelpers.Destroy();
60+
61+
yield return null;
62+
}
63+
64+
[UnityTest]
65+
public IEnumerator TrackServerLogSentAndReceivedMetric()
66+
{
67+
var waitForSentMetric = new WaitForMetricValues<ServerLogEvent>(m_ClientMetrics.Dispatcher, MetricNames.ServerLogSent);
68+
var waitForReceivedMetric = new WaitForMetricValues<ServerLogEvent>(m_ClientMetrics.Dispatcher, MetricNames.ServerLogReceived);
69+
NetworkLog.LogWarningServer("log message");
70+
71+
yield return waitForSentMetric.WaitForAFewFrames();
72+
yield return waitForReceivedMetric.WaitForAFewFrames();
73+
74+
var sentMetrics = waitForSentMetric.EnsureMetricValuesHaveBeenFound();
75+
Assert.AreEqual(1, sentMetrics.Count);
76+
77+
var receivedMetrics = waitForReceivedMetric.EnsureMetricValuesHaveBeenFound();
78+
Assert.AreEqual(1, receivedMetrics.Count);
79+
80+
var sentMetric = sentMetrics.First();
81+
Assert.AreEqual(m_Server.LocalClientId, sentMetric.Connection.Id);
82+
Assert.AreEqual((uint)NetworkLog.LogType.Warning, (uint)sentMetric.LogLevel);
83+
84+
var receivedMetric = receivedMetrics.First();
85+
Assert.AreEqual(m_Client.LocalClientId, receivedMetric.Connection.Id);
86+
Assert.AreEqual((uint)NetworkLog.LogType.Warning, (uint)receivedMetric.LogLevel);
87+
}
88+
}
89+
}

com.unity.multiplayer.mlapi/Tests/Runtime/Metrics/ServerLogs/ServerLogsMetricTests.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)