From 76bd3de2fd243d0c910404af8a9998de746b04c4 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 19:22:47 +0100
Subject: Add checks monitoring framework to provide alerts if certain
conditions do not hold.
Not yet in use.
---
OpenSim/Framework/Monitoring/ChecksManager.cs | 262 ++++++++++++++++++++++++++
1 file changed, 262 insertions(+)
create mode 100644 OpenSim/Framework/Monitoring/ChecksManager.cs
(limited to 'OpenSim/Framework/Monitoring/ChecksManager.cs')
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
new file mode 100644
index 0000000..e4a7f8c
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -0,0 +1,262 @@
+/*
+ * 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 OpenSimulator 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using log4net;
+
+namespace OpenSim.Framework.Monitoring
+{
+ ///
+ /// Static class used to register/deregister checks on runtime conditions.
+ ///
+ public static class ChecksManager
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ // Subcommand used to list other stats.
+ public const string ListSubCommand = "list";
+
+ // All subcommands
+ public static HashSet SubCommands = new HashSet { ListSubCommand };
+
+ ///
+ /// Checks categorized by category/container/shortname
+ ///
+ ///
+ /// Do not add or remove directly from this dictionary.
+ ///
+ public static SortedDictionary>> RegisteredChecks
+ = new SortedDictionary>>();
+
+ public static void RegisterConsoleCommands(ICommandConsole console)
+ {
+ console.Commands.AddCommand(
+ "General",
+ false,
+ "show checks",
+ "show checks",
+ "Show checks configured for this server",
+ "If no argument is specified then info on all checks will be shown.\n"
+ + "'list' argument will show check categories.\n"
+ + "THIS FACILITY IS EXPERIMENTAL",
+ HandleShowchecksCommand);
+ }
+
+ public static void HandleShowchecksCommand(string module, string[] cmd)
+ {
+ ICommandConsole con = MainConsole.Instance;
+
+ if (cmd.Length > 2)
+ {
+ foreach (string name in cmd.Skip(2))
+ {
+ string[] components = name.Split('.');
+
+ string categoryName = components[0];
+// string containerName = components.Length > 1 ? components[1] : null;
+
+ if (categoryName == ListSubCommand)
+ {
+ con.Output("check categories available are:");
+
+ foreach (string category in RegisteredChecks.Keys)
+ con.OutputFormat(" {0}", category);
+ }
+// else
+// {
+// SortedDictionary> category;
+// if (!Registeredchecks.TryGetValue(categoryName, out category))
+// {
+// con.OutputFormat("No such category as {0}", categoryName);
+// }
+// else
+// {
+// if (String.IsNullOrEmpty(containerName))
+// {
+// OutputConfiguredToConsole(con, category);
+// }
+// else
+// {
+// SortedDictionary container;
+// if (category.TryGetValue(containerName, out container))
+// {
+// OutputContainerChecksToConsole(con, container);
+// }
+// else
+// {
+// con.OutputFormat("No such container {0} in category {1}", containerName, categoryName);
+// }
+// }
+// }
+// }
+ }
+ }
+ else
+ {
+ OutputAllChecksToConsole(con);
+ }
+ }
+
+ ///
+ /// Registers a statistic.
+ ///
+ ///
+ ///
+ public static bool RegisterCheck(Check check)
+ {
+ SortedDictionary> category = null, newCategory;
+ SortedDictionary container = null, newContainer;
+
+ lock (RegisteredChecks)
+ {
+ // Check name is not unique across category/container/shortname key.
+ // XXX: For now just return false. This is to avoid problems in regression tests where all tests
+ // in a class are run in the same instance of the VM.
+ if (TryGetCheckParents(check, out category, out container))
+ return false;
+
+ // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed.
+ // This means that we don't need to lock or copy them on iteration, which will be a much more
+ // common operation after startup.
+ if (container != null)
+ newContainer = new SortedDictionary(container);
+ else
+ newContainer = new SortedDictionary();
+
+ if (category != null)
+ newCategory = new SortedDictionary>(category);
+ else
+ newCategory = new SortedDictionary>();
+
+ newContainer[check.ShortName] = check;
+ newCategory[check.Container] = newContainer;
+ RegisteredChecks[check.Category] = newCategory;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Deregister an check
+ /// >
+ ///
+ ///
+ public static bool DeregisterCheck(Check check)
+ {
+ SortedDictionary> category = null, newCategory;
+ SortedDictionary container = null, newContainer;
+
+ lock (RegisteredChecks)
+ {
+ if (!TryGetCheckParents(check, out category, out container))
+ return false;
+
+ newContainer = new SortedDictionary(container);
+ newContainer.Remove(check.ShortName);
+
+ newCategory = new SortedDictionary>(category);
+ newCategory.Remove(check.Container);
+
+ newCategory[check.Container] = newContainer;
+ RegisteredChecks[check.Category] = newCategory;
+
+ return true;
+ }
+ }
+
+ public static bool TryGetCheckParents(
+ Check check,
+ out SortedDictionary> category,
+ out SortedDictionary container)
+ {
+ category = null;
+ container = null;
+
+ lock (RegisteredChecks)
+ {
+ if (RegisteredChecks.TryGetValue(check.Category, out category))
+ {
+ if (category.TryGetValue(check.Container, out container))
+ {
+ if (container.ContainsKey(check.ShortName))
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static void CheckChecks()
+ {
+ lock (RegisteredChecks)
+ {
+ foreach (SortedDictionary> category in RegisteredChecks.Values)
+ {
+ foreach (SortedDictionary container in category.Values)
+ {
+ foreach (Check check in container.Values)
+ {
+ if (!check.CheckIt())
+ m_log.WarnFormat(
+ "[CHECKS MANAGER]: Check {0}.{1}.{2} failed with message {3}", check.Category, check.Container, check.ShortName, check.LastFailureMessage);
+ }
+ }
+ }
+ }
+ }
+
+ private static void OutputAllChecksToConsole(ICommandConsole con)
+ {
+ foreach (var category in RegisteredChecks.Values)
+ {
+ OutputCategoryChecksToConsole(con, category);
+ }
+ }
+
+ private static void OutputCategoryChecksToConsole(
+ ICommandConsole con, SortedDictionary> category)
+ {
+ foreach (var container in category.Values)
+ {
+ OutputContainerChecksToConsole(con, container);
+ }
+ }
+
+ private static void OutputContainerChecksToConsole(ICommandConsole con, SortedDictionary container)
+ {
+ foreach (Check check in container.Values)
+ {
+ con.Output(check.ToConsoleString());
+ }
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.1
From 387d564aadc38c28af78d5b60a3bad57f1a8a2d5 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 24 Aug 2016 07:41:11 +0100
Subject: do similar changes to unused checksManager
---
OpenSim/Framework/Monitoring/ChecksManager.cs | 45 +++++++++++++--------------
1 file changed, 21 insertions(+), 24 deletions(-)
(limited to 'OpenSim/Framework/Monitoring/ChecksManager.cs')
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
index e4a7f8c..ff3b041 100644
--- a/OpenSim/Framework/Monitoring/ChecksManager.cs
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -132,8 +132,8 @@ namespace OpenSim.Framework.Monitoring
///
public static bool RegisterCheck(Check check)
{
- SortedDictionary> category = null, newCategory;
- SortedDictionary container = null, newContainer;
+ SortedDictionary> category = null;
+ SortedDictionary container = null;
lock (RegisteredChecks)
{
@@ -146,19 +146,15 @@ namespace OpenSim.Framework.Monitoring
// We take a copy-on-write approach here of replacing dictionaries when keys are added or removed.
// This means that we don't need to lock or copy them on iteration, which will be a much more
// common operation after startup.
- if (container != null)
- newContainer = new SortedDictionary(container);
- else
- newContainer = new SortedDictionary();
+ if (container == null)
+ container = new SortedDictionary();
- if (category != null)
- newCategory = new SortedDictionary>(category);
- else
- newCategory = new SortedDictionary>();
+ if (category == null)
+ category = new SortedDictionary>();
- newContainer[check.ShortName] = check;
- newCategory[check.Container] = newContainer;
- RegisteredChecks[check.Category] = newCategory;
+ container[check.ShortName] = check;
+ category[check.Container] = container;
+ RegisteredChecks[check.Category] = category;
}
return true;
@@ -171,23 +167,24 @@ namespace OpenSim.Framework.Monitoring
///
public static bool DeregisterCheck(Check check)
{
- SortedDictionary> category = null, newCategory;
- SortedDictionary container = null, newContainer;
+ SortedDictionary> category = null;
+ SortedDictionary container = null;
lock (RegisteredChecks)
{
if (!TryGetCheckParents(check, out category, out container))
return false;
- newContainer = new SortedDictionary(container);
- newContainer.Remove(check.ShortName);
-
- newCategory = new SortedDictionary>(category);
- newCategory.Remove(check.Container);
-
- newCategory[check.Container] = newContainer;
- RegisteredChecks[check.Category] = newCategory;
-
+ if(container != null)
+ {
+ container.Remove(check.ShortName);
+ if(category != null && container.Count == 0)
+ {
+ category.Remove(check.Container);
+ if(category.Count == 0)
+ RegisteredChecks.Remove(check.Category);
+ }
+ }
return true;
}
}
--
cgit v1.1
From 0fd17c08ae642fac17b24dfad06c61cfe5739483 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 20 Aug 2019 23:28:59 +0100
Subject: Massive console refactor. Greatly simplify interface.
---
OpenSim/Framework/Monitoring/ChecksManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
mode change 100644 => 100755 OpenSim/Framework/Monitoring/ChecksManager.cs
(limited to 'OpenSim/Framework/Monitoring/ChecksManager.cs')
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
old mode 100644
new mode 100755
index ff3b041..100b748
--- a/OpenSim/Framework/Monitoring/ChecksManager.cs
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Framework.Monitoring
con.Output("check categories available are:");
foreach (string category in RegisteredChecks.Keys)
- con.OutputFormat(" {0}", category);
+ con.Output(" {0}", null, category);
}
// else
// {
--
cgit v1.1
From b98ad6c53c484aa2744c5040c9f29c475c3d4f72 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 22 Oct 2019 12:23:19 +0100
Subject: remove some useless NULL arguments
---
OpenSim/Framework/Monitoring/ChecksManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Framework/Monitoring/ChecksManager.cs')
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
index 100b748..f719099 100755
--- a/OpenSim/Framework/Monitoring/ChecksManager.cs
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Framework.Monitoring
con.Output("check categories available are:");
foreach (string category in RegisteredChecks.Keys)
- con.Output(" {0}", null, category);
+ con.Output(" {0}", category);
}
// else
// {
--
cgit v1.1
From 237659ba30a2d6a072aae989252a1e6be0423c3c Mon Sep 17 00:00:00 2001
From: onefang
Date: Wed, 9 Sep 2020 00:52:35 +1000
Subject: Remove useless executable bit that Windows adds.
---
OpenSim/Framework/Monitoring/ChecksManager.cs | 0
1 file changed, 0 insertions(+), 0 deletions(-)
mode change 100755 => 100644 OpenSim/Framework/Monitoring/ChecksManager.cs
(limited to 'OpenSim/Framework/Monitoring/ChecksManager.cs')
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
old mode 100755
new mode 100644
--
cgit v1.1