ContributionsMost RecentMost LikesSolutionsRe: SQL performance graphs stopped working after collector upgrade to 31.002 Thanks might have to look into implementing something like this for our environment. Re: SQL performance graphs stopped working after collector upgrade to 31.002 I am curious...how are you polling dashboard widgets to find the failed polls? Re: SQL performance graphs stopped working after collector upgrade to 31.002 May want to only upgrade one collector to test first. We had to downgrade our collectors back to 30.002 that were running any type of SQL query datasources. They weren't polling at all on 31.003. Since we downgraded we at least are getting partial polls at the moment(a handful each hour instead of every 3 minutes). Re: LM datasource to discover instances and create devices If you have a linux box on your network somewhere, you could always set a cronjob to hit the api and delete the folder/devices(flagged by a property source)and then recreate the group with another api call. Isn't an out of the box solution, but should work if you really needed a solution in the interim. Re: Rapid7 integration with LogicMonitor Rapid 7 has a few products. One is nexpose which is a vulnerability scanner which I don't think would work well with a custom datasource unless you were only interested in something very basic like the risk score for a device. The event source would probably be the best route to take for integrating the alerts into LM. Re: How to monitor opensource elasticsearch in Logic Monitor Last one for cluster health status. <?xml version="1.0" encoding="UTF-8" ?> <feed version="1.0" hasPendingRequests="false" > <company></company> <status>200</status> <errmsg>OK</errmsg> <interval>0</interval> <entry type="predatasource"> <version>1573572264</version> <name>Elasticsearch_Cluster_Health_Status_veri</name> <displayedas>Cluster Health Status_veri</displayedas> <description>Elasticsearch Cluster status: 2 == green, 1 == yellow, 0 == red.</description> <collector>script</collector> <hasMultiInstances>false</hasMultiInstances> <schedule>60</schedule> <appliesTo>hasCategory("elasticsearch") or system.deviceId == "6986"</appliesTo> <wildcardauto>false</wildcardauto> <wildcardpersist>false</wildcardpersist> <wildcardlinuxscript></wildcardlinuxscript> <wildcardlinuxcmdline></wildcardlinuxcmdline> <wildcardwinscript></wildcardwinscript> <wildcardwincmdline></wildcardwincmdline> <wildcardgroovyscript></wildcardgroovyscript> <wildcardschedule>1440</wildcardschedule> <wildcarddisable>false</wildcarddisable> <wildcarddeleteinactive>false</wildcarddeleteinactive> <agdmethod>none</agdmethod> <agdparams></agdparams> <group></group> <tags>cluster,elasticsearch,health,status</tags> <technology></technology> <adlist><![CDATA[{"agdmethod":"none","agdparams":"","id":0,"filters":[],"params":{}}]]></adlist> <schemaVersion>2</schemaVersion> <dataSourceType>1</dataSourceType> <attributes> <attribute> <name>scripttype</name> <value>embed</value> <comment></comment> </attribute> <attribute> <name>scriptgroovy</name> <value>import groovy.json.JsonSlurper import org.apache.http.client.methods.HttpGet import org.apache.http.conn.ssl.SSLConnectionSocketFactory import org.apache.http.conn.ssl.SSLContextBuilder import org.apache.http.conn.ssl.TrustSelfSignedStrategy import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils def hostname = hostProps.get("system.hostname") def slurper = new JsonSlurper() def cluster_status_map = ["green" : 2, "yellow": 1, "red" : 0] def request_endpoint = "http://${hostname}:9200/_cluster/health" def request_headers = ["User-Agent" : "LogicMonitor Polling Agent", "Content-Type": "application/json"]; /* * http_get - do an HTTP GET with apache http client * @param string request_endpoint * @param map request_headers * @return map [code,status,body] */ def http_get(request_endpoint, request_headers) { def http_get = new HttpGet(request_endpoint); // what type of request? if (request_endpoint.startsWith('https:')) { // https -- create an ssl-safe client ssl_builder = new SSLContextBuilder(); ssl_builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); ssl_sf = new SSLConnectionSocketFactory(ssl_builder.build(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); client = HttpClients.custom().setSSLSocketFactory(ssl_sf).build(); } else { // vanilla http -- use the default client client = HttpClients.createDefault(); } // iterate over request headers request_headers.each() { key, value -> http_get.setHeader(key, value); } def http_response = client.execute(http_get); def response_message = http_response.getEntity(); def response_status = http_response.getStatusLine(); def response_code = response_status.getStatusCode(); def response_body = EntityUtils.toString(response_message); http_response.close(); return ; } // Make HTTP GET call def get_response = http_get(request_endpoint, request_headers); // Parse result to JSON def result = slurper.parseText(get_response['body']) // Print the results println cluster_status_map[result.status] return 0; </value> <comment></comment> </attribute> <attribute> <name>windowsscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>windowscmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxcmdline</name> <value></value> <comment></comment> </attribute> </attributes> <datapoints> <datapoint> <name>cluster_status</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>none</postprocessormethod> <postprocessorparam></postprocessorparam> <usevalue>output</usevalue> <alertexpr>= 1 0</alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody>The ElasticSearch Cluster at ##HOST## is reporting a state of ##VALUE## putting it in a ##LEVEL## state. The cluster has been in this state since ##START## or for ##DURATION##.</alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>ElasticSearch Cluster status: 2 = green, 1 = yellow, 0 = red.</description> <maxvalue>2</maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>1</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> </datapoints> <graphs> <graph> <name>Elasticsearch Cluster Health Status</name> <title>Elasticsearch Cluster Health Status</title> <verticallabel>status</verticallabel> <rigid>false</rigid> <maxvalue>2.0</maxvalue> <minvalue>0.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>cluster_status</name> <datapointname>cluster_status</datapointname> <cf>1</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>Status</legend> <color>blue</color> <datapointname>cluster_status</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> </graphdatas> </graph> </graphs> <overviewgraphs> </overviewgraphs> <scripts> </scripts> </entry> </feed> Re: How to monitor opensource elasticsearch in Logic Monitor We have 3 datasources that we use for our internal Elk clusters. Maybe they can help you or at least point you in the right direction for writing your own. This is the one for shard health. <?xml version="1.0" encoding="UTF-8" ?> <feed version="1.0" hasPendingRequests="false" > <company></company> <status>200</status> <errmsg>OK</errmsg> <interval>0</interval> <entry type="predatasource"> <version>1573572263</version> <name>Elasticsearch_Cluster_Shards_veri</name> <displayedas>Cluster Shards_veri</displayedas> <description>Monitors Elasticsearch Cluster shard health.</description> <collector>webpage</collector> <hasMultiInstances>false</hasMultiInstances> <schedule>60</schedule> <appliesTo>hasCategory("elasticsearch") or system.deviceId == "6986"</appliesTo> <wildcardauto>false</wildcardauto> <wildcardpersist>false</wildcardpersist> <wildcardlinuxscript></wildcardlinuxscript> <wildcardlinuxcmdline></wildcardlinuxcmdline> <wildcardwinscript></wildcardwinscript> <wildcardwincmdline></wildcardwincmdline> <wildcardgroovyscript></wildcardgroovyscript> <wildcardschedule>1440</wildcardschedule> <wildcarddisable>false</wildcarddisable> <wildcarddeleteinactive>false</wildcarddeleteinactive> <agdmethod>none</agdmethod> <agdparams></agdparams> <group></group> <tags>cluster,shards,elasticsearch,health</tags> <technology></technology> <adlist><![CDATA[{"agdmethod":"none","agdparams":"","id":0,"filters":[],"params":{}}]]></adlist> <schemaVersion>2</schemaVersion> <dataSourceType>1</dataSourceType> <attributes> <attribute> <name>ip</name> <value></value> <comment></comment> </attribute> <attribute> <name>port</name> <value>9200</value> <comment></comment> </attribute> <attribute> <name>followRedirect</name> <value>false</value> <comment></comment> </attribute> <attribute> <name>connectTimeout</name> <value>1000</value> <comment></comment> </attribute> <attribute> <name>readTimeout</name> <value>1000</value> <comment></comment> </attribute> <attribute> <name>request</name> <value>GET /_cluster/health?pretty&human HTTP/1.0</value> <comment></comment> </attribute> <attribute> <name>ssl</name> <value>N</value> <comment></comment> </attribute> </attributes> <datapoints> <datapoint> <name>active_primary_shards</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>json</postprocessormethod> <postprocessorparam>active_primary_shards</postprocessorparam> <usevalue>body</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>Number of active primary shards.</description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>active_shards</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>json</postprocessormethod> <postprocessorparam>active_shards</postprocessorparam> <usevalue>body</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>Number of active shards.</description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>initializing_shards</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>json</postprocessormethod> <postprocessorparam>initializing_shards</postprocessorparam> <usevalue>body</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>Number of initializing shards.</description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>relocating_shards</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>json</postprocessormethod> <postprocessorparam>relocating_shards</postprocessorparam> <usevalue>body</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>Number of relocating shards.</description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>unassigned_shards</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>json</postprocessormethod> <postprocessorparam>unassigned_shards</postprocessorparam> <usevalue>body</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description>Number of unassigned shards.</description> <maxvalue></maxvalue> <minvalue></minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> </datapoints> <graphs> <graph> <name>Shards</name> <title>Shards</title> <verticallabel>shards</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>active_primary_shards</name> <datapointname>active_primary_shards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>active_shards</name> <datapointname>active_shards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>initializing_shards</name> <datapointname>initializing_shards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>relocating_shards</name> <datapointname>relocating_shards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>unassigned_shards</name> <datapointname>unassigned_shards</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>Active Primary</legend> <color>red</color> <datapointname>active_primary_shards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Active</legend> <color>orange</color> <datapointname>active_shards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Initializing</legend> <color>yellow</color> <datapointname>initializing_shards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Relocating</legend> <color>green</color> <datapointname>relocating_shards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Unassigned</legend> <color>blue</color> <datapointname>unassigned_shards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> </graphdatas> </graph> </graphs> <overviewgraphs> </overviewgraphs> <scripts> </scripts> </entry> </feed> Re: VMWare Guest OS counts Both are still under security review...I am assuming you can probably get that cleared easy enough....? Re: LogicMonitor Custom HTTP Integrations Blake, If I understand you correctly, I think you are talking about something similar to what we do on status hub not status page but I think you could handle it with a similar process. We have our different products with multiple services under each sometimes. These services are all updated independently by creating the generic webhook integration in statushub. We then create a property on the webcheck or device - statushub.token=#######. When an alert is triggered it posts to the webhook and appends thetoken that references the service in status hub. payload={ "title": "This service is currently experiencing issues and we are investigating.", "message": "We apologize for the inconvenience!", "type": "investigating", "status": "down", "service_token": "##statushub.token2##" } This should work pretty much the sameway using the component api that they offer when I took a quick glance at their docs. You would just append the token in the API component Url that you use to post. Maybe this will help you or at least give you an idea of how you could solve it... Re: Statuspage.io See the integration's description for the property that will need to be added to the devices/websites that you want to post alerts for to statushub. { "enabledStatus": [ "active", "clear" ], "parseMethod": "", "name": "statushub-via-payload", "ack": null, "clear": { "headers": [], "password": "********", "method": "post", "payload": "payload={\n \"title\": \"This service has returned to normal.\",\n \"message\": \"Service: ##WEBSITE##; Service Description: ##WEBSITEDESCRIPTION##\",\n \"type\": \"resolved\",\n \"status\": \"up\",\n \"service_token\": \"##statushub.token##\"\n}", "payloadFormat": "formdata", "url": "https://hooks.statushub.io/hooks/generic_hook", "username": "" }, "description": "INTERNAL ONLY - More detailed\nUP / DOWN\nService token in payload instead of url, means one integration instead of an integration per service.\nproperty: statushub.token", "active": { "headers": [], "password": "********", "method": "post", "payload": "payload={\n \"title\": \"This service is currently experiencing problems\",\n \"message\": \"Service: ##WEBSITE##; service.description: ##WEBSITEDESCRIPTION##\",\n \"type\": \"investigating\",\n \"status\": \"down\",\n \"service_token\": \"##statushub.token##\"\n}", "payloadFormat": "formdata", "url": "https://hooks.statushub.io/hooks/generic_hook", "username": "" }, "update": null, "type": "http", "parseExpression": "", "uiDetails": "{\"includeIDInHttpResponse\":false,\"groupInfo\":[[\"active\",\"clear\"],[\"active\"]],\"multipleMode\":true}" }
Top ContributionsRe: LM datasource to discover instances and create devicesRe: Rapid7 integration with LogicMonitorRe: How to monitor opensource elasticsearch in Logic MonitorRe: How to monitor opensource elasticsearch in Logic MonitorRe: VMWare Guest OS countsRe: LogicMonitor Custom HTTP IntegrationsRe: LogicMonitor Custom HTTP IntegrationsRe: Statuspage.ioRe: SQL performance graphs stopped working after collector upgrade to 31.002Re: SQL performance graphs stopped working after collector upgrade to 31.002