Skip to content
Merged
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 @@ -35,7 +35,17 @@ internal CustomMessagingManager(NetworkManager networkManager)
/// </summary>
public event UnnamedMessageDelegate OnUnnamedMessage;

internal void InvokeUnnamedMessage(ulong clientId, Stream stream) => OnUnnamedMessage?.Invoke(clientId, stream);
internal void InvokeUnnamedMessage(ulong clientId, Stream stream)
{
var bytesCount = 0UL;
Comment thread
bendoyon marked this conversation as resolved.
if (stream.CanSeek)
{
bytesCount = (ulong)stream.Length;
}

OnUnnamedMessage?.Invoke(clientId, stream);
m_NetworkManager.NetworkMetrics.TrackUnnamedMessageReceived(clientId, bytesCount);
}

/// <summary>
/// Sends unnamed message to a list of clients
Expand All @@ -57,6 +67,7 @@ public void SendUnnamedMessage(List<ulong> clientIds, NetworkBuffer buffer, Netw

m_NetworkManager.MessageSender.Send(NetworkConstants.UNNAMED_MESSAGE, networkChannel, clientIds, buffer);
PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageSent);
m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientIds, (ulong)buffer.Length);
}

/// <summary>
Expand All @@ -69,6 +80,7 @@ public void SendUnnamedMessage(ulong clientId, NetworkBuffer buffer, NetworkChan
{
m_NetworkManager.MessageSender.Send(clientId, NetworkConstants.UNNAMED_MESSAGE, networkChannel, buffer);
PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageSent);
m_NetworkManager.NetworkMetrics.TrackUnnamedMessageSent(clientId, (ulong)buffer.Length);
}

/// <summary>
Expand Down
23 changes: 23 additions & 0 deletions com.unity.multiplayer.mlapi/Runtime/Metrics/INetworkMetrics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Collections.Generic;

namespace MLAPI.Metrics
{
public interface INetworkMetrics
{
void TrackNetworkObject(NetworkObject networkObject);

void TrackNamedMessageSent(ulong receiverClientId, string messageName, ulong bytesCount);

void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, ulong bytesCount);

void TrackNamedMessageReceived(ulong senderClientId, string messageName, ulong bytesCount);

void TrackUnnamedMessageSent(ulong receiverClientId, ulong bytesCount);

void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, ulong bytesCount);

void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount);

void DispatchFrame();
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

64 changes: 25 additions & 39 deletions com.unity.multiplayer.mlapi/Runtime/Metrics/NetworkMetrics.cs
Original file line number Diff line number Diff line change
@@ -1,54 +1,21 @@
using System.Collections.Generic;
using System.Collections.Generic;
using Unity.Multiplayer.NetStats.Dispatch;
using Unity.Multiplayer.NetStats.Metrics;
using Unity.Multiplayer.NetworkProfiler;
using Unity.Multiplayer.NetworkProfiler.Models;

namespace MLAPI.Metrics
{
public interface INetworkMetrics
{
void TrackNetworkObject(NetworkObject networkObject);

void TrackNamedMessageSent(ulong receiverClientId, string messageName, ulong bytesCount);

void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, ulong bytesCount);

void TrackNamedMessageReceived(ulong senderClientId, string messageName, ulong bytesCount);

void DispatchFrame();
}

public class NullNetworkMetrics : INetworkMetrics
{
public void TrackNetworkObject(NetworkObject networkObject)
{
}

public void TrackNamedMessageSent(ulong receiverClientId, string messageName, ulong bytesCount)
{
}

public void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, ulong bytesCount)
{
}

public void TrackNamedMessageReceived(ulong senderClientId, string messageName, ulong bytesCount)
{
}

public void DispatchFrame()
{
}
}

#if true
public class NetworkMetrics : INetworkMetrics
{
private readonly NetworkManager m_NetworkManager;

private EventMetric<NamedMessageEvent> m_NamedMessageSentEvent = new EventMetric<NamedMessageEvent>("Named Message Sent");
private EventMetric<NamedMessageEvent> m_NamedMessageReceivedEvent = new EventMetric<NamedMessageEvent>("Named Message Received");
readonly EventMetric<NamedMessageEvent> m_NamedMessageSentEvent = new EventMetric<NamedMessageEvent>(MetricNames.NamedMessageSent);
readonly EventMetric<NamedMessageEvent> m_NamedMessageReceivedEvent = new EventMetric<NamedMessageEvent>(MetricNames.NamedMessageReceived);

readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageSentEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageSent);
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageReceivedEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageReceived);

