PolyMon 2.x - Suggestions and Ideas

Topics: News & Releases, PolyMon 2.x, User Forum
Apr 1, 2009 at 12:31 PM
Please use this thread to add your ideas, suggestions and wishlists for PolyMon 2.x.
Apr 1, 2009 at 1:52 PM
Hey Fred, I too was very encouraged to hear you on the podcast. I've been kicking myself for missing the live ustream version - I even asked Jonathan in a chat earlier that same day when they were going to have you on, but he missed my question and I didn't follow up. I've been hoping for an update and I'm looking forward to seeing you integrate PolyMon and PolyMonRT.

I've been using PolyMon for 10-12 months and I love it for monitoring one very self-contained portion of my enviornment. We have other tools like Nagios and OpenView, but I'm a Windows guy so Nagios isn't very interesting, and OpenView is... well... OpenView. Over-priced, overly-complex, and it doesn't support PowerShell. In fact, PolyMon is the only monitoring tool I'm aware of that has real PowerShell support.

Anyway - I would love to help out as your work on v2. I've spent a large part of my career on monitoring including some very high-profile products.

In addition to the features you've mentioned that you are working on, here are some I would love to see:

1. Monitored Entities - Generally this is servers, but it could really be anything with an IP address. I'd like to have PolyMon store my list of monitored entities and allow me to associate them with monitors. This way, I can have one monitor for disk space and when it runs it checks disk space on all of the associated servers.

2. Grouping of Entities - When I add a new email server I want to add it to the Email Servers group which is associated with various monitors. Then the new server is automatically monitored just like the current email servers.

3. Discovery of Entities - When I add a new entity to PolyMon, I want the option to have it automatically "discovered". When it is discovered a set of discovery rules are run against it which could be a powershell script, a registry scan, a WMI query, an SNMP get, etc. If the entity matches any of the discovery rules then it is automatically included in the group(s) associated with the discovery rules.

4. Custom dashboard - you should take a look at another CodePlex project - PoshBoard - for some great ideas on building a dashboard. In fact, you may be able to collaborate with the owner of that project.

5. Editing PowerShell scripts - I'd like the ability to associate a PowerShell editor like PowerGUI, PowerShellPlus, or Sapien's new PrimalPad with PolyMon so that I can have a button in the PowerShell monitor called "Edit with PowerGUI" which will open my script in PowerGUI for editing.

6. PowerShell Host name - I'd suggest changing the name of your PowerShell host ($host.name) from "Default MSH Host" to something like "PolyMon". I use this to determine whether my script is running inside PolyMon or not so I can create my own $status variable if I'm running outside of PolyMon when testing.

7. $status.StatusID - I'd like the ability to specify my own StatusIDs and have them be first-class citizens. Meaning I want the ability to set Notification Rules for them and have %Status% in the Notification template work for them.

8. Action Scripts trigger - I'd like the ability to trigger the Action Script only if the Status is Fail. This would save me from having to check the status in the script and prevent it from running needlessly.

9. Action Scripts repetition - I'd like the ability to specify how many times the action script should attempt to run while a monitor is in a particular state. For instance, most times I want the script to run only once when the monitor changes from OK to Fail. The counter should be reset once the monitor goes back to OK. Alternatively, some people may want the ability to run the Action Script ever X minutes while the monitor is in the Fail state.

10. %EventMessage% length - there appears to be a limit to how long the EventMessage can be. When I run a PowerShell script I like to include some data in the EventMessage to provide some context to the administrator. For instance a notification for "CPU over Threshold" might include "get-process | sort CPU -desc | select -first 20". Currently the results are cut off.

Ten is probably enough for now. I have one more that I'll send you directly, because I think it could be a KILLER feature that you may want to keep quiet.

Apr 1, 2009 at 5:06 PM

I love PolyMon most of all for it's Powershell integration. In our shop, PolyMon is tasked with monitoring applications and their processes.

