From 90c853685c14e186a3dfd06b7a584d16bf520ccf Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 25 Jan 2008 19:24:25 +0000 Subject: [PATCH] * Add very basic initial login stats to the user server * Typing 'stats' on the command line will given total number of successful logins today and yesterday * A little bit more to come, probably * Refactoring will follow next --- .../Framework/Communications/LoginService.cs | 26 +++++- .../Framework/Servers/BaseOpenSimServer.cs | 43 ++++++++++ .../Framework/Statistics/UserStatsReporter.cs | 82 +++++++++++++++++++ OpenSim/Grid/AssetServer/Main.cs | 11 ++- OpenSim/Grid/UserServer/Main.cs | 12 ++- OpenSim/Grid/UserServer/UserLoginService.cs | 8 +- OpenSim/Region/Application/OpenSimMain.cs | 3 +- .../Communications/Local/LocalLoginService.cs | 10 ++- OpenSim/Region/Examples/SimpleApp/Program.cs | 3 +- prebuild.xml | 30 ++++++- 10 files changed, 206 insertions(+), 22 deletions(-) create mode 100644 OpenSim/Framework/Servers/BaseOpenSimServer.cs create mode 100755 OpenSim/Framework/Statistics/UserStatsReporter.cs 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