diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index f80cb342af..c20a4e81a4 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -30,6 +30,7 @@ using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
+using System.Text;
using System.Timers;
using log4net;
using Nini.Config;
@@ -988,38 +989,74 @@ namespace OpenSim
///
private string GetQueuesReport()
{
- string report = String.Empty;
+ StringBuilder report = new StringBuilder();
+
+ int columnPadding = 2;
+ int maxNameLength = 18;
+ int maxRegionNameLength = 14;
+ int maxTypeLength = 5;
+ int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding;
+
+ report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", "");
+ report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", "");
+ report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type", "");
+
+ report.AppendFormat(
+ "{0,9} {1,10} {2,8} {3,7} {4,7} {5,7} {6,7} {7,9} {8,7} {9,7}\n",
+ "Packets",
+ "Packets",
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ "Bytes");
+
+ report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", "");
+ report.AppendFormat(
+ "{0,9} {1,10} {2,8} {3,7} {4,7} {5,7} {6,7} {7,9} {8,7} {9,7}\n",
+ "Sent",
+ "Received",
+ "Resend",
+ "Land",
+ "Wind",
+ "Cloud",
+ "Task",
+ "Texture",
+ "Asset",
+ "State");
+
+ m_sceneManager.ForEachScene(
+ delegate(Scene scene)
+ {
+ scene.ForEachClient(
+ delegate(IClientAPI client)
+ {
+ if (client is IStatsCollector)
+ {
+ string name = client.Name;
+ string regionName = scene.RegionInfo.RegionName;
+
+ report.AppendFormat(
+ "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}",
+ name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, "");
+ report.AppendFormat(
+ "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}",
+ regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, "");
+ report.AppendFormat(
+ "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}",
+ scene.PresenceChildStatus(client.AgentId) ? "Child" : "Root", "");
- m_sceneManager.ForEachScene(delegate(Scene scene)
- {
- scene.ForEachClient(delegate(IClientAPI client)
- {
- if (client is IStatsCollector)
- {
- report = report + client.FirstName +
- " " + client.LastName;
+ IStatsCollector stats = (IStatsCollector)client;
+
+ report.AppendLine(stats.Report());
+ }
+ });
+ });
- IStatsCollector stats =
- (IStatsCollector) client;
-
- report = report + string.Format("{0,7} {1,7} {2,7} {3,7} {4,7} {5,7} {6,7} {7,7} {8,7} {9,7}\n",
- "Send",
- "In",
- "Out",
- "Resend",
- "Land",
- "Wind",
- "Cloud",
- "Task",
- "Texture",
- "Asset");
- report = report + stats.Report() +
- "\n";
- }
- });
- });
-
- return report;
+ return report.ToString();
}
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index ca5a7bdc4b..1812c08d2a 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -246,11 +246,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
throw new NotImplementedException();
}
+ ///
+ /// Return statistics information about client packet queues.
+ ///
+ ///
+ /// FIXME: This should really be done in a more sensible manner rather than sending back a formatted string.
+ ///
+ ///
public string GetStats()
{
- // TODO: ???
- return string.Format("{0,7} {1,7} {2,7} {3,7} {4,7} {5,7} {6,7} {7,7} {8,7} {9,7}",
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ return string.Format(
+ "{0,9} {1,10} {2,8} {3,7} {4,7} {5,7} {6,7} {7,9} {8,7} {9,7}",
+ PacketsSent,
+ PacketsReceived,
+ m_throttleCategories[(int)ThrottleOutPacketType.Resend].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Land].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Wind].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Cloud].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Task].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Texture].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.Asset].Content,
+ m_throttleCategories[(int)ThrottleOutPacketType.State].Content);
}
public void SendPacketStats()