Adding Arista AP's to LogicMonitor
There was a previous request about this, and I have been working on this my self, so I thought I would share what I have delivered. Required Custom Parameters. The Discovery and collection scripts are expecting the following custom properties to be present for each device I have added these at the folder (in our case "Networks") so they cascade down. AristaWIFI.api.endpoint - This is the endpoint within CV-Cue under advanced setting for configuration and management API integrations. AristaWIFI.api.key - The API Key for CV-CUE AristaWIFI.api.token - The API Token for CV-CUE If these are not provided then the collector and discovery scripts will fail. NetScan: I had issues getting the netscan to work in Groovy so wrote a pyhton script to do this which links to Arista CloudVision and LogicMonitor, I have something in my backlog now to migrate this to groovy, the biggest challenge I have is that the HTTP DELETE call in Groovy is expecting data which is not needed for the delete call to close the session. This also uses the Python Core Library we use for all of our LogicMonitor integrations, so sharing is a tad difficult as I would have share the script and our Core Library. If people think this is worth While I would add it in the future. I set a system category of "AristaWifi" to easily identify Arista AP's for the collection and discovery scripts. Finally I also include the AP's ID on discovery as this is used to pull the specific AP from CV-CUE as the custom Property "CVcueId". What Metrics can be collected. Currently I am collecting CPU and Memory which I have created a Arista WIFI General Metrics Data source, and Arista WIFI SSID Metrics which is collecting the Associated Clients and the SSID State which is whether it is Enabled (1) or Disabled (0), I also have unknown (3) if the information can not be retrieved from the JSON. Arista Wifi General Metrics: This data source is configured to use Script as the collection source, below is the script. Note: The logout is commented out until I can result the http delete issue mentioned above. /******************************************************************************* * Arista WIFI Integration with CUE for discovery of the AP's ******************************************************************************/ import com.santaba.agent.groovyapi.http.* import com.santaba.agent.groovy.utils.GroovyScriptHelper as GSH import com.logicmonitor.mod.Snippets import com.santaba.agent.AgentVersion import java.text.DecimalFormat import com.santaba.agent.util.Settings import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.json.JsonBuilder import java.util.concurrent.Executors import java.util.concurrent.TimeUnit // To run in debug mode, set to true Boolean debug = false // To enable logging, set to true Boolean log = false // Set props object based on whether or not we are running inside a netscan or debug console def props try { hostProps.get("system.hostname") props = hostProps debug = true // set debug to true so that we can ensure we do not print sensitive properties } catch (MissingPropertyException) { props = netscanProps } String key = props.get("AristaWIFI.api.key") String token = props.get("AristaWIFI.api.token") String AristaEndPoint = props.get("AristaWIFI.api.endpoint") //Get the Arista CV WIFI Node Node Id as discovered in the scanning script and submitted to the device.. String nodeId = props.get("CVcueId") String clientId = "logicmonitor" String wifiUrl = "https://"+AristaEndPoint+"/wifi/api/" if (!key) { throw new Exception("Must provide AristaWIFI.api.key to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!token) { throw new Exception("Must provide AristaWIFI.api.token credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!clientId) { throw new Exception("Must provide AristaWIFI.api.clientId credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } //def logCacheContext = "${org}::arista-wifi-cloud" //Boolean skipDeviceDedupe = props.get("skip.device.dedupe", "false").toBoolean() String hostnameSource = props.get("hostname.source", "")?.toLowerCase()?.trim() Integer collectorVersion = AgentVersion.AGENT_VERSION.toInteger() // Bail out early if we don't have the correct minimum collector version to ensure netscan runs properly if (collectorVersion < 32400) { def formattedVer = new DecimalFormat("00.000").format(collectorVersion / 1000) throw new Exception("Upgrade collector running netscan to 32.400 or higher to run full featured enhanced netscan. Currently running version ${formattedVer}.") } httpClient = HTTP.open(AristaEndPoint,443); httpClient.setHTTPProxy('[YOUR Proxy]',8080); // Log in to arista loginurl = "https://"+AristaEndPoint+"/wifi/api/session" payloadstring = '{"type":"apiKeycredentials","keyId":"'+key+'","keyValue":"'+token+'","timeout":129,"clientIdentifier": "'+clientId+'"}'; def payload = payloadstring; //println payload; def loginResponse = httpClient.post(loginurl,payload,["Content-Type":"application/json"]); if ( !(httpClient.getStatusCode() =~ /20/) ) { // Error has occured println "Authentication Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } String RawCookie = httpClient.getHeader("Set-Cookie") //Have Kept but as yet not needed will remove if not needed.. String httpResponseBody = httpClient.getResponseBody() //Retrieve the Cookie to use from the header. AristaCookie = RawCookie.split(';')[0] //Retrieve AP data. deviceURL = 'manageddevices/aps?startindex=0&pagesize=1000&locationid=0&nodeid=0&boxid='+nodeId SendUrl = wifiUrl+deviceURL def header = ["Content-Type":"application/json","Cookie":AristaCookie] String deviceResponse = httpClient.get(SendUrl,header) if ( !(httpClient.getStatusCode() =~ /200/)) { println "Failed to retrieve data "+httpClient.getStatusCode return 1 } String deviceBody = httpClient.getResponseBody() def deviceJson = new JsonSlurper().parseText(deviceBody) def healthStats = deviceJson.managedDevices.healthStats def wildvalue = "" Integer rawminCPU = healthStats[0].minCpuUtilization Integer minCpu = rawminCPU/100 Integer rawavgCPU = healthStats[0].avgCpuUtilization Integer avgCpu = rawavgCPU/100 Integer rawmaxCPU = healthStats[0].maxCpuUtilization Integer maxCpu = rawmaxCPU/100 Integer rawminMem = healthStats[0].minMemoryUtilization Integer minMem = rawminCPU/100 Integer rawAvgMem = healthStats[0].avgMemoryUtilization Integer avgMem = rawAvgMem/100 Integer rawmaxMem = healthStats[0].maxMemoryUtilization Integer maxMem = rawmaxCPU/100 println "${wildvalue}.mincpu=${minCpu}" println "${wildvalue}.avgcpu=${avgCpu}" println "${wildvalue}.maxcpu=${maxCpu}" println "${wildvalue}.minMem=${minMem}" println "${wildvalue}.avgMem=${avgMem}" println "${wildvalue}.maxMem=${maxMem}" // Commented out log out process for now as will need to revisit currently reducing Timeout to 5 minutes for the session. /* String cookieString = '"'+AristaCookie+'"' def logoutheaders = ["Content-Type":"application/json","Cookie":AristaCookie] println logoutheaders def logoutResponse = httpClient.delete(loginurl,"{}",logoutheaders) logoutResult = httpClient.getStatusCode() if ( !(httpClient.getStatusCode() =~ /20/) ) { //Error has occured println "Logout Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } println logoutResponse;*/ def LMDebugPrint(message) { if (debug) { println(message.toString()) } } return 0 Arista WIFI SSID Metrics: This will collect the number of associated clients by Band (IE 2.4ghz) and SSID I have the created graphs to aggregate the data together for total number of associated clients. Discovery Script: /******************************************************************************* * Arista WIFI Integration with CUE for discovery of the AP's ******************************************************************************/ import com.santaba.agent.groovyapi.http.* import com.santaba.agent.groovy.utils.GroovyScriptHelper as GSH import com.logicmonitor.mod.Snippets import com.santaba.agent.AgentVersion import java.text.DecimalFormat import com.santaba.agent.util.Settings import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.json.JsonBuilder import java.util.concurrent.Executors import java.util.concurrent.TimeUnit // To run in debug mode, set to true Boolean debug = false // To enable logging, set to true Boolean log = false // Set props object based on whether or not we are running inside a netscan or debug console def props try { hostProps.get("system.hostname") props = hostProps debug = true // set debug to true so that we can ensure we do not print sensitive properties } catch (MissingPropertyException) { props = netscanProps } String key = props.get("AristaWIFI.api.key") String token = props.get("AristaWIFI.api.token") String AristaEndPoint = props.get("AristaWIFI.api.endpoint") //Get the Arista CV WIFI Node Node Id as discovered in the scanning script and submitted to the device.. String nodeId = props.get("CVcueId") String clientId = "logicmonitor" String wifiUrl = "https://"+AristaEndPoint+"/wifi/api/" if (!key) { throw new Exception("Must provide AristaWIFI.api.key to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!token) { throw new Exception("Must provide AristaWIFI.api.token credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!clientId) { throw new Exception("Must provide AristaWIFI.api.clientId credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } //def logCacheContext = "${org}::arista-wifi-cloud" //Boolean skipDeviceDedupe = props.get("skip.device.dedupe", "false").toBoolean() String hostnameSource = props.get("hostname.source", "")?.toLowerCase()?.trim() Integer collectorVersion = AgentVersion.AGENT_VERSION.toInteger() // Bail out early if we don't have the correct minimum collector version to ensure netscan runs properly if (collectorVersion < 32400) { def formattedVer = new DecimalFormat("00.000").format(collectorVersion / 1000) throw new Exception("Upgrade collector running netscan to 32.400 or higher to run full featured enhanced netscan. Currently running version ${formattedVer}.") } httpClient = HTTP.open(AristaEndPoint,443); httpClient.setHTTPProxy('[Your Proxy]',8080); // Log in to arista loginurl = "https://"+AristaEndPoint+"/wifi/api/session" payloadstring = '{"type":"apiKeycredentials","keyId":"'+key+'","keyValue":"'+token+'","timeout":129,"clientIdentifier": "'+clientId+'"}'; def payload = payloadstring; //println payload; def loginResponse = httpClient.post(loginurl,payload,["Content-Type":"application/json"]); if ( !(httpClient.getStatusCode() =~ /20/) ) { // Error has occured println "Authentication Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } String RawCookie = httpClient.getHeader("Set-Cookie") //Have Kept but as yet not needed will remove if not needed.. String httpResponseBody = httpClient.getResponseBody() //Retrieve the Cookie to use from the header. AristaCookie = RawCookie.split(';')[0] //Retrieve AP data. deviceURL = 'manageddevices/aps?startindex=0&pagesize=1000&locationid=0&nodeid=0&boxid='+nodeId SendUrl = wifiUrl+deviceURL def header = ["Content-Type":"application/json","Cookie":AristaCookie] String deviceResponse = httpClient.get(SendUrl,header) if ( !(httpClient.getStatusCode() =~ /200/)) { println "Failed to retrieve data "+httpClient.getStatusCode return 1 } String deviceBody = httpClient.getResponseBody() def encoded_instance_props_array = [] def deviceJson = new JsonSlurper().parseText(deviceBody) def wildvalue = "" def wildalias = "" def description = "" def getOperatingBand = "" def getSSID = "" def radios = deviceJson.managedDevices.radios radios[0].each { RadioEntry -> // Build out wireless entries. getOperatingBand = RadioEntry.operatingBand RadioEntry.wirelessInterfaces.each { ssidEntry -> getssid = ssidEntry.ssid description = ssidEntry.bssid wildvalue = getOperatingBand+"_"+getssid wildalias = wildvalue def instance_props = [ "auto.opertating.band": RadioEntry.operatingBand, "auto.ssid": ssidEntry.ssid, "auto.bssid":ssidEntry.bssid, "auto.ssid.profileId":ssidEntry.ssidProfileId ] encoded_instance_props_array = instance_props.collect() { property, value -> URLEncoder.encode(property.toString()) + "=" + URLEncoder.encode(value.toString()) } println "${wildvalue}##${wildalias}##${description}####${encoded_instance_props_array.join("&")}" } } // Commented out log out process for now as will need to revisit currently reducing Timeout to 5 minutes for the session. /* String cookieString = '"'+AristaCookie+'"' def logoutheaders = ["Content-Type":"application/json","Cookie":AristaCookie] println logoutheaders def logoutResponse = httpClient.delete(loginurl,"{}",logoutheaders) logoutResult = httpClient.getStatusCode() if ( !(httpClient.getStatusCode() =~ /20/) ) { //Error has occured println "Logout Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } println logoutResponse;*/ def LMDebugPrint(message) { if (debug) { println(message.toString()) } } return 0 Collection Script: /******************************************************************************* * Arista WIFI Integration with CUE for discovery of the AP's ******************************************************************************/ import com.santaba.agent.groovyapi.http.* import com.santaba.agent.groovy.utils.GroovyScriptHelper as GSH import com.logicmonitor.mod.Snippets import com.santaba.agent.AgentVersion import java.text.DecimalFormat import com.santaba.agent.util.Settings import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.json.JsonBuilder import java.util.concurrent.Executors import java.util.concurrent.TimeUnit // To run in debug mode, set to true Boolean debug = false // To enable logging, set to true Boolean log = false // Set props object based on whether or not we are running inside a netscan or debug console def props try { hostProps.get("system.hostname") props = hostProps debug = true // set debug to true so that we can ensure we do not print sensitive properties } catch (MissingPropertyException) { props = netscanProps } String key = props.get("AristaWIFI.api.key") String token = props.get("AristaWIFI.api.token") String AristaEndPont = props.get("AristaWIFI.api.endpoint") //Get the Arista CV WIFI Node Node Id as discovered in the scanning script and submitted to the device.. String nodeId = props.get("CVcueId") String clientId = "logicmonitor" String wifiUrl = "https://"+AristaEndPont+"/wifi/api/" if (!key) { throw new Exception("Must provide AristaWIFI.api.key to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!token) { throw new Exception("Must provide AristaWIFI.api.token credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!clientId) { throw new Exception("Must provide AristaWIFI.api.clientId credentials to run this script. Verify necessary credentials have been provided in Netscan properties.") } if (!AristaEndPont) { throw new Exception("Must provide AristaWIFI.api.endpoint to run this script. Verify necessary variable is within your LogicMonitor instance before continuing.") } //def logCacheContext = "${org}::arista-wifi-cloud" //Boolean skipDeviceDedupe = props.get("skip.device.dedupe", "false").toBoolean() String hostnameSource = props.get("hostname.source", "")?.toLowerCase()?.trim() Integer collectorVersion = AgentVersion.AGENT_VERSION.toInteger() // Bail out early if we don't have the correct minimum collector version to ensure netscan runs properly if (collectorVersion < 32400) { def formattedVer = new DecimalFormat("00.000").format(collectorVersion / 1000) throw new Exception("Upgrade collector running netscan to 32.400 or higher to run full featured enhanced netscan. Currently running version ${formattedVer}.") } httpClient = HTTP.open(AristaEndPont,443); httpClient.setHTTPProxy('[Your Proxy]',8080); // Log in to arista loginurl = "https://"+AristaEndPont+"/wifi/api/session" payloadstring = '{"type":"apiKeycredentials","keyId":"'+key+'","keyValue":"'+token+'","timeout":129,"clientIdentifier": "'+clientId+'"}'; def payload = payloadstring; //println payload; def loginResponse = httpClient.post(loginurl,payload,["Content-Type":"application/json"]); if ( !(httpClient.getStatusCode() =~ /20/) ) { // Error has occured println "Authentication Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } String RawCookie = httpClient.getHeader("Set-Cookie") //Have Kept but as yet not needed will remove if not needed.. String httpResponseBody = httpClient.getResponseBody() //Retrieve the Cookie to use from the header. AristaCookie = RawCookie.split(';')[0] //Retrieve AP data. deviceURL = 'manageddevices/aps?startindex=0&pagesize=1000&locationid=0&nodeid=0&boxid='+nodeId SendUrl = wifiUrl+deviceURL def header = ["Content-Type":"application/json","Cookie":AristaCookie] String deviceResponse = httpClient.get(SendUrl,header) if ( !(httpClient.getStatusCode() =~ /200/)) { println "Failed to retrieve data "+httpClient.getStatusCode return 1 } String deviceBody = httpClient.getResponseBody() def encoded_instance_props_array = [] def deviceJson = new JsonSlurper().parseText(deviceBody) def wildvalue = "" def wildalias = "" def description = "" def getOperatingBand = "" def getSSID = "" def radios = deviceJson.managedDevices.radios def ssidActive = 3 radios[0].each { RadioEntry -> // Build out wireless entries. getOperatingBand = RadioEntry.operatingBand RadioEntry.wirelessInterfaces.each { ssidEntry -> getssid = ssidEntry.ssid description = ssidEntry.bssid wildvalue = getOperatingBand+"_"+getssid wildalias = wildvalue if (ssidEntry.active == true) { ssidActive = 1 } else { ssidActive = 0 } println "${wildvalue}.numAssocClients=${ssidEntry.numAssocClients}" println "${wildvalue}.active=${ssidActive}" } } // Commented out log out process for now as will need to revisit currently reducing Timeout to 5 minutes for the session. /* String cookieString = '"'+AristaCookie+'"' def logoutheaders = ["Content-Type":"application/json","Cookie":AristaCookie] println logoutheaders def logoutResponse = httpClient.delete(loginurl,"{}",logoutheaders) logoutResult = httpClient.getStatusCode() if ( !(httpClient.getStatusCode() =~ /20/) ) { //Error has occured println "Logout Failure"; println httpClient.getStatusCode(); println loginResponse; return(1); } println logoutResponse;*/ def LMDebugPrint(message) { if (debug) { println(message.toString()) } } return 088Views0likes1CommentIs there a way to export data source to a template file; CSV?
So we are in the final phases of rolling out LogicMonitor and now the daunting process of Alert Tuning has rolled upon us. In our old monitoring solution we has it very much tweaked and customized and overall all alerts were around ~400-600ish. In LogicMonitor we are currently at 13000+. We need to seriously tune up the Datasources and we need a way to show our SME's what each datasource is monitoring and what it alerts on, what thresholds, etc.. Is there a way to export the Datasource's Monitoring Template to a CSV file so that we can reference that and our SME's can then say turn off, adjust etc.. I see in the reports section there is a "Alert Threshold Report" but that lists out every single datapoint instance on a group/resource and we don't want that. We need what the base DS template looks at and uses and applies to each matching resource.1.1KViews0likes7CommentsAnyone know of a way to monitor for SNapshot age on a Hyper-V machine?
We have some checks that monitor our VMWare system for Snapshots. Once they are over 72 hour old, we get an alert. I haven’t been able to find a way to do the same thing for our Hyper-V servers. Does anyone happen to know if that’s possible? I didn’t see anything in the Exchange but just through I’d ‘check in case someone knew of anything. I can pull the data with Powershell via the get-vm|get-vmsnapshot command. Not sure if that’s usable in LM somehow. Thanks.457Views7likes9CommentsHow can I tell what's been customized on a DataSource?
Hi, When I look at the toolbox area, the datasources have an icon that tells me if it's been Customized. How can I tell What has been customized if there aren't any notes in the Local History section? Is there a way to do a comparison between the original somehow if there's no update available for me to compare to? Thanks.63Views3likes2CommentsDataSource PowerShell Active Discovery and Collector scripts
Hello LM Community! I am trying to configure a new DataSource that uses PowerShell scripts for both Active Discovery and Collector Attributes with the end goal being to populate the discovered devices/instances with data. My Active Discovery script is as follows (I've left out the functions that generate bearer tokens and make the MS Graph calls). $tenantID = '<tenantId>' $appID = '<appId>' $appSecret = '<appSecret>' $appCredentials = New-Object System.Management.Automation.PSCredential($appID, (ConvertTo-SecureString $appSecret -AsPlainText -Force)) $authToken = Get-MSGraphAuthToken -Credential $appCredentials -TenantID $tenantID $resourceURL = "https://graph.microsoft.com/v1.0/servicePrincipals" $applications = (Invoke-MSGraphQuery -method GET -Uri $resourceURL -token $authToken -Recursive).value | Where-Object {$_.preferredSingleSignOnMode -eq "saml"} foreach ($application in $applications) { Write-Host "$($application.appId)##$($application.appDisplayName)" } This successfully imports all of the instances as I would expect with their respective 'appId' and 'appDisplayName'. These can be seen under the Resources tab in LM. My Collector Attributes script is as follows (again functions left out): $tenantID = '<tenantId>' $appID = '<appId>' $appSecret = '<appSecret>' $global:appCredentials = New-Object System.Management.Automation.PSCredential($appID, (ConvertTo-SecureString $appSecret -AsPlainText -Force)) $global:authToken = Get-MSGraphAuthToken -Credential $appCredentials -TenantID $tenantID $resourceURL = "https://graph.microsoft.com/v1.0/servicePrincipals" $applications = (Invoke-MSGraphQuery -method GET -Uri $resourceURL -token $authToken -Recursive).value | Where-Object {$_.preferredSingleSignOnMode -eq "saml"} $todayDate = Get-Date foreach ($application in $applications) { $expirationDate = $application.keyCredentials.endDateTime[0] | Get-Date -Format yyyy-MM-dd $daysToExpiration = (New-TimeSpan -Start $todayDate -End $($application.keyCredentials.endDateTime[0])).Days $data = [PSCustomObject]@{ appId = $application.appId expirationDate = $expirationDate daysToExpiration = $daysToExpiration } | ConvertTo-Json $data } When I test this script, I select the Device to run it from and the Instance to run it against. The output contains the 'appId', 'expirationDate' and 'daysToExpiration' properties of all the instances, and not just the instance I want to match the latter two data points to. This would be as expected when looking at the script, but not what I want to achieve. I don't understand how the Collector script is supposed to match the values of the properties to their respective Instances. Could someone please explain this to me? I then want to interpret the output with a JSON parser, so I have some JSON Datapoints configured to pull in the desired 'expirationDate' and 'daysToExpiration'. For example: Interpreter: JSON JSON Path: $.daysToExpiration This appears to only work for one of the properties but not both. I have read other articles and documentation that mentions key pairs, but ideally I would like to stick with JSON.129Views4likes3CommentsTesla Motors LogicModule Suite
I previously published a datasource for Tesla Motors Battery Statistics - which presents compelling vehicle battery and charging information that is fetched from the Tesla REST API. To complement those efforts, I've written a few other Tesla Motors LogicModules that return a variety of different, but still interesting, datapoints - including a ConfigSource that displays configuration information about the vehicle itself (are the doors locked? Is the sunroof open?) The following is a list of all the Tesla Motors LogicModules now available (see the above-linked post for additional info on how this all works.) DataSource 'Battery Statistics' tracks battery and charger performance and health metrics Tesla Motors Battery Statistics previously posted to the Exchange but included here for sake of keeping everything together.) The datasource name is TeslaMotors_BatteryStatistics and has lmLocator DXLLKY. DataSource 'Climate Statistics' tracks inside and outside temperatures, as well as driver and passenger temperature settings. The datasource name is TeslaMotors_ClimateStatistics and has lmLocator YZRWXC. ConfigSource 'Car Configuration' collects textual configuration data, cleans it up and makes it easily readable (screenshot attached.) The configsource name is TeslaMotors_Configuration and has lmLocator GRY9AE. DataSource 'Location Data' tracks compass heading, latitude and longitude, and power. The datasource name is TeslaMotors_LocationData and has lmLocator AYWYWA. DataSource 'Odometer Reading' does exactly what you might expect. The datasource name is TeslaMotors_BatteryStatistics and has lmLocator HHJRD135Views12likes5Commentsparam not found error in datapoint mapping
Hello, I am new to LogicMonitor and need some help. I was working on creating a datasource where the groovy script returns line based output like: QueueDepth.Queue_Name_1=24 QueueDepth.Queue_Name_2=20 The datapoints are created like: Queue_Name_1 → Key- ##WILDVALUE##.Queue_Name_1 Queue_Name_2 → Key- ##WILDVALUE##.Queue_Name_2 However, when the data gets polled, it is unable to retrieve it: NaN param not found in output - (method=namevalue, param=.Queue_Name_1) Can someone please let me know what I am missing here. Regards, Shivam391Views8likes9CommentsOracle jdbc JAR file update
LogicMonitor's collector utilizes an outdated version of the Oracle JDBC jar file. It's essential to upgrade to the most recent version available in the Maven repository to take advantage of new secure database connection types. However, users should note a significant change in behavior with the new jar: while the old version automatically closed abandoned Oracle database connections, the new version does not, potentially leading to an excessive number of open connections. This surge in open connections can overload and crash an Oracle server where connections aren’t limited by user. Therefore, clients must either ensure that customizations explicitly close database connections or adjust their server settings to impose limits on the number of concurrent open connections. All of the newest Logicmonitor datasources properly close connections but some of the older modules did not do this. Logicmonitor has created a module to test for this problem and alert if it occurs. Oracle_Database_MonitorUser will keep track of the number of connections in use by the monitoring user and alert if the number of connections is too high. This update is scheduled for collector 35.400. Make sure this module is installed before upgrading to collect 35.400 and monitor your database connections before rolling this out to general release.86Views15likes0CommentsCan I set a different threshold for C drive from D or E drive space?
Hi, Our Windows servers have the standard alerting based on Volume Capacity. When Used Percent gets to 90%, we get a warning, 95% error, etc. How could we change this so that the C drive uses a different set of thresholds than the D drive? Can we do that within the basic DataSource or would we have to have one DataSource that just checks C and one that just checks D? I don’t want to clutter everything up, but if this is easy to do, it would come in handy. Thanks.215Views6likes5Commentsinvalid Output format - root element of output JSON should be "data"
What does means the below message on the following setting ? [MSG] [WARN] [collector-task-thread-collector.batchscript-batchscript-28-1::collector.batchscript:Task:4218:XXX.XXX.XXX.XXX:batchscript:SAP Cloud Connector Memory Status::18] [BatchScriptSlaveTask._prepareOutput:155] invalid Output format - root element of output JSON should be "data", CONTEXT= The output is {"physicalKB":{"total":16469532,"CloudConnector":959296,"others":6477020,"free":9033216},"virtualKB":{"total":41635356,"CloudConnector":4639480,"others":5910204,"free":31085672},"cloudConnectorHeapKB":{"total":4128768,"used":209168,"free":3919600},"version":1}117Views5likes5Comments