Skip to content
30 changes: 26 additions & 4 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,12 @@ internal void __endSendServerRpc(NetworkSerializer serializer, uint rpcMethodId,
#if DEVELOPMENT_BUILD || UNITY_EDITOR
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not related to this PR, but does this mean we wont have access to stats in the RNSM in release builds outside of the editor?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only RPCs. There was some concern that the memory needed to keep RPC names around shouldn't exist, so we compromised with this strategy for now.

if (NetworkManager.__rpc_name_table.TryGetValue(rpcMethodId, out var rpcMethodName))
{
NetworkManager.NetworkMetrics.TrackRpcSent(NetworkManager.ServerClientId, NetworkObjectId, rpcMethodName, rpcMessageSize);
NetworkManager.NetworkMetrics.TrackRpcSent(
NetworkManager.ServerClientId,
NetworkObjectId,
rpcMethodName,
__getTypeName(),
rpcMessageSize);
}
#endif
}
Expand Down Expand Up @@ -217,7 +222,12 @@ internal void __endSendClientRpc(NetworkSerializer serializer, uint rpcMethodId,
#if DEVELOPMENT_BUILD || UNITY_EDITOR
if (NetworkManager.__rpc_name_table.TryGetValue(rpcMethodId, out var rpcMethodName))
{
NetworkManager.NetworkMetrics.TrackRpcSent(NetworkManager.ConnectedClients.Select(x => x.Key).ToArray(), NetworkObjectId, rpcMethodName, messageSize);
NetworkManager.NetworkMetrics.TrackRpcSent(
NetworkManager.ConnectedClients.Select(x => x.Key).ToArray(),
NetworkObjectId,
rpcMethodName,
__getTypeName(),
messageSize);
}
#endif
}
Expand Down Expand Up @@ -575,7 +585,13 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
m_NetworkVariableIndexesToReset.Add(k);
}

NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(clientId, NetworkObjectId, name, NetworkVariableFields[k].Name, bufferSizeCapture.Flush());
NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(
clientId,
NetworkObjectId,
name,
NetworkVariableFields[k].Name,
__getTypeName(),
bufferSizeCapture.Flush());
}
}

Expand Down Expand Up @@ -671,7 +687,13 @@ internal static void HandleNetworkVariableDeltas(List<INetworkVariable> networkV
long readStartPos = stream.Position;

networkVariableList[i].ReadDelta(stream, networkManager.IsServer);
networkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(clientId, logInstance.NetworkObjectId, logInstance.name, networkVariableList[i].Name, stream.Length);
networkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(
clientId,
logInstance.NetworkObjectId,
logInstance.name,
networkVariableList[i].Name,
logInstance.__getTypeName(),
stream.Length);

(stream as NetworkBuffer).SkipPadBits();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1226,7 +1226,12 @@ internal void InvokeRpc(MessageFrameItem item, NetworkUpdateStage networkUpdateS
#if DEVELOPMENT_BUILD || UNITY_EDITOR
if (__rpc_name_table.TryGetValue(networkMethodId, out var rpcMethodName))
{
NetworkMetrics.TrackRpcReceived(item.NetworkId, networkObjectId, rpcMethodName, item.StreamSize);
NetworkMetrics.TrackRpcReceived(
item.NetworkId,
networkObjectId,
rpcMethodName,
networkBehaviour.__getTypeName(),
item.StreamSize);
}
#endif
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,21 @@ internal interface INetworkMetrics

void TrackUnnamedMessageReceived(ulong senderClientId, long bytesCount);

void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount);

void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount);
void TrackNetworkVariableDeltaSent(
ulong receiverClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount);

void TrackNetworkVariableDeltaReceived(
ulong senderClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount);

void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount);

Expand All @@ -36,11 +48,26 @@ internal interface INetworkMetrics

void TrackObjectDestroyReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, long bytesCount);

void TrackRpcSent(ulong receiverClientId, ulong networkObjectId, string rpcName, long bytesCount);

void TrackRpcSent(ulong[] receiverClientIds, ulong networkObjectId, string rpcName, long bytesCount);

void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string rpcName, long bytesCount);
void TrackRpcSent(
ulong receiverClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount);

void TrackRpcSent(
ulong[] receiverClientIds,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount);

void TrackRpcReceived(
ulong senderClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount);

void TrackServerLogSent(ulong receiverClientId, uint logType, long bytesCount);

Expand Down
78 changes: 64 additions & 14 deletions com.unity.netcode.gameobjects/Runtime/Metrics/NetworkMetrics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,38 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, long bytesCount)
m_UnnamedMessageReceivedEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(senderClientId), bytesCount));
}

public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount)
{
m_NetworkVariableDeltaSentEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
}

public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount)
{
m_NetworkVariableDeltaReceivedEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
public void TrackNetworkVariableDeltaSent(
ulong receiverClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount)
{
m_NetworkVariableDeltaSentEvent.Mark(
new NetworkVariableEvent(
new ConnectionInfo(receiverClientId),
new NetworkObjectIdentifier(gameObjectName, networkObjectId),
variableName,
networkBehaviourName,
bytesCount));
}

public void TrackNetworkVariableDeltaReceived(
ulong senderClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount)
{
m_NetworkVariableDeltaReceivedEvent.Mark(
new NetworkVariableEvent(
new ConnectionInfo(senderClientId),
new NetworkObjectIdentifier(gameObjectName, networkObjectId),
variableName,
networkBehaviourName,
bytesCount));
}

public void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, long bytesCount)
Expand Down Expand Up @@ -140,32 +164,58 @@ public void TrackObjectDestroyReceived(ulong senderClientId, ulong networkObject
m_ObjectDestroyReceivedEvent.Mark(new ObjectDestroyedEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
}

public void TrackRpcSent(ulong receiverClientId, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcSent(
ulong receiverClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
if (!m_NetworkGameObjects.TryGetValue(networkObjectId, out var networkObjectIdentifier))
{
networkObjectIdentifier = new NetworkObjectIdentifier("", networkObjectId);
}

m_RpcSentEvent.Mark(new RpcEvent(new ConnectionInfo(receiverClientId), networkObjectIdentifier, rpcName, bytesCount));
m_RpcSentEvent.Mark(
new RpcEvent(
new ConnectionInfo(receiverClientId),
networkObjectIdentifier,
rpcName,
networkBehaviourName,
bytesCount));
}

public void TrackRpcSent(ulong[] receiverClientIds, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcSent(
ulong[] receiverClientIds,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
foreach (var receiverClientId in receiverClientIds)
{
TrackRpcSent(receiverClientId, networkObjectId, rpcName, bytesCount);
TrackRpcSent(receiverClientId, networkObjectId, rpcName, networkBehaviourName, bytesCount);
}
}

public void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcReceived(
ulong senderClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
if (!m_NetworkGameObjects.TryGetValue(networkObjectId, out var networkObjectIdentifier))
{
networkObjectIdentifier = new NetworkObjectIdentifier("", networkObjectId);
}

m_RpcReceivedEvent.Mark(new RpcEvent(new ConnectionInfo(senderClientId), networkObjectIdentifier, rpcName, bytesCount));
m_RpcReceivedEvent.Mark(
new RpcEvent(new ConnectionInfo(senderClientId),
networkObjectIdentifier,
rpcName,
networkBehaviourName,
bytesCount));
}

public void TrackServerLogSent(ulong receiverClientId, uint logType, long bytesCount)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,23 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, long bytesCount)
{
}

public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount)
public void TrackNetworkVariableDeltaSent(
ulong receiverClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount)
{
}

public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, long bytesCount)
public void TrackNetworkVariableDeltaReceived(
ulong senderClientId,
ulong networkObjectId,
string gameObjectName,
string variableName,
string networkBehaviourName,
long bytesCount)
{
}

Expand Down Expand Up @@ -68,15 +80,30 @@ public void TrackObjectDestroyReceived(ulong senderClientId, ulong networkObject
{
}

public void TrackRpcSent(ulong receiverClientId, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcSent(
ulong receiverClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
}

public void TrackRpcSent(ulong[] receiverClientIds, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcSent(
ulong[] receiverClientIds,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
}

public void TrackRpcReceived(ulong senderClientId, ulong networkObjectId, string rpcName, long bytesCount)
public void TrackRpcReceived(
ulong senderClientId,
ulong networkObjectId,
string rpcName,
string networkBehaviourName,
long bytesCount)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public IEnumerator TrackRpcSentMetricOnServer()
Assert.AreEqual(2, serverRpcSentValues.Count); // Server will receive this, since it's host

Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.Name == nameof(RpcTestComponent.MyClientRpc)));
Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.NetworkBehaviourName == nameof(RpcTestComponent)));
Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.BytesCount != 0));
Assert.Contains(Server.LocalClientId, serverRpcSentValues.Select(x => x.Connection.Id).ToArray());
Assert.Contains(Client.LocalClientId, serverRpcSentValues.Select(x => x.Connection.Id).ToArray());
Expand All @@ -53,6 +54,7 @@ public IEnumerator TrackRpcSentMetricOnClient()
var rpcSent = clientRpcSentValues.First();
Assert.AreEqual(Server.LocalClientId, rpcSent.Connection.Id);
Assert.AreEqual(nameof(RpcTestComponent.MyServerRpc), rpcSent.Name);
Assert.AreEqual(nameof(RpcTestComponent), rpcSent.NetworkBehaviourName);
Assert.AreNotEqual(0, rpcSent.BytesCount);
}

Expand All @@ -74,6 +76,7 @@ public IEnumerator TrackRpcReceivedMetricOnServer()
var rpcReceived = serverRpcReceivedValues.First();
Assert.AreEqual(Client.LocalClientId, rpcReceived.Connection.Id);
Assert.AreEqual(nameof(RpcTestComponent.MyServerRpc), rpcReceived.Name);
Assert.AreEqual(nameof(RpcTestComponent), rpcReceived.NetworkBehaviourName);
Assert.AreNotEqual(0, rpcReceived.BytesCount);
}

Expand All @@ -95,6 +98,7 @@ public IEnumerator TrackRpcReceivedMetricOnClient()
var rpcReceived = clientRpcReceivedValues.First();
Assert.AreEqual(Server.LocalClientId, rpcReceived.Connection.Id);
Assert.AreEqual(nameof(RpcTestComponent.MyClientRpc), rpcReceived.Name);
Assert.AreEqual(nameof(RpcTestComponent), rpcReceived.NetworkBehaviourName);
Assert.AreNotEqual(0, rpcReceived.BytesCount);
}
}
Expand Down
2 changes: 1 addition & 1 deletion testproject-tools-integration/Packages/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"dependencies": {
"com.unity.ide.rider": "3.0.7",
"com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects",
"com.unity.multiplayer.tools": "0.0.1-preview.1",
"com.unity.multiplayer.tools": "0.0.1-preview.2",
"com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp",
"com.unity.test-framework": "1.1.26",
"com.unity.modules.ai": "1.0.0",
Expand Down