Quantcast
Channel: THWACK: Document List - Network Performance Monitor
Viewing all 1956 articles
Browse latest View live

Group Status (swql, sql)

$
0
0

Groups are useful in pulling together similar information.   For example for an application we can put in the nodes, interfaces, volumes, luns, and other aspects of a application.

The bad part is that we can’t display this in a clean way.   The All groups widget has no filter.  A way around this is to use a group custom property and tag the groups.   For example, all application groups have been tagged with isApp=1.

 

Now it’s a simple matter of displaying the status of the apps (swql).

 

SELECT

g.name as [Application]

,concat('/Orion/images/StatusIcons/Small-', g.StatusDescription,'.gif') AS [_IconFor_Application]

,concat('/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',g.ContainerID) as [_linkfor_Application]

,gs.total as [Total]

,gs.up as [Up]

,case when gs.up>0 then '/Orion/images/StatusIcons/Small-up.gif' end as [_Iconfor_Up]

,gs.warning as [Warning]

,case when gs.warning>0 then '/Orion/images/StatusIcons/Small-warning.gif' end as [_Iconfor_Warning]

,gs.critical as [Critical]

,case when gs.critical>0 then '/Orion/images/StatusIcons/Small-critical.gif' end as [_Iconfor_Critical]

,gs.down as [Down]

,case when gs.down>0 then '/Orion/images/StatusIcons/Small-down.gif' end as [_Iconfor_Down]

 

 

FROM Orion.Groups g

join (

SELECT

cm.ContainerID

,count(*) as [total]

,sum(case when cm.Status=1 then 1 else 0 end) as [up]

,sum(case when cm.Status=3 then 1 else 0 end) as [warning]

,sum(case when cm.Status=14 then 1 else 0 end) as [critical]

,sum(case when cm.Status=2 then 1 else 0 end) as [down]

FROM Orion.ContainerMembers cm

group by cm.ContainerID

order by cm.ContainerID asc

) gs on gs.containerid=g.ContainerID

 

 

where g.CustomProperties.isApp=1

order by g.Name

 

 

This is good, but still takes up too much screen real estate.  I wanted something concise and to the point – without the need for any scrolling.  Unfortunately, swql does not have the proper constructs – we’ll have to resort to sql.

select 

max(column1) as C1,

max(column2) as C2,

max(column3) as C3,

max(column4) as C4

from (

select linenumber

,case colnumber when 1 then node else NULL end as column1,

case colnumber when 2 then node else NULL end as column2,

case colnumber when 3 then node else NULL end as column3,

case colnumber when 4 then node else NULL end as column4

from

(select concat('<img src="/orion/images/statusicons/Small-',si.StatusName,'.gif"/>',

'<a href="/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',cast(tmp.ContainerID as varchar),'">',tmp.Name+'</>') [Node]

,((rownumber-1) / 4) + 1 as linenumber

,((rownumber-1) % 4)+1 as colnumber

from (select c.name, c.ContainerID, c.status,rownumber = ROW_NUMBER() over (order by c.name asc) from Containers c join ContainerCustomProperties cp on cp.ContainerID=c.ContainerID where cp.isApp=1) tmp 

join StatusInfo si on si.StatusId=tmp.Status) tmp1

group by linenumber, tmp1.colnumber, tmp1.node) tmp2

group by tmp2.linenumber

 

For a NOC view, it's going to be simplified.  They don't need to know the memory or other issues.  Just is the group up or not.

select 

max(column1) as C1,

max(column2) as C2,

max(column3) as C3,

max(column4) as C4

from (

select linenumber

,case colnumber when 1 then node else NULL end as column1,

case colnumber when 2 then node else NULL end as column2,

case colnumber when 3 then node else NULL end as column3,

case colnumber when 4 then node else NULL end as column4

from

(select

case when tmp.Status=1 then

concat('<img src="/orion/images/statusicons/Small-Up.gif"/>',

'<a href="/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',cast(tmp.ContainerID as varchar),'">',tmp.Name+'</>')

else

concat('<img src="/orion/images/statusicons/Small-Down.gif"/>',

'<a href="/Orion/NetPerfMon/ContainerDetails.aspx?NetObject=C:',cast(tmp.ContainerID as varchar),'">',tmp.Name+'</>')

end as [Node]

,((rownumber-1) / 4) + 1 as linenumber

,((rownumber-1) % 4)+1 as colnumber

from (select c.name, c.ContainerID, c.status,rownumber = ROW_NUMBER() over (order by c.name asc) from Containers c join ContainerCustomProperties cp on cp.ContainerID=c.ContainerID where cp.isApp=1) tmp 

join StatusInfo si on si.StatusId=tmp.Status) tmp1

group by linenumber, tmp1.colnumber, tmp1.node) tmp2

group by tmp2.linenumber

 

Thank you,

amit


F5 - vCMP

How-To: Insert Google Charts within Custom HTML

$
0
0

So a member of my team was working on a customer request where they wanted the default 'Network Wide Availability Chart' to show the values plotted on the chart so that when it was exported to PDF for management presentations they could see the actual numbers. Now, this isn't something SolarWinds is able to do out of the box. So we had to think "outside the box". After a quick chat with a fellow MVP wluther we came to the conclusion we could use Google Charts to accomplish this.

 

The end result should look something like this:

 

Multiple Charts Per Widget:

 

Multiple Widgets Per Page

 

 

If you too would like to be able to have something similar to this then I have some good news for you, adding this to your own platform is pretty simple. Here is how:

 

 

This mod was performed on Orion Platform 2018.4 HF3, NPM12.4

WHAT DO YOU NEED?

  1. Access to manage views in your Orion environment
  2. The "Custom HTML" resource added to a view
  3. A working method to copy text from one of the attached files
  4. A working method to paste text, copied in #3 above, into a custom HTML resource, from #2 above.

 

 

Before we begin, (while the following is certainly a good practice, it actually doesn't apply to this customization, for once.)

 

PLEASE don't edit the system files/database without backing them up first.

 

     STEPS:

 

     -Download/Open the attached file.

     -Log in to your Orion environment.

          -Navigate to the "Custom HTML" resource you want to display the calendar.

               -Click Edit.

     -Copy the contents of the attached file.

     -Paste the contents of the attached file into the "Custom HTML" resource you have opened to edit.

     -Click to save the resource edit.

     -Enjoy your new Availability dashboard.

 

** If you decide to use the 2 individual widget charts and you want them on the same page, you need to remove Line 3 (Below) from any additional widgets after the first one (You only need it once per page).

 

<SCRIPT TYPE="text/javascript" src="https://www.gstatic.com/charts/loader.js"></SCRIPT>

 

This is in essence, just a simple Vertical Bar Chart using an SWQL Source to populate the data. If you want to present different data then just go ahead and update the query, and the chart should reflect it too. The query I used was situational, and could easily be updated to add filters or provide additional or totally different data. The two queries I used are as follows:

 

SELECT
SUBSTRING(TOSTRING(DATETRUNC('Day',DATETIME)),0,8) AS [Day]
,ROUND(AVG(Availability),2) AS [Average]
,TOSTRING(ROUND(AVG(Availability),0)) AS [Label]
,CASE WHEN AVG(Availability) <= 85 THEN 'Red' WHEN AVG(Availability) < 90 THEN 'Yellow' ELSE 'Green' END AS [State]
    FROM Orion.ResponseTime WHERE (MONTHDIFF(DATETIME,(GETUTCDATE()))=1)
    GROUP BY DATETRUNC('DAY',DATETIME) ORDER BY [Day]

 

AND

 

SELECT
CONCAT(SUBSTRING(TOSTRING(DATETRUNC('MONTH',DATETIME)),1,4),SUBSTRING(TOSTRING(DATETRUNC('MONTH',DATETIME)),8,4)) AS [Month]
,ROUND(AVG(Availability),2) AS [Average], TOSTRING(ROUND(AVG(Availability),2)) AS [Label]
,CASE WHEN AVG(Availability) <= 85 THEN 'Red' WHEN AVG(Availability) < 90 THEN 'Yellow' ELSE 'Green' END AS [State]
    FROM Orion.ResponseTime WHERE (YEARDIFF(DATETIME,(GETUTCDATE()))=0)
    GROUP BY DATETRUNC('MONTH',DATETIME) ORDER BY DATETRUNC('MONTH',DATETIME) ASC

SELECT

 

Again I would like to say a massive thank you to wluther for working on this for me, and also KMSigma for dropping a small bombshell on us both to help with a small change that can make a large improvement - This was how to enable multiple widgets to load on a single view. Not to mention of course the entire MVP Crew for supporting a new MVP like me

 

 

LINKS TO OTHER GOODNESS:

 

Here are a few links to other related posts that contain similar work which will hopefully help inspire you as they did me:

 

Here are various examples from wluther

The very first version of Google Charts examples, which is a calendar with dynamic pie charts and table data. Using Your Custom HTML Resource To Properly Display SWQL Query Results

Here is an example of just the Timeline chart. Using Your Custom HTML Resource To View Events On A Timeline

Here is an example of showing simple table data. How-To: Insert Google Charts (Table Data) within Custom HTML

Here is an example of a Google Pie chart. How-To: Insert Google Charts (Pie Chart) within Custom HTML

 

Here is an example from jhaas, showing how to track outages on a Calendar and dynamic Timeline chart. Interactive Node Outage tracker 

Here is an example from elevate, showing how to do a Google Pie chart. Google Charts | Pie Charts

  

For more ways to customize your SolarWinds environment, make sure to check out this link, by CourtesyIT - How to do various customizations with your Solarwinds

 

 

 

Thank you

 

-David

Neighbor Status (swql)

$
0
0

I didn't see a widget for Neighbor Status - so here's one in swql:

 

 

SELECT

TOUPPER(SUBSTRING(n.caption,1,case when charindex('.',n.caption,1) <=4

then length(n.caption) else (charindex('.',n.caption,1)-1) end)) as [Node]

,n.DetailsUrl AS [_LinkFor_Node]

,'/Orion/images/StatusIcons/Small-' + n.StatusIcon AS [_IconFor_Node]

,case when nn.Caption is not NULL then nn.Caption else rn.NeighborIP end as [Neighbor]

,case when nn.Caption is not NULL then nn.DetailsUrl end as [_LinkFor_Neighbor]

,case when nn.Caption is not NULL then concat('/Orion/images/StatusIcons/Small-',nn.StatusIcon) end as [_IconFor_Neighbor]

,rn.ProtocolName as [Protocol]

,case when rn.ProtocolStatusLED=1 then '/Orion/images/StatusIcons/Small-Up.gif'

      when rn.ProtocolStatusLED=2 then '/Orion/images/StatusIcons/Small-Down.gif' end as [_iconfor_Protocol]

,rn.AutonomousSystem as [Remote AS]

,case when rn.ProtocolStatusDescription is NULL then 'N/A' else rn.ProtocolStatusDescription end as [Status]

,rn.LastChange

FROM Orion.Routing.Neighbors rn

join Orion.nodes n on n.nodeid=rn.nodeid

left join Orion.NodeIPAddresses nip on nip.IPaddress=rn.NeighborIP

left join Orion.Nodes nn on nn.nodeid=nip.nodeid

where rn.IsDeleted='False'

Order by rn.ProtocolStatusLED desc

 

Thank you,

Amit

SWQL - Active Alerts Report

SAML Single Sign-on

$
0
0

For several years now there has been a growing industry trend towards consolidating user authentication mechanisms by integrating applications into a single sign-on solution. This has the benefit of allowing end-users to authenticate to a variety of different applications throughout the organization using a single set of credentials. For end-users, the benefit is obvious. One set of credentials to remember, regardless of which application they're authenticating to. For the organization though, providing your users with a seamless and transparent single sign-on solution has tremendous security benefits. The first being one security password policy to enforce. Different applications typically implement their own unique password complexity requirements and password expiration policies that are essentially impossible to synchronize across various autonomous systems. The end result is usually either passwords being written down on sticky notes and 'hidden' under keyboards, or routine and unnecessary calls made to the helpdesk to reset passwords for end-users. For these reasons and others, we have received countless requests from people just like you throughout the last few years, requesting Orion support an open standards method of single sign-on.

 

SAML (Security Assertion Markup Language) being the industry standard, was the most oft-requested solution, as there is a wide variety of commercial, free, and open source solutions already available, implemented, and operating in customer environments today. Many of these SAML providers offer the additional added security benefit of supporting multi-factor authentication, such as hardware or software tokens, biometrics such as fingerprints, or facial recognition, and even two-step authentication via cellular using SMS text messages or native mobile apps. Supporting multi-factor authentication has been another frequently requested feature we've also been eager to deliver upon, and with the addition of SAML support to the Orion Platform, this could now become a reality. To that end, this release of NPM 12.4 includes native out-of-the-box support for SAML 2.0 authentication, allowing users to leverage their single sign-on credentials to authenticate to the Orion web console, regardless of the type of credentials used.

 

The following steps outlined below will walk you through how to utilize SAML authentication with Orion. For demonstration purposes, I'll be using Okta as my SAML provider, though you could use ADFS (Active Directory Federation Services) or virtually any other SAML 2.0 provider. The instructions assume you already have Okta installed, running, and users created.

 

 

 

Verify Ports are Open

 

Once you have NPM 12.4 installed in your environment, ensure the Orion server can access Okta by opening a browser on your Orion server and logging into the Okta web interface. This will ensure any ports required between Okta and the Orion server are open. Similarly, you also want to verify your client workstations are also able to access both the Orion web interface, as well as the Okta web portal.

 

Configuring Okta

Create Okta Application

 

1. Once you've verified all necessary ports are opened, you'll want to login to Okta and click 'Admin' from the top menu to access the Okta management interface.

 

2. Click the carrot next to 'Developer Console' if available to expose a drop-down menu. Select 'Classic UI' from the list to switch to the Okta classic interface

 

3. Next, From the Administration page, click 'Applications' from the top menu bar. A drop-down menu will appear. Click on 'Applications' from the list.

 

4. On the 'Applications' page, click 'Add Application'.

 

5. Next, click 'Create New App' on the 'Add Application' page

 

6. Select 'SAML 2.0' from the list of available Sign on methods and click 'Create'.

 

7. In the 'General Settings' step, enter a name for your Orion application in the field next to 'App Name'  I named my application 'aLTeReGo's Orion'.

At this point, you can add an optional Icon that will appear when the user accesses this application directly from within Okta's web portal. If you're looking for an App logo icon, I'm somewhat partial to the one below. Once you've entered a name for your new Okta application click 'next'.

 

7. Open another browser window or tab to obtain your 'Single sign-on URL' and 'Audience URI' required for the next step in the Okta application configuration wizard. Log into your Orion web console and go to [Settings> All Settings> SAML Configuration] and click on the button entitled 'Add Identity Provider'.

 

8. Copy the 'Single Sign-on Service URL' to your clipboard and paste it into Okta's 'Single Sign o URL' field in the SAML settings step of the wizard.

 

9. From Orion's 'Add Identity Provider' page, copy the 'Entity ID' to your clipboard and paste it into the 'Audience URI (SP Entity ID)' field of Okta's SAML configuration wizard.

 

10. When done, the 'General' section of your Okta's SAML Settings Configuration should look similar to the image below.

 

11. Scroll down Okta's SAML Settings page until you reach the 'Attribute Statements (Optional)' section. Create three attributes using the values specified in the following table.

 

NameName formatValue
EmailUnspecifieduser.email
FirstNameUnspecifieduser.firstName
LastNameUnspecifieduser.lastName

 

12. Scroll slightly further down the same page to the section entitled 'Group Attribute Statements (Optional) and create a single attribute using the values shown in the table below

NameName formatFilterValue
GroupNamesUnspecifiedRegex.*

 

Once you've completed steps 11 and 12, verify your 'Attribute Statements (Optional)' and 'Group Attribute Statements (Optional)' field look identical to the following image and click 'Next'.

 

13. If prompted to 'Help Okta support understand how you configured this application' select 'I'm an Okta customer adding an internal app' if asked 'Are you a customer or partner'. Similarly, if you are asked to define the 'App type' select 'This is an internal app that we have created' and click 'Finish'.

 

Grant Okta Users Access to Orion

 

1. Edit the Okta application you just created and click the 'Assignments' tab in the top navigation. Then click the 'Assign' button

 

2. Select from the list of existing Okta users by clicking the 'Assign' button next to their name. Once you've selected all users you wish to access the Orion web console using single sign-on, click 'Done'.

Configuring SAML Authentication in Orion

 

1. Return back to the Orion Web Console and go to [Settings > All Settings > SAML Configuration] and click 'Add Identity Provider'.

 

2. In the 'Add Identity Provider' window click 'Next'

 

3. In the 'Identity Provider Name' enter a friendly name of your SAML provider. Note that the name entered here will appear to your end users when logging into the Orion web console. In my configuration, I named my Identity Provider simply 'Okta' as this is a name well known to my users.

 

4. In a separate browser Window or tab return to the Okta administration console, edit the application you created earlier and click on the 'Sign On' tab. Once there, click on the 'View Setup Instructions' button pictured below.

 

5. Copy the 'Identity Provider Single Sign-On URL' from Okta and paste it into the 'SSO Target URL (Endpoint)' field in Orion.

6. Copy the 'Identity Provider Issuer' from Okta, and past this information into the 'Issuer (Entity ID)' field in Orion

7. Copy the 'X.509 Certificate' in its entirety, including '-----BEGIN CERTIFICATE-----' through to -----END CERTIFICATE----- and paste this into the 'Public Certificate' field in Orion.

 

8. When you're done, the 'Add Identity Provider' wizard should look similar to the following. Once you've validated your changes, click 'Next'.

 

9. On the final step of the 'Add Identity Provider Wizard' simply click 'Save'.

 

10. When you're done you will be returned to the 'SAML Configuration' page. At the top, you will find a slider which allows you to globally enable or disable SAML authentication for Orion. By default, it is enabled once SAML authentication is successfully configured.

 

Creating SAML User Accounts in Orion

 

Now that you have SAML configured both in Okta and Orion, you'll need to create matching SAML user accounts in Orion so can assign permissions and apply any view restrictions you desire, no different than you would any other user in Orion.

 

1. To get started navigate to [Settings > All Settings > Manage Accounts] and click 'Add New Account'.

 

2. In the list of account types to create, choose 'SAML individual account' and click 'Next'.

 

3. In the 'Enter Account Info' step, enter the username of the user you wish to access Orion using SAML authentication into the 'Name ID' field. It's important that this name match identically to what appears in Okta or the user will be unable to login to Orion. Once you've entered the username into the field click 'Next'.

 

4. In the final step of the Wizard, assign any special permissions, views, menu bars, or view limitations you wish the user to have when the login to Orion. When complete, scroll to the bottom of the page and click 'Submit' to save these changes.

 

 

Testing your SAML Authentication

 

1. To test your SAML authentication, log out of the Orion web console or open a different browser from the one you're currently logged in with. E.G. if you're using Google Chrome to configure Orion, open Firefox to test your SAML configuration.

2. When you first access the Orion login page you may notice you now have a new option that wasn't there prior to configuring SAML authentication. Below the usual 'Login' button, there is now an additional button entitled 'Login with Okta'. Okta is the friendly name we gave to our SAML provider in step #3 of 'Configuring SAML Authentication in Orion' above. Click the button 'Login with Okta' to proceed.

 

3. You should now be redirected to the Okta web portal. If you're not already logged into Okta, you will be prompted to authenticate. Simply enter your Okta credentials and click 'Sign in'

 

4. Once you've successfully authenticated to Okta, you should be immediately redirected back to the Orion web console and transparently authenticated

 

Summary

 

As stated earlier, this walkthrough is simply an example of using individual user accounts with Okta. If you've configured Orion SAML authentication, we'd love to hear which identity provider you're using and whether you're leveraging individual user accounts or groups. Also, if you have any tips and tricks or better yet,  a walkthrough on how you configured a different identity provider, we'd love to hear from you!

 

Note that SAML can be used simultaneously in conjunction with all other existing authentication mechanisms supported by Orion, including both Active Directory user and group authentication via LDAP or MSAPI, as well as local Orion user accounts. SAML does, however, require that your IIS be configured to use Forms Based Authentication (default behavior) and cannot be used with Windows Integrated Authentication (optional setting located in the Configuration Wizard).

Mean Time Between Failure (MTBF) Report for Nodes

NPM Website - HTTP Error 500.19 Internal Server Error

$
0
0

This is something interesting.  Installing the inetpub on drive C works, but the client wants it on Drive E.  In putting on drive E, we got the 500.19 error.

 

We finally got it to work and the solution involves changing the identity on the SolarWinds application pool from NetworkService to LocalSystem.


UPDATE:  changing the identity works temporarily.  Once you run config wiz, the identity is changed back to NetworkService.  The best solution I have found is from the kb:  SolarWinds Knowledge Base :: What files and directories should I exclude from antivirus protection to optimize performan…

From the KB, assign the user NetworkService to the inetpub and that should solve the 500.19 error.   Not sure why this is not set sometimes during an install.  My best guess is maybe due to security restrictions on the logon from where the install was done.


Thanks

Amit Shah

Loop1 Systems

a1.jpg


Cleaning up the unknown interface, volume, hardware (swql)

$
0
0

Cleaning up is always a bit of a chore.  Luckily this script makes a little easier by pointing to objects which are "unknown". 

The script will list up, down, disabled, unknown, and total for three objects - Interfaces, volumes, and hardware.   I'm sure it can be expanded to other objects as well.

To get just the unknowns, comment out the three lines and uncomment the fourth.

select

n.Caption ,n.vendor

--,isnull(i.up,0) as [Int-Up], isnull(i.Down,0) as [Int-Down], isnull(i.dis,0) as [Int-Dis], isnull(i.Unk,0) as [Int-Unk], isnull(i.total,0) as [Int-Total]

--,isnull(vol.up,0) as [Vol-Up], isnull(vol.Down,0) as [Vol-Down], isnull(vol.dis,0) as [Vil-Dis], isnull(vol.Unk,0) as [Vol-Unk], isnull(vol.total,0) as [Vol-Total]

--,isnull(hi.up,0) as [Hard-Up], isnull(hi.down,0) as [Hard-Down], isnull(hi.Dis,0) as [Hard-Dis], isnull(hi.unk,0) as [Hard-Unk], isnull(hi.total,0) as [Hard-Total]

,isnull(i.unk,0) as [Int-Unk], isnull(vol.unk,0) as [Vol-Unk], isnull(hi.unk,0) as [Hard-Unk]

from orion.nodes n

left join (select v.nodeid

,sum(case when v.status=1 and v.VolumeType like 'Fix%' then 1 else 0 end) as [Up]

,sum(case when v.status=0 and v.VolumeType like 'Fix%'then 1 else 0 end) as [Unk]

,sum(case when v.status=2 and v.VolumeType like 'Fix%'then 1 else 0 end) as [Down]

,sum(case when v.status=27 and v.VolumeType like 'Fix%'then 1 else 0 end) as [Dis]

,sum(case when v.VolumeType like 'Fix%' then 1 end) as [Total] 

      from orion.Volumes v

      group by v.nodeid     ) vol on vol.nodeid=n.nodeid

left join (SELECT hi.NodeID

,sum(case when hi.statusdescription ='up' then 1 else 0 end) as [Up]

,sum(case when hi.statusdescription ='down' then 1 else 0 end) as [Down]

,sum(case when hi.statusdescription ='unknown' then 1 else 0 end) as [Unk]

,sum(case when hi.statusdescription ='disabled' then 1 else 0 end) as [Dis]

,count(*) as [Total]

FROM Orion.HardwareHealth.HardwareItem hi

group by hi.nodeid) hi on hi.nodeid=n.nodeid

left join (select i.nodeid

,sum(case when i.status=1 then 1 else 0 end) as [Up]

,sum(case when i.status=2 then 1 else 0 end) as [Down]

,sum(case when i.status=0 then 1 else 0 end) as [Unk]

,sum(case when i.status=27 then 1 else 0 end) as [Dis]

,count(*) as [Total]

FROM Orion.NPM.Interfaces i

group by i.nodeid) i on i.nodeid=n.nodeid

where n.status=1 and n.ObjectSubType not like 'ICMP'

order by isnull(i.unk,0)+isnull(vol.unk,0)+isnull(hi.unk,0) desc

 

Thanks

Amit

NPM 2019.4 IS NOW GENERALLY AVAILABLE!

$
0
0

It is my pleasure to announce that Network Performance Monitor (NPM) 2019.4 is now available and can be downloaded from the Customer Portal.

 

Note that we've changed the version numbering with this release. This and future releases will follow a "year.quarter" numbering system instead of the previous (12.5) system.

 

What's New in NPM 2019.4?

 

  • Device View - Visually display your network switches on Cisco 2960 and Juniper devices to check port status, utilization, and position from the Orion Web Console.
  • Real-time Charts - Display real-time data with new dashboard widgets:
    • CPU Load and Memory Utilization on Node Details.
    • Percent Utilization on Interface Details.
  • Performance Improvements - Check out the improved load times for widgets.
  • Updated Localization - Improved support for German and Japanese languages.
  • Improved Port-type Mapping - Discover port types with more accuracy.

 

Device View

 

Device View allows you to see the physical layout of your network switch's interfaces (except management or console) in order to check port status, utilization, and position from the Orion Web Console. It is being released in NPM 2019.4 as a "technical preview", meaning we haven't added enough functionality to deem it a full-fledged feature. In this case, the limiting factor comes in the form of vendor support.

 

NPM 2019.4 includes Device View support for the majority of switches in the following families (provided they're not in a "stacked" configuration):

  • Cisco Catalyst 2960
  • Cisco Catalyst 2960L
  • Cisco Catalyst 2960S
  • Cisco Catalyst 2960X
  • Cisco Catalyst 2960XR
  • Juniper EX2200
  • Juniper EX3300

 

In order for Device View to be available in the web console, the supported switch will need to be monitored as an SNMP node.

 

Once monitored, you'll be able to access the new subview from the Node Details page.

 

Device View can be filtered using the filter list on the left side of the page. Currently, you can filter the interfaces based on status. Interfaces that do not match the selected filters become opaque.

Device View also provides a side panel with additional interface details. This is not visible by default. To view the side panel, click on any interface in the Device View stencil. The side panel displays the caption of the interface, it's IP address, MAC address, duplex mode, and more.

 

 

Real-Time Charts

 

With NPM 2019.4, we're also releasing our first set of widgets that provide real-time data!

 

Real-time CPU Load & Memory Usage will now appear by default in the top-right position of the Node DetailsVital Stats page.

 

 

Real-time interface Percent Utilization will similarly appear in the top-right position of the Interface DetailsSummary page.

 

These charts can also be added via the Add Widget panel on other appropriate views.

 

The Chart Refresh Time update interval for real-time data charts is set to 2 seconds by default. This can be changed in two ways:

 

  • Via the Web Console Settings page:

  • Via the Advanced Configuration page:

 

The polling settings are tied to PerfStack, and can be adjusted on the Advanced Configuration page in PerfStack settings.

 

Improved Port Type Mapping

 

This feature provides information which can be used for filtering interfaces by port type during the discovery process. The changes we've made are primarily on the backend, but you may notice some minor UI tweaks.

 

 

Performance Improvements

 

NPM 2019.4 includes many improvements to web performance. We think you'll notice a difference in how fast the pages load.

 

 

Updated Localization

 

NPM 2019.4 includes improved support for the Japanese and German languages.

 

 

What now?

Looking for more information on what we'll be working on now that 2019.4 is out the door? Take a look at What We're Working On. Don't see what you're looking for? Advocate your needs with a Feature Request.

What We're Working on for NPM (Updated Nov 25, 2019)

$
0
0
The latest release ofNetwork Performance Monitor (NPM) is available on solarwinds.com and in your customer portal. See the NPM 2019.4 Release Notes for a comprehensive look.

You ask, we listen. Many of the top features being worked on in NPM are generated through your feedback - specifically your votes in our NPM Feature Requests forum and your participation in our Feedback Sessions.

 

Here's what the NPM Team is currently working on:

 

  • UI Performance Optimizations - continuing to address our largest complaint in the last 10 years: user interface performance
  • Microsoft Azure Integration - visibility into Azure Virtual Network Gateways, specifically VPN status and throughput
  • Device Views - improving Device View by adding support for switch-stacks and additional vendors
  • Improved Device Support - additional device support for commonly requested vendors
  • Improved Interface Status - applying enhanced node status to interfaces
  • New Dashboard Framework - next-generation summary dashboard framework
  • Orion Maps - bridging the feature parity gap with Network Atlas

 

GIVE US FEEDBACK

We actively refine the product roadmap to solve your problems. Participate in Feedback Sessions for THWACK points and personalized input into the future of NPM. You can also submit and vote on NPM Feature Requests.

Bulk import ICMP nodes

$
0
0

Hello Thwackers,

 

I thought I would share my rough and ready PowerShell script which helps when you have a known list of ICMP devices to import.

 

This is very useful if like me, you are going through an onboarding process from one system to another.

 

The script takes input from a CSV file and creates ICMP polled nodes from the data. It supports setting custom properties across all rows, and custom properties per row.

 

Just change the parameters between lines 8 and 35 with values that are appropriate for your installation. if you are using custom properties, add them at lines 94 and 158. Comments in the script will guide you.

 

It should also help as a springboard for further development with the API.

 

You will need to download the Orion SDK to make use of the SwisPowerShell module.

 

https://github.com/solarwinds/OrionSDK

 

Enjoy!

Database transaction log is full - Recovery ( Simple Mode vs Full Mode )

$
0
0

Growth is either down to 2 reasons:
1 NO DISK SPACE
2 LDF Autogrowth restriction has been reached

First thing I would do is Change Recovery from FULL to SIMPLE if not done so already

Database recovery model - Change recovery model to Simple - SolarWinds Worldwide, LLC. Help and Support
SQL Mgt Studio - LDF - Database Recovery mode when setup for DR - FULL vs SIMPLE - SolarWinds Worldwide, LLC. Help and S…

Here is Good explanation of Simple VS Full Recovery:

http://msdn.microsoft.com/en-us/library/ms189275.aspx

tttt.PNG

 

 

Transaction Log Size

The transaction log should be sized based on the amount of data modifications made to a database and the frequency of the log backups.
Large data modifications, such as data loads or index rebuilds should be taken into account when calculating a log file size.

In simple recovery model the transaction log should not grow as the interval between checkpoints (which truncate the log) is based on the amount of data modifications made.
If the log does grow, it may be that there are long-running transactions or transactions that have been left open. Either may indicate a problem with the application.

In full or bulk-logged recovery model, if the transaction log grows it may indicate that the frequency of data modifications has increased and as such,
the interval between log backups should be decreased. It may also indicate long running transactions or that the log backup jobs are not running properly.

 

 

RESOLUTION STEPS :-


.LDF file grows out of control, How to recover:
1.) Make sure recovery model is set for SIMPLE  and NOT FULL

http://knowledgebase.solarwinds.com/kb/questions/1359/Changing+Recovery+Model+of+database+back+to+Simple
2.) Backup the database, this will mark the data in the transaction logs as committed and no longer necessary.

Do not delete the LDF File if in-memory is being used, instead disable in-meory first, and always backup your database first before doing anything on the database and backup your db on a schedule.
3.) Shrink the database again to reclaim the log space. (PLEASE NOTE YOU MUST HAVE SOME FREE SPACE ON THE DISK IN ORDER TO RUN THE SHRINK )


How to: Shrink a Database (SQL Server Management Studio)


How to: Shrink a File (SQL Server Management Studio)

 

  1. 4.) If above doesn’t work as last resort is to detach the database (do not force it to detach if it gives an error that it can not detach, this will damage the database)
    once detached delete the .LDF file and reattach the database.
  2. 4.) Stop Orion Services.
    5.) In the SQL Mgt Studio or Orion Database Manger, right-click on the NetPerfMon database and choose "Detach".
    6.) Navigate to that directory where the MDF and the LDF files are stored, and delete ONLY the LDF file.
    7.) Go back into the database manager, right-click on your SQL server, and choose "Attach Database."

         at.JPG

 

        8.) Select the MDF file, and hit okay.

           mdf.JPG

 

         9) Remove the LDF file entry hit OK
     detach.JPG


It will recreate will 0KB LDF File automatically.

 

Future Proof so it doesn’t recoccur
After above all should be fine, but have you check LDF File growth doesnt reoccur.