private Dictionary<ulong, NetworkObjectIdentifier> m_NetworkGameObjects = new Dictionary<ulong, NetworkObjectIdentifier>();

Expand All @@ -57,6 +24,7 @@ public NetworkMetrics(NetworkManager networkManager)
m_NetworkManager = networkManager;
Dispatcher = new MetricDispatcherBuilder()
.WithMetricEvents(m_NamedMessageSentEvent, m_NamedMessageReceivedEvent)
.WithMetricEvents(m_UnnamedMessageSentEvent, m_UnnamedMessageReceivedEvent)
.Build();

Dispatcher.RegisterObserver(MLAPIObserver.Observer);
Expand Down Expand Up @@ -90,6 +58,24 @@ public void TrackNamedMessageReceived(ulong senderClientId, string messageName,
m_NamedMessageReceivedEvent.Mark(new NamedMessageEvent(new ConnectionInfo(senderClientId), messageName, bytesCount));
}

public void TrackUnnamedMessageSent(ulong receiverClientId, ulong bytesCount)
{
m_UnnamedMessageSentEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(receiverClientId), bytesCount));
}

public void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, ulong bytesCount)
{
foreach (var receiverClientId in receiverClientIds)
{
TrackUnnamedMessageSent(receiverClientId, bytesCount);
}
}

public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
{
m_UnnamedMessageReceivedEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(senderClientId), bytesCount));
}

public void DispatchFrame()
{
Dispatcher.Dispatch();
Expand Down
39 changes: 39 additions & 0 deletions com.unity.multiplayer.mlapi/Runtime/Metrics/NullNetworkMetrics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.Collections.Generic;

namespace MLAPI.Metrics
{
public class NullNetworkMetrics : INetworkMetrics
{
public void TrackNetworkObject(NetworkObject networkObject)
{
}

public void TrackNamedMessageSent(ulong receiverClientId, string messageName, ulong bytesCount)
{
}

public void TrackNamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, string messageName, ulong bytesCount)
{
}

public void TrackNamedMessageReceived(ulong senderClientId, string messageName, ulong bytesCount)
{
}

public void TrackUnnamedMessageSent(ulong receiverClientId, ulong bytesCount)
{
}

public void TrackUnnamedMessageSent(IReadOnlyCollection<ulong> receiverClientIds, ulong bytesCount)
{
}

public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
{
}

public void DispatchFrame()
{
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.Collections;
using System.Linq;
using NUnit.Framework;
using Unity.Multiplayer.NetStats.Dispatch;
using Unity.Multiplayer.NetStats.Metrics;
using UnityEngine;

namespace MLAPI.RuntimeTests.Metrics
{
#if true
public abstract class MetricsTestBase
{
protected static IEnumerator WaitForMetricsDispatch()
{
yield return new WaitForEndOfFrame();
yield return new WaitForEndOfFrame();
}

protected static IEnumerator WaitForAFewFrames()
{
yield return new WaitForSeconds(0.5f);
}

protected static IEventMetric<TEvent> AssertSingleMetricEventOfType<TEvent>(MetricCollection collection, string name)
{
var namedMessageSentMetric = collection.Metrics.SingleOrDefault(x => x.Name == name);
Comment thread
bendoyon marked this conversation as resolved.
Assert.NotNull(namedMessageSentMetric);

var typedMetric = namedMessageSentMetric as IEventMetric<TEvent>;
Assert.NotNull(typedMetric);
Assert.IsNotEmpty(typedMetric.Values);

return typedMetric;
}

protected class TestObserver : IMetricObserver
{
private readonly Action<MetricCollection> m_Assertion;

public TestObserver(Action<MetricCollection> assertion)
{
m_Assertion = assertion;
}

public void Observe(MetricCollection collection)
{
m_Assertion.Invoke(collection);
}
}
}
#endif
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading