Initial work on preparing metrics and writing those to InfluxDB

This commit is contained in:
Mark Nellemann 2020-08-11 16:26:16 +02:00
parent 05909c7267
commit 30726da763
16 changed files with 345 additions and 1083 deletions

26
README.md Normal file
View file

@ -0,0 +1,26 @@
# HMC Insights
Small Java-based utility to fetch metrics from one or more HMC's and push those to an InfluxDB time-series database.
## TODO Liste
- Use TOML for configuration file, to support multiple HMC's - https://github.com/tomlj/tomlj
## Usage Instructions
...
## Development Information
### InfluxDB for test and development
Start the influxdb container
docker run --name=influxdb -d -p 8086:8086 influxdb
Use the influx client from the container
docker exec -it influxdb influx

View file

@ -25,6 +25,7 @@ dependencies {
implementation 'org.codehaus.groovy:groovy-all:3.0.5' implementation 'org.codehaus.groovy:groovy-all:3.0.5'
implementation 'com.squareup.okhttp3:okhttp:4.8.0' implementation 'com.squareup.okhttp3:okhttp:4.8.0'
implementation 'org.influxdb:influxdb-java:2.19' implementation 'org.influxdb:influxdb-java:2.19'
// implementation 'org.tomlj:tomlj:1.0.0'
implementation 'org.slf4j:slf4j-api:1.7.+' implementation 'org.slf4j:slf4j-api:1.7.+'
runtimeOnly 'ch.qos.logback:logback-classic:1.+' runtimeOnly 'ch.qos.logback:logback-classic:1.+'

View file

@ -9,6 +9,7 @@ import groovy.util.logging.Slf4j
class App { class App {
HmcClient hmc HmcClient hmc
InfluxClient influx
Map<String,ManagedSystem> systems = new HashMap<String, ManagedSystem>() Map<String,ManagedSystem> systems = new HashMap<String, ManagedSystem>()
Map<String, LogicalPartition> partitions = new HashMap<String, LogicalPartition>() Map<String, LogicalPartition> partitions = new HashMap<String, LogicalPartition>()
@ -19,36 +20,40 @@ class App {
def cli = new CliBuilder() def cli = new CliBuilder()
cli.h(longOpt: 'help', 'display usage') cli.h(longOpt: 'help', 'display usage')
cli.v(longOpt: 'version', 'display version') cli.v(longOpt: 'version', 'display version')
cli.c(longOpt: 'config', args: 1, required: true, defaultValue: '~/.config/hmci.properties', 'configuration file') cli.c(longOpt: 'config', args: 1, required: true, defaultValue: '~/.config/hmci.toml', 'configuration file')
OptionAccessor options = cli.parse(args) OptionAccessor options = cli.parse(args)
if (options.h) cli.usage() if (options.h) cli.usage()
if(options.c) { if(options.c) {
//println("TODO: Use configuration file: " + options.config) File configurationFile = new File((String)options.config)
if(configurationFile.exists()) {
log.info("Configuration file found at: " + configurationFile.toString())
} else {
log.warn("No configuration file found at: " + configurationFile.toString())
}
} }
// TODO: Read configuration file or create new empty file, // TODO: Read configuration file or create new empty file,
// pass the properties or configuration bean to App. // pass the properties or configuration bean to App.
println("HMC Insights")
hmc = new HmcClient("https://10.32.64.39:12443", "hmci", "hmcihmci") hmc = new HmcClient("https://10.32.64.39:12443", "hmci", "hmcihmci")
hmc.login() hmc.login()
scanHmc()
getMetricsForSystems()
//getMetricsForPartitions()
scan() writeMetricsForManagedSystems()
metricsForSystems()
metricsForPartitions()
hmc?.logoff() hmc?.logoff()
influx?.logoff()
} }
void scan() { void scanHmc() {
try { try {
@ -79,7 +84,7 @@ class App {
} }
void metricsForSystems() { void getMetricsForSystems() {
try { try {
@ -105,7 +110,7 @@ class App {
} }
void metricsForPartitions() { void getMetricsForPartitions() {
try { try {
@ -132,6 +137,18 @@ class App {
} }
} }
void writeMetricsForManagedSystems() {
if(!influx) {
influx = new InfluxClient("http://127.0.0.1:8086", "root", "", "hmci")
influx.login()
}
systems.each {systemId, system ->
influx.writeManagedSystem(system)
}
}
static void main(String... args) { static void main(String... args) {
new App(args) new App(args)

View file

@ -109,9 +109,6 @@ class HmcClient {
* @return * @return
*/ */
Map<String, ManagedSystem> getManagedSystems() { Map<String, ManagedSystem> getManagedSystems() {
log.debug("getManagedSystems()")
URL url = new URL(String.format("%s/rest/api/uom/ManagedSystem", baseUrl)) URL url = new URL(String.format("%s/rest/api/uom/ManagedSystem", baseUrl))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()
@ -121,13 +118,15 @@ class HmcClient {
feed?.entry?.each { entry -> feed?.entry?.each { entry ->
entry.content.each { content -> entry.content.each { content ->
content.ManagedSystem.each { system -> content.ManagedSystem.each { system ->
ManagedSystem managedSystem = new ManagedSystem(entry.id as String) ManagedSystem managedSystem = new ManagedSystem(
managedSystem.name = system.SystemName entry.id as String,
managedSystem.model = system.MachineTypeModelAndSerialNumber.Model system.SystemName as String,
managedSystem.type = system.MachineTypeModelAndSerialNumber.MachineType system.MachineTypeModelAndSerialNumber?.MachineType as String,
managedSystem.serialNumber = system.MachineTypeModelAndSerialNumber.SerialNumber system.MachineTypeModelAndSerialNumber?.Model as String,
system.MachineTypeModelAndSerialNumber?.SerialNumber as String
)
managedSystemsMap.put(managedSystem.id, managedSystem) managedSystemsMap.put(managedSystem.id, managedSystem)
log.debug("getManagedSystems() " + managedSystem.toString()) log.debug("getManagedSystems() - Found system: " + managedSystem.toString())
} }
} }
} }
@ -144,8 +143,6 @@ class HmcClient {
* @return * @return
*/ */
Map<String, LogicalPartition> getLogicalPartitionsForManagedSystemWithId(String systemId) { Map<String, LogicalPartition> getLogicalPartitionsForManagedSystemWithId(String systemId) {
log.debug("getLogicalPartitionsForManagedSystem() - systemId: " + systemId)
URL url = new URL(String.format("%s/rest/api/uom/ManagedSystem/%s/LogicalPartition", baseUrl, systemId)) URL url = new URL(String.format("%s/rest/api/uom/ManagedSystem/%s/LogicalPartition", baseUrl, systemId))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()
@ -157,9 +154,12 @@ class HmcClient {
entry.content.each { content -> entry.content.each { content ->
//log.debug("Content") //log.debug("Content")
content.LogicalPartition.each { partition -> content.LogicalPartition.each { partition ->
LogicalPartition logicalPartition = new LogicalPartition(partition.PartitionUUID as String, systemId) LogicalPartition logicalPartition = new LogicalPartition(
logicalPartition.name = partition.PartitionName partition.PartitionUUID as String,
logicalPartition.type = partition.PartitionType systemId as String,
partition.PartitionName as String,
partition.PartitionType as String
)
partitionMap.put(logicalPartition.id, logicalPartition) partitionMap.put(logicalPartition.id, logicalPartition)
log.debug("getLogicalPartitionsForManagedSystem() - Found partition: " + logicalPartition.toString()) log.debug("getLogicalPartitionsForManagedSystem() - Found partition: " + logicalPartition.toString())
} }
@ -178,7 +178,7 @@ class HmcClient {
*/ */
String getPcmDataForManagedSystem(String systemId) { String getPcmDataForManagedSystem(String systemId) {
log.debug("getPcmDataForManagedSystem() - " + systemId) log.debug("getPcmDataForManagedSystem() - " + systemId)
URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, systemId)) URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/ProcessedMetrics?NoOfSamples=0", baseUrl, systemId))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()
@ -206,7 +206,7 @@ class HmcClient {
String getPcmDataForLogicalPartition(String systemId, String partitionId) { String getPcmDataForLogicalPartition(String systemId, String partitionId) {
log.debug(String.format("getPcmDataForLogicalPartition() - %s @ %s", partitionId, systemId)) log.debug(String.format("getPcmDataForLogicalPartition() - %s @ %s", partitionId, systemId))
URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/LogicalPartition/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, systemId, partitionId)) URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/LogicalPartition/%s/ProcessedMetrics?NoOfSamples=0", baseUrl, systemId, partitionId))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()

View file

@ -1,5 +1,159 @@
package biz.nellemann.hmci package biz.nellemann.hmci
import groovy.util.logging.Slf4j
import org.influxdb.dto.BatchPoints
import java.time.Instant
import java.util.concurrent.TimeUnit
import org.influxdb.InfluxDB
import org.influxdb.BatchOptions
import org.influxdb.InfluxDBFactory
import org.influxdb.dto.QueryResult
import org.influxdb.dto.Query
import org.influxdb.dto.Point
@Slf4j
class InfluxClient { class InfluxClient {
final String url
final String username
final String password
final String database
InfluxDB influxDB
InfluxClient(String url, String username, String password, String database) {
this.url = url
this.username = username
this.password = password
this.database = database
}
void login() {
if(!influxDB) {
influxDB = InfluxDBFactory.connect(url, username, password);
createDatabase()
}
}
void logoff() {
influxDB?.close();
}
void createDatabase() {
try {
// Create a database...
// https://docs.influxdata.com/influxdb/v1.7/query_language/database_management/
influxDB.query(new Query("CREATE DATABASE " + database));
influxDB.setDatabase(database);
// ... and a retention policy, if necessary.
// https://docs.influxdata.com/influxdb/v1.7/query_language/database_management/
/*String retentionPolicyName = "one_day_only";
influxDB.query(new Query("CREATE RETENTION POLICY " + retentionPolicyName
+ " ON " + database + " DURATION 1d REPLICATION 1 DEFAULT"));
influxDB.setRetentionPolicy(retentionPolicyName);*/
// Enable batch writes to get better performance.
influxDB.enableBatch(BatchOptions.DEFAULTS);
} catch(Exception e) {
log.error("createDatabase()", e)
}
}
void write() {
// Write points to InfluxDB.
influxDB.write(Point.measurement("h2o_feet")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.tag("location", "santa_monica")
.addField("level description", "below 3 feet")
.addField("water_level", 2.064d)
.build());
influxDB.write(Point.measurement("h2o_feet")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.tag("location", "coyote_creek")
.addField("level description", "between 6 and 9 feet")
.addField("water_level", 8.12d)
.build());
}
void read() {
// Query your data using InfluxQL.
// https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/#the-basic-select-statement
QueryResult queryResult = influxDB.query(new Query("SELECT * FROM h2o_feet"));
println(queryResult);
}
void writeManagedSystem(ManagedSystem system) {
if(system.metrics == null) {
log.warn("writeManagedSystem() - null metrics, skipping")
return
}
Instant timestamp = system.getTimestamp()
if(!timestamp) {
log.warn("writeManagedSystem() - no timestamp, skipping")
return
}
BatchPoints batchPoints = BatchPoints
.database(database)
//.retentionPolicy("defaultPolicy")
.build();
/*
ServerProcessor processor
ServerMemory memory
PhysicalProcessorPool physicalProcessorPool
SharedProcessorPool sharedProcessorPool
+ VIOS
*/
batchPoints.point(getSystemMemory(system, timestamp));
batchPoints.point(getSystemProcessor(system, timestamp));
influxDB.write(batchPoints);
}
private static Point getSystemMemory(ManagedSystem system, Instant timestamp) {
Point.Builder point1Builder = Point.measurement("SystemMemory")
.time(timestamp.toEpochMilli(), TimeUnit.MILLISECONDS)
.tag("name", system.name)
Map memoryMap = system.getMemoryMetrics()
memoryMap.each {fieldName, fieldValue ->
point1Builder.addField(fieldName, fieldValue)
}
return point1Builder.build();
}
private static Point getSystemProcessor(ManagedSystem system, Instant timestamp) {
Point.Builder point1Builder = Point.measurement("SystemProcessor")
.time(timestamp.toEpochMilli(), TimeUnit.MILLISECONDS)
.tag("name", system.name)
Map memoryMap = system.getProcessorMetrics()
memoryMap.each {fieldName, fieldValue ->
point1Builder.addField(fieldName, fieldValue)
}
return point1Builder.build();
}
} }

View file

@ -1,34 +1,24 @@
package biz.nellemann.hmci package biz.nellemann.hmci
import biz.nellemann.hmci.pojo.PcmData
import biz.nellemann.hmci.pojo.SystemUtil
import groovy.json.JsonSlurper
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
@Slf4j @Slf4j
class LogicalPartition { class LogicalPartition extends MetaSystem {
public String id public String id
public String name public String name
public String type public String type
public String systemId public String systemId
protected PcmData metrics LogicalPartition(String id, String systemId, String name, String type) {
LogicalPartition(String id, String systemId) {
this.id = id this.id = id
this.systemId = systemId this.systemId = systemId
this.name = name
this.type = type
} }
String toString() { String toString() {
return "[${id}] ${name} (${type})" return "[${id}] ${name} (${type})"
} }
void processMetrics(String json) {
log.debug("processMetrics()")
def pcmMap = new JsonSlurper().parseText(json)
metrics = new PcmData(pcmMap as Map)
}
} }

View file

@ -1,12 +1,10 @@
package biz.nellemann.hmci package biz.nellemann.hmci
import biz.nellemann.hmci.pojo.PcmData
import groovy.json.JsonSlurper
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
@Slf4j @Slf4j
class ManagedSystem { class ManagedSystem extends MetaSystem {
public String id public String id
public String name public String name
@ -14,10 +12,13 @@ class ManagedSystem {
public String model public String model
public String serialNumber public String serialNumber
protected PcmData metrics
ManagedSystem(String id) { ManagedSystem(String id, String name, String type, String model, String serialNumber) {
this.id = id this.id = id
this.name = name
this.type = type
this.model = model
this.serialNumber = serialNumber
} }
String toString() { String toString() {
@ -25,10 +26,26 @@ class ManagedSystem {
} }
void processMetrics(String json) { Map<String,BigDecimal> getMemoryMetrics() {
log.debug("processMetrics()")
def pcmMap = new JsonSlurper().parseText(json) HashMap<String, BigDecimal> map = [
metrics = new PcmData(pcmMap as Map) totalMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.totalMem.first(),
availableMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.availableMem.first(),
configurableMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.configurableMem.first(),
assignedMemToLpars: metrics.systemUtil.utilSamples.first().serverUtil.memory.assignedMemToLpars.first()
]
return map
}
Map<String,BigDecimal> getProcessorMetrics() {
HashMap<String, BigDecimal> map = [
availableProcUnits: metrics.systemUtil.utilSamples.first().serverUtil.processor.availableProcUnits.first(),
]
return map
} }
} }

View file

@ -0,0 +1,36 @@
package biz.nellemann.hmci
import biz.nellemann.hmci.pojo.PcmData
import groovy.json.JsonSlurper
import groovy.util.logging.Slf4j
import java.time.Instant
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeParseException
@Slf4j
class MetaSystem {
protected PcmData metrics
void processMetrics(String json) {
def pcmMap = new JsonSlurper().parseText(json)
metrics = new PcmData(pcmMap as Map)
}
Instant getTimestamp() {
String timeStamp = metrics.systemUtil.utilSamples.first().sampleInfo.timeStamp
Instant instant
try {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[XXX][X]");
instant = Instant.from(dateTimeFormatter.parse(timeStamp))
} catch(DateTimeParseException e) {
log.warn("getTimestamp() - parse error: " + timeStamp)
}
return instant
}
}

View file

@ -0,0 +1,11 @@
package biz.nellemann.hmci.pojo
import groovy.transform.ToString
@ToString
class SampleInfo {
String timeStamp
Integer status
}

View file

@ -6,6 +6,7 @@ import groovy.transform.ToString
class UtilSample { class UtilSample {
String sampleType String sampleType
SampleInfo sampleInfo
ServerUtil serverUtil ServerUtil serverUtil
List<ViosUtil> viosUtil List<ViosUtil> viosUtil
List<LparUtil> lparsUtil List<LparUtil> lparsUtil

View file

@ -44,8 +44,8 @@ class HmcClientTest extends Specification {
mockServer.enqueue(new MockResponse().setBody(testXml)); mockServer.enqueue(new MockResponse().setBody(testXml));
when: when:
ManagedSystem system = new ManagedSystem("e09834d1-c930-3883-bdad-405d8e26e166") ManagedSystem system = new ManagedSystem("e09834d1-c930-3883-bdad-405d8e26e166", "Test Name","Test Type", "Test Model", "Test S/N")
Map<String, ManagedSystem> partitions = hmc.getLogicalPartitionsForManagedSystemWithId(system.id) Map<String, LogicalPartition> partitions = hmc.getLogicalPartitionsForManagedSystemWithId(system.id)
then: then:
partitions.size() == 12 partitions.size() == 12

View file

@ -0,0 +1,37 @@
package biz.nellemann.hmci
import okhttp3.mockwebserver.MockWebServer
import spock.lang.Specification
class InfluxClientTest extends Specification {
InfluxClient influxClient
def setup() {
influxClient = new InfluxClient("http://localhost:8086", "root", "", "hmci")
influxClient.login()
}
def cleanup() {
influxClient.logoff()
}
void "write some managed system data to influx"() {
setup:
def testFile = new File(getClass().getResource('/pcm-data-managed-system.json').toURI())
def testJson = testFile.getText('UTF-8')
when:
ManagedSystem system = new ManagedSystem("e09834d1-c930-3883-bdad-405d8e26e166", "TestSystem", "TestType", "TestModel", "Test s/n")
system.processMetrics(testJson)
influxClient.writeManagedSystem(system)
then:
system.metrics.systemUtil.utilInfo.name == "S822L-8247-213C1BA"
}
}

View file

@ -12,7 +12,7 @@ class LogicalPartitionTest extends Specification {
def testJson = testFile.getText('UTF-8') def testJson = testFile.getText('UTF-8')
when: when:
LogicalPartition lpar = new LogicalPartition("2DE05DB6-8AD5-448F-8327-0F488D287E82", "e09834d1-c930-3883-bdad-405d8e26e166") LogicalPartition lpar = new LogicalPartition("2DE05DB6-8AD5-448F-8327-0F488D287E82", "e09834d1-c930-3883-bdad-405d8e26e166", "9Flash01", "OS400")
lpar.processMetrics(testJson) lpar.processMetrics(testJson)
then: then:

View file

@ -11,7 +11,7 @@ class ManagedSystemTest extends Specification {
def testJson = testFile.getText('UTF-8') def testJson = testFile.getText('UTF-8')
when: when:
ManagedSystem system = new ManagedSystem("e09834d1-c930-3883-bdad-405d8e26e166") ManagedSystem system = new ManagedSystem("e09834d1-c930-3883-bdad-405d8e26e166", "Test Name","Test Type", "Test Model", "Test S/N")
system.processMetrics(testJson) system.processMetrics(testJson)
then: then:

View file

@ -1,223 +0,0 @@
{
"utilInfo": {
"version": "1.3.0",
"metricType": "Processed",
"frequency": 30,
"startTimeStamp": "2020-08-07T12:37:30+0200",
"endTimeStamp": "2020-08-07T12:37:30+0200",
"mtms": "9009-42A*21F64EV",
"name": "Server-9009-42A-SN21F64EV",
"uuid": "b597e4da-2aab-3f52-8616-341d62153559",
"metricArrayOrder": [
"AVG"
]
},
"utilSamples": [
{
"sampleType": "LogicalPartition",
"sampleInfo": {
"timeStamp": "2020-08-07T12:37:30+0200",
"status": 2,
"errorInfo": [
{
"errId": "3004",
"errMsg": "Failed to fetch SRIOV adapter physical port statistics due to a technical error.",
"uuid": "b597e4da-2aab-3f52-8616-341d62153559",
"reportedBy": "ManagedSystem",
"occurrenceCount": 1
},
{
"errId": "3004",
"errMsg": "Failed to fetch SRIOV adapter physical port statistics due to a technical error.",
"uuid": "b597e4da-2aab-3f52-8616-341d62153559",
"reportedBy": "ManagedSystem",
"occurrenceCount": 1
}
]
},
"lparsUtil": [
{
"id": 10,
"uuid": "2DE05DB6-8AD5-448F-8327-0F488D287E82",
"name": "P9-PowerVC",
"state": "Running",
"type": "AIX/Linux",
"osType": "Linux",
"affinityScore": 100,
"memory": {
"logicalMem": [
112640.000
],
"backedPhysicalMem": [
112640.000
]
},
"processor": {
"poolId": 0,
"weight": 128,
"mode": "uncap",
"maxVirtualProcessors": [
8.000
],
"currentVirtualProcessors": [
4.000
],
"maxProcUnits": [
8.000
],
"entitledProcUnits": [
1.000
],
"utilizedProcUnits": [
0.574
],
"utilizedCappedProcUnits": [
0.498
],
"utilizedUncappedProcUnits": [
0.076
],
"idleProcUnits": [
0.376
],
"donatedProcUnits": [
0.000
],
"timeSpentWaitingForDispatch": [
0.000
],
"timePerInstructionExecution": [
0.000
]
},
"network": {
"virtualEthernetAdapters": [
{
"physicalLocation": "U9009.42A.21F64EV-V10-C2",
"vlanId": 1,
"vswitchId": 0,
"isPortVlanId": true,
"viosId": 1,
"sharedEthernetAdapterId": "ent5",
"receivedPackets": [
11.933
],
"sentPackets": [
7.767
],
"droppedPackets": [
0.000
],
"sentBytes": [
2020.467
],
"receivedBytes": [
4291.167
],
"receivedPhysicalPackets": [
11.933
],
"sentPhysicalPackets": [
7.767
],
"droppedPhysicalPackets": [
0.000
],
"sentPhysicalBytes": [
2020.467
],
"receivedPhysicalBytes": [
4291.167
],
"transferredBytes": [
6311.634
],
"transferredPhysicalBytes": [
6311.634
]
}
]
},
"storage": {
"genericVirtualAdapters": [
{
"id": "vhost5",
"type": "virtual",
"viosId": 1,
"physicalLocation": "U9009.42A.21F64EV-V10-C3",
"numOfReads": [
0.000
],
"numOfWrites": [
0.000
],
"readBytes": [
0.000
],
"writeBytes": [
0.000
],
"transmittedBytes": [
null
]
}
],
"virtualFiberChannelAdapters": [
{
"wwpn": "c050760b1d10002a",
"wwpn2": "c050760b1d10002b",
"physicalLocation": "U9009.42A.21F64EV-V10-C87",
"physicalPortWWPN": "100000109b89aca8",
"viosId": 1,
"numOfReads": [
0.000
],
"numOfWrites": [
2.867
],
"readBytes": [
0.000
],
"writeBytes": [
138786.133
],
"runningSpeed": [
8.000
],
"transmittedBytes": [
0.000
]
},
{
"wwpn": "c050760b1d10002c",
"wwpn2": "c050760b1d10002d",
"physicalLocation": "U9009.42A.21F64EV-V10-C88",
"physicalPortWWPN": "100000109b7db96a",
"viosId": 2,
"numOfReads": [
0.000
],
"numOfWrites": [
2.933
],
"readBytes": [
0.000
],
"writeBytes": [
140731.733
],
"runningSpeed": [
8.000
],
"transmittedBytes": [
0.000
]
}
]
}
}
]
}
]
}
}

View file

@ -1,805 +0,0 @@
{
"systemUtil": {
"utilInfo": {
"version": "1.3.0",
"metricType": "Processed",
"frequency": 30,
"startTimeStamp": "2020-08-07T10:44:00+0200",
"endTimeStamp": "2020-08-07T10:44:00+0200",
"mtms": "8247-22L*213C1BA",
"name": "S822L-8247-213C1BA",
"uuid": "e09834d1-c930-3883-bdad-405d8e26e166",
"metricArrayOrder": [
"AVG"
]
},
"utilSamples": [
{
"sampleType": "ManagedSystem",
"sampleInfo": {
"timeStamp": "2020-08-07T10:44:00+0200",
"status": 0
},
"systemFirmwareUtil": {
"utilizedProcUnits": [
0.000
],
"assignedMem": [
5632.000
]
},
"serverUtil": {
"processor": {
"totalProcUnits": [
24.000
],
"utilizedProcUnits": [
0.017
],
"availableProcUnits": [
16.000
],
"configurableProcUnits": [
24.000
]
},
"memory": {
"totalMem": [
1048576.000
],
"availableMem": [
1001984.000
],
"configurableMem": [
1048576.000
],
"assignedMemToLpars": [
40960.000
]
},
"physicalProcessorPool": {
"assignedProcUnits": [
23.879
],
"utilizedProcUnits": [
0.007
],
"availableProcUnits": [
23.872
],
"configuredProcUnits": [
0.000
],
"borrowedProcUnits": [
16.000
]
},
"sharedProcessorPool": [
{
"id": 0,
"name": "DefaultPool",
"assignedProcUnits": [
23.879
],
"utilizedProcUnits": [
0.005
],
"availableProcUnits": [
23.874
],
"configuredProcUnits": [
6.000
],
"borrowedProcUnits": [
16.000
]
}
]
},
"viosUtil": [
{
"id": 1,
"uuid": "2F30379A-860B-4661-A24E-CD8E449C81AC",
"name": "VIOS1",
"state": "Running",
"affinityScore": 100,
"memory": {
"assignedMem": [
8192.000
],
"utilizedMem": [
2061.000
]
},
"processor": {
"weight": 0,
"mode": "share_idle_procs_active",
"maxVirtualProcessors": [
2.000
],
"currentVirtualProcessors": [
0.000
],
"maxProcUnits": [
2.000
],
"entitledProcUnits": [
1.000
],
"utilizedProcUnits": [
0.006
],
"utilizedCappedProcUnits": [
0.079
],
"utilizedUncappedProcUnits": [
0.000
],
"idleProcUnits": [
0.073
],
"donatedProcUnits": [
0.921
],
"timeSpentWaitingForDispatch": [
0.000
],
"timePerInstructionExecution": [
51.000
]
},
"network": {
"clientLpars": [
"62F4D488-C838-41E2-B83B-E68E004E3B63"
],
"genericAdapters": [
{
"id": "ent2",
"type": "physical",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C10-T3",
"receivedPackets": [
29.733
],
"sentPackets": [
25.900
],
"droppedPackets": [
0.000
],
"sentBytes": [
7508.933
],
"receivedBytes": [
5676.000
],
"transferredBytes": [
13184.933
]
},
{
"id": "ent6",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V1-C3-T1",
"receivedPackets": [
12.967
],
"sentPackets": [
9.700
],
"droppedPackets": [
0.000
],
"sentBytes": [
3348.667
],
"receivedBytes": [
2401.733
],
"transferredBytes": [
5750.400
]
},
{
"id": "ent4",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V1-C2-T1",
"receivedPackets": [
26.900
],
"sentPackets": [
33.800
],
"droppedPackets": [
0.000
],
"sentBytes": [
8853.333
],
"receivedBytes": [
8214.933
],
"transferredBytes": [
17068.266
]
}
],
"sharedAdapters": [
{
"id": "ent5",
"type": "sea",
"physicalLocation": "U8247.22L.213C1BA-V1-C2-T1",
"receivedPackets": [
56.633
],
"sentPackets": [
59.700
],
"droppedPackets": [
0.000
],
"sentBytes": [
16362.267
],
"receivedBytes": [
13890.933
],
"transferredBytes": [
30253.200
],
"bridgedAdapters": [
"ent2",
"ent4",
"ent4"
]
}
],
"virtualEthernetAdapters": [
{
"physicalLocation": "U8247.22L.213C1BA-V1-C2",
"vlanId": 1,
"vswitchId": 0,
"isPortVlanId": true,
"receivedPackets": [
10.467
],
"sentPackets": [
14.667
],
"droppedPackets": [
0.000
],
"sentBytes": [
1931.333
],
"receivedBytes": [
3875.433
],
"receivedPhysicalPackets": [
0.000
],
"sentPhysicalPackets": [
0.000
],
"droppedPhysicalPackets": [
0.000
],
"sentPhysicalBytes": [
0.000
],
"receivedPhysicalBytes": [
0.000
],
"transferredBytes": [
5806.766
],
"transferredPhysicalBytes": [
0.000
]
},
{
"physicalLocation": "U8247.22L.213C1BA-V1-C3",
"vlanId": 1,
"vswitchId": 0,
"isPortVlanId": true,
"receivedPackets": [
6.100
],
"sentPackets": [
1.700
],
"droppedPackets": [
0.000
],
"sentBytes": [
1420.533
],
"receivedBytes": [
575.100
],
"receivedPhysicalPackets": [
6.100
],
"sentPhysicalPackets": [
1.700
],
"droppedPhysicalPackets": [
0.000
],
"sentPhysicalBytes": [
1420.533
],
"receivedPhysicalBytes": [
575.100
],
"transferredBytes": [
1995.633
],
"transferredPhysicalBytes": [
1995.633
]
}
]
},
"storage": {
"clientLpars": [
"62F4D488-C838-41E2-B83B-E68E004E3B63"
],
"genericPhysicalAdapters": [
{
"id": "sissas0",
"type": "sas",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C14-T1",
"numOfReads": [
0.000
],
"numOfWrites": [
4.533
],
"readBytes": [
0.000
],
"writeBytes": [
2321.067
],
"transmittedBytes": [
2321.067
]
}
],
"genericVirtualAdapters": [
{
"id": "vhost1",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V1-C6",
"numOfReads": [
0.000
],
"numOfWrites": [
0.000
],
"readBytes": [
0.000
],
"writeBytes": [
0.000
],
"transmittedBytes": [
0.000
]
},
{
"id": "vhost0",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V1-C5",
"numOfReads": [
0.500
],
"numOfWrites": [
0.500
],
"readBytes": [
256.000
],
"writeBytes": [
256.000
],
"transmittedBytes": [
512.000
]
},
{
"id": "vhost2",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V1-C7",
"numOfReads": [
0.000
],
"numOfWrites": [
0.000
],
"readBytes": [
0.000
],
"writeBytes": [
0.000
],
"transmittedBytes": [
0.000
]
}
],
"fiberChannelAdapters": [
{
"id": "fcs0",
"wwpn": "10000090faba5108",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C12-T1",
"numOfPorts": 3,
"numOfReads": [
0.000
],
"numOfWrites": [
0.467
],
"readBytes": [
0.000
],
"writeBytes": [
30583.467
],
"runningSpeed": [
8.000
],
"transmittedBytes": [
30583.467
]
},
{
"id": "fcs1",
"wwpn": "10000090faba5109",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C12-T2",
"numOfPorts": 0,
"numOfReads": [
0.000
],
"numOfWrites": [
0.000
],
"readBytes": [
0.000
],
"writeBytes": [
0.000
],
"runningSpeed": [
0.000
],
"transmittedBytes": [
0.000
]
}
]
}
},
{
"id": 2,
"uuid": "2BA128CE-38E4-4522-B823-7471633C2717",
"name": "VIOS2",
"state": "Running",
"affinityScore": 100,
"memory": {
"assignedMem": [
8192.000
],
"utilizedMem": [
2090.000
]
},
"processor": {
"weight": 0,
"mode": "share_idle_procs_active",
"maxVirtualProcessors": [
2.000
],
"currentVirtualProcessors": [
0.000
],
"maxProcUnits": [
2.000
],
"entitledProcUnits": [
1.000
],
"utilizedProcUnits": [
0.005
],
"utilizedCappedProcUnits": [
0.042
],
"utilizedUncappedProcUnits": [
0.000
],
"idleProcUnits": [
0.037
],
"donatedProcUnits": [
0.958
],
"timeSpentWaitingForDispatch": [
0.000
],
"timePerInstructionExecution": [
52.000
]
},
"network": {
"genericAdapters": [
{
"id": "ent6",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V2-C3-T1",
"receivedPackets": [
12.233
],
"sentPackets": [
9.000
],
"droppedPackets": [
0.000
],
"sentBytes": [
3011.200
],
"receivedBytes": [
2265.067
],
"transferredBytes": [
5276.267
]
},
{
"id": "ent4",
"type": "virtual",
"physicalLocation": "U8247.22L.213C1BA-V2-C2-T1",
"receivedPackets": [
4.600
],
"sentPackets": [
1.000
],
"droppedPackets": [
0.000
],
"sentBytes": [
706.000
],
"receivedBytes": [
3247.600
],
"transferredBytes": [
3953.600
]
},
{
"id": "ent2",
"type": "physical",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C6-T3",
"receivedPackets": [
5.167
],
"sentPackets": [
0.000
],
"droppedPackets": [
0.000
],
"sentBytes": [
0.000
],
"receivedBytes": [
380.333
],
"transferredBytes": [
380.333
]
}
],
"sharedAdapters": [
{
"id": "ent5",
"type": "sea",
"physicalLocation": "U8247.22L.213C1BA-V2-C2-T1",
"receivedPackets": [
9.767
],
"sentPackets": [
1.000
],
"droppedPackets": [
0.000
],
"sentBytes": [
706.000
],
"receivedBytes": [
3627.933
],
"transferredBytes": [
4333.933
],
"bridgedAdapters": [
"ent2",
"ent4",
"ent4"
]
}
],
"virtualEthernetAdapters": [
{
"physicalLocation": "U8247.22L.213C1BA-V2-C2",
"vlanId": 1,
"vswitchId": 0,
"isPortVlanId": true,
"receivedPackets": [
0.000
],
"sentPackets": [
0.000
],
"droppedPackets": [
0.000
],
"sentBytes": [
0.000
],
"receivedBytes": [
0.000
],
"receivedPhysicalPackets": [
0.000
],
"sentPhysicalPackets": [
0.000
],
"droppedPhysicalPackets": [
0.000
],
"sentPhysicalBytes": [
0.000
],
"receivedPhysicalBytes": [
0.000
],
"transferredBytes": [
0.000
],
"transferredPhysicalBytes": [
0.000
]
},
{
"physicalLocation": "U8247.22L.213C1BA-V2-C3",
"vlanId": 1,
"vswitchId": 0,
"isPortVlanId": true,
"receivedPackets": [
5.867
],
"sentPackets": [
1.567
],
"droppedPackets": [
0.000
],
"sentBytes": [
1306.633
],
"receivedBytes": [
517.900
],
"receivedPhysicalPackets": [
5.867
],
"sentPhysicalPackets": [
1.567
],
"droppedPhysicalPackets": [
0.000
],
"sentPhysicalBytes": [
1306.633
],
"receivedPhysicalBytes": [
517.900
],
"transferredBytes": [
1824.533
],
"transferredPhysicalBytes": [
1824.533
]
}
]
},
"storage": {
"clientLpars": [
"62F4D488-C838-41E2-B83B-E68E004E3B63"
],
"genericPhysicalAdapters": [
{
"id": "sissas1",
"type": "sas",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C15-T1",
"numOfReads": [
0.000
],
"numOfWrites": [
6.400
],
"readBytes": [
0.000
],
"writeBytes": [
3276.800
],
"transmittedBytes": [
3276.800
]
}
],
"fiberChannelAdapters": [
{
"id": "fcs1",
"wwpn": "10000090fab674d7",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C2-T2",
"numOfPorts": 0,
"numOfReads": [
0.000
],
"numOfWrites": [
0.000
],
"readBytes": [
0.000
],
"writeBytes": [
0.000
],
"runningSpeed": [
0.000
],
"transmittedBytes": [
0.000
]
},
{
"id": "fcs0",
"wwpn": "10000090fab674d6",
"physicalLocation": "U78CB.001.WZS0BYF-P1-C2-T1",
"numOfPorts": 3,
"numOfReads": [
0.000
],
"numOfWrites": [
0.400
],
"readBytes": [
0.000
],
"writeBytes": [
26214.400
],
"runningSpeed": [
8.000
],
"transmittedBytes": [
26214.400
]
}
]
}
}
]
}
]
}
}