Also once set to SIMPLE Recovery, LDF file should never really be over 1GB if all running smoothly.
But can also configure LDF to Restricted Growth, so say LDF File on Drive over 100GB Free,

  You could restrict LDF to few dozen GB just to be safe,
in case LDF growth reoccurred and LDF goes 100GB and brings down server due lack disk space.

log.JPG

 

 

 

 

How can i Examine / Open / Analyze what is in Transaction Log file ?  

 

SQL Server transaction log format is not documented and therefore can’t be used to read data from it directly.

 

There are tools such as ApexSQL Log that can read the transaction log but it’s only because they probably spent a ton of time reverse engineering its format.

ApexSQL Log - SQL Server log explorer | ApexSQL

Options for reading are to:

a) figure the format on your own (not recommended)

b) get yourself a third party tool

c) using functions such as fn_dblog that are also not documented but can give you some details.

 

For more details please see the post below

http://stackoverflow.com/questions/7748653/how-to-open-the-sql-server-transaction-log-fileldf

 

How to read the SQL Server Database Transaction Log

http://solutioncenter.apexsql.com/read-a-sql-server-transaction-log/

Alert Variable - Remove Domain Suffix from Sysname

$
0
0

The following variable can be used to strip the domain suffix from the Sysname in an Alert:

 

${SQL: SELECT RTRIM (SUBSTRING(Sysname,1,((Select CASE WHEN (CharIndex('.yourdomain',Sysname)>0) THEN (CharIndex('.yourdomain',Sysname)-1) ELSE (LEN(Sysname)) END))))  FROM Nodes WHERE NodeID = ${NodeID}}

 

Replace yourdomain with your actual domain suffix.

Node SLA Availability Report Last Month


BlueCoat CAS poller

BlueCoat CAS Universal Device Poller

Node Downtime with Duration and Minimum Length Filtering

$
0
0

**REQUIRES ORION PLATFORM 2018.2 OR ABOVE**

 

I had assembled this based on a much older SQL report, and then updated it to SWQL, then added some more intelligence to it so you can filter it based on the duration of the outage, search by the device names, and it has a method of letting you know when nodes have been down so long they aged out of the events table.

 

Based on popular requests I figured it was time to put it out here to make it easier for the Thwackers to find and use.  This is intended to be used inside the Custom Query Resource


 

select n.caption as [Device]
-- shows the current status icon
, '/Orion/images/StatusIcons/Small-' + n.StatusIcon AS [_IconFor_Device]
-- makes a clickable link to the node details
, n.DetailsUrl as [_linkfor_Device]
-- shows the timestamp of the down event, if there is no timestamp then is says the event was greater than the number of days in your event retention settings
, isnull(tostring(t2.[Down Event]),concat('Greater than ',(SELECT CurrentValue FROM Orion.Settings where settingid='SWNetPerfMon-Settings-Retain Events'),' days ago')) as [Down Event]
-- shows the timestamp of the up event, unless the object is still down
, isnull(tostring(t2.[Up Event]),'Still Down') as [Up Event]
-- figures out the minutes between the down and up events, if the object is still down it counts from the down event to now, displays 99999 if we cannot accurately determine the original downtime, and 
, isnull(MINUTEDIFF(t2.[Down Event], isnull(t2.[Up Event],GETUTCDATE())),99999) as Minutes


from orion.nodes n
left join (SELECT    
 -- Device nodeid used for our join   
 StartTime.Nodes.NodeID     

 -- Down Event time stamp in local time zone    
 ,ToLocal(StartTime.EventTime) AS [Down Event]      
 -- Up Event time stamp in local time zone    
 ,(SELECT TOP 1    
 ToLocal(EventTime) AS [EventTime]    
 FROM Orion.Events AS [EndTime]    
-- picks the first up event that is newer than the down event for this node
 WHERE EndTime.EventTime >= StartTime.EventTime   
-- EventType 5 is a node up 
 AND EndTime.EventType = 5    
 AND EndTime.NetObjectID = StartTime.NetObjectID    
 AND EventTime IS NOT NULL    
 ORDER BY EndTime.EventTime    
 ) AS [Up Event]      
-- This is the table we are querying    
FROM Orion.Events StartTime      
-- EventType 1 is a node down
WHERE StartTime.EventType = 1        
) t2 on n.NodeID = t2.nodeid


-- this is how I catch nodes that are down but have aged out of the events table
where (n.status = 2 or t2.nodeid is not null)


-- If you want to filter the results to only show outages of a minimum duration uncomment the below line
--and MINUTEDIFF(isnull(t2.[Down Event],(GETUTCDATE()-30)), isnull(t2.[Up Event],GETUTCDATE())) >  60


