All Activity

This stream auto-updates     

  1. Past hour
  2. I'm having difficulty looking for a replacement of NetBotz to monitor all DCs/IDFs and fully supported by LM. Does anyone have recommendations? I'm guessing we want two tiers of monitoring: some with cameras and detailed sensors, the rest with just temperature sensing in random closets. NetBotz run a big expensive, but if they are the best choice I'm ready to make the case. I've heard good things about ITWatchDog, but can't find anything the DataSources for them.
  3. Yesterday
  4. Richard Collisn

    Infoblox Monitoring

    @Kerry DeVilbiss Are the above Infoblox datasources available to be added to our account also?
  5. Last week
  6. Cole McDonald

    Ookla Speedtest

    I changed the first If () {} to test the correct variable (was $site, which isn't represented anywhere else in the script). Then I cleaned the code up a bit and lined everything up... OCD is both great and horrible for programming.
  7. Cole McDonald

    Custom Graphs in Dashboards

    I'd like to see the ability to have a dashboard widget that contains a script (powershell in my case, but whichever) which produces a JSON dataset so custom graphs can be produced. My specific need is to pull historical data, perform some transforms, then create a graph, HTML, or table with the resulting dataset. { "dataSet" = [ {"time" = "09234920934", "value" = "3.4"}, {"time" = "09234920935", "value" = "3.8"}, {"time" = "09234920936", "value" = "3.2"}, {"time" = "09234920937", "value" = "2.4"}, {"time" = "09234920938", "value" = "2.7"} ] }
  8. Cole McDonald

    Ookla Speedtest

    $stats = Measure-Command {$return = Invoke-WebRequest -Uri "https://dallas7.testmy.net/dl-10MB"} Seems to work to get the same data as the .net web client the other is implementing. This both implements the download test and retrieves the returned code to be parsed for any tokens that would allow it to perform the push... just have to figure out the request they're building to piece the next URL or REST request together.
  9. Cole McDonald

    Ookla Speedtest

    I wonder if I could dig up some powershell/.net to implement a socket we could push the test through... let me search through my saved favorites, I think I've used something like that to instantiate remote listeners for port route verification... https://stackoverflow.com/questions/29759854/how-to-connect-to-tcp-socket-with-powershell-to-send-and-receive-data I'm also testing invoke-webrequest -URI $URL right now as well using the URI from your code against dallas7. I'll see what it returns and if I can get that parsed to the value you're looking for.
  10. Cole McDonald

    Allow Logarithmic scaling of graphs

    While I agree this would be a great built in function, you could technically implement this right now with a virtual datapoint… https://stackoverflow.com/questions/19472747/convert-linear-scale-to-logarithmic
  11. Michael Horwath

    LogicMonitor - Device count reporting

    #!/bin/sh USERN="iamabot" PASSW="ohyouwannahaveaparty" #PROXY="--proxy http://proxy.example.com:3128" /usr/bin/env curl $PROXY -s \ "https://iamameatpopsicle.logicmonitor.com/santaba/rpc/getHosts?hostGroupId=1&c=iamameatpopsicle&u=${USERN}&p=${PASSW}" | \ grep -c '"type": "HOST",' so do that, set up a datasource to absorb the return value. Update the hostGroupId with the correct groupId. Note: I wrote this a very long time ago and some of the interfaces may have changed.
  12. mnagel

    Ookla Speedtest

    @Cole McDonald Sure, no problem -- see below. The Ookla one is not much better in reality because the web method is not as accurate as the application socket method, but at least it tried to do bidirectional testing. I can't claim credit for this, I found it and modified a bit to work in LM. I set the mirror site as a property since auto-selection does not work with testmy.net. Mark $size = 50; $mirror = "##speedtest.testmy.mirror##"; if ($site -eq "") { $url = "https://testmy.net/dl-${size}MB" } else { $url = "https://${mirror}.testmy.net/dl-${size}MB" } $path = "Out-Null" $WebClient = New-Object System.Net.WebClient $mbps = "{0:N2}" -f (($size/(Measure-Command {$Request=Get-Date; $WebClient.DownloadFile( $url, $path )}).TotalSeconds) * 😎 Write-Host "Mbps="$mbps
  13. Cole McDonald

    Ookla Speedtest

    mnagel… would you mind if I took a peek at your powershell? Second set of eyes and all that.
  14. Michael Rodrigues

    Ruckus Virtual SmartZone

    @Hayden if you go through support they can get this to the monitoring team. Being beta, you may see a longer turnaround time for response from the dev team. You're sure you've got SNMP enabled on your Ruckus, and it's properly configured in LM for your Ruckus resource? You can also do some snmpwalks on the device from the debug window to see if it's responding at all.
  15. Michael Rodrigues

    Ookla Speedtest

    Reviewed. You weren't kidding about simple code.
  16. madan

    Allow Logarithmic scaling of graphs

    @Mosh How are you exporting though?
  17. Cole McDonald

    Increase when idleInterval alerts

    If you don't want to change the event timing itself, you can add a blank line to the Escalation chain... it will use the escalation interval on that blank step which will add time. We use this for Services restarting that take a long time. We need to know that they've restarted, but also need to know if they don't finish restarting. So we have an escalation chain just for the service alerts that alert our team, then waits 20 more minutes before alerting us again. If you add a blank to the end of the escalation chain, you can stop repeated messaging as well. Works especially well if you are using a ticketing system that only accepts email as an incoming connector.
  18. Cole McDonald

    Datasource to poll for number of files in a UNC path?

    You can do this fairly easily with a powershell: $path = '\\##system.displayname##\path\to\count' (get-childitem $path).count If you need different paths / system, you'll have to provide a hash table of those relationships somewhere. Either as a text file on a server accessible from the Collector, the collector itself, or hardcoded into the DataSource. It will need to come in as a "Gauge" value rather than a counter.
  19. Please make it so that when configuring a website monitor that has multiple Steps, we can set it so that it only alerts if all steps fail. In other words, if any one of the steps passes, then everything is still okay. For example, I have a primary URL for an API endpoint, and a secondary URL. As long as either is available I don't need an alert. Only if both steps fail, then I want an alert.
  20. Please make the "Are you sure?" an option that can be disabled in Settings. For us non-MSP enterprise customers that extra mouse click would be a frustration. I like the idea of locking groups as this means we can turn off the confirmation prompt, and know that important service groups are locked from accidental drag and drop.
  21. Cole McDonald

    Swagger Doc help adding a customProperty to a device

    Thank you. The part I found confusing mostly was the example code given... it is just a generic, blank JSON block. Had that had more detail, I'd have been able to figure it out more quickly. When I've done documentation for Functions and Objects in the past, I've always made sure to include expected input and output... not just types, but structural so that anyone can drop in on my code and be able to produce results immediately. Most of what I've done in the past has been internal tooling, so I saw it as cost savings for the company I was working for due to reduced dev time. I don't tend to see that level of documentation for APIs elsewhere. All of MS's dev docs miss this as well. I've commented on it and they've stated that it was a common complaint. Their new documentation is much clearer, but most of their offerings are still the old documentation style; just giving the function names and leaving it to the developer to parse their meaning/usage.
  22. I am looking to poll ~20 UNC paths for to count the total number of files respectively and display in a simple graph widget. Is this something LM can do natively?
  23. Kerry DeVilbiss

    Cisco Firepower data source

    Our Monitoring team released Cisco Firepower DataSources (+ PropertySource) to the core repository last night - check your portals for the download! Cheers, Kerry
  24. Sarah Terry

    Swagger Doc help adding a customProperty to a device

    @Cole McDonald @Joe Tran we will improve the documentation for this endpoint - thanks!
  25. Jason Miller

    Increase when idleInterval alerts

    Is there a way so we can wait a longer period of time (such as 6min) before the idleInterval sends an alert? I know LM warns about making changes to that alert. Thanks Jason
  26. Cole McDonald

    Collapse Clustered Instances at Group Level

    Previous had an issue with the properties it was adding. If you're creating a new property from a proertySource script, it adds it as an "auto.*" property, which goes away as soon as the script stops processing. To add a new permanent custom property, you have to use the REST API, not just a "category.name=data" output from the script. Here's the final: # These first two lines will need to change to fit your environment. # The groupParentID is the id of a group to house the dynamic groups that will be created... # if that's you root level, use that ID. # We're using a group named "Failover Clusters" in our heirarchy to house them. ####### # Cole McDonald - Sr. Technical Analyst # cole.mcdonald@beyondimpactllc.com # Beyond Impact 2.0, llc # No warranty provided for this code, use at your own risk ####### $company = "Your_Company_Name" $groupParentID = "566" $URLRoot = "https://$company.logicmonitor.com/santaba/rest" $server = "##system.displayname##" $accessID = "##LogicMonitor.accessId.key##" $accessKey = "##LogicMonitor.accessKey.key##" function Send-Request { param ( $cred, $accessid = $null, $accesskey = $null, $URL , $data = $null, $version = '2' , $httpVerb = "GET" ) if ( $accessId -eq $null) { $accessId = $cred.UserName $accessKey = $cred.GetNetworkCredential().Password } # Use TLS 1.2 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Get current time in milliseconds $epoch = [Math]::Round( ( New-TimeSpan ` -start (Get-Date -Date "1/1/1970") ` -end (Get-Date).ToUniversalTime()).TotalMilliseconds ) # Concatenate Request Details $requestVars = $httpVerb + $epoch + $data + $resourcePath # Construct Signature $hmac = New-Object System.Security.Cryptography.HMACSHA256 $hmac.Key = [Text.Encoding]::UTF8.GetBytes( $accessKey ) $signatureBytes = $hmac.ComputeHash( [Text.Encoding]::UTF8.GetBytes( $requestVars ) ) $signatureHex = [System.BitConverter]::ToString( $signatureBytes ) -replace '-' $signature = [System.Convert]::ToBase64String( [System.Text.Encoding]::UTF8.GetBytes( $signatureHex.ToLower() ) ) # Construct Headers $auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add( "Authorization", $auth ) $headers.Add( "Content-Type" , 'application/json' ) # uses version 2 of the API $headers.Add( "X-version" , $version ) # Make Request $response = Invoke-RestMethod ` -Uri $URL ` -Method $httpVerb ` -Body $data ` -Header $headers $result = $response Return $result } if ( test-path "\\$server\C`$\Windows\Cluster\CLUSDB" ) { "system.categories=ClusterMember" $clusterInfo = invoke-command ` -ComputerName $server ` -scriptBlock { Import-Module failoverclusters $cluster = get-cluster "$($cluster.name):$($cluster.id)" } $clustername = ($clusterinfo -split ':')[0] $clusterid = ($clusterinfo -split ':')[1] $groupName = "Failover Cluster - $clustername" # Read Groups # Construct URL $resourcePath = "/device/groups" $url = $URLRoot + $resourcePath # Make Request $response = Send-Request ` -accessid $accessID ` -accesskey $accessKey ` -URL $url $group = $response.items | ? name -eq $groupName if ( ($group | measure-object).count -gt 0 ) { # "*** Group Already exists. Need Device properties? ***" try { $resource = "##Failover.Cluster.GUID##" } catch { $resource = $null } if ( $resource -ne $clusterid ) { # Add Properties # Construct URL $resourcePath = "/device/devices/##system.deviceid##/properties/" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"type`" : `"custom`" , `"name`" : `"Failover.Cluster.GUID`" , `"value`" : `"$ClusterID`" } "@ $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "POST" } } else { # "*** create group & tag resource ***" # Construct URL $resourcePath = "/device/groups" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"name`" : `"$groupName`" , `"parentId`" : `"$groupParentID`" , `"disableAlerting`" : `"true`" , `"enableNetflow`" : `"false`" , `"appliesTo`" : `"Failover.Cluster.GUID == \`"$ClusterID\`"`" , `"customProperties`" : [{ `"name`" : `"Failover.Cluster.ParentGUID`" , `"value`" : `"$ClusterID`" }] } "@ try { $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "POST" # Add Properties # Construct URL $resourcePath = "/device/devices/##system.deviceid##/properties/Failover.Cluster.GUID" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"type`" : `"custom`" , `"name`" : `"Failover.Cluster.GUID`" , `"value`" : `"$ClusterID`" } "@ $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "PUT" } catch { $error[0] | out-file $logPath -append } } }
  27. Cole McDonald

    more cluster alert improvement requests

    Previous had an issue with the properties it was adding. If you're creating a new property from a proertySource script, it adds it as an "auto.*" property, which goes away as soon as the script stops processing. To add a new permanent custom property, you have to use the REST API, not just a "category.name=data" output from the script. Here's the final: # These first two lines will need to change to fit your environment. # The groupParentID is the id of a group to house the dynamic groups that will be created... # if that's you root level, use that ID. # We're using a group named "Failover Clusters" in our heirarchy to house them. ####### # Cole McDonald - Sr. Technical Analyst # cole.mcdonald@beyondimpactllc.com # Beyond Impact 2.0, llc # No warranty provided for this code, use at your own risk ####### $company = "Your_Company_Name" $groupParentID = "566" $URLRoot = "https://$company.logicmonitor.com/santaba/rest" $server = "##system.displayname##" $accessID = "##LogicMonitor.accessId.key##" $accessKey = "##LogicMonitor.accessKey.key##" function Send-Request { param ( $cred, $accessid = $null, $accesskey = $null, $URL , $data = $null, $version = '2' , $httpVerb = "GET" ) if ( $accessId -eq $null) { $accessId = $cred.UserName $accessKey = $cred.GetNetworkCredential().Password } # Use TLS 1.2 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Get current time in milliseconds $epoch = [Math]::Round( ( New-TimeSpan ` -start (Get-Date -Date "1/1/1970") ` -end (Get-Date).ToUniversalTime()).TotalMilliseconds ) # Concatenate Request Details $requestVars = $httpVerb + $epoch + $data + $resourcePath # Construct Signature $hmac = New-Object System.Security.Cryptography.HMACSHA256 $hmac.Key = [Text.Encoding]::UTF8.GetBytes( $accessKey ) $signatureBytes = $hmac.ComputeHash( [Text.Encoding]::UTF8.GetBytes( $requestVars ) ) $signatureHex = [System.BitConverter]::ToString( $signatureBytes ) -replace '-' $signature = [System.Convert]::ToBase64String( [System.Text.Encoding]::UTF8.GetBytes( $signatureHex.ToLower() ) ) # Construct Headers $auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add( "Authorization", $auth ) $headers.Add( "Content-Type" , 'application/json' ) # uses version 2 of the API $headers.Add( "X-version" , $version ) # Make Request $response = Invoke-RestMethod ` -Uri $URL ` -Method $httpVerb ` -Body $data ` -Header $headers $result = $response Return $result } if ( test-path "\\$server\C`$\Windows\Cluster\CLUSDB" ) { "system.categories=ClusterMember" $clusterInfo = invoke-command ` -ComputerName $server ` -scriptBlock { Import-Module failoverclusters $cluster = get-cluster "$($cluster.name):$($cluster.id)" } $clustername = ($clusterinfo -split ':')[0] $clusterid = ($clusterinfo -split ':')[1] $groupName = "Failover Cluster - $clustername" # Read Groups # Construct URL $resourcePath = "/device/groups" $url = $URLRoot + $resourcePath # Make Request $response = Send-Request ` -accessid $accessID ` -accesskey $accessKey ` -URL $url $group = $response.items | ? name -eq $groupName if ( ($group | measure-object).count -gt 0 ) { # "*** Group Already exists. Need Device properties? ***" try { $resource = "##Failover.Cluster.GUID##" } catch { $resource = $null } if ( $resource -ne $clusterid ) { # Add Properties # Construct URL $resourcePath = "/device/devices/##system.deviceid##/properties/" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"type`" : `"custom`" , `"name`" : `"Failover.Cluster.GUID`" , `"value`" : `"$ClusterID`" } "@ $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "POST" } } else { # "*** create group & tag resource ***" # Construct URL $resourcePath = "/device/groups" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"name`" : `"$groupName`" , `"parentId`" : `"$groupParentID`" , `"disableAlerting`" : `"true`" , `"enableNetflow`" : `"false`" , `"appliesTo`" : `"Failover.Cluster.GUID == \`"$ClusterID\`"`" , `"customProperties`" : [{ `"name`" : `"Failover.Cluster.ParentGUID`" , `"value`" : `"$ClusterID`" }] } "@ try { $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "POST" # Add Properties # Construct URL $resourcePath = "/device/devices/##system.deviceid##/properties/Failover.Cluster.GUID" $url = $URLRoot + $resourcePath # Construct Data Body $data = ` @" { `"type`" : `"custom`" , `"name`" : `"Failover.Cluster.GUID`" , `"value`" : `"$ClusterID`" } "@ $response = Send-Request ` -accesskey $accessKey ` -accessid $accessId ` -URL $url ` -data $data ` -httpVerb "PUT" } catch { $error[0] | out-file $logPath -append } } }
  28. Cole McDonald

    Swagger Doc help adding a customProperty to a device

    with out the stray }] … and the properties are case sensitive!
  1. Load more activity