March, 2007

  • musc@> $daniele.work.ToString()

    MOM 2005 Alerts to RSS feed

    • 0 Comments

    I am an RSS Addict, you know that.So I wanted an RSS Feed to show MOM Alerts. I have been thinking of it for a while, last year (or was it the year before?).
    It seemed like a logical thing to me: alerts are created (and can be resolved - that is, expire), generally get sorted by the date and the time when they have been created, the look pretty much like a list. Also, many people like to receive mail notification when new alerts are generated.
    So, if the alert can be sent to you (push), you could also get to it(pull).
    Pretty much the same deal with receiving a mail or reading a newsgroup, or syndicating a feed.

    At the time I looked around but it seemed like no one had something like this already done.
    So I wrote a very simple RSS feed generator for MOM Alerts.
    I did it quite an amount of time ago, just as an exercise.
    Then, after a while, I figured out that the MOM 2005 Resource Kit had been updated to include such a utility!

    Wow, I thought, they finally added what I have been thinking for a while. Might it be because I mentioned it on an private Mailing list ? Maybe. Maybe not. Who cares. Of course, if it is included in the resource kit it must be way cooler than the one I made, I though.
    I really thought something along these lines, but never actually had the time to try it out.
    I think I just sort of assumed it must have been cooler than the one I made, since it was part of an official package, while I am not a developer. So I basically forgot about the one I wrote, dismissing it as being crap without looking too much into it anymore.
    Until today.
    Today I actually tried to use the alert to RSS tool included in the resource kit, because a customer asked if there was any other way to get notified, other than receiving notification or using the console (or the console notifier).
    So I looked at the resource kit's Alert-to-RSS Utility.
    My experience with it:
    1) it is provided in source code form - which is ok if it was ALSO provided as source. Instead it is ONLY provided as source, and most admins don't have Visual Studio installed or don't know how to compile from the command line;
    2) Even when they wanted to compile it, it includes a bug which makes it impossible to compile - solution in this newsgroup discussion;
    3) if you don't want to mess about with code since you are using a resource Kit tool (as opposed to something present in the SDK) you can even get it already compiled by someone from somewhere on the net, but that choice is about trust.

    Anyway, one way or another, after it is finally set up.... surprise surprise!!!
    It does NOT show a LIST of alerts (as I was expecting).
    It shows a summary of how many alerts you have. basically it is an RSS feed made of a single item, and this single item tells you how many alerts you have. What is one supposed to do with such a SUMMARY? IMHO, it is useless the way it is. It is even worse than one of those feed that only contains the excerpt of the article, rather than the full article.
    Knowing that I have 7 critical errors and 5 warning without actually knowing ANYTHING of them is pointless.
    It might be useful for a manager, but not for a sysadmin, at least.

    So I thought my version, even if coded crap, might be useful to someone because it gives you a list of alerts (those that are not resolved) and each one of them tells you the description of the alert, the machine tat generated it, and includes links to the actual alert in the web console, so you can click, go there, and start troubleshooting from within your aggregator!
    My code does this. Anyway, since I am a crap coder, since I wrote it in only fifteen minutes more than a year ago, and since I don't have time to fix it and make it nicer... it has several issues, and could be improved in a million ways, in particular for the following aspects:

    1. is currently depends on the SDK Database views - it could use the MOM Server API's or the webservice instead;
    2. it uses SQL Security to connect to the DB - by default MOM does not allow this - it is suggested for the SQL instance hosting "OnePoint" to only use Windows Integrated Authentication.. so to make my code work you have to switch back to Mixed mode, and create a login in SQL that has permission to read the database. This is due to the fact that I've coded this in five minutes and I don't know how to use delegation - if I was able to use delegation, I would... so that the end user accessing IIS would be the one connecting to the DB. If anybody wants to teach me how to do this, I will be most grateful.
    3. it could accept parameters as URL variables, so to filter out only events for a specific machine, or a specific resolution state, etc etc
    4. At present it uses RSS.Net to generate the feed. It could made independent from it, but I don't really see why, and I quite like that library.

    The code is just an ASP.Net page and its codebehind, no need to compile, but of course you need to change a couple of lines to match your webconsole address.
    Also, you need to get RSS.NET and copy its library (RSS.Net.dll) in the /bin subfolder of the website directory where you place the RSSFeed generator page. I see that I wrote this with version 0.86, but any version should do, really.

    Here is what it will look like:

    AlertToRSS

    And here's the code of the page (two files):

    Default.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    Default.aspx.cs

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Web;
    using Rss;

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    string webconsoleaddress = "http://192.168.0.222:1272/AlertDetail.aspx?v=a&sid=" // must change to match your address

    // Inizializza il Feed
    RssChannel rssChannel = new RssChannel();
    rssChannel.Title = "MOM Alerts"
    rssChannel.PubDate = DateTime.Now;
    rssChannel.Link = new Uri("http://192.168.0.222:1272/rss/"); // must change to match your address
    rssChannel.LastBuildDate = DateTime.Now;
    rssChannel.Description = "Contains the latest Alerts"

    // query - you might want to change the severity
    string mySelectQuery = "SELECT ComputerName, Name, Severity, TimeRaised, RepeatCount, GUID FROM dbo.SDKAlertView WHERE Severity > 10 AND ResolutionState < 255"

    // SQL Connection – must change SQL server, user name and password
    SqlConnection conn = new SqlConnection("Data Source=192.168.0.222;Initial Catalog=OnePoint;User ID=rss;Password=rss");
    SqlDataReader rdr = null;

    try
    {
    conn.Open();
    SqlCommand cmd = new SqlCommand(mySelectQuery, conn);
    rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
    RssItem rssItem = new RssItem();
    string titleField = rdr[1].ToString();
    rssItem.Title = titleField;
    string url = webconsoleaddress + rdr[5];
    rssItem.Link = new Uri(url.ToString());
    string description = "<![CDATA[ <p><a xhref=\"" + rssItem.Link + "\">" + rdr[1] + " </a></p><br>" + "<br>Computer: " + rdr[0] + "<br>Repeat Count: " + rdr[4] + "<BR>Original ALert Time: " + rdr[3];
    rssItem.Description = description;
    rssChannel.Items.Add(rssItem);
    }

    // Finalizza il feed
    RssFeed rssFeed = new RssFeed();
    rssFeed.Channels.Add(rssChannel);
    Response.ContentType = "text/xml"
    Response.ExpiresAbsolute = DateTime.MinValue;
    rssFeed.Write(Response.OutputStream);
    }
    finally
    {
    if (rdr != null)
    {
    rdr.Close();
    }

    if (conn != null)
    {
    conn.Close();
    }
    }
    }
    }

Page 1 of 1 (1 items)