Fix 500 status code when POST'ing to server.

Various improvements to plugins.
This commit is contained in:
Mark Nellemann 2021-05-17 15:05:35 +02:00
parent 66cd7c735b
commit cca1c099df
12 changed files with 109 additions and 28 deletions

View file

@ -17,6 +17,7 @@ dependencies {
annotationProcessor "info.picocli:picocli-codegen:${picocliVersion}" annotationProcessor "info.picocli:picocli-codegen:${picocliVersion}"
implementation "info.picocli:picocli:${picocliVersion}" implementation "info.picocli:picocli:${picocliVersion}"
implementation 'org.tomlj:tomlj:1.0.0'
implementation group: 'org.apache.camel', name: 'camel-core', version: camelVersion implementation group: 'org.apache.camel', name: 'camel-core', version: camelVersion
implementation group: 'org.apache.camel', name: 'camel-main', version: camelVersion implementation group: 'org.apache.camel', name: 'camel-main', version: camelVersion

View file

@ -47,7 +47,7 @@ public class ClientRouteBuilder extends RouteBuilder {
// Setup Camel route for this extension // Setup Camel route for this extension
// a unique timer name gives the timer it's own thread, otherwise it's a shared thread for other timers with same name. // a unique timer name gives the timer it's own thread, otherwise it's a shared thread for other timers with same name.
from("timer:"+provides+"?fixedRate=true&period=10s") from("timer:"+provides+"?fixedRate=true&period=30s")
.bean(ext, "getMetrics") .bean(ext, "getMetrics")
//.doTry() //.doTry()
.process(new MetricEnrichProcessor(registry)) .process(new MetricEnrichProcessor(registry))

View file

@ -0,0 +1,44 @@
# AIX Plugin
## Processor Extension
The processor extension works for both AIX and Linux on the Power ppc64/ppc64le architecture.
Metrics reported are:
- **mode** - Processor mode, Capped or Uncapped
- **type** - Processor type, Shared or Dedicated
- **lcpu** - Number of logical CPU's available for this partition
- **ent** - Processor entitlements available for this partition
- **user** - Indicates the percentage of the entitled processing capacity used while executing at the user level (application).
- **sys** - Indicates the percentage of the entitled processing capacity used while executing at the system level (kernel).
- **idle** - Indicates the percentage of the entitled processing capacity unused while the partition was idle and did not have any outstanding disk I/O request.
- **wait** - Indicates the percentage of the entitled processing capacity unused while the partition was idle and had outstanding disk I/O request(s).
- **physc** - Indicates the number of physical processors consumed.
- **entc** - Indicates the percentage of the entitled capacity consumed.
- **lbusy** - Indicates the percentage of logical processor(s) utilization that occurred while executing at the user and system level.
## Memory Extension
Metrics reported are:
- **total** - Total amount of memory (in KB).
- **used** - real memory consumption (in KB).
- **free** - free memory for use (in KB).
- **pin** - pinned memory consumption (in KB).
- **virtual** - virtual memory consumption (in KB).
- **available** - available memory (if freeing up virtual) (in KB).
- **paged** - paging space consumption (in KB).
*Pinning a memory region prohibits the pager from stealing pages from the pages backing the pinned memory region.*
## Disk Extension
Only reports first device found. Improvements on the TODO.
Metrics reported are:
- **device** - Name of device.
- **reads** - The total number of KB read.
- **writes** - The total number of KB written.

View file

@ -50,7 +50,7 @@ public class AixDiskExtension implements MetricExtension {
@Override @Override
public MetricResult getMetrics() { public MetricResult getMetrics() {
List<String> iostat = PluginHelper.executeCommand("iostat -d"); List<String> iostat = PluginHelper.executeCommand("iostat -d 1 1");
AixDiskStat diskStat = processCommandOutput(iostat); AixDiskStat diskStat = processCommandOutput(iostat);
Map<String, String> tagsMap = diskStat.getTags(); Map<String, String> tagsMap = diskStat.getTags();

View file

@ -50,7 +50,8 @@ public class AixMemoryExtension implements MetricExtension {
@Override @Override
public MetricResult getMetrics() { public MetricResult getMetrics() {
List<String> svmon = PluginHelper.executeCommand("svmon -G -O unit=KB"); //List<String> svmon = PluginHelper.executeCommand("svmon -G -O unit=KB");
List<String> svmon = PluginHelper.executeCommand("svmon -G -O summary=longreal,unit=KB");
AixMemoryStat memoryStat = processCommandOutput(svmon); AixMemoryStat memoryStat = processCommandOutput(svmon);
Map<String, String> tagsMap = memoryStat.getTags(); Map<String, String> tagsMap = memoryStat.getTags();

View file

@ -15,28 +15,27 @@ public class AixMemoryStat {
private static final Logger log = LoggerFactory.getLogger(AixMemoryStat.class); private static final Logger log = LoggerFactory.getLogger(AixMemoryStat.class);
// size inuse free pin virtual available mmode private final Pattern pattern = Pattern.compile("^\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
// memory 4194304 4036532 157772 1854772 2335076 1652640 Ded
private final Pattern patternAix = Pattern.compile("^memory\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\S+)");
private Long total; private Long total;
private Long used; private Long used;
private Long free; private Long free;
private Long pin;
private Long virtual; private Long virtual;
private Long available; private Long available;
private String mode; private Long paged;
AixMemoryStat(List<String> lines) { AixMemoryStat(List<String> lines) {
for (String line : lines) { for (String line : lines) {
Matcher matcher = patternAix.matcher(line); Matcher matcher = pattern.matcher(line);
if (matcher.find() && matcher.groupCount() == 7) { if (matcher.find() && matcher.groupCount() == 7) {
total = Long.parseLong(matcher.group(1)); total = Long.parseLong(matcher.group(1));
used = Long.parseLong(matcher.group(2)); used = Long.parseLong(matcher.group(2));
free = Long.parseLong(matcher.group(3)); free = Long.parseLong(matcher.group(3));
//pin = Long.parseLong(matcher.group(4)); pin = Long.parseLong(matcher.group(4));
virtual = Long.parseLong(matcher.group(5)); virtual = Long.parseLong(matcher.group(5));
available = Long.parseLong(matcher.group(6)); available = Long.parseLong(matcher.group(6));
mode = matcher.group(7); paged = Long.parseLong(matcher.group(7));
break; break;
} }
} }
@ -45,7 +44,6 @@ public class AixMemoryStat {
public Map<String, String> getTags() { public Map<String, String> getTags() {
Map<String, String> tags = new HashMap<>(); Map<String, String> tags = new HashMap<>();
tags.put("mode", mode);
return tags; return tags;
} }
@ -59,8 +57,10 @@ public class AixMemoryStat {
fields.put("total", total); fields.put("total", total);
fields.put("used", used); fields.put("used", used);
fields.put("free", free); fields.put("free", free);
fields.put("pin", pin);
fields.put("virtual", virtual); fields.put("virtual", virtual);
fields.put("available", available); fields.put("available", available);
fields.put("paged", paged);
fields.put("usage", usage.doubleValue()); fields.put("usage", usage.doubleValue());
return fields; return fields;
} }

View file

@ -15,14 +15,14 @@ class AixMemoryTest extends Specification {
AixMemoryStat stats = extension.processCommandOutput(lines) AixMemoryStat stats = extension.processCommandOutput(lines)
then: then:
stats.getFields().get("total") == 4194304l stats.getFields().get("total") == 4194304l
stats.getFields().get("used") == 4036532l stats.getFields().get("used") == 4065060l
stats.getFields().get("free") == 157772l stats.getFields().get("free") == 129244l
stats.getFields().get("virtual") == 2335076l stats.getFields().get("pin") == 1878240l
stats.getFields().get("available") == 1652640l stats.getFields().get("virtual") == 2784988l
stats.getFields().get("usage") == 60.6d stats.getFields().get("available") == 1058012l
stats.getTags().get("mode") == "Ded" stats.getFields().get("paged") == 524288l
stats.getFields().get("usage") == 74.78d
} }

View file

@ -1,9 +1,6 @@
Unit: KB Unit: KB
-------------------------------------------------------------------------------------- ------------------------------------------------------------------------
size inuse free pin virtual available mmode Memory
memory 4194304 4036532 157772 1854772 2335076 1652640 Ded ------------------------------------------------------------------------
pg space 524288 12400 Size Inuse Free Pin Virtual Available Pgsp
4194304 4065060 129244 1878240 2784988 1058012 524288
work pers clnt other
pin 1407060 0 16736 430976
in use 2335076 0 1701456

View file

@ -0,0 +1,36 @@
# Linux Plugin
## Processor Extension
Reports the following metrics seen:
- **user** - Percentage of CPU time spend on user processes.
- **sys** - Percentage of CPU time spend on system processes.
- **wait** - Percentage of CPU time spend on waiting (for i/o).
- **idle** - Percentage of CPU time spend on idle (doing nothing).
- **busy** - Percentage of CPU time not spend on idle (working).
## Memory Extension
Reports the following metrics, from the *free* command:
- **total** - The total amount of (installed) memory (in KB).
- **used** - Used memory (calculated as total - free - buffers - cache) (in KB).
- **free** - Unused memory (MemFree and SwapFree in /proc/meminfo) (in KB).
- **shared** - Memory used (mostly) by tmpfs (Shmem in /proc/meminfo) (in KB).
- **buffers** - Sum of buffers and cache (in KB).
- **available** - Estimation of how much memory is available for starting new applications, without swapping (in KB).
- **usage** - Percentage of memory used out of the total amount of memory.
## Disk Extension
Only reports first device found. Improvements on the TODO.
Metrics reported are:
- **device** - Name of device.
- **reads** - The total number of KB read.
- **writes** - The total number of KB written.

View file

@ -54,7 +54,6 @@ public class LinuxDiskExtension implements MetricExtension {
LinuxDiskProcLine proc2 = processFileOutput(readProcFile()); LinuxDiskProcLine proc2 = processFileOutput(readProcFile());
LinuxDiskStat stat = new LinuxDiskStat(proc1, proc2); LinuxDiskStat stat = new LinuxDiskStat(proc1, proc2);
System.err.println("FOOBAR");
return new MetricResult("disk", new Measurement(stat.getTags(), stat.getFields())); return new MetricResult("disk", new Measurement(stat.getTags(), stat.getFields()));
} }

View file

@ -46,8 +46,8 @@ public class MetricResultToPointProcessor implements Processor {
} }
} }
exchange.getIn().setBody(builder.build()); exchange.getIn().setBody(builder.build());
} }
} }

View file

@ -1,5 +1,6 @@
package org.sysmon.server; package org.sysmon.server;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder; import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode; import org.apache.camel.model.rest.RestBindingMode;
import org.apache.camel.spi.Registry; import org.apache.camel.spi.Registry;
@ -32,6 +33,8 @@ public class ServerRouteBuilder extends RouteBuilder {
.produces("text/html") .produces("text/html")
.type(MetricResult.class) .type(MetricResult.class)
.route() .route()
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(202))
.setHeader("Content-Type", constant("application/x-www-form-urlencoded"))
.to("seda:inbound") .to("seda:inbound")
.endRest(); .endRest();