-- if you want to use this query in a search box of the Custom Query resource uncomment the below line
--and n.Caption like '%${SEARCH_STRING}%'


order by t2.[down event] desc

 

-Marc Netterfield

    Loop1 Systems: SolarWinds Training and Professional Services

google charts using AnnotatedTimeLine - CPUMEM and ResponseTime/PacketLoss

$
0
0

I have posted a CPU and MEM chart using google charts Google Charts for CPU and MEM

 

This time I used AnnotatedTimeLine and it looks really good.  Informative yet - taking up minimal footprint.   It also uses the zoom feature.  I'm loading just data from today, but you can load it a weeks worth of data then set the initial zoom.

 

Combining Response Time and Packet Loss was tricky because this required dual-y charts.  I have done dual-Y, but we loose the zoom functionality.  The zoom buttons are not editable - they are either on or off and are controlled by the options (which I have not used).

Annotated Timeline  |  Charts  |  Google Developers

 

This will go in the 'Node Details' view.

 

 

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

<div>

<script>

console.log('*****START*');

var swqlCPUMEM="select concat(month(tolocal(n.CPULoadHistory.DateTime)),'/',day(tolocal(n.CPULoadHistory.DateTime)),'/',year(tolocal(n.CPULoadHistory.DateTime)),' ',hour(tolocal(n.CPULoadHistory.DateTime)),':',minute(tolocal(n.CPULoadHistory.DateTime)),':',second(tolocal(n.CPULoadHistory.DateTime))) as [ss],n.CPULoadHistory.AvgLoad as [cpu], round(n.CPULoadHistory.AvgPercentMemoryUsed,0) as [mem] from Orion.nodes n where n.nodeid=${nodeid} and daydiff(tolocal(n.CPULoadHistory.DateTime),GETDATE())=0 order by n.CPULoadHistory.DateTime"

