diff --git a/OpenSim/Framework/Communications/LoginService.cs b/OpenSim/Framework/Communications/LoginService.cs
index 3a68bfb5ff..1707607d58 100644
--- a/OpenSim/Framework/Communications/LoginService.cs
+++ b/OpenSim/Framework/Communications/LoginService.cs
@@ -38,6 +38,7 @@ using Nwc.XmlRpc;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console;
+using OpenSim.Framework.Statistics;
namespace OpenSim.Framework.UserManagement
{
@@ -47,16 +48,28 @@ namespace OpenSim.Framework.UserManagement
protected UserManagerBase m_userManager = null;
protected Mutex m_loginMutex = new Mutex(false);
+ protected UserStatsReporter m_statsCollector;
+
///
/// Used during login to send the skeleton of the OpenSim Library to the client.
///
protected LibraryRootFolder m_libraryRootFolder;
- public LoginService(
- UserManagerBase userManager, LibraryRootFolder libraryRootFolder, string welcomeMess)
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ ///
+ /// An object for collecting statistical information.
+ /// Can be null if statistics are not required
+ ///
+ public LoginService(UserManagerBase userManager, LibraryRootFolder libraryRootFolder,
+ UserStatsReporter statsCollector, string welcomeMess)
{
m_userManager = userManager;
m_libraryRootFolder = libraryRootFolder;
+ m_statsCollector = statsCollector;
if (welcomeMess != String.Empty)
{
@@ -211,6 +224,11 @@ namespace OpenSim.Framework.UserManagement
//return logResponse.ToXmlRpcResponse();
}
CommitAgent(ref userProfile);
+
+ // If we reach this point, then the login has successfully logged onto the grid
+ if (m_statsCollector != null)
+ m_statsCollector.AddSuccessfulLogin();
+
return logResponse.ToXmlRpcResponse();
}
@@ -338,6 +356,10 @@ namespace OpenSim.Framework.UserManagement
}
CommitAgent(ref userProfile);
+
+ // If we reach this point, then the login has successfully logged onto the grid
+ if (m_statsCollector != null)
+ m_statsCollector.AddSuccessfulLogin();
return logResponse.ToLLSDResponse();
}
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
new file mode 100644
index 0000000000..28a5b25405
--- /dev/null
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) Contributors, http://opensimulator.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of the OpenSim Project nor the
+* names of its contributors may be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+using System;
+
+namespace OpenSim.Framework.Servers
+{
+ ///
+ /// Common base for the main OpenSimServers (user, grid, inventory, region, etc)
+ /// XXX Not yet implemented, may not grow up for some time
+ ///
+ public class BaseOpenSimServer
+ {
+ public BaseOpenSimServer()
+ {
+ }
+ }
+}
diff --git a/OpenSim/Framework/Statistics/UserStatsReporter.cs b/OpenSim/Framework/Statistics/UserStatsReporter.cs
new file mode 100755
index 0000000000..9b3a13fccd
--- /dev/null
+++ b/OpenSim/Framework/Statistics/UserStatsReporter.cs
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) Contributors, http://opensimulator.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of the OpenSim Project nor the
+* names of its contributors may be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+using System.Text;
+using System.Timers;
+
+namespace OpenSim.Framework.Statistics
+{
+ ///
+ /// Description of UserStatsReporter.
+ ///
+ public class UserStatsReporter
+ {
+ private Timer ageStatsTimer = new Timer(24 * 60 * 60 * 1000);
+
+ private int successfulLoginsToday;
+ public int SuccessfulLoginsToday { get { return successfulLoginsToday; } }
+
+ private int successfulLoginsYesterday;
+ public int SuccessfulLoginsYesterday { get { return successfulLoginsYesterday; } }
+
+ public UserStatsReporter()
+ {
+ ageStatsTimer.Elapsed += new ElapsedEventHandler(OnAgeing);
+ ageStatsTimer.Enabled = true;
+ }
+
+ private void OnAgeing(object source, ElapsedEventArgs e)
+ {
+ successfulLoginsYesterday = successfulLoginsToday;
+
+ // There is a possibility that an asset request could occur between the execution of these
+ // two statements. But we're better off without the synchronization overhead.
+ successfulLoginsToday = 0;
+ }
+
+ ///
+ /// Record a successful login
+ ///
+ public void AddSuccessfulLogin()
+ {
+ successfulLoginsToday++;
+ }
+
+ ///
+ /// Report back collected statistical information.
+ ///
+ ///
+ public string Report()
+ {
+ return string.Format(
+@"Successful logins today : {0}
+Successful logins yesterday : {1}",
+ SuccessfulLoginsToday, SuccessfulLoginsYesterday);
+ }
+ }
+}
diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs
index 4fc66f7092..1e0dced6a3 100644
--- a/OpenSim/Grid/AssetServer/Main.cs
+++ b/OpenSim/Grid/AssetServer/Main.cs
@@ -53,7 +53,7 @@ namespace OpenSim.Grid.AssetServer
private IAssetProvider m_assetProvider;
- private AssetStatsReporter stats;
+ protected AssetStatsReporter m_stats;
[STAThread]
public static void Main(string[] args)
@@ -100,10 +100,9 @@ namespace OpenSim.Grid.AssetServer
m_console.Verbose("ASSET", "Starting HTTP process");
BaseHttpServer httpServer = new BaseHttpServer(m_config.HttpPort);
- // XXX Hardcoded - could be a plugin later on
- stats = new AssetStatsReporter();
+ m_stats = new AssetStatsReporter();
- httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider, stats));
+ httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider, m_stats));
httpServer.AddStreamHandler(new PostAssetStreamHandler(this, m_assetProvider));
httpServer.Start();
@@ -179,12 +178,12 @@ namespace OpenSim.Grid.AssetServer
case "help":
m_console.Notice(
@"shutdown - shutdown this asset server (USE CAUTION!)
- stats - statistical information for this asset server");
+ stats - statistical information for this server");
break;
case "stats":
- MainLog.Instance.Notice("STATS", Environment.NewLine + stats.Report());
+ MainLog.Instance.Notice("STATS", Environment.NewLine + m_stats.Report());
break;
case "shutdown":
diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs
index a2881e6734..1ae4bee4a5 100644
--- a/OpenSim/Grid/UserServer/Main.cs
+++ b/OpenSim/Grid/UserServer/Main.cs
@@ -34,6 +34,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console;
using OpenSim.Framework.Servers;
+using OpenSim.Framework.Statistics;
namespace OpenSim.Grid.UserServer
{
@@ -47,6 +48,8 @@ namespace OpenSim.Grid.UserServer
public UserManager m_userManager;
public UserLoginService m_loginService;
public MessageServersConnector m_messagesService;
+
+ protected UserStatsReporter m_stats;
private LogBase m_console;
private LLUUID m_lastCreatedUser = LLUUID.Random();
@@ -91,9 +94,11 @@ namespace OpenSim.Grid.UserServer
m_userManager = new UserManager();
m_userManager._config = Cfg;
m_userManager.AddPlugin(Cfg.DatabaseProvider);
+
+ m_stats = new UserStatsReporter();
m_loginService = new UserLoginService(
- m_userManager, new LibraryRootFolder(), Cfg, Cfg.DefaultStartupMsg);
+ m_userManager, new LibraryRootFolder(), m_stats, Cfg, Cfg.DefaultStartupMsg);
m_messagesService = new MessageServersConnector(MainLog.Instance);
@@ -180,6 +185,7 @@ namespace OpenSim.Grid.UserServer
{
case "help":
m_console.Notice("create user - create a new user");
+ m_console.Notice("stats - statistical information for this server");
m_console.Notice("shutdown - shutdown the grid (USE CAUTION!)");
break;
@@ -192,6 +198,10 @@ namespace OpenSim.Grid.UserServer
m_console.Close();
Environment.Exit(0);
break;
+
+ case "stats":
+ MainLog.Instance.Notice("STATS", Environment.NewLine + m_stats.Report());
+ break;
case "test-inventory":
// RestObjectPosterResponse> requester = new RestObjectPosterResponse>();
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs
index 98d19f7fe1..0f02ad2b0a 100644
--- a/OpenSim/Grid/UserServer/UserLoginService.cs
+++ b/OpenSim/Grid/UserServer/UserLoginService.cs
@@ -38,6 +38,7 @@ using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console;
using OpenSim.Framework.Data;
using OpenSim.Framework.Servers;
+using OpenSim.Framework.Statistics;
using OpenSim.Framework.UserManagement;
using InventoryFolder=OpenSim.Framework.InventoryFolder;
@@ -53,8 +54,9 @@ namespace OpenSim.Grid.UserServer
public UserConfig m_config;
public UserLoginService(
- UserManagerBase userManager, LibraryRootFolder libraryRootFolder, UserConfig config, string welcomeMess)
- : base(userManager, libraryRootFolder, welcomeMess)
+ UserManagerBase userManager, LibraryRootFolder libraryRootFolder,
+ UserStatsReporter statsCollector, UserConfig config, string welcomeMess)
+ : base(userManager, libraryRootFolder, statsCollector, welcomeMess)
{
m_config = config;
}
@@ -290,4 +292,4 @@ namespace OpenSim.Grid.UserServer
}
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index 9da1c05d7c..9484e15d68 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -327,9 +327,10 @@ namespace OpenSim
inventoryService, backendService, backendService, m_dumpAssetsToFile);
m_commsManager = localComms;
+ // TODO No user stats collection yet for standalone
m_loginService =
new LocalLoginService(userService, m_standaloneWelcomeMessage, localComms, m_networkServersInfo,
- m_standaloneAuthenticate);
+ null, m_standaloneAuthenticate);
m_loginService.OnLoginToRegion += backendService.AddNewSession;
// XMLRPC action
diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs
index 38f19700b6..7dee2cb32c 100644
--- a/OpenSim/Region/Communications/Local/LocalLoginService.cs
+++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs
@@ -34,6 +34,7 @@ using libsecondlife;
using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console;
+using OpenSim.Framework.Statistics;
using OpenSim.Framework.UserManagement;
using InventoryFolder=OpenSim.Framework.InventoryFolder;
@@ -52,9 +53,10 @@ namespace OpenSim.Region.Communications.Local
public event LoginToRegionEvent OnLoginToRegion;
- public LocalLoginService(UserManagerBase userManager, string welcomeMess, CommunicationsLocal parent,
- NetworkServersInfo serversInfo, bool authenticate)
- : base(userManager, parent.UserProfileCacheService.libraryRoot, welcomeMess)
+ public LocalLoginService(UserManagerBase userManager, string welcomeMess,
+ CommunicationsLocal parent, NetworkServersInfo serversInfo,
+ UserStatsReporter statsCollector, bool authenticate)
+ : base(userManager, parent.UserProfileCacheService.libraryRoot, statsCollector, welcomeMess)
{
m_Parent = parent;
this.serversInfo = serversInfo;
@@ -228,4 +230,4 @@ namespace OpenSim.Region.Communications.Local
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs
index 8b8bcf4a0a..485d6578bc 100644
--- a/OpenSim/Region/Examples/SimpleApp/Program.cs
+++ b/OpenSim/Region/Examples/SimpleApp/Program.cs
@@ -88,7 +88,8 @@ namespace SimpleApp
m_commsManager = localComms;
LocalLoginService loginService =
- new LocalLoginService(userService, String.Empty, localComms, m_networkServersInfo, false);
+ new LocalLoginService(
+ userService, String.Empty, localComms, m_networkServersInfo, null, false);
loginService.OnLoginToRegion += backendService.AddNewSession;
m_httpServer.AddXmlRPCHandler("login_to_simulator", loginService.XmlRpcLoginMethod);
diff --git a/prebuild.xml b/prebuild.xml
index d91aed5ee2..b2b3bbda95 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -79,6 +79,26 @@
+
+
+
+ ../../../bin/
+
+
+
+
+ ../../../bin/
+
+
+
+ ../../../bin/
+
+
+
+
+
+
+
-
+
../../../../bin/tests/stress