Powershell allows me to whip up system specific tests. i.e. Application X is known to be working only if, this web site can be logged into, there is enough drive space here, such-and-such file was writen, this TCP packet sent to the server returns the correct values, etc. So one PolyMon test will have many individual tests within it. And these tests are written to stand alone outside of PolyMon, not just because it is easier to write and debug them, but we also use these tests as proofs for our test systems and disaster recovery systems.

My feature request (that hasn't already been asked for above) is to make it easier for a Powershell test to work both in and out of Polymon. The best solution I have thought of to do this would be if Polymon could do the following:

 1) Append any calls to Write-Host to the Status Text.
 2) Append any calls to Write-Warning to the StatusText and set the StatusID code to 2.
 3) Append any calls to Write-Error to StatusText and set the StatusID to 3.
 4) Append any Hash Table objects that are output with a numerical value to the StatusCounters hash table.

This request was originally posted to the following thread with a Powershell wrapper workaround:
Apr 3, 2009 at 8:02 AM
Great to here the news. I have usee polymon  monitor about 300 window servers for one year. It works great!
As I see it, the new version will support following:
1. Collect the asset information about the server, expercially monitor the change of hardware
2. An web interface (I am planning)
3. Support the agent on each server monitored. (for security concerned)

and an suggestion for model design:
Seperate the "monitor" table into two part: : one for "monitor definition" and another for relation to server.
Apr 4, 2009 at 12:58 AM
First off, let me say that I have just started using PolyMon, and it is an amazing tool.

I did have one thought about a feature that could be added. This would be to have the ability to make monitors that were subsets of one master monitor, that could have their functions controlled based on the status of the master monitor. That probably makes no sense, so let me give an example.

Let's say I have a remote site across a T1 link, with several servers. I am running a ping-based monitor on against the backside of my router/firewall at the remote site, plus a number of ping-based monitors against the servers in that location. If the link goes down and the ping monitor can no longer hit the router/firewall, I don't need to also get twenty alerts about the servers in that location being down. If the router ping hits failed status, I want the server monitors to suspend until the router ping goes back to OK or warning.

Another example would be if I had a server where I was checking for URL availability, and also running a ping monitor. If the ping monitor fails, I will realize that the server is down, so I don't need to know that the URL is unavailable.

Anyway, whether or not this becomes a feature, PolyMon is a great monitoring package. Thanks for producing it and providing it to us.
Apr 6, 2009 at 2:49 PM
Very glad to see the new roadmap!

I tried Polymon a while ago and could never get SNMP to work on some enterprise devices, I think you had stated the limitation was the SNMP library used.  
That is the feature I would love to see fixed, the only real limitation I ever ran into in my use of Polymon, such a great app!

Apr 8, 2009 at 1:33 PM
Thank you to everyone for all the suggestions to date.
Please keep 'em coming if you have more!!

I have started a mind map of the feature wish list  for PolyMon 2.x.
I have been using the excellent XMind product for this (free version).
You can view the mind map directly in your web browser (without downloading anything)  or download it here:

Please provide feedback and I can make the changes to the mind map.
Thanks again!
Apr 16, 2009 at 12:13 AM
I've been looking at your Data Collection portion of your mind map and am wondering if there isn't an easier way to do multiple threads / multiple services.  My thought is to make the database the threading core.

To do this, there would be a few changes in the database needed.

First, add a new table to queue up monitors.

-MonitorQueueID - identity
-MonitorID   - 123 (from dbo.Monitor)
-PreferedWindowsService  MonServer3 (or maybe null for no preference)

Second, add a task to populate the MonitorQueue based on the desired frequency.  Only add items to the queue if they aren’t there already. (You don’t want CPU for Server1 twice in there.)  The update is to reset any monitors that have been waiting for 5 minutes.  It probably means a hung thread.