var paramsCPUMEM = JSON.stringify({

query: swqlCPUMEM,

parameters: {

}

});

$.ajax({

type: 'POST',

url: '/Orion/Services/Information.asmx/QueryWithParameters',

data: paramsCPUMEM,

contentType: "application/json; charset=utf-8",

dataType: "json",

success: function(response) {

             google.charts.load('current', {'packages':['annotatedtimeline']});

             google.charts.setOnLoadCallback(drawChartCPUMEM);

            var i;

             function drawChartCPUMEM() {

             var dataCPUMEM = new google.visualization.DataTable();

           dataCPUMEM.addColumn('datetime',  'Date');

           dataCPUMEM.addColumn( 'number',  'CPU');

           dataCPUMEM.addColumn( 'number',  'MEM');

  for (var i = 0; i < response.d.Rows.length; i++){

    var row = [new Date(response.d.Rows[i][0]), response.d.Rows[i][1], response.d.Rows[i][2]  ];

    dataCPUMEM.addRow(row);

  }

var options = {

        width: 400,

        height: 100,

        chartArea: {left: 30, top:5, width: '60%', height: '75%'},

       legend: { textStyle: { fontSize: 12}},

       vAxis: { gridlines: { count: 4 } , maxValue: 100}

      };

             var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('CPUMEM'));

             chart.draw(dataCPUMEM);

          }

}

})

</script>

</div>

  <div id="CPUMEM"></div>

 

 

 

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

<div>

<script>

console.log('*****START*');

var swqlRTLOSS="select concat(month(tolocal(n.ResponseTimeHistory.DateTime)),'/',day(tolocal(n.ResponseTimeHistory.DateTime)),'/',year(tolocal(n.ResponseTimeHistory.DateTime)),' ',hour(tolocal(n.ResponseTimeHistory.DateTime)),':',minute(tolocal(n.ResponseTimeHistory.DateTime)),':',second(tolocal(n.ResponseTimeHistory.DateTime))) as [ss],n.ResponseTimeHistory.AvgResponseTime as [RT], case when (n.ResponseTimeHistory.PercentLoss=100) then (select case when max(n.ResponseTimeHistory.AvgResponseTime)=0 then 1 else  max(n.ResponseTimeHistory.AvgResponseTime) end as [d] from Orion.nodes n where n.nodeid=${nodeid} and daydiff(tolocal(n.ResponseTimeHistory.DateTime),GETDATE())=0) else 0 end as [loss] from Orion.nodes n where n.nodeid=${nodeid} and daydiff(tolocal(n.ResponseTimeHistory.DateTime),GETDATE())=0 group by n.ResponseTimeHistory.AvgResponseTime, n.ResponseTimeHistory.PercentLoss, n.ResponseTimeHistory.DateTime order by n.ResponseTimeHistory.DateTime"

var paramsRTLOSS = JSON.stringify({

query: swqlRTLOSS,

parameters: {}

});

$.ajax({

type: 'POST',

url: '/Orion/Services/Information.asmx/QueryWithParameters',

data: paramsRTLOSS,

contentType: "application/json; charset=utf-8",

dataType: "json",

success: function(response) {

               console.table(response);

           google.charts.load('current', {'packages':['annotatedtimeline']});

             google.charts.setOnLoadCallback(drawChartRTLOSS);

            var i;

             function drawChartRTLOSS() {

             var dataRTLOSS = new google.visualization.DataTable();

           dataRTLOSS.addColumn('datetime',  'Time');

           dataRTLOSS.addColumn( 'number',  'RespTime');

           dataRTLOSS.addColumn( 'number',  'Loss');

  for (var i = 0; i < response.d.Rows.length; i++){

    var row = [new Date(response.d.Rows[i][0]), response.d.Rows[i][1], response.d.Rows[i][2]  ];

    dataRTLOSS.addRow(row);

  }

var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('RTLOSS'));

        chart.draw(dataRTLOSS);

          }

}

})

</script>

</div>

  <div id="RTLOSS"></div>

Eaton UPS Custom Poller

Viewing all 1956 articles
Browse latest View live