From 0f42e8dcc623a0c34437e2023d7fdd24602dfa06 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Wed, 22 Sep 2021 10:07:31 +0200 Subject: [PATCH 1/3] Cleanup. --- doc/monitoring-eye-svgrepo-com.png | Bin 0 -> 29086 bytes doc/monitoring-eye-svgrepo-com.svg | 74 ++++++++++++++++++ .../main/java/sysmon/server/Application.java | 2 +- .../server/ComboResultToPointProcessor.java | 16 +--- .../server/MetricResultToPointProcessor.java | 3 - 5 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 doc/monitoring-eye-svgrepo-com.png create mode 100644 doc/monitoring-eye-svgrepo-com.svg diff --git a/doc/monitoring-eye-svgrepo-com.png b/doc/monitoring-eye-svgrepo-com.png new file mode 100644 index 0000000000000000000000000000000000000000..8c022edca457a4df6f9892618b67196e41e5e5b3 GIT binary patch literal 29086 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/src/main/java/sysmon/server/Application.java b/server/src/main/java/sysmon/server/Application.java index 1b4c8e7..e95b5e7 100644 --- a/server/src/main/java/sysmon/server/Application.java +++ b/server/src/main/java/sysmon/server/Application.java @@ -32,7 +32,7 @@ public class Application implements Callable { private Integer listenPort = 9925; @CommandLine.Option(names = { "-t", "--threads" }, description = "Threads for processing inbound metrics(default: ${DEFAULT-VALUE}).", paramLabel = "") - private Integer threads = 5; + private Integer threads = 1; @CommandLine.Option(names = { "-d", "--debug" }, description = "Enable debugging (default: ${DEFAULT_VALUE}).") private boolean enableDebug = false; diff --git a/server/src/main/java/sysmon/server/ComboResultToPointProcessor.java b/server/src/main/java/sysmon/server/ComboResultToPointProcessor.java index 5cbfbd6..a8c4f33 100644 --- a/server/src/main/java/sysmon/server/ComboResultToPointProcessor.java +++ b/server/src/main/java/sysmon/server/ComboResultToPointProcessor.java @@ -4,19 +4,15 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import sysmon.shared.ComboResult; import sysmon.shared.Measurement; import sysmon.shared.MetricResult; -import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ComboResultToPointProcessor implements Processor { - private static final Logger log = LoggerFactory.getLogger(ComboResultToPointProcessor.class); private static String influxDbName; ComboResultToPointProcessor(String influxDbName) { @@ -24,22 +20,17 @@ public class ComboResultToPointProcessor implements Processor { } @Override - public void process(Exchange exchange) throws Exception { + public void process(Exchange exchange) { ComboResult comboResult = exchange.getIn().getBody(ComboResult.class); - //MetricResult metricResult = exchange.getIn().getBody(MetricResult.class); - - //log.info("Size of measurements: " + measurementList.size()); BatchPoints.Builder batchPoints = BatchPoints .database(ComboResultToPointProcessor.influxDbName) .precision(TimeUnit.MILLISECONDS); - List results = comboResult.getMetricResults(); - for(MetricResult metricResult : results) { + for(MetricResult metricResult : comboResult.getMetricResults()) { - List measurementList = metricResult.getMeasurements(); - for(Measurement measurement : measurementList) { + for(Measurement measurement : metricResult.getMeasurements()) { Point.Builder point = Point.measurement(metricResult.getName()) .time(metricResult.getTimestamp(), TimeUnit.MILLISECONDS) @@ -65,6 +56,7 @@ public class ComboResultToPointProcessor implements Processor { } batchPoints.point(point.build()); } + } exchange.getIn().setBody(batchPoints.build()); diff --git a/server/src/main/java/sysmon/server/MetricResultToPointProcessor.java b/server/src/main/java/sysmon/server/MetricResultToPointProcessor.java index 7afafd0..70216f5 100644 --- a/server/src/main/java/sysmon/server/MetricResultToPointProcessor.java +++ b/server/src/main/java/sysmon/server/MetricResultToPointProcessor.java @@ -4,8 +4,6 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import sysmon.shared.Measurement; import sysmon.shared.MetricResult; @@ -15,7 +13,6 @@ import java.util.concurrent.TimeUnit; public class MetricResultToPointProcessor implements Processor { - private static final Logger log = LoggerFactory.getLogger(MetricResultToPointProcessor.class); private static String influxDbName; MetricResultToPointProcessor(String influxDbName) { From 33533e0885d5e33e9822dbe2a3d452241b36d780 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Wed, 22 Sep 2021 15:46:48 +0200 Subject: [PATCH 2/3] Improve robustness, logging and example dashboards --- LICENSE | 202 ++ README.md | 8 +- .../sysmon/client/ClientRouteBuilder.java | 24 +- .../src/main/resources/application.properties | 3 + .../main/resources/simplelogger.properties | 2 + ...Sysmon - Host Overview-1632317598140.json} | 1708 ++++++++++------- ...mon - Process Explorer-1632317613366.json} | 49 +- gradle.properties | 2 +- plugins/os-ibmi/build.gradle | 2 +- .../sysmon/server/ServerRouteBuilder.java | 7 +- .../main/resources/simplelogger.properties | 2 + .../main/java/sysmon/shared/ComboResult.java | 2 +- .../main/java/sysmon/shared/MetricResult.java | 22 +- 13 files changed, 1276 insertions(+), 757 deletions(-) create mode 100644 LICENSE rename doc/{Sysmon - Host Overview-1631013497580.json => Sysmon - Host Overview-1632317598140.json} (82%) rename doc/{Sysmon - Process Explorer-1631263229100.json => Sysmon - Process Explorer-1632317613366.json} (96%) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 3fe1da1..8edb0d3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # System Monitor -Java based system monitoring solution with support for plugins. +This software is free to use and is licensed under the [Apache 2.0 License](LICENSE). - Example dashboards are provided in the [doc/](doc) folder, which can be imported into your Grafana installation. - Screenshots are available in the [downloads](https://bitbucket.org/mnellemann/sysmon/downloads/) section. +![Sysmon Icon](doc/monitoring-eye-svgrepo-com.svg){width=320 height=320} + ## Components ### Client @@ -15,13 +17,13 @@ Runs on your hosts and collects metrics, which are sent to the central *server*. ### Server -Receives aggregated metrics from clients and saves these into InfluxDB. +Receives aggregated metrics from *clients* and saves these into InfluxDB. [More information](server/README.md). ### Plugins -Loaded by the client and provides extensions for doing the actual collecting of metrics. +Loaded by the *client* and provides extensions for doing the actual collecting of metrics. [More information](plugins/README.md). diff --git a/client/src/main/java/sysmon/client/ClientRouteBuilder.java b/client/src/main/java/sysmon/client/ClientRouteBuilder.java index 6adf7fe..7353b57 100644 --- a/client/src/main/java/sysmon/client/ClientRouteBuilder.java +++ b/client/src/main/java/sysmon/client/ClientRouteBuilder.java @@ -43,7 +43,7 @@ public class ClientRouteBuilder extends RouteBuilder { // Load configuration if available if(configuration.isForExtension(name)) { - log.info(">>> Loading configuring for extension: " + ext.getDescription()); + log.info("Loading configuring for extension: " + ext.getDescription()); ext.setConfiguration(configuration.getForExtension(name)); } @@ -55,7 +55,7 @@ public class ClientRouteBuilder extends RouteBuilder { continue; } - log.info(">>> Enabling extension: " + ext.getDescription()); + log.info("Enabling extension: " + ext.getDescription()); providers.add(provides); // Setup Camel route for this extension @@ -72,25 +72,29 @@ public class ClientRouteBuilder extends RouteBuilder { .log("${body}") .to("seda:metrics?discardWhenFull=true"); } else { - log.info(">>> Skipping extension (not supported or disabled): " + ext.getDescription()); + log.info("Skipping extension (not supported or disabled): " + ext.getDescription()); } } - from("seda:metrics") + from("seda:metrics?purgeWhenStopping=true") .aggregate(constant(true), AggregationStrategies.beanAllowNull(ComboAppender.class, "append")) - //.aggregate(new GroupedExchangeAggregationStrategy()).constant(true) - //.aggregate(constant(true), new ListOfResultsStrategy()) - // wait for 5 seconds to aggregate - .completionTimeout(5000L).to("seda:outbound"); + .completionTimeout(5000L) + .doTry() + .to("seda:outbound?discardWhenFull=true") + .log("Aggregating ${body} before sending to server.") + .doCatch(Exception.class) + .log(LoggingLevel.WARN, "Error: ${exception.message}.") + .end(); - from("seda:outbound") + from("seda:outbound?purgeWhenStopping=true") .setHeader(Exchange.HTTP_METHOD, constant("POST")) .doTry() .marshal(new JacksonDataFormat(ComboResult.class)) .to((String)registry.lookupByName("myServerUrl")) + .log("${body}") .doCatch(Exception.class) - .log(LoggingLevel.WARN,"Error: ${exception.message}") + .log(LoggingLevel.WARN,"Error: ${exception.message}.") .end(); } diff --git a/client/src/main/resources/application.properties b/client/src/main/resources/application.properties index 4e881d2..b01e8aa 100644 --- a/client/src/main/resources/application.properties +++ b/client/src/main/resources/application.properties @@ -30,3 +30,6 @@ camel.main.name = sysmon-client camel.main.lightweight = true # and eager load classes #camel.main.eager-classloading = true + +# limit the seda queue size +camel.component.seda.queue-size=10 \ No newline at end of file diff --git a/client/src/main/resources/simplelogger.properties b/client/src/main/resources/simplelogger.properties index a2f88ce..ef3458f 100644 --- a/client/src/main/resources/simplelogger.properties +++ b/client/src/main/resources/simplelogger.properties @@ -4,3 +4,5 @@ org.slf4j.simpleLogger.showShortLogName=true org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss.SSS org.slf4j.simpleLogger.levelInBrackets=true org.slf4j.simpleLogger.defaultLogLevel=warn +org.slf4j.simpleLogger.showThreadName=false +org.slf4j.simpleLogger.showLogName=false diff --git a/doc/Sysmon - Host Overview-1631013497580.json b/doc/Sysmon - Host Overview-1632317598140.json similarity index 82% rename from doc/Sysmon - Host Overview-1631013497580.json rename to doc/Sysmon - Host Overview-1632317598140.json index 79a78f9..509e9ec 100644 --- a/doc/Sysmon - Host Overview-1631013497580.json +++ b/doc/Sysmon - Host Overview-1632317598140.json @@ -20,7 +20,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "8.0.6" + "version": "8.1.4" }, { "type": "panel", @@ -40,6 +40,12 @@ "name": "Stat", "version": "" }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, { "type": "panel", "id": "timeseries", @@ -56,6 +62,12 @@ "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, "type": "dashboard" } ] @@ -65,9 +77,26 @@ "gnetId": null, "graphTooltip": 0, "id": null, - "iteration": 1631013342292, + "iteration": 1632317456870, "links": [], "panels": [ + { + "datasource": null, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 28, + "options": { + "content": "## Metrics are collected by an agent running inside of each LPAR / VM / Host.\n \n For more information: [bitbucket.org/mnellemann/sysmon](https://bitbucket.org/mnellemann/sysmon)\n ", + "mode": "markdown" + }, + "pluginVersion": "8.1.4", + "transparent": true, + "type": "text" + }, { "collapsed": false, "datasource": null, @@ -75,7 +104,7 @@ "h": 1, "w": 24, "x": 0, - "y": 0 + "y": 3 }, "id": 4, "panels": [], @@ -93,10 +122,10 @@ "fill": 1, "fillGradient": 0, "gridPos": { - "h": 10, + "h": 5, "w": 12, "x": 0, - "y": 1 + "y": 4 }, "hiddenSeries": false, "id": 2, @@ -116,7 +145,7 @@ "alertThreshold": true }, "percentage": false, - "pluginVersion": "8.0.6", + "pluginVersion": "8.1.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -329,7 +358,8 @@ "value": 80 } ] - } + }, + "unit": "string" }, "overrides": [ { @@ -341,6 +371,14 @@ { "id": "displayName", "value": "Mode" + }, + { + "id": "noValue", + "value": "N/A" + }, + { + "id": "unit", + "value": "string" } ] }, @@ -353,6 +391,14 @@ { "id": "displayName", "value": "Type" + }, + { + "id": "noValue", + "value": "N/A" + }, + { + "id": "unit", + "value": "string" } ] }, @@ -365,6 +411,10 @@ { "id": "displayName", "value": "Entitlements" + }, + { + "id": "noValue", + "value": "N/A" } ] }, @@ -377,16 +427,20 @@ { "id": "displayName", "value": "Logical CPUs" + }, + { + "id": "noValue", + "value": "N/A" } ] } ] }, "gridPos": { - "h": 4, + "h": 5, "w": 12, "x": 12, - "y": 1 + "y": 4 }, "id": 16, "options": { @@ -398,13 +452,13 @@ "calcs": [ "lastNotNull" ], - "fields": "", + "fields": "/.*/", "values": false }, "text": {}, "textMode": "value_and_name" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.1.4", "targets": [ { "groupBy": [ @@ -416,7 +470,7 @@ }, { "params": [ - "linear" + "previous" ], "type": "fill" } @@ -500,6 +554,7 @@ } ] ], + "slimit": "1", "tags": [ { "key": "hostname", @@ -512,338 +567,21 @@ "timeFrom": null, "timeShift": null, "title": "LPAR Details (IBM Power)", - "type": "stat" - }, - { - "datasource": "${DS_INFLUXDB-SYSMON}", - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "base_disk.iotime" - }, - "properties": [ - { - "id": "displayName", - "value": "I/O Time" - }, - { - "id": "unit", - "value": "ms" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "base_disk.queue" - }, - "properties": [ - { - "id": "displayName", - "value": "Queue" - }, - { - "id": "unit", - "value": "none" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 12, - "y": 5 - }, - "id": 19, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "text": {} - }, - "pluginVersion": "8.0.6", - "targets": [ + "transformations": [ { - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "linear" - ], - "type": "fill" + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "aix_processor.mode", + "aix_processor.type", + "aix_processor.ent", + "aix_processor.lcpu" + ] } - ], - "measurement": "base_disk", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "iotime" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "1s" - ], - "type": "non_negative_derivative" - }, - { - "params": [ - "iotime" - ], - "type": "alias" - } - ], - [ - { - "params": [ - "queue" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "queue" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "hostname", - "operator": "=~", - "value": "/^$hostname$/" - } - ] + } } ], - "timeFrom": null, - "timeShift": null, - "title": "Disk Metrics", - "type": "gauge" - }, - { - "datasource": "${DS_INFLUXDB-SYSMON}", - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd" - }, - "decimals": 2, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "aix_processor.entc" - }, - "properties": [ - { - "id": "displayName", - "value": "Consumed Entitlements" - }, - { - "id": "unit", - "value": "percent" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "aix_processor.physc" - }, - "properties": [ - { - "id": "displayName", - "value": "Consumed Phys. Cores" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "aix_processor.lbusy" - }, - "properties": [ - { - "id": "displayName", - "value": "Busy Logical CPUs" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 5 - }, - "id": 17, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.0.6", - "targets": [ - { - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "linear" - ], - "type": "fill" - } - ], - "measurement": "aix_processor", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "physc" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "physc" - ], - "type": "alias" - } - ], - [ - { - "params": [ - "lbusy" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "lbusy" - ], - "type": "alias" - } - ], - [ - { - "params": [ - "entc" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "entc" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "hostname", - "operator": "=~", - "value": "/^$hostname$/" - } - ] - } - ], - "timeFrom": null, - "timeShift": null, - "title": "LPAR Processor Usage (IBM Power)", "type": "stat" }, { @@ -861,10 +599,10 @@ "fill": 1, "fillGradient": 0, "gridPos": { - "h": 10, + "h": 6, "w": 12, "x": 0, - "y": 11 + "y": 9 }, "hiddenSeries": false, "id": 8, @@ -884,7 +622,7 @@ "alertThreshold": true }, "percentage": false, - "pluginVersion": "8.0.6", + "pluginVersion": "8.1.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1041,54 +779,81 @@ } }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": "${DS_INFLUXDB-SYSMON}", "fieldConfig": { "defaults": { - "unit": "binBps" + "color": { + "mode": "continuous-GrYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "base_disk.iotime" + }, + "properties": [ + { + "id": "displayName", + "value": "I/O Time" + }, + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "base_disk.queue" + }, + "properties": [ + { + "id": "displayName", + "value": "Queue" + }, + { + "id": "unit", + "value": "none" + } + ] + } + ] }, - "fill": 1, - "fillGradient": 0, "gridPos": { - "h": 10, - "w": 12, + "h": 6, + "w": 4, "x": 12, - "y": 11 + "y": 9 }, - "hiddenSeries": false, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", + "id": 19, "options": { - "alertThreshold": true + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} }, - "percentage": false, - "pluginVersion": "8.0.6", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "8.1.4", "targets": [ { - "alias": "$col", "groupBy": [ { "params": [ @@ -1112,7 +877,7 @@ [ { "params": [ - "reads" + "iotime" ], "type": "field" }, @@ -1128,7 +893,7 @@ }, { "params": [ - "reads" + "iotime" ], "type": "alias" } @@ -1136,7 +901,295 @@ [ { "params": [ - "writes" + "queue" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "queue" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Metrics", + "type": "gauge" + }, + { + "datasource": "${DS_INFLUXDB-SYSMON}", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "decimals": 2, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "aix_processor.entc" + }, + "properties": [ + { + "id": "displayName", + "value": "Consumed Entitlements" + }, + { + "id": "unit", + "value": "percent" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "aix_processor.physc" + }, + "properties": [ + { + "id": "displayName", + "value": "Consumed Phys. Cores" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "aix_processor.lbusy" + }, + "properties": [ + { + "id": "displayName", + "value": "Busy Logical CPUs" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 9 + }, + "id": 17, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.4", + "targets": [ + { + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "linear" + ], + "type": "fill" + } + ], + "measurement": "aix_processor", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "physc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "physc" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "lbusy" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "lbusy" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "entc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "entc" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "timeFrom": null, + "timeShift": null, + "title": "LPAR Processor Usage (IBM Power)", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_INFLUXDB-SYSMON}", + "description": "", + "fieldConfig": { + "defaults": { + "unit": "binBps" + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 15 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.4", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_name ($col)", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "name" + ], + "type": "tag" + }, + { + "params": [ + "linear" + ], + "type": "fill" + } + ], + "measurement": "base_network", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tx_bytes" ], "type": "field" }, @@ -1152,7 +1205,37 @@ }, { "params": [ - "writes" + "tx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "1s" + ], + "type": "non_negative_derivative" + }, + { + "params": [ + "*-1" + ], + "type": "math" + }, + { + "params": [ + "rx" ], "type": "alias" } @@ -1171,7 +1254,191 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Disk Usage", + "title": "Network I/O", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:248", + "format": "binBps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:249", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_INFLUXDB-SYSMON}", + "fieldConfig": { + "defaults": { + "unit": "binBps" + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 15 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.4", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_name ($col)", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "name" + ], + "type": "tag" + }, + { + "params": [ + "linear" + ], + "type": "fill" + } + ], + "measurement": "base_disk", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "read" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "1s" + ], + "type": "non_negative_derivative" + }, + { + "params": [ + "*-1" + ], + "type": "math" + }, + { + "params": [ + "read" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "write" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "1s" + ], + "type": "non_negative_derivative" + }, + { + "params": [ + "write" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Disk Device I/O", "tooltip": { "shared": true, "sort": 0, @@ -1218,23 +1485,25 @@ "datasource": "${DS_INFLUXDB-SYSMON}", "fieldConfig": { "defaults": { - "unit": "binBps" + "unit": "dtdurationms" }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { - "h": 11, + "h": 10, "w": 12, "x": 0, - "y": 21 + "y": 24 }, "hiddenSeries": false, - "id": 18, + "id": 24, "legend": { "avg": false, "current": false, + "hideEmpty": true, + "hideZero": true, "max": false, "min": false, "show": true, @@ -1248,7 +1517,7 @@ "alertThreshold": true }, "percentage": false, - "pluginVersion": "8.0.6", + "pluginVersion": "8.1.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1258,7 +1527,7 @@ "steppedLine": false, "targets": [ { - "alias": "$col", + "alias": "$tag_name($tag_pid)", "groupBy": [ { "params": [ @@ -1268,63 +1537,45 @@ }, { "params": [ - "linear" + "pid" + ], + "type": "tag" + }, + { + "params": [ + "name" + ], + "type": "tag" + }, + { + "params": [ + "null" ], "type": "fill" } ], - "measurement": "base_network", + "measurement": "base_process", "orderByTime": "ASC", "policy": "default", + "query": "SELECT non_negative_difference(sum(last(\"user_time\"),last(\"kernel_time\"))) FROM \"base_process\" WHERE (\"hostname\" =~ /^$hostname$/) AND $timeFilter GROUP BY time($__interval), \"pid\", \"name\" fill(null)", + "rawQuery": false, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ - "txBytes" + "user_time" ], "type": "field" }, { "params": [], - "type": "mean" - }, - { - "params": [ - "1s" - ], - "type": "non_negative_derivative" - }, - { - "params": [ - "tx" - ], - "type": "alias" - } - ], - [ - { - "params": [ - "rxBytes" - ], - "type": "field" + "type": "last" }, { "params": [], - "type": "mean" - }, - { - "params": [ - "1s" - ], - "type": "non_negative_derivative" - }, - { - "params": [ - "rx" - ], - "type": "alias" + "type": "non_negative_difference" } ] ], @@ -1341,7 +1592,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Network Usage", + "title": "Running Processes - User Time", "tooltip": { "shared": true, "sort": 0, @@ -1357,8 +1608,7 @@ }, "yaxes": [ { - "$$hashKey": "object:248", - "format": "binBps", + "format": "dtdurationms", "label": null, "logBase": 1, "max": null, @@ -1366,7 +1616,6 @@ "show": true }, { - "$$hashKey": "object:249", "format": "short", "label": null, "logBase": 1, @@ -1380,6 +1629,320 @@ "alignLevel": null } }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_INFLUXDB-SYSMON}", + "description": "", + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 24 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.4", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_mount", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "mount" + ], + "type": "tag" + }, + { + "params": [ + "linear" + ], + "type": "fill" + } + ], + "measurement": "base_filesystem", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT ( ( ( last(\"total_bytes\") - last(\"free_bytes\") ) / last(\"total_bytes\")) * 100) AS \"used\" FROM \"base_filesystem\" WHERE (\"hostname\" =~ /^$hostname$/) AND $timeFilter GROUP BY time($__interval), \"mount\" fill(linear)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "free_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "free" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "total_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "total" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "thresholds": [ + { + "$$hashKey": "object:221", + "colorMode": "warning", + "fill": true, + "line": false, + "op": "gt", + "value": 80, + "yaxis": "left" + }, + { + "$$hashKey": "object:227", + "colorMode": "critical", + "fill": true, + "line": false, + "op": "gt", + "value": 90, + "yaxis": "left" + } + ], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Filesystem Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:196", + "decimals": null, + "format": "percent", + "label": "Percentage Used", + "logBase": 1, + "max": "100", + "min": null, + "show": true + }, + { + "$$hashKey": "object:197", + "format": "short", + "label": "Inodes Free", + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "datasource": "${DS_INFLUXDB-SYSMON}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 34 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "alias": "$tag_name($tag_pid)", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "pid" + ], + "type": "tag" + }, + { + "params": [ + "name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "base_process", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT sum(non_negative_derivative(mean(\"user_time\"), 30s), non_negative_derivative(mean(\"user_time\"), 30s)) FROM \"base_process\" WHERE (\"hostname\" =~ /^$hostname$/) AND $timeFilter GROUP BY time($__interval), \"pid\", \"name\" fill(null)", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "mem_rss" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "title": "Running Processes - Resident Memory", + "transformations": [], + "type": "timeseries" + }, { "datasource": "${DS_INFLUXDB-SYSMON}", "description": "", @@ -1501,10 +2064,10 @@ ] }, "gridPos": { - "h": 11, + "h": 10, "w": 12, "x": 12, - "y": 21 + "y": 34 }, "id": 22, "options": { @@ -1522,7 +2085,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.1.4", "targets": [ { "groupBy": [ @@ -1703,281 +2266,14 @@ "timeShift": null, "title": "Network Sockets (Linux)", "type": "stat" - }, - { - "datasource": "${DS_INFLUXDB-SYSMON}", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "dtdurationms" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 24, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi" - } - }, - "pluginVersion": "8.0.6", - "targets": [ - { - "alias": "$tag_name($tag_pid)", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "pid" - ], - "type": "tag" - }, - { - "params": [ - "name" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "base_process", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT non_negative_difference(sum(last(\"user_time\"),last(\"kernel_time\"))) FROM \"base_process\" WHERE (\"hostname\" =~ /^$hostname$/) AND $timeFilter GROUP BY time($__interval), \"pid\", \"name\" fill(null)", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "user_time" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [], - "type": "non_negative_difference" - } - ] - ], - "tags": [ - { - "key": "hostname", - "operator": "=~", - "value": "/^$hostname$/" - } - ] - } - ], - "title": "Running Processes - User Time", - "type": "timeseries" - }, - { - "datasource": "${DS_INFLUXDB-SYSMON}", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 12, - "x": 12, - "y": 32 - }, - "id": 25, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi" - } - }, - "pluginVersion": "8.0.6", - "targets": [ - { - "alias": "$tag_name($tag_pid)", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "pid" - ], - "type": "tag" - }, - { - "params": [ - "name" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "base_process", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT sum(non_negative_derivative(mean(\"user_time\"), 30s), non_negative_derivative(mean(\"user_time\"), 30s)) FROM \"base_process\" WHERE (\"hostname\" =~ /^$hostname$/) AND $timeFilter GROUP BY time($__interval), \"pid\", \"name\" fill(null)", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "mem_rss" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "hostname", - "operator": "=~", - "value": "/^$hostname$/" - } - ] - } - ], - "title": "Running Processes - Resident Memory", - "type": "timeseries" } ], - "refresh": "1m", + "refresh": "30s", "schemaVersion": 30, "style": "dark", - "tags": [], + "tags": [ + "sysmon" + ], "templating": { "list": [ { @@ -2025,5 +2321,5 @@ "timezone": "", "title": "Sysmon - Host Overview", "uid": "QkVPjseMk", - "version": 46 + "version": 62 } \ No newline at end of file diff --git a/doc/Sysmon - Process Explorer-1631263229100.json b/doc/Sysmon - Process Explorer-1632317613366.json similarity index 96% rename from doc/Sysmon - Process Explorer-1631263229100.json rename to doc/Sysmon - Process Explorer-1632317613366.json index 80e64a4..394ef52 100644 --- a/doc/Sysmon - Process Explorer-1631263229100.json +++ b/doc/Sysmon - Process Explorer-1632317613366.json @@ -14,7 +14,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "8.1.2" + "version": "8.1.4" }, { "type": "datasource", @@ -34,6 +34,12 @@ "name": "Table", "version": "" }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, { "type": "panel", "id": "timeseries", @@ -65,9 +71,26 @@ "gnetId": null, "graphTooltip": 0, "id": null, - "iteration": 1631256755587, + "iteration": 1632317604857, "links": [], "panels": [ + { + "datasource": null, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 30, + "options": { + "content": "## Metrics are collected by an agent running inside of each LPAR / VM / Host.\n \n For more information: [bitbucket.org/mnellemann/sysmon](https://bitbucket.org/mnellemann/sysmon)\n ", + "mode": "markdown" + }, + "pluginVersion": "8.1.4", + "transparent": true, + "type": "text" + }, { "collapsed": false, "datasource": null, @@ -75,7 +98,7 @@ "h": 1, "w": 24, "x": 0, - "y": 0 + "y": 3 }, "id": 4, "panels": [], @@ -113,14 +136,14 @@ "h": 6, "w": 12, "x": 0, - "y": 1 + "y": 4 }, "id": 16, "options": { "showHeader": true, "sortBy": [] }, - "pluginVersion": "8.1.2", + "pluginVersion": "8.1.4", "targets": [ { "groupBy": [ @@ -223,7 +246,7 @@ "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "thresholds" }, "mappings": [], "thresholds": { @@ -268,7 +291,7 @@ "h": 6, "w": 7, "x": 12, - "y": 1 + "y": 4 }, "id": 19, "options": { @@ -286,7 +309,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.1.2", + "pluginVersion": "8.1.4", "targets": [ { "groupBy": [ @@ -422,7 +445,7 @@ "h": 6, "w": 5, "x": 19, - "y": 1 + "y": 4 }, "id": 26, "options": { @@ -440,7 +463,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.1.2", + "pluginVersion": "8.1.4", "targets": [ { "groupBy": [ @@ -580,7 +603,7 @@ "h": 11, "w": 12, "x": 0, - "y": 7 + "y": 10 }, "id": 24, "options": { @@ -755,7 +778,7 @@ "h": 11, "w": 12, "x": 12, - "y": 7 + "y": 10 }, "id": 25, "options": { @@ -953,5 +976,5 @@ "timezone": "", "title": "Sysmon - Process Explorer", "uid": "Vjut5mS7k", - "version": 15 + "version": 18 } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 03f3c8e..4c9311f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=0.1.2 +version=0.1.3 pf4jVersion=3.6.0 slf4jVersion=1.7.32 camelVersion=3.11.2 diff --git a/plugins/os-ibmi/build.gradle b/plugins/os-ibmi/build.gradle index f3624d7..3cbc369 100644 --- a/plugins/os-ibmi/build.gradle +++ b/plugins/os-ibmi/build.gradle @@ -3,5 +3,5 @@ plugins { dependencies { // https://mvnrepository.com/artifact/net.sf.jt400/jt400 - implementation group: 'net.sf.jt400', name: 'jt400', version: '10.6' + implementation group: 'net.sf.jt400', name: 'jt400', version: '10.7' } \ No newline at end of file diff --git a/server/src/main/java/sysmon/server/ServerRouteBuilder.java b/server/src/main/java/sysmon/server/ServerRouteBuilder.java index 631f9e7..3e50481 100644 --- a/server/src/main/java/sysmon/server/ServerRouteBuilder.java +++ b/server/src/main/java/sysmon/server/ServerRouteBuilder.java @@ -40,18 +40,19 @@ public class ServerRouteBuilder extends RouteBuilder { .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(202)) .setHeader("Content-Type", constant("application/x-www-form-urlencoded")) .to("seda:inbound?discardWhenFull=true") + .setBody(simple("OK, received by server.")) .doCatch(Exception.class) - .log(LoggingLevel.WARN, "Error: ${exception.message}") + .log(LoggingLevel.WARN, "Error: ${exception.message}.") .end() .endRest(); fromF("seda:inbound?concurrentConsumers=%s", threads) - .log(">>> metric: ${header.hostname} - ${body}") + .log("From ${header.hostname}: ${body}.") .doTry() .process(new ComboResultToPointProcessor(dbname)) .toF("influxdb://ref.myInfluxConnection?batch=true") //&retentionPolicy=autogen .doCatch(Exception.class) - .log(LoggingLevel.WARN, "Error: ${exception.message}") + .log(LoggingLevel.WARN, "Error: ${exception.message}.") .end(); } diff --git a/server/src/main/resources/simplelogger.properties b/server/src/main/resources/simplelogger.properties index a2f88ce..ef3458f 100644 --- a/server/src/main/resources/simplelogger.properties +++ b/server/src/main/resources/simplelogger.properties @@ -4,3 +4,5 @@ org.slf4j.simpleLogger.showShortLogName=true org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss.SSS org.slf4j.simpleLogger.levelInBrackets=true org.slf4j.simpleLogger.defaultLogLevel=warn +org.slf4j.simpleLogger.showThreadName=false +org.slf4j.simpleLogger.showLogName=false diff --git a/shared/src/main/java/sysmon/shared/ComboResult.java b/shared/src/main/java/sysmon/shared/ComboResult.java index 014dad2..416706a 100644 --- a/shared/src/main/java/sysmon/shared/ComboResult.java +++ b/shared/src/main/java/sysmon/shared/ComboResult.java @@ -28,7 +28,7 @@ public class ComboResult implements Serializable { @Override public String toString() { - return "ComboResult of size: " + metricResults.size(); + return metricResults.size() + " results"; } } diff --git a/shared/src/main/java/sysmon/shared/MetricResult.java b/shared/src/main/java/sysmon/shared/MetricResult.java index 9e92e94..4c64793 100644 --- a/shared/src/main/java/sysmon/shared/MetricResult.java +++ b/shared/src/main/java/sysmon/shared/MetricResult.java @@ -75,28 +75,12 @@ public class MetricResult implements Serializable { } public String toString() { - StringBuilder sb = new StringBuilder(String.format("%s - %s => ", timestamp.toString(), name)); + StringBuilder sb = new StringBuilder(String.format("From %s: ", name)); if(measurements != null && !measurements.isEmpty()) { - + sb.append(String.format("%d measurement(s) ", measurements.size())); for(Measurement m : measurements) { - - sb.append("{ "); - if(m != null && m.getTags() != null) { - for (Map.Entry entry : m.getTags().entrySet()) - sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(", "); - } - sb.append("} "); - - /* - sb.append("[ "); - if(m != null && m.getFields() != null) { - for (Map.Entry entry : m.getFields().entrySet()) - sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(", "); - } - sb.append("] "); - */ - + sb.append(String.format("{ tags: %d, fields: %d } ", m.getTags().size(), m.getFields().size())); } } From 75c76af01f6f2b38328e8b0242ba05c0ab047178 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Wed, 22 Sep 2021 13:48:10 +0000 Subject: [PATCH 3/3] README.md edited online with Bitbucket --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8edb0d3..81bcb88 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This software is free to use and is licensed under the [Apache 2.0 License](LICE - Example dashboards are provided in the [doc/](doc) folder, which can be imported into your Grafana installation. - Screenshots are available in the [downloads](https://bitbucket.org/mnellemann/sysmon/downloads/) section. -![Sysmon Icon](doc/monitoring-eye-svgrepo-com.svg){width=320 height=320} +![Sysmon Icon](doc/monitoring-eye-svgrepo-com.png) ## Components