summaryrefslogtreecommitdiffstats
path: root/pcp
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2021-03-05 16:35:32 +1100
committerNathan Scott <nathans@redhat.com>2021-06-09 17:09:29 +1000
commit956b2ae70ccd7bbb91f20176e9ad4a6a2175931c (patch)
tree959d9e852a2564f5082bc800a6d004342107b019 /pcp
parentc6f20fbcc684bc7dd6d2805f1072c651b733d259 (diff)
Update PCP platform to match latest API changes
Updates for recent NetworkIO Meter changes, adds support for the SysArch and HostName Meters. The SysArch change is based on work originally by Sohaib Mohamed.
Diffstat (limited to 'pcp')
-rw-r--r--pcp/Platform.c100
-rw-r--r--pcp/Platform.h14
2 files changed, 95 insertions, 19 deletions
diff --git a/pcp/Platform.c b/pcp/Platform.c
index ebb70549..4fcf3db1 100644
--- a/pcp/Platform.c
+++ b/pcp/Platform.c
@@ -35,6 +35,7 @@ in the source distribution for its full text.
#include "ProvideCurses.h"
#include "Settings.h"
#include "SwapMeter.h"
+#include "SysArchMeter.h"
#include "TasksMeter.h"
#include "UptimeMeter.h"
#include "XUtils.h"
@@ -45,6 +46,7 @@ in the source distribution for its full text.
#include "zfs/ZfsArcStats.h"
#include "zfs/ZfsCompressedArcMeter.h"
+
typedef struct Platform_ {
int context; /* PMAPI(3) context identifier */
unsigned int total; /* total number of all metrics */
@@ -55,6 +57,7 @@ typedef struct Platform_ {
pmResult* result; /* sample values result indexed by Metric */
long long btime; /* boottime in seconds since the epoch */
+ char *release; /* uname and distro from this context */
int pidmax; /* maximum platform process identifier */
int ncpu; /* maximum processor count configured */
} Platform;
@@ -107,6 +110,7 @@ const MeterClass* const Platform_meterTypes[] = {
&ZramMeter_class,
&DiskIOMeter_class,
&NetworkIOMeter_class,
+ &SysArchMeter_class,
NULL
};
@@ -118,6 +122,7 @@ static const char *Platform_metricNames[] = {
[PCP_UNAME_SYSNAME] = "kernel.uname.sysname",
[PCP_UNAME_RELEASE] = "kernel.uname.release",
[PCP_UNAME_MACHINE] = "kernel.uname.machine",
+ [PCP_UNAME_DISTRO] = "kernel.uname.distro",
[PCP_LOAD_AVERAGE] = "kernel.all.load",
[PCP_PID_MAX] = "kernel.all.pid_max",
[PCP_UPTIME] = "kernel.all.uptime",
@@ -449,6 +454,7 @@ void Platform_init(void) {
Metric_enable(PCP_UNAME_SYSNAME, true);
Metric_enable(PCP_UNAME_RELEASE, true);
Metric_enable(PCP_UNAME_MACHINE, true);
+ Metric_enable(PCP_UNAME_DISTRO, true);
Metric_fetch(NULL);
@@ -459,9 +465,11 @@ void Platform_init(void) {
Metric_enable(PCP_UNAME_SYSNAME, false);
Metric_enable(PCP_UNAME_RELEASE, false);
Metric_enable(PCP_UNAME_MACHINE, false);
+ Metric_enable(PCP_UNAME_DISTRO, false);
/* first sample (fetch) performed above, save constants */
Platform_getBootTime();
+ Platform_getRelease(0);
Platform_getMaxCPU();
Platform_getMaxPid();
}
@@ -645,6 +653,76 @@ void Platform_setZfsCompressedArcValues(Meter* this) {
ZfsCompressedArcMeter_readStats(this, &(ppl->zfs));
}
+void Platform_getHostname(char* buffer, size_t size) {
+ pmGetHostName(pcp->context, buffer, size);
+}
+
+void Platform_getRelease(char** string) {
+ /* fast-path - previously-formatted string */
+ if (string) {
+ *string = pcp->release;
+ return;
+ }
+
+ /* first call, extract just-sampled values */
+ pmAtomValue value;
+
+ char* name = NULL;
+ if (Metric_values(PCP_UNAME_SYSNAME, &value, 1, PM_TYPE_STRING))
+ name = value.cp;
+ char* release = NULL;
+ if (Metric_values(PCP_UNAME_RELEASE, &value, 1, PM_TYPE_STRING))
+ release = value.cp;
+ char* machine = NULL;
+ if (Metric_values(PCP_UNAME_MACHINE, &value, 1, PM_TYPE_STRING))
+ machine = value.cp;
+ char* distro = NULL;
+ if (Metric_values(PCP_UNAME_DISTRO, &value, 1, PM_TYPE_STRING))
+ distro = value.cp;
+
+ size_t length = 16; /* padded for formatting characters */
+ if (name)
+ length += strlen(name);
+ if (release)
+ length += strlen(release);
+ if (machine)
+ length += strlen(machine);
+ if (distro)
+ length += strlen(distro);
+ pcp->release = xCalloc(1, length);
+
+ if (name) {
+ strcat(pcp->release, name);
+ strcat(pcp->release, " ");
+ }
+ if (release) {
+ strcat(pcp->release, release);
+ strcat(pcp->release, " ");
+ }
+ if (machine) {
+ strcat(pcp->release, "[");
+ strcat(pcp->release, machine);
+ strcat(pcp->release, "] ");
+ }
+ if (distro) {
+ if (pcp->release[0] != '\0') {
+ strcat(pcp->release, "@ ");
+ strcat(pcp->release, distro);
+ } else {
+ strcat(pcp->release, distro);
+ }
+ strcat(pcp->release, " ");
+ }
+
+ if (pcp->release) /* cull trailing space */
+ pcp->release[strlen(pcp->release)] = '\0';
+
+ free(distro);
+ free(machine);
+ free(release);
+ free(name);
+}
+
char* Platform_getProcessEnv(pid_t pid) {
pmAtomValue value;
if (!Metric_instance(PCP_PROC_ENVIRON, pid, 0, &value, PM_TYPE_STRING))
@@ -685,9 +763,7 @@ void Platform_getPressureStall(const char* file, bool some, double* ten, double*
}
bool Platform_getDiskIO(DiskIOData* data) {
- data->totalBytesRead = 0;
- data->totalBytesWritten = 0;
- data->totalMsTimeSpend = 0;
+ memset(data, 0, sizeof(*data));
pmAtomValue value;
if (Metric_values(PCP_DISK_READB, &value, 1, PM_TYPE_U64) != NULL)
@@ -699,24 +775,18 @@ bool Platform_getDiskIO(DiskIOData* data) {
return true;
}
-bool Platform_getNetworkIO(unsigned long int* bytesReceived,
- unsigned long int* packetsReceived,
- unsigned long int* bytesTransmitted,
- unsigned long int* packetsTransmitted) {
- *bytesReceived = 0;
- *packetsReceived = 0;
- *bytesTransmitted = 0;
- *packetsTransmitted = 0;
+bool Platform_getNetworkIO(NetworkIOData* data) {
+ memset(data, 0, sizeof(*data));
pmAtomValue value;
if (Metric_values(PCP_NET_RECVB, &value, 1, PM_TYPE_U64) != NULL)
- *bytesReceived = value.ull;
+ data->bytesReceived = value.ull;
if (Metric_values(PCP_NET_SENDB, &value, 1, PM_TYPE_U64) != NULL)
- *bytesTransmitted = value.ull;
+ data->bytesTransmitted = value.ull;
if (Metric_values(PCP_NET_RECVP, &value, 1, PM_TYPE_U64) != NULL)
- *packetsReceived = value.ull;
+ data->packetsReceived = value.ull;
if (Metric_values(PCP_NET_SENDP, &value, 1, PM_TYPE_U64) != NULL)
- *packetsTransmitted = value.ull;
+ data->packetsTransmitted = value.ull;
return true;
}
diff --git a/pcp/Platform.h b/pcp/Platform.h
index eb6b3f10..4d66d888 100644
--- a/pcp/Platform.h
+++ b/pcp/Platform.h
@@ -24,9 +24,12 @@ in the source distribution for its full text.
#include "BatteryMeter.h"
#include "DiskIOMeter.h"
#include "Meter.h"
+#include "NetworkIOMeter.h"
#include "Process.h"
#include "ProcessLocksScreen.h"
#include "SignalsPanel.h"
+#include "SysArchMeter.h"
+
extern ProcessField Platform_defaultFields[];
@@ -76,13 +79,15 @@ void Platform_getPressureStall(const char *file, bool some, double* ten, double*
bool Platform_getDiskIO(DiskIOData* data);
-bool Platform_getNetworkIO(unsigned long int* bytesReceived,
- unsigned long int* packetsReceived,
- unsigned long int* bytesTransmitted,
- unsigned long int* packetsTransmitted);
+bool Platform_getNetworkIO(NetworkIOData* data);
void Platform_getBattery(double *percent, ACPresence *isOnAC);
+void Platform_getHostname(char* buffer, size_t size);
+
+void Platform_getRelease(char** string);
+
+
typedef enum Metric_ {
PCP_CONTROL_THREADS, /* proc.control.perclient.threads */
@@ -91,6 +96,7 @@ typedef enum Metric_ {
PCP_UNAME_SYSNAME, /* kernel.uname.sysname */
PCP_UNAME_RELEASE, /* kernel.uname.release */
PCP_UNAME_MACHINE, /* kernel.uname.machine */
+ PCP_UNAME_DISTRO, /* kernel.uname.distro */
PCP_LOAD_AVERAGE, /* kernel.all.load */
PCP_PID_MAX, /* kernel.all.pid_max */
PCP_UPTIME, /* kernel.all.uptime */

© 2014-2024 Faster IT GmbH | imprint | privacy policy