extensions/procfs/ProcFsSerialization.h (152 lines of code) (raw):
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#pragma once
#include <stdint.h>
#include <concepts>
#include <string_view>
#include "CpuStat.h"
#include "DiskStat.h"
#include "MemInfo.h"
#include "NetDev.h"
#include "ProcessStat.h"
#include "utils/gsl.h"
namespace org::apache::nifi::minifi::extensions::procfs {
template<class Serializer>
requires std::invocable<Serializer, const char*, uint64_t>
void SerializeCPUStatData(const CpuStatData& cpu_stat_data,
Serializer serializer) {
serializer("user time", cpu_stat_data.getUser().count());
serializer("nice time", cpu_stat_data.getNice().count());
serializer("system time", cpu_stat_data.getSystem().count());
serializer("idle time", cpu_stat_data.getIdle().count());
serializer("io wait time", cpu_stat_data.getIoWait().count());
serializer("irq time", cpu_stat_data.getIrq().count());
serializer("soft irq time", cpu_stat_data.getSoftIrq().count());
serializer("steal time", cpu_stat_data.getSteal().count());
serializer("guest time", cpu_stat_data.getGuest().count());
serializer("guest nice time", cpu_stat_data.getGuestNice().count());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, double>
void SerializeNormalizedCPUStat(const CpuStatData& cpu_stat_data,
Serializer serializer) {
gsl_Expects(cpu_stat_data.getTotal() > 0ms);
serializer("user time %", cpu_stat_data.getUser()/cpu_stat_data.getTotal());
serializer("nice time %", cpu_stat_data.getNice()/cpu_stat_data.getTotal());
serializer("system time %", cpu_stat_data.getSystem()/cpu_stat_data.getTotal());
serializer("idle time %", cpu_stat_data.getIdle()/cpu_stat_data.getTotal());
serializer("io wait time %", cpu_stat_data.getIoWait()/cpu_stat_data.getTotal());
serializer("irq time %", cpu_stat_data.getIrq()/cpu_stat_data.getTotal());
serializer("soft irq %", cpu_stat_data.getSoftIrq()/cpu_stat_data.getTotal());
serializer("steal time %", cpu_stat_data.getSteal()/cpu_stat_data.getTotal());
serializer("guest time %", cpu_stat_data.getGuest()/cpu_stat_data.getTotal());
serializer("guest nice time %", cpu_stat_data.getGuestNice()/cpu_stat_data.getTotal());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, uint64_t>
void SerializeDiskStatData(const DiskStatData& disk_stat_data,
Serializer serializer) {
serializer("Major Device Number", disk_stat_data.getMajorDeviceNumber());
serializer("Minor Device Number", disk_stat_data.getMinorDeviceNumber());
serializer("Reads Completed", disk_stat_data.getReadsCompleted());
serializer("Reads Merged", disk_stat_data.getReadsMerged());
serializer("Sectors Read", disk_stat_data.getSectorsRead());
serializer("Writes Completed", disk_stat_data.getWritesCompleted());
serializer("Writes Merged", disk_stat_data.getWritesMerged());
serializer("Sectors Written", disk_stat_data.getSectorsWritten());
serializer("IOs in progress", disk_stat_data.getIosInProgress());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, double>
void SerializeDiskStatDataPerSec(const DiskStatData& disk_stat_data,
const std::chrono::duration<double> duration,
Serializer serializer) {
gsl_Expects(duration > 0ms);
serializer("Major Device Number", disk_stat_data.getMajorDeviceNumber());
serializer("Minor Device Number", disk_stat_data.getMinorDeviceNumber());
serializer("Reads Completed/sec", disk_stat_data.getReadsCompleted()/duration.count());
serializer("Reads Merged/sec", disk_stat_data.getReadsMerged()/duration.count());
serializer("Sectors Read/sec", disk_stat_data.getSectorsRead()/duration.count());
serializer("Writes Completed/sec", disk_stat_data.getWritesCompleted()/duration.count());
serializer("Writes Merged/sec", disk_stat_data.getWritesMerged()/duration.count());
serializer("Sectors Written/sec", disk_stat_data.getSectorsWritten()/duration.count());
serializer("IOs in progress", disk_stat_data.getIosInProgress()/duration.count());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, uint64_t>
void SerializeMemInfo(const MemInfo& mem_info,
Serializer serializer) {
serializer("MemTotal", mem_info.getTotalMemory());
serializer("MemFree", mem_info.getFreeMemory());
serializer("MemAvailable", mem_info.getAvailableMemory());
serializer("SwapTotal", mem_info.getTotalSwap());
serializer("SwapFree", mem_info.getFreeSwap());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, uint64_t>
void SerializeNetDevData(const NetDevData& net_dev_data,
Serializer serializer) {
serializer("Bytes Received", net_dev_data.getBytesReceived());
serializer("Packets Received", net_dev_data.getPacketsReceived());
serializer("Receive Errors", net_dev_data.getReceiveErrors());
serializer("Receive Drop Errors", net_dev_data.getReceiveDropErrors());
serializer("Receive Fifo Errors", net_dev_data.getReceiveFifoErrors());
serializer("Receive Frame Errors", net_dev_data.getReceiveFrameErrors());
serializer("Compressed Packets Received", net_dev_data.getCompressedPacketsReceived());
serializer("Multicast Frames Received", net_dev_data.getMulticastFramesReceived());
serializer("Bytes Transmitted", net_dev_data.getBytesTransmitted());
serializer("Packets Transmitted", net_dev_data.getPacketsTransmitted());
serializer("Transmit errors", net_dev_data.getTransmitErrors());
serializer("Transmit drop errors", net_dev_data.getTransmitDropErrors());
serializer("Transmit fifo errors", net_dev_data.getTransmitFifoErrors());
serializer("Transmit collisions", net_dev_data.getTransmitCollisions());
serializer("Transmit carrier losses", net_dev_data.getTransmitCarrierLosses());
serializer("Compressed Packets Transmitted", net_dev_data.getCompressedPacketsTransmitted());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, double>
void SerializeNetDevDataPerSec(const NetDevData& net_dev_data,
const std::chrono::duration<double> duration,
Serializer serializer) {
gsl_Expects(duration > 0ms);
serializer("Bytes Received/sec", net_dev_data.getBytesReceived()/duration.count());
serializer("Packets Received/sec", net_dev_data.getPacketsReceived()/duration.count());
serializer("Receive Errors/sec", net_dev_data.getReceiveErrors()/duration.count());
serializer("Receive Drop Errors/sec", net_dev_data.getReceiveDropErrors()/duration.count());
serializer("Receive Fifo Errors/sec", net_dev_data.getReceiveFifoErrors()/duration.count());
serializer("Receive Frame Errors/sec", net_dev_data.getReceiveFrameErrors()/duration.count());
serializer("Compressed Packets Received/sec", net_dev_data.getCompressedPacketsReceived()/duration.count());
serializer("Multicast Frames Received/sec", net_dev_data.getMulticastFramesReceived()/duration.count());
serializer("Bytes Transmitted/sec", net_dev_data.getBytesTransmitted()/duration.count());
serializer("Packets Transmitted/sec", net_dev_data.getPacketsTransmitted()/duration.count());
serializer("Transmit errors/sec", net_dev_data.getTransmitErrors()/duration.count());
serializer("Transmit drop errors/sec", net_dev_data.getTransmitDropErrors()/duration.count());
serializer("Transmit fifo errors/sec", net_dev_data.getTransmitFifoErrors()/duration.count());
serializer("Transmit collisions/sec", net_dev_data.getTransmitCollisions()/duration.count());
serializer("Transmit carrier losses/sec", net_dev_data.getTransmitCarrierLosses()/duration.count());
serializer("Compressed Packets Transmitted/sec", net_dev_data.getCompressedPacketsTransmitted()/duration.count());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, uint64_t> &&
std::invocable<Serializer, const char*, std::string_view>
void SerializeProcessStat(const ProcessStat& process_stat,
Serializer serializer) {
serializer("COMM", process_stat.getComm());
serializer("RES", process_stat.getMemory());
serializer("CPUTIME", process_stat.getCpuTime().count());
}
template<class Serializer>
requires std::invocable<Serializer, const char*, double> &&
std::invocable<Serializer, const char*, uint64_t> &&
std::invocable<Serializer, const char*, std::string_view>
void SerializeNormalizedProcessStat(const ProcessStat& process_stat_start,
const ProcessStat& process_stat_end,
const std::chrono::duration<double> all_cpu_time,
Serializer serializer) {
gsl_Expects(all_cpu_time > 0ms);
gsl_Expects(process_stat_start.getComm() == process_stat_end.getComm());
gsl_Expects(process_stat_end.getCpuTime() >= process_stat_start.getCpuTime());
auto cpu_time_diff = process_stat_end.getCpuTime()-process_stat_start.getCpuTime();
serializer("COMM", process_stat_start.getComm());
serializer("RES", process_stat_end.getMemory());
serializer("CPU%", 100*(cpu_time_diff/all_cpu_time));
}
} // namespace org::apache::nifi::minifi::extensions::procfs