Showing results for 
Search instead for 
Did you mean: 
Create Post

Orion® Platform 2020.2 - Modern Dashboards

Dashboards, Dashboards, Get Your Dashboards!

The Orion ® Platform Team is proud to announce a new modern dashboarding framework. This, data-driven and highly performant dashboard framework provides Orion users with a greater level of flexibility over how their dashboard data is displayed.

A grid-based layout, new widgets types, drag and drop placement with full vertical and horizontal widget scaling all provide users with increased control over the layout of the dashboard.

There is also one more really awesome feature of the new dashboarding framework which I love, but, you will have to read on to find out more about it!


For the full list of Orion new features and improvements visit: 

Example Modern Dashboard

2020-03-25 14_58_07-ITOM - Systems Status Dashboard.png

New widgets types, visually compelling, status and threshold driven indications.

    Summary Views, Classic and Modern Dashboards, what’s the difference?

    Orion modules provide many great examples of dashboards such as the Network Summary, Application Summary, and Top 10 dashboards. These are based on classic Orion views which contain resources whereby a Summary View is suited to displaying high-level information across all monitored entities such as All Nodes, All Volumes All Applications, etc.

    In the realm of Summary Views and Classic Dashboards, the two terms are interchangeable. Additional view types are available for displaying information related to a specific entity such a Node Details, Application Details etc. Modern Dashboards are not intended to replace these existing Summary Views, but rather offer you an alternative method for presenting the data in your dashboard.

    This is the 1st iteration of the new dashboard framework which will evolve with each subsequent release. Your feedback is central to this evolution and so I would encourage you to send any feedback you may have, positive or negative so that we can continue to deliver features that you want. 

    Let's Get Started - Manage Dashboards

    The Orion Veterans amongst you will likely have already seen the additional menu item 'Manage Dashboards' under 'All Settings'

    Manage Dashboards MM.png

    Manage Dashboards is your one-stop-shop for managing classic views and modern dashboards, it replaces the 'Manage Views' link in All Settings. It allows you to filter all dashboards based on Owner, Version & Visibility.

    Manage Dashboards.png

      Dashboard Security

    The dashboard security model differs from the classic view security model.

    • Dashboards can be created by ALL Orion Users,  Manage Views Permission is not required
    • Admins can see and edit ALL dashboards
    • Non-admins can see and edit dashboards they own
    • Dashboards visibility can be Public Or Private

    Go ahead, click create ‘Modern Dashboard’.

    Give the dashboard a name and 'Immediately open this dashboard for editing'

    Create New Dashboard.png

    Drag And Drop a new widget to the dashboard and click Finish Configuring 

    Drag and Drop.gif

    The Widget Cloner Panel presents you with the 4 widget types available. As you create new dashboards and widgets, these will be readily available for you to clone as you edit the dashboard.

    Clicking Create Widget will save an empty widget to the dashboard. Select the Table Widget and Click Customize to configure the widget. 

    Select type and configure.png


    All widgets have 2 common configuration elements, Presentation and Data Model.

    Inital State.png

    Widget Configuration Table Widget

    The table widget is designed to display tabular data. Let's take a look at what is required to build the following table which shows:

    • The Node Status
    • Current CPU Utilisation with warning and critical threshold indications.
    • Current Memory Utilisation with warning and critical threshold indications.
    • Number of monitored Volumes  on the Node
    • Number of monitored Interfaces on the Node

    Demo Table.png


    Widget Presentation


    Notice the Optional Widget Link URL? Here you can provide a link to another Orion URL or other external URL. The widget will display the 'Explore Data' button on the top right-hand side.



    The Data Model

    All dashboard widgets are data-driven. Based on SWQL users can define their own Custom Query or use the in-built Graphical Query Builder. The data model can be presented in a number of different formats, and the output of the query will need to match the type of widget you are creating. For those who may not be familiar or comfortable writing SWQL we have provided a graphical query builder that is covered in more detail below.

    Data Model.png

    If Choosing to hand-edit a SWQL query, the editor allows you to explore all entities and import a SWQL statement which selects all columns.

    Pro Tip! The 1st rule of SWQL: there is no SELECT *

    Hand edit.gif

    For this task, we are going to use the Visual Query Builder to define the Data Model configuration. The visual query builder can be used to quickly build a data model across multiple entities without having any knowledge of the entity relationships, put simply it creates the query and required joins for you!

    • Use the graphical query builder to edit the data model for a table widget.
    • Choose the Node for the row type.

    TB Select Entity Type.png


    • Select the check box "Show advanced and specialized entities" 
    • Drag Caption, Status, DetailsUrl, CPULoad, PerecentMemoryUsed, Volumes.Caption, Interfaces.Caption
    • The Orion Nodes entity has a 1 1:Many relationship with both Interfaces and volumes, the query builder allows you to aggregate the rows to provide Count, Min, Max, Average aggregations.
    • Save the Data Model

    query builder.gif

    We must now choose which columns will be displayed in the table, click add new column

    add new column.png


    Each Column has 2 configuration elements.

    • Description
    • Property & Formatting

    Define the description for the field such as 'Node' and expand the Property and formatting panel. Here you can choose from a section of preconfigured formatters. For the node column, we will use Orion Entity. This presents additional field mappings. 

    NOde Column.png

    Status, DetailsUrl and Label all match back to columns selected in the query builder. The Entity type is the icon of your choosing from the supplied list.


    The CPU and Memory Columns use a 'Threshold Value' for the format. There are many threshold formats available based on Orion thresholds for the metric such as response time, packet loss, IOPS, Interface Utilisation & many more. The Interface and Volume Count Fields both use a Simple Number Formatter.


    CPU Value Configuration Memory Value Configuration
    CPU Column.png Memory.png



    Volume Count Value Configuration Interface Count Value Configuration




      KPI Widget – The Big Number

    KPI Completed.png

    KPI widgets display a big number representing a certain metric. You can add multiple KPI cells to an individual KPI widget, select a default background color, and can have a warning and critical threshold applied to the observed values.

    KPI Threshold Applied.png

    The data model for a KPI should return a single number. Here are some example queries to get you started.

    Description Query
    Total nodes that are in a down state. SELECT COUNT(1) AS KPI_Numbe from Orion.Nodes WHERE Status=2 
    Total Number of Active Alerts SELECT
    COUNT(o.AlertConfigurations.Name) AS [KPI_Number]
    FROM Orion.AlertObjects o
    WHERE o.AlertActive.TriggeredMessage <> ''
    CPU Load of a node with caption PRODMGMT-16 SELECT n.CPULoad
    FROM Orion.Nodes n
    n.Caption = 'PRODMGMT-16'


    Proportional Chart

    The proportional chart allows you to chose from 4 subtypes

    • Pie Chart
    • Donut Chart
    • Horizontal Bar
    • Vertical Bar

    All Types .png

    Data models for proportional charts require two fields, one of which must be numerical, the other is used as a grouping. e.g how many nodes do I have, grouped by their status?

    In this example, the ‘how many nodes’  is the number we need and the status will be used to group the data.

    Description Query
    Count Nodes by Status SELECT COUNT(1) AS Count_Items, Status FROM Orion.Nodes GROUP BY Status
    Count Applications By Status SELECT COUNT(1) as Count_Items,
    FROM Orion.APM.Application
    GROUP BY Status
    Count Interfaces By Status SELECT COUNT(1) as Count_Items,
    FROM Orion.NPM.Interfaces
    GROUP BY Status


    Select the matching Value and Category Fields to display the data.

    Mapped values.png

    Notice the Data Format? The proportional chart can map the status values returned by the query to meaningful text and will show these in the legend.

    Pro Tip! Want to provide your own custom color mapping? Define the colors in your query and choose Custom from the data format

    Advanced Formatter.png Custom Color.png

    SELECT Count(o.AlertActive.TriggeredMessage) AS Item_Count ,CASE WHEN o.AlertConfigurations.Severity = 1 then '#03fc7f' WHEN o.AlertConfigurations.Severity = 2 then '#a903fc' WHEN o.AlertConfigurations.Severity = 3 then '#ebfc03' WHEN o.AlertConfigurations.Severity = 4 then '#bafc03' WHEN o.AlertConfigurations.Severity = 5 then '#fc2403' END AS [Color], CASE WHEN o.AlertConfigurations.Severity = 1 then 'Critical' WHEN o.AlertConfigurations.Severity = 2 then 'Serious' WHEN o.AlertConfigurations.Severity = 3 then 'Warning' WHEN o.AlertConfigurations.Severity = 4 then 'Informational' WHEN o.AlertConfigurations.Severity = 5 then 'Notice' END AS [Severity] FROM Orion.AlertObjects o WHERE o.AlertActive.TriggeredMessage <> '' GROUP By o.AlertConfigurations.Severity

    Time Series Widget

    This one is gimme, no reinventing the wheel here. The Time Series widget allows you to display a Perfstack project. One caveat, however, it supports line charts only at this time.

    To learn more about the powerful performance analysis and metric correlation capabilities available in  perfstack, I highly encourage you to read through the documentation here

    The time series widget has an additional configuration within the presentation panel allowing you to define the time span to display

    PS Time Span.png

    Editing the data model for a Timeseries widget presents a dialog to choose an existing Perfstack Project

    Select Project.png




    2020-03-25 16_05_51-Thwack Dashboard.png

    Pièce de résistance..  

    Auto update without page refresh.

    If you have gotten this far reading through everything and are eagerly waiting to find the awesome feature I mentioned, I salute you.  If you blindly scrolled down to get here, well I salute you too but you have missed out on some great info!

    Notice when placing an application into an unmanaged state how the proportional widget updates a few seconds later? Dashboard widgets can refresh their data model without having to reload the entire page. In classic Orion views, this change in status may take up to 5 minutes to become apparent.




    Happy Dashboarding! 

    Please let us know what you think, where we have done well, where can we do better.



    Labels (5)

    @tony.johnson Sadly in our deployment the "do not display a prefix icon" isn't accepted and it forces choosing an icon. As for the KPI I meant making it possible to show tx/rx in a single block to save space. As of now the KPI squares feel a bit bigger than they need to be.



    Consider me another vote for @hansolo's request for the "subset" left sidebar option to come to modern dashboards.

    In my current "business continuity" dashboard each main focus on the front page has a deeper dive set of widgets to dive into each category with greater depth. 

    Quickly flipping between them makes things easier. On top of that for "easy" testing and migration to other pages I have a public "Testgrounds" where upcoming widgets are demoed and then an "API Playground" for testing requested external vendor facing API calls being displayed via custom HTML widgets where there isn't a pre-built widget that will work. 

    Our team has been using this method for quick status checks without hunting all over the site to get to them. 


    Ultimately while new features are fantastic, doing away with the good parts of classic isn't so fantastic. Looking forward to someday mixing and matching widgets between views.

    Interesting... reminds me a LOT of the new SEM dashboards thanks to the UX team Ashley and others!


    Loving the new dashboards and how you can manipulate the data to present what you want to be able to see.

    Created a test Alerts Dashboard for our environment, however on the custom tables part when i define my table and get the records returned, is there any way to have only a section displayed within the widget, so that its split into pages of say 20 records at a time.

    As you can see from the screens, the first one has 68 records and a scroll bar, ideally i'd like to lose the scrollbar and have pages of 20 say, is that possible?


    @dunky2k Thank you for the feedback and for sharing this dashboard. Paging within a table is not possible in this release but is something I am tracking for consideration in the future as dashboard widgets evolve. I am curious as to your use case for paging over infinite scroll, is it purely a visual preference or are there other factors?

    @tony.johnson  Thanks for the clarity on what is and isn't possible at the moment, as for the use of scrolls, its purely a visual preference, nothing more than that. 

    Any plans to have an online event to go over creating these new dashboards?

    I'm totally with you cfizz34.  I've been messing with them and I really am struggling on how to reproduce a lot of what they've done in their samples.  It seems like one of those things that will be easy once you understand it, but until then it seems really complicated.  Kind of like when Custom Tables and Custom Charts came out.

    Dumb question maybe, can we change the dashboard name once created? Or is the process -> Duplicate and then create the new name and delete the old dashboard?


    Would also be great to have an iFrame widget for embedding external sites.

    @acandell The only method available right now to rename a dashboard is as you describe. I will add a +1 for a custom HTML widget which I am tracking internally.

    @cfizz34 We are currently in the planning stages for ThwackCamp and can certainly look at doing something more targeted. Are there particular workflows you are struggling with?

    Really just getting it started and usable seems to be a struggle personally.  Do you think shareable (via import/export) dashboards would ever be an option?


    I like this alot, now I must learn SWQL :).


    However a tiny thing that is bothering me immensly, I would very much be able to skip the warning threshold and go directly from green to red.

    I have created a KPI widget that should be green at all times until a single alert appears. But that is impossible at the moment, now I must go from green to yellow (1 alert) to red (more than 1 alert)


    Anyone have a table that is displaying information similar to how the 'Polling Summary' shows?



    Hey @tony.johnson would you be kind enough to post the SWQL statement you used to build the top interfaces by utilization?  Im trying to build something similar for my dashboard, but don't have super deep knowledge of the ins and outs of the database to pull in the needed info for my table and thus getting some rather random results.

    @martin.lkab Thank you for the feedback. I will track this internally as a feature request to make the warning threshold optional.

    @travis.schlafke This should help as a start. YOu can safely remove the WHERE i.Description like '%mpls%' clause if you want to see all interfaces or adjust the text "mpls" to any interface description suitable for your needs.

    n.NodeName AS Node,
    n.DetailsUrl AS [_Linkfor_Node],
    n.Status AS Node_Status,
    i.InterfaceName AS Interface,
    i.DetailsUrl AS [_Linkfor_Interface],
    i.Status AS Interface_Status,
    i.InPercentUtil AS RECEIVE,
    i.OutPercentUtil AS TRANSMIT
    Orion.NPM.Interfaces as i
    LEFT JOIN Orion.Nodes as n ON n.NodeID=i.NodeID
    WHERE i.Description like '%mpls%'
    PercentUtil DESCENDING

    Is there a central place all custom reports/SQL/SWQL queries can be stored on THWACK or GitHub?


    Both Report Lab and Alert Lab exist on thwack today

    however, for the pure SWQL/SQL used there is no specific content exchange.  

    Thanks TJ!


    Really like the new modern dashboards and are using 2 in production on wallboards and when using KPI Widgets with Table or Timeseries Widgets the KPI widgets update automatically as they should but the Table ones don't at all that I can see and the Timeseries using a know good Perfstack doesn't much at all. I have a browser addon refreshing the page but I shouldn't have to.

    Am I missing something? I have tested in Firefox and Chrome and have the same issue

    @tilde39 Thank you for reporting this. Can you confirm if you are running the RC or GA version?


    GA. You can duplicate this on the modern dashboard live demo on your site for Perfstack Timeseries and I assume tables but I have no way of knowing if the tables should change.

    Please help me How can I make top 10 alerts widget as in your dashboard?


    Hi @tony.johnson - Is there a way to add Maps to the Modern Dashboard?

    @mark.johnson-TEN - Adding maps is currently NOT supported but SolarWinds have noted it as a feature request for future versions.

    @shuth  - many thanks for the feedback 🙂


    Inspired by and heavily borrowed from the great work of  @adatole here

    The data model I have used for the All alerts table widget is:

    Nodes.Caption AS NodeName,
    Nodes.Status as NodeStatus,
    '/Orion/Netperfmon/AckAlert.aspx?AlertDefID='+tostring(AlertObjects.AlertObjectID) AS AcknowledgeIt,
    'Acknowledge' As AckLabel,
    AlertActive.AlertActiveID, AlertObjects.AlertObjectID, AlertConfigurations.Name, AlertConfigurations.Severity, AlertConfigurations.ObjectType,
     AlertObjects.EntityUri, AlertObjects.EntityType, AlertObjects.EntityCaption,
    ToLocal(AlertActive.TriggeredDateTime) AS TriggeredDateTime, AlertObjects.LastTriggeredDateTime, AlertActive.TriggeredMessage AS Message,
    AlertActive.AcknowledgedDateTime, AlertActive.Acknowledged AS Acknowledged, AlertActive.AcknowledgedBy, AlertActive.AcknowledgedNote,
    	When Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/86400)>0 Then 
    		ToString(ToString(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) +0.0)/86400))+'d '+
    		ToString(Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 86400*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/86400))) + 0.0)/3600))+'h '+
    		ToString(Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 3600*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/3600))) + 0.0)/60))+'m ')
    	When Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 86400*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/86400))) + 0.0)/3600)>0 Then 
    		ToString(ToString(Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 86400*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/86400))) + 0.0)/3600))+'h '+
    		ToString(Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 3600*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/3600))) + 0.0)/60))+'m ')
    	When Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 3600*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/3600))) + 0.0)/60)>0 Then 
    		ToString(ToString(Floor(((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) - 3600*(Floor((SecondDiff(AlertActive.TriggeredDateTime,GetUtcDate()) + 0.0)/3600))) + 0.0)/60))+'m ')
    	Else ''
    End AS ActiveTime
    FROM Orion.AlertObjects (nolock=true) AlertObjects
    INNER JOIN Orion.AlertActive (nolock=true) AlertActive ON AlertObjects.AlertObjectID=AlertActive.AlertObjectID
    INNER JOIN Orion.AlertConfigurations (nolock=true) AlertConfigurations ON AlertConfigurations.AlertID=AlertObjects.AlertID
    INNER JOIN Orion.NodesCustomProperties (nolock=true) NodeCP ON AlertObjects.RelatedNodeID = NodeCP.NodeID
    INNER JOIN Orion.Nodes (nolock=true) Nodes ON AlertObjects.RelatedNodeID = Nodes.NodeID
    Order By AlertConfigurations.Name, AlertObjects.EntityCaption


     You will need to apply the appropriate formatters for each column such as the node details

    Node Details Formatter.png


    Also keep in mind the query above includes a reference to a Node Custom Property 'Importance' which you may need to remove from the query




    I adjusted some of the device's thresholds so I did not have any empty widgets. Which is why my 'Interfaces over threshold' and a couple of others show a low % utilization

    Version history
    Revision #:
    46 of 46
    Last update:
    ‎06-04-2020 05:07 AM
    Updated by: