diff --git a/OpenSim/Grid/AssetServer/AssetStatsReporter.cs b/OpenSim/Grid/AssetServer/AssetStatsReporter.cs new file mode 100644 index 0000000000..dac44df8f9 --- /dev/null +++ b/OpenSim/Grid/AssetServer/AssetStatsReporter.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.Grid.AssetServer +{ + /// + /// Collects and reports information on the requests made to the asset server + /// + public class AssetStatsReporter + { + private Timer ageStatsTimer = new Timer(24 * 60 * 60); + + private long assetRequestsToday; + public long AssetRequestsToday { get { return assetRequestsToday; } } + + private long assetRequestsYesterday; + public long AssetRequestsYesterday { get { return assetRequestsYesterday; } } + + public AssetStatsReporter() + { + ageStatsTimer.Elapsed += new ElapsedEventHandler(OnAgeing); + ageStatsTimer.Enabled = true; + } + + private void OnAgeing(object source, ElapsedEventArgs e) + { + assetRequestsYesterday = assetRequestsToday; + + // 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. + assetRequestsToday = 0; + } + + /// + /// Record that a request was made to the asset server + /// + public void AddRequest() + { + assetRequestsToday++; + } + + /// + /// Report back collected statistical information. + /// + /// + public string Report() + { + return string.Format( +@"Asset requests today : {0} +Asset requests yesterday : {1}", + AssetRequestsToday, AssetRequestsYesterday); + } + } +} diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs index ed77e3ece0..4fc66f7092 100644 --- a/OpenSim/Grid/AssetServer/Main.cs +++ b/OpenSim/Grid/AssetServer/Main.cs @@ -52,6 +52,8 @@ namespace OpenSim.Grid.AssetServer protected IAssetLoader assetLoader = new AssetLoaderFileSystem(); private IAssetProvider m_assetProvider; + + private AssetStatsReporter stats; [STAThread] public static void Main(string[] args) @@ -97,8 +99,11 @@ 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(); - httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider)); + httpServer.AddStreamHandler(new GetAssetStreamHandler(this, m_assetProvider, stats)); httpServer.AddStreamHandler(new PostAssetStreamHandler(this, m_assetProvider)); httpServer.Start(); @@ -172,7 +177,14 @@ namespace OpenSim.Grid.AssetServer switch (cmd) { case "help": - m_console.Notice("shutdown - shutdown this asset server (USE CAUTION!)"); + m_console.Notice( + @"shutdown - shutdown this asset server (USE CAUTION!) + stats - statistical information for this asset server"); + + break; + + case "stats": + MainLog.Instance.Notice("STATS", Environment.NewLine + stats.Report()); break; case "shutdown": @@ -186,4 +198,4 @@ namespace OpenSim.Grid.AssetServer { } } -} \ No newline at end of file +} diff --git a/OpenSim/Grid/AssetServer/RestService.cs b/OpenSim/Grid/AssetServer/RestService.cs index ee44108efd..36dcdb0f44 100644 --- a/OpenSim/Grid/AssetServer/RestService.cs +++ b/OpenSim/Grid/AssetServer/RestService.cs @@ -42,7 +42,18 @@ namespace OpenSim.Grid.AssetServer { private OpenAsset_Main m_assetManager; private IAssetProvider m_assetProvider; + private AssetStatsReporter m_stats; + public GetAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider, + AssetStatsReporter stats) + : base("GET", "/assets") + { + MainLog.Instance.Verbose("REST", "In Get Request"); + m_assetManager = assetManager; + m_assetProvider = assetProvider; + m_stats = stats; + } + public override byte[] Handle(string path, Stream request) { MainLog.Instance.Verbose("REST", "In Handle"); @@ -57,6 +68,8 @@ namespace OpenSim.Grid.AssetServer LLUUID assetID = LLUUID.Parse(p[0]); MainLog.Instance.Verbose("REST", "GET:/asset fetch param={0} UUID={1}", param, assetID); + m_stats.AddRequest(); + AssetBase asset = m_assetProvider.FetchAsset(assetID); if (asset != null) { @@ -70,7 +83,7 @@ namespace OpenSim.Grid.AssetServer xw.Flush(); ms.Seek(0, SeekOrigin.Begin); - StreamReader sr = new StreamReader(ms); + //StreamReader sr = new StreamReader(ms); result = ms.GetBuffer(); MainLog.Instance.Verbose("REST", "Buffer: {0}", result); @@ -88,14 +101,6 @@ namespace OpenSim.Grid.AssetServer } return result; } - - public GetAssetStreamHandler(OpenAsset_Main assetManager, IAssetProvider assetProvider) - : base("GET", "/assets") - { - MainLog.Instance.Verbose("REST", "In Get Request"); - m_assetManager = assetManager; - m_assetProvider = assetProvider; - } } public class PostAssetStreamHandler : BaseStreamHandler @@ -129,4 +134,4 @@ namespace OpenSim.Grid.AssetServer m_assetProvider = assetProvider; } } -} \ No newline at end of file +}