Insert MonitorQueue
Select m.MonitorID 
from dbo.Monitor m left join MonitorQueue mq on m.MonitorID = mq.MonitorID
where mq.MonitorID is null
and DATEDIFF(minute, CONVERT(char(10), getdate(), 121), GETDATE() ) % m.TriggerMod = 0

update dbo.MonitorQueue set AssignedService = null, AssignedThread = null, AssignedDate = null
where AssignedDate < dateadd(minute, -5, getdate())

If the query above ran once per minute, then it would always make sure that all triggers would run based on the number of minutes since midnight. 

Third, have each Service/Thread call a stored proc to pull out one Monitor to run.  It would probably have something like the following in it:

begin tran
update dbo.MonitorQueue with (rowlock) 
set AssignedService = 'PolyServer1', AssignedThread = 11, AssignedDate = GETDATE() 
output inserted.MonitorQueueID, inserted.MonitorID
where MonitorQueueID = (select top 1 MonitorQueueID from dbo.MonitorQueue with (readpast, rowlock, xlock) where AssignedDate is null)
commit tran

Forth, once a monitor has been completed have it write the data to the database and delete the MonitorQueue entry based on the MonitorQueueID.

Fifth, have each thread be able to execute any monitor type.  It calls the proc to see which monitor to run and gets 1 monitor back.  It then runs it and puts it back into the database.  Even low end SQL servers should be able to handle 1000s of these per minute.  And a higher end one could handle thousands per second, not just per minute. (I’m working with one that gets about 5000 batches/sec currently on a 4TB+ database.) 

If you did it this way, it would require little in the way of threading code and you would be able to concentrate on other features.  This is really my biggest issue right now with PolyMon.  Realistically if it were just an executable you ran, you could start 20 from jobs or a command line to add more threads.  

Thanks, I hope this gives you some additional ideas on threading.  Most of this was based on the current release of PolyMon, so of course, changes would be needed for the next version.

Apr 22, 2009 at 4:40 PM
Here's a simple suggestion...

A lot of controls in PolyMon Manager make heavy use of gradients.  This is all fine and pretty when you are logged on locally, but when you try to access PolyMon Manager over Remote Desktop over a slow WAN link, it can get extremely frustrating waiting 10 seconds to a minute for the gradients to finish drawing when all you wanted was the Alerts view (or whatever).

It would be awesome if at least the background gradients could be disabled, so RDP can better compress the visual data from PolyMon Manager over Remote Desktop.
Apr 22, 2009 at 4:51 PM
Another suggestion... Change PolyMon's MDI into a TDI (Tabbed Document Interface).  There are some open source solutions that provide this already...


I'm sure there's more.  That was just a quick google.
Apr 23, 2009 at 1:51 PM
Thank you for all the suggestions. Please keep 'em coming!

Regarding TDI framework: Agreed, a TDI type interface would be a much better alternative. Here was another TDI type framework I ran across a while back when looking into this: sourceforge.net/projects/dockpanelsuite

Regarding gradients: Yes, I also suffer from the RDP refresh rates :-) I think individual controls/charts may be able to leverage gradients, but background gradients definitely have to go.

Regarding multi-threading: I looked at multi-threading a while back and that would not present a huge or time consuming challenge. However I agree that the idea of having the database queue up monitor activities is a good one. In view of the full scheduler planned for PolyMon that is probably the way it should be done anyway.

Thanks again for the feedback. If you're interested in how things are going please don't forget to also check my blog (at polymon.blogspot.com).
Apr 23, 2009 at 7:15 PM
Yes, Control Gradients are fine.  It's the backgrounds that kill me.  Part of the problem is that (some of?) the background gradients are a radial gradients.  So actually, RDP compresses that very poorly because essentially every pixel in the background area changes color before going to the next pixel in the X or Y direction.  Horizontal or vertical gradients are slower than a flat background, but are acceptible because an entire line in the X or Y direction is the same color.  I think that's why the foreground gradients appear quicker than the background gradients.

