OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
AssetStatsCollector.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Timers;
30 
31 using OpenMetaverse.StructuredData;
32 
33 namespace OpenSim.Framework.Monitoring
34 {
39  {
40  private Timer ageStatsTimer = new Timer(24 * 60 * 60 * 1000);
41  private DateTime startTime = DateTime.Now;
42 
43  private long assetRequestsToday;
44  private long assetRequestsNotFoundToday;
45  private long assetRequestsYesterday;
46  private long assetRequestsNotFoundYesterday;
47 
48  public long AssetRequestsToday { get { return assetRequestsToday; } }
49  public long AssetRequestsNotFoundToday { get { return assetRequestsNotFoundToday; } }
50  public long AssetRequestsYesterday { get { return assetRequestsYesterday; } }
51  public long AssetRequestsNotFoundYesterday { get { return assetRequestsNotFoundYesterday; } }
52 
54  {
55  ageStatsTimer.Elapsed += new ElapsedEventHandler(OnAgeing);
56  ageStatsTimer.Enabled = true;
57  }
58 
59  private void OnAgeing(object source, ElapsedEventArgs e)
60  {
61  assetRequestsYesterday = assetRequestsToday;
62 
63  // There is a possibility that an asset request could occur between the execution of these
64  // two statements. But we're better off without the synchronization overhead.
65  assetRequestsToday = 0;
66 
67  assetRequestsNotFoundYesterday = assetRequestsNotFoundToday;
68  assetRequestsNotFoundToday = 0;
69  }
70 
74  public void AddNotFoundRequest()
75  {
76  assetRequestsNotFoundToday++;
77  }
78 
82  public void AddRequest()
83  {
84  assetRequestsToday++;
85  }
86 
91  override public string Report()
92  {
93  double elapsedHours = (DateTime.Now - startTime).TotalHours;
94  if (elapsedHours <= 0) { elapsedHours = 1; } // prevent divide by zero
95 
96  long assetRequestsTodayPerHour = (long)Math.Round(AssetRequestsToday / elapsedHours);
97  long assetRequestsYesterdayPerHour = (long)Math.Round(AssetRequestsYesterday / 24.0);
98 
99  return string.Format(
100 @"Asset requests today : {0} ({1} per hour) of which {2} were not found
101 Asset requests yesterday : {3} ({4} per hour) of which {5} were not found",
102  AssetRequestsToday, assetRequestsTodayPerHour, AssetRequestsNotFoundToday,
103  AssetRequestsYesterday, assetRequestsYesterdayPerHour, AssetRequestsNotFoundYesterday);
104  }
105 
106  public override string XReport(string uptime, string version)
107  {
108  return OSDParser.SerializeJsonString(OReport(uptime, version));
109  }
110 
111  public override OSDMap OReport(string uptime, string version)
112  {
113  double elapsedHours = (DateTime.Now - startTime).TotalHours;
114  if (elapsedHours <= 0) { elapsedHours = 1; } // prevent divide by zero
115 
116  long assetRequestsTodayPerHour = (long)Math.Round(AssetRequestsToday / elapsedHours);
117  long assetRequestsYesterdayPerHour = (long)Math.Round(AssetRequestsYesterday / 24.0);
118 
119  OSDMap ret = new OSDMap();
120  ret.Add("AssetRequestsToday", OSD.FromLong(AssetRequestsToday));
121  ret.Add("AssetRequestsTodayPerHour", OSD.FromLong(assetRequestsTodayPerHour));
122  ret.Add("AssetRequestsNotFoundToday", OSD.FromLong(AssetRequestsNotFoundToday));
123  ret.Add("AssetRequestsYesterday", OSD.FromLong(AssetRequestsYesterday));
124  ret.Add("AssetRequestsYesterdayPerHour", OSD.FromLong(assetRequestsYesterdayPerHour));
125  ret.Add("AssetRequestsNotFoundYesterday", OSD.FromLong(assetRequestsNotFoundYesterday));
126 
127  return ret;
128  }
129  }
130 }
override OSDMap OReport(string uptime, string version)
Report back collected statistical information as an OSDMap of key/values
OpenMetaverse.StructuredData.OSDMap OSDMap
override string XReport(string uptime, string version)
Report back collected statistical information in json
override string Report()
Report back collected statistical information.
System.Timers.Timer Timer
void AddRequest()
Record that a request was made to the asset server
void AddNotFoundRequest()
Record that an asset request failed to find an asset
Interactive OpenSim region server
Definition: OpenSim.cs:55
Statistics which all collectors are interested in reporting