I have created several groups on my Solarwinds platform, now i would like to see the traffic utilization on the interface of the nodes specific to each group.
However, when i try to customize the group, i am seeing traffic utilization for all interfaces on every single node on the platform.
Has anyone worked with groups and been able to achieve this ?
There are some of the built-in Netflow reports like Top 100 applications, Top 50 Conversations, Top 5 Protocols, and etc.
However, we need to create report which will give this irrespective of Node. Also, one report which will have co-relation between Applications, Protocol, Device, Conversations.
I see that customization is very less for Netflow reporting.
Anyone is there who has customized NTA reports based on customer needs to identify traffic Application Wise or protocol wise analysis.
If possible, pls share report screenshot which would help us to create new reports.
It can be either. You can use domain\username for an AD account or just use the username (with no domain name) for a local account. If you have issues with the network share, there is also an ISO upgrade available.
jblankjblank the table orion.routing.neighbors shows the ifindex from the snmp ifindex, but interfaceid is a global value. I can track it back obviously by finding the node id in the interfaces table but anyway that sw could actually collect and store the global interfaceid here or would that be too invasive? It would make connecting the dots a lot less complex. I realize it isnt necessary but the global interface id is way more interesting to me than ifindex.
Edit: I removed a test field from an array while typing notes and in the part where I was pushing the edges into the edges array I left a comma that is not needed as it is the last item being pushed into the array. That would have possibly broke the code. I am removing the extra comma in these notes. I found it by mistake reviewing my post.
Ok I decided to release it into the wild. Please note, I am not a programmer yet just learning and I know the code lacks efficiency majorly. Some of the thinks I did in here (naming the peers array for example were me just testing new methods of doing things that I havent done before. Enjoy and I wont be able to answer much about it until monday but see if anyone wants to try to make it work...show me what you got...lol
<div id="mynetwork"></div> ///div id used in this example for map
<script>
///declaring variables outside of the function so all functions can use them i think
var nodes;
var edges;
var edges=[];
var swql;
var results=[];
var links;
responses=[];
var node;
var node=[];
var nodename;
var nodename=[];
var nodes=[];
let result;
var data;
data=[];
var x;
var y;
var peers;
var peers=[]
var basenodes;
var basenodes=[]
var outsidenodes;
var outsidenodes=[];
////datareduce function
function datareduce(){
///push each query response into data[0,1,2,3,4,etc]
for(x=0; x<responses.length; x++) {
data.push(responses[x].d.Rows);
}
//find my ip addresses
///check to see if my node is in my node list if not push my node id/nodename seperated them to make searchable arrays probably a total waste of time but i had issue with includes and the dataset returned directly from sw
for(x=0; x<data[0].length; x++){
if (node.includes(data[0][x][1])==false){
node.push(data[0][x][1]);
nodename.push(data[0][x][0]);
}
for(y=0; y<data[2].length; y++){
///push my ip addresses for each node into an array of ip addresses of only interesting nodes...so later dont loop the entire ip address table every time lot of wasted steps going on here. Making it work before i try to make it work cleanly lol
if(data[0][x][1]==data[2][y][0]){
basenodes.push(data[2][y]);
}
}
}
///go through my basenodes ip and find ospf neighbors that show me as their neighbor this match represents a peer push to peer record. I did master break here once i find a match no need to keep looking
for(x=0; x<basenodes.length; x++){
for(y=0; y<data[1].length; y++){
if(data[1][y][1]==basenodes[x][1]){
peers.push(
{
peer1:basenodes[x][0],
peer1ip:basenodes[x][1],
peer1ifindex:basenodes[x][2],
peer2:data[1][y][0]
});
break;
}
}
}
////go through peers and look for peers that are not part of my initial search...if not in my initial search need to check for their neighbors and include my initial node list nodes as peer statements going back the other way (two sides of every connection need to find that interface as well)
for(x=0; x<peers.length; x++){
if (node.includes(peers[x]['peer2'])==false){
outsidenodes.push(peers[x]['peer2']);
for(y=0; y<data[3].length; y++){
if(peers[x]['peer2']==data[3][y][0]){
node.push(data[3][y][0]);
nodename.push(data[3][y][1]);
}
}
}
}
///searching new set of nodes for matches in original list
value:data[4][y][4] ///i was toying around with making line thickness match traffic on link so i got rid of all interface stats except inbps and used it here
///the line above here is where I removed the comma from the value: line
})
break;
}
}
}
console.log(data);
// create a network
var container = document.getElementById('mynetwork');
// provide the data in the vis format
var dataset = {
nodes: nodes,
edges: edges
};
var options = {
layout:{
improvedLayout: false
}
}
var network = new vis.Network(container, dataset, options);
//network.on('select', function (properties) {
// alert('selected edge: ' + properties.edges);
//});
}
//doajax request to solarwinds and push answer to responses object
var swql=["SELECT distinct i.node.nodename, i.NodeID FROM Orion.NPM.Interfaces i where i.caption like '%r1-r1%'" ,
"SELECT NodeID, NeighborIP FROM Orion.Routing.Neighbors where protocolname ='ospf'" ,
"SELECT NodeID, IPAddress, InterfaceIndex FROM Orion.NodeIPAddresses",
"SELECT nodeid, caption FROM Orion.nodes" , " select nodeid,interfaceid,index,caption,inbps,operstatus from orion.npm.interfaces"] ;
///these lines run the swql queries and wait till they are done to process the data
///i learned about asynch funtions and waiting for them with then...before I learned this I was having to nest all my swql queries inside eachother and copy and paste them all over and over again the entire code which was really bad. This new method has opened up for me to declare my ajax call in an outside script then call it on any page at any time which once I implement will be really cool..I will also be doing the same for all future graphing types with outside function that I call and pass args to.
///weird function name for a function that does a lot of extra work it doesnt need to...i wanted to get rid of responses.d.Rows(or columns) and just have the data
We are getting notifications of the following format in our Orion platform:
Plugin "Orion Licensing Business Layer" failed to start on [HOSTNAME]. Please restart the Module Engine service on [HOSTNAME].
We recently migrated our entire environment from Amazon to Azure. The hostnames in the notifications are of three Amazon servers that used to function as Polling Engines (ROP's). These servers were brought offline before we started migrating Solarwinds to the new servers.
I'd like to know where this Event is triggered, so that it can be silenced. I can no longer access the old servers, so solving this the standard way isn't possible.
The old hostnames are no longer present in the Engines table and the nodes monitoring them have also been deleted.
The event looks like this in the database. Note that it doesn't give any information regarding the origin of this event.
"exceptionMessage": "Object reference not set to an instance of an object.",
"exceptionType": "System.Exception",
"stackTrace": " at SolarWinds.Orion.Web.Platform.Data.SwisRepository.Invoke[T](String entity, String verb, Object[] args) in C:\\buildAgent\\work\\1ec88b4de741def0\\Src\\Lib\\SolarWinds.Orion.Web.Platform\\Data\\SwisRepository.cs:line 181\r\n at SolarWinds.Orion.Web.Services.Data.SwisQueryRepository.Invoke[T](String entity, String verb, Object[] args) in C:\\buildAgent\\work\\1ec88b4de741def0\\Src\\Lib\\SolarWinds.Orion.Web.Services\\Data\\SwisQueryRepository.cs:line 35\r\n at SolarWinds.Orion.Web.Services.SwisService.Invoke[T](String entity, String verb, Object[] parameters) in C:\\buildAgent\\work\\1ec88b4de741def0\\Src\\Lib\\SolarWinds.Orion.Web.Services\\SwisService.cs:line 40\r\n at SolarWinds.Orion.Api.Host.Controllers.SwisController.Invoke(InvokeParam verb) in C:\\buildAgent\\work\\165e2f5a876348dd\\Src\\Web\\SolarWinds.Orion.Api.Host\\Controllers\\SwisController.cs:line 61\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()"
Hey thanks, that didn't entirely work for me for whatever reason but, you put me on the right track. After trying a couple things I stumbled on the ActionTypeID named SendHttpRequest with that and the Title and Description gives me what I was looking for... now to figure out the joins and what not to get the report to look good.
Is there any documentation around setting something like this up? I'm not very familiar with the Send-MailMessage powershell command. Are there any plans add this functionality into the native UI at some point in the future?
I'm able to get a simple email to fire off after a new account is created but for some reason the password variable isnt returning any value. Is there anything else I need to check on my end?
can you specifiy what you mean by "the password variable isn´t returning a value"? Could you post the parameter definition of your script and how you try to access the variable?
There is documentation regarding the usage of scripts and the passing of parameters in the extended install & config guide you can find in the success center.