As for DockPanelSuite... I tried that once a long time ago for my app, RD Tabs, when I was trying to introduce a more advanced tab management system and replace the standard tab control.  I had forgot the name and would have included it if I could have remembered! 

I should let you know though, that I ended up rolling my own solution because DockPanel kept crashing my application... frequently!  But that might have just been my app and, again, this was about two years ago, so DockPanel (if it had bugs) may be a lot more stable.
May 22, 2009 at 4:42 AM

Hi Fred,

Here's another couple of suggestions:

* Priority*
Currently I forward all email notifications through one of my email systems where the email priority for major and critical alerts is set to High, the priority for clear and information is set to Low and the priority for warning and minor is left alone.

By doing this when I receive an email in Outlook or on my Windows Mobile phone I can easily tell if it's something I need to deal with immediately based on the priority. I don't even have to open the email right then if it's low or normal priority.

This is very easy to implement. All that is required is adding an additional header to the email named x-priority.
High priority is
        x-priority: 1
Low priority is
        x-priority: 4

While this may not work in all email clients, they would just ignore the extra header and it shouldn't cause any problems.

* Conversation *
In addition, one commonly used client, Outlook, supports a view of messages where they are arranged by conversation rather than date. This allows me to view all emails of a related thread in one place and quickly jump to the most recent email in the thread to see what is going on.

I haven't tested it, but it may be possible for PolyMon to specify the conversation id in the header. If so, then in the email conversation view users would see the oldest notification followed by newer notifications. This would make it MUCH easier to quickly determine which (if any) problem notifications don't have corresponding clear notifications so the administrator can respond if necessary, or just keep sipping his beer.

There are two different methods I know of for tagging an email as part of a conversation. Outlook Express, Netscape and some Unix clients follow RFC standard that uses a "References" header. MS Outlook, Exchange and OWA use a "Thread-index" header.

Again, it should be pretty trivial for PolyMon to support this, but it would provide a lot of bang for the buck in terms of reducing the time admins need for triaging notifications when they are away from the PolyMon console.



Jun 18, 2009 at 2:14 PM

A couple things:


1.  I second the earlier motion about SNMP being stable.  I've just created my first monitors on it, and it can be problematic.  I find that increasing the timeout to a very high value (15000 ms) helps somewhat.  

2.  Ability to suspend a monitor for a predefined period of time.  When something goes down, and I know it's down, and it won't be back for x hrs, I'd like to be able to suspend the monitor.  If I disable it, I have to remember to go back later....



Jun 23, 2009 at 12:48 PM

Just one thing for now. Keep the simplicity of plugin development.

I havent gotten into PoSH yet but writing a customized Monitor was dead simple. I needed to collect hard drive space used for all fixed logical drives so the regular WMI Monitor didnt cut it. 30 lines of C# later and I'm adding a Counter with space used for each volume.



Jun 23, 2009 at 1:57 PM
Edited Jun 23, 2009 at 1:59 PM

And another thing, separate presentation and data management tasks in the manager and make an API out of the data management tasks for us to use. I had 40 machines to add, each with 4 monitors. Right now I'm doing something so ugly that I'm not sure I want to show it but here goes:

static void CopyMonitor(string copyfrom, string hostname, string service)
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["SQLConn"]);
    string query = "select MonitorID from Monitor inner join MonitorType on Monitor.MonitorTypeID = MonitorType.MonitorTypeID where Monitor.Name = @monitorname";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.Parameters.Add("@monitorname", SqlDbType.VarChar, 50).Value = copyfrom;
    int monitorId = (int)cmd.ExecuteScalar();

    PolyMon.Monitors.MonitorMetadata currentMonitorDef = new PolyMon.Monitors.MonitorMetadata(monitorId);
    currentMonitorDef.MonitorName = service;
    currentMonitorDef.MonitorXMLString = System.Text.RegularExpressions.Regex.Replace(currentMonitorDef.MonitorXMLString, "<Host>(.*?)</Host>",
string.Format("<Host>{0}</Host>", hostname)); Type type = currentMonitorDef.GetType(); System.Reflection.FieldInfo fieldInfo = type.GetField("mIsNewInstance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); fieldInfo.SetValue(currentMonitorDef, true); currentMonitorDef.Save(); }

MonitorMetadata was quite easy to follow but seems rather tied to the form that manages it. Especially the way the form fields are used to clone instances.

Is there any way I can help?


Aug 13, 2009 at 7:52 AM
Edited Aug 13, 2009 at 8:31 AM
  1. More alert types - Instant Messaging, exec powershell script
  2. Monitor dependencies -
    mikep554 wrote:
    Let's say I have a remote site across a T1 link, with several servers. I am running a ping-based monitor on against the backside of my router/firewall at the remote site, plus a number of ping-based monitors against the servers in that location. If the link goes down and the ping monitor can no longer hit the router/firewall, I don't need to also get twenty alerts about the servers in that location being down. If the router ping hits failed status, I want the server monitors to suspend until the router ping goes back to OK or warning.
  3. Better SNMP support - How about using the libraries from #SNMP
  4. A web version of PolyMon Manager
  5. Basic REST/SOAP services for integration into existing websites (Eg. for users who are working at a web hosting company so they can display a the network status on their site)

Otherwise great work guys.



Aug 21, 2009 at 2:29 PM

Consider changing from cycles to minutes. Right now I have my cycle time set to a minute, so when I setup a new monitor I enter into the number minutes to elapse before checking again in the cycle field. The tricky part is the notification rules, notify every X tests which happen every Y cycles. I understand this and am getting used to doing the math every time I add or review a test, but it confuses my co-workers who rarely use PolyMon.



Sep 14, 2009 at 1:11 AM

I'd vote for a web interface.

We have multiple sites that do monitoring and a single web site for monitoring definition and status would be great.


Sep 30, 2009 at 11:34 AM

At the moment the monitoring host has to have IP access to the system being monitored. Have you thought about the possibility of a remote agent? This could connect to something like a webservice and pull down commands to be ex excuted and return the results via the same webservice, or something similar.  

This is useful when you want to monitor or remotely manage a clients system but where you don't want or can't setup and maintain a vpn connection  to do remote admin. 

It would also be interesting to be able to 'package' monitors. While you can monitor most things via Wmi, the majority of it is of little interest but certain counters are commonly of interest - disk response times, available memory, etc.

Have you also considered functionality to be able to remotely execute scripts on a one off basic (say to force install a certain security patch, or modify the registry on all systems in a group)?



Jan 14, 2010 at 9:14 PM

Adding the capability to send out a page or a txt message would be good.

Jul 26, 2011 at 2:39 PM
Edited Jul 26, 2011 at 2:47 PM

First THANK YOU for this application.  We've only been testing it for a week and it's given us a lot of visibility in our SharePoint environment.  A request I have would be to add authentication information to the URL check.  We don't have anonymous configured so we'd need to login with a domain account.  Also hopefully it works with SSL.

Second, in testing I setup a lot of monitors.  When I take it to production I'd love to have an export / import option to configure a new environment.

And finally, a bit of an odd request not sure if others have a similar use case.  I'd like to be able to monitor the size of a page.  We have a separate team that handles the content on the page and it's not unusual for them to sometimes forget to scale down images and we'll have page sizes exceeding 3-5mb which greatly affects global performance.  A URL page size check?

Aug 17, 2011 at 2:26 AM

this is a important soft for me. i want 2.0 include :

1)tree style groups

2)use MEF make extentend UI, Monitor. Agent, Addin, etc.

3)use c# to program (if possible).

4)we also need scan host, port.

5)like jnetmap(another), Analysis net and draw graphic (include switch port) 




Sep 9, 2012 at 8:20 AM

I have a couple of suggestions; version 2.0 should support Windows 8 and SQL server 2012.