Group status bullseye style charts

Here's the source code/implementation from this discussion. Our NOC team really liked these bullseye-style graphs from another application. I re-created them for Solarwinds.

Update: Pie chart lovers can find a version of this with pie charts over here.

Prequisites

  • You must know the Group ID of the group you wish to display in the chart. The easiest way to find this is to go to the details page for the group and get the group number from the end of the URL. E.g. if the URL is https://solarwinds.yourcompany.com/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:69, the group ID is 69.
  • SQL Server 2012 or newer. If you have an older version of SQL Server, see the note about "Older versions of SQL Server" at the end of this document.

Installation

  1. Download and unzip the attached archive.
  2. Copy GroupMemberAggregateStatus.aspx, GroupMemberAggregateStatus.aspx.cs, and globe.png to <Solarwinds install volume>\InetPub\SolarWinds\Orion\NetPerfMon\ .

Implementation

  1. On your Solarwinds NOC view page, click "Customize Page" in the page's upper right corner.
  2. Add a new Custom HTML resource and save your changes.
  3. Find the new Custom HTML resource on the page and click the "EDIT" box in the resource's upper right corner.
  4. Fill in the Title and Subtitle fields as you wish and check the "Use synchronous loading" box.
  5. Copy and paste the HTML below into the (unlabeled) URL field.

    <iframe scrollbars="none" height="170px" width="100%" src="/Orion/NetPerfMon/GroupMemberAggregateStatus.aspx?ContainerID=GROUPID" ></iframe>

    Replace GROUPID in the URL with the ID number of the group you want to display. Your resource, when completely filled in, will look similar to this:
    pastedImage_11.png
  6. Click "Submit" to save your changes.

Example of a page with several charts

NOC_view.jpg

Older versions of SQL Server

If your installation uses a version of SQL Server older than SQL Server 2012, you must edit GroupMemberAggregateStatus.aspx.cs. Find both instances of the string

concat('/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',C.ContainerID)

and replace it with

'/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:'+cast(C.ContainerID as varchar)

This will continue to work after you upgrade to SQL Server 2012.

GroupMemberAggregateStatus.zip
  • Good question. I wouldn't expect smart card authentication to have anything to do with it. On the off chance that it's affecting the handling of URLs, what happens if you replace

    <iframe src="/Orion.....>

    with

    <iframe src="https://sarahv2/Orion...>

    FWIW, at one point I had servers named Abe, Sylvia, Naftule, and Dave. I like klezmer music.

  • What happens if you run these two queries in the Orion Database Manager app? These are the queries that drive the display.

    SELECT concat('/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',C.ContainerID) as detailsURL, C.Name, C.ContainerID, C.Status

    FROM Containers C

    WHERE C.ContainerID='1'

    SELECT GroupStatusSummary.Name as GroupName, SI.ShortDescription as Status,

    SI.StatusID as StatusID, GroupStatusSummary.detailsURL as detailsURL,

    '/Orion/images/StatusIcons/Small-' + SI.IconPostFix + '.gif' AS Icon,

    CASE

      WHEN GroupStatusSummary.CountStatus IS NULL THEN 0

      WHEN GroupStatusSummary.CountStatus IS NOT NULL THEN GroupStatusSummary.CountStatus 

    END as CountStatus,

    GroupStatusSummary.detailsURL as [_Linkfor_CountStatus]

    FROM StatusInfo SI LEFT OUTER JOIN

    (

      SELECT concat('/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',C.ContainerID) as detailsURL ,

      CMS.Status,

      Count(CMS.Status) AS CountStatus,

      C.Name

      FROM Containers C

      INNER JOIN ContainerMemberSnapshots CMS on C.ContainerID = CMS.ContainerID

      WHERE C.ContainerID='1'

      GROUP BY C.ContainerID, C.Name, CMS.Status

    ) GroupStatusSummary on SI.StatusID = GroupStatusSummary.Status

    WHERE SI.StatusID IN (0,1,2,3,14,17)

    ORDER BY SI.StatusID DESC

  • Did you place the files in the Inetpub/Solarwinds/Orion directory? 

  • So I tried: <iframe scrollbars="none" height="170px" width="100%" src="https://sarahv2/Orion/NetPerfMon/GroupMemberAggregateStatus.aspx?ContainerID=1" ></iframe> but I got the same error.

  • The first query returns:

    Msg 195, Level 15, State 10, Line 1

    'concat' is not a recognized built-in function name.

    Msg 195, Level 15, State 10, Line 1

    'concat' is not a recognized built-in function name.

    The second query returns:

    Msg 195, Level 15, State 10, Line 11

    'concat' is not a recognized built-in function name.

    Msg 195, Level 15, State 10, Line 11

    'concat' is not a recognized built-in function name.

  • OK, I think we're getting somewhere. What version of SQL Server do you have? The concat() function is new in SQL Server 2012.

    If you're using an older version of SQL Server, try replacing the references to concat() with '/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:'+cast(C.ContainerID as varchar) .

    The first query would be:

    SELECT '/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:'+cast(C.ContainerID as varchar) as detailsURL, C.Name, C.ContainerID, C.Status

    FROM Containers C

    WHERE C.ContainerID='1'

    The second query would be:

    SELECT GroupStatusSummary.Name as GroupName, SI.ShortDescription as Status,

    SI.StatusID as StatusID, GroupStatusSummary.detailsURL as detailsURL,

    '/Orion/images/StatusIcons/Small-' + SI.IconPostFix + '.gif' AS Icon,

    CASE

      WHEN GroupStatusSummary.CountStatus IS NULL THEN 0

      WHEN GroupStatusSummary.CountStatus IS NOT NULL THEN GroupStatusSummary.CountStatus

    END as CountStatus,

    GroupStatusSummary.detailsURL as [_Linkfor_CountStatus]

    FROM StatusInfo SI LEFT OUTER JOIN

    (

      SELECT '/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:'+cast(C.ContainerID as varchar) as detailsURL ,

      CMS.Status,

      Count(CMS.Status) AS CountStatus,

      C.Name

      FROM Containers C

      INNER JOIN ContainerMemberSnapshots CMS on C.ContainerID = CMS.ContainerID

      WHERE C.ContainerID='1'

      GROUP BY C.ContainerID, C.Name, CMS.Status

    ) GroupStatusSummary on SI.StatusID = GroupStatusSummary.Status

    WHERE SI.StatusID IN (0,1,2,3,14,17)

    ORDER BY SI.StatusID DESC

    If these work, let me know and I'll rework the code for you.

  • Now this could be an issue if it is specifically looking for that path. Once upon a time, SW support had me rebuild the web site and rename it. Thus the path for me is: Inetpub/SolarWinds1/Orion

  • yeah, irishjd​, you have to be careful going outside the standards.  Having the "1" in there may be interested at times.  When was the last time the server was rebuilt?   

    Regardless, place the files down in there inside the NetPerfMon folder and refresh your browswer.

  • I just rebuilt the web site to /Inetpub/SolarWinds/, copied the files to the correct location, changed the src reference back to /Orion/NetPerfMon/... but I am still getting the same error.

  • Did you see my question about the database version? Can you try the modified scripts and tell me if they work? The resource may be failing because the SQL queries aren't returning useful data.