extensions/procfs/ProcessStat.h (90 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 <sys/param.h>
#include <sys/types.h>
#include <string>
#include <istream>
#include <algorithm>
#include <utility>
#include <optional>
#include "SystemClockDuration.h"
namespace org::apache::nifi::minifi::extensions::procfs {
class ProcessStatData {
private:
ProcessStatData() = default;
public:
static std::optional<ProcessStatData> parseProcessStatFile(std::istream& stat_file);
[[nodiscard]] pid_t getPid() const noexcept { return pid_; }
[[nodiscard]] const std::string& getComm() const noexcept { return comm_; }
[[nodiscard]] SystemClockDuration getUtime() const noexcept { return utime_; }
[[nodiscard]] SystemClockDuration getStime() const noexcept { return stime_; }
[[nodiscard]] uint64_t getRss() const noexcept { return rss_; }
private:
pid_t pid_ = -1; // (1) The process ID.
std::string comm_ = ""; // (2) The filename of the executable, in parentheses. This is visible whether or not the executable is swapped out.
char state_ = 'R'; // (3) One character indicating the process state
pid_t ppid_ = -1; // (4) The PID of the parent.
pid_t pgrp_ = -1; // (5) The process group ID of the process.
int32_t session_ = 0; // (6) The session ID of the process.
int32_t tty_nr_ = 0; // (7) The controlling terminal of the process.
pid_t tpgid_ = -1; // (8) The ID of the foreground process group of the controlling terminal of the process.
uint32_t flags_ = 0; // (9) The kernel flags word of the process.
uint64_t minflt_ = 0; // (10) The number of minor faults the process has made which have not required loading a memory page from disk.
uint64_t cminflt_ = 0; // (11) The number of minor faults that the process's waited-for children have made.
uint64_t majflt_ = 0; // (12) The number of major faults the process has made which have required loading a memory page from disk.
uint64_t cmajflt_ = 0; // (13) The number of major faults that the process's waited-for children have made.
SystemClockDuration utime_ {0}; // (14) Amount of time that this process has been scheduled in user mode, measured in clock ticks.
SystemClockDuration stime_ {0}; // (15) Amount of time that this process has been scheduled in kernel mode, measured in clock ticks.
SystemClockDuration cutime_ {0}; // (16) Amount of time that this process's waited-for children have been scheduled in user mode, measured in clock ticks.
SystemClockDuration cstime_ {0}; // (17) Amount of time that this process's waited-for children have been scheduled in kernel mode, measured in clock ticks.
int32_t priority_ = 0; // (18) Priority
int32_t nice_ = 0; // (19) The nice value.
int32_t num_threads_ = 0; // (20) Number of threads in this process
int32_t itrealvalue_ = 0; // (21) The time in jiffies before the next SIGALRM is sent to the process due to an interval timer.
uint64_t starttime_ = 0; // (22) The time the process started after system boot.
uint64_t vsize_ = 0; // (23) Virtual memory size in bytes.
int32_t rss_ = 0; // (24) Resident Set Size: number of pages the process has in real memory.
uint64_t rsslim_ = 0; // (25) Current soft limit in bytes on the rss of the process.
uint64_t startcode_ = 0; // (26) The address above which program text can run.
uint64_t endcode_ = 0; // (27) The address below which program text can run.
uint64_t startstack_ = 0; // (28) The address of the start (i.e., bottom) of the stack.
uint64_t kstkesp_ = 0; // (29) The current value of ESP (stack pointer), as found in the kernel stack page for the process.
uint64_t kstkeip_ = 0; // (30) The current EIP (instruction pointer).
uint64_t signal_ = 0; // (31) The bitmap of pending signals, displayed as a decimal number.
uint64_t blocked_ = 0; // (32) The bitmap of blocked signals, displayed as a decimal number.
uint64_t sigignore_ = 0; // (33) The bitmap of ignored signals, displayed as a decimal number.
uint64_t sigcatch_ = 0; // (34) The bitmap of caught signals, displayed as a decimal number.
uint64_t wchan_ = 0; // (35) This is the "channel" in which the process is waiting.
uint64_t nswap_ = 0; // (36) Number of pages swapped (not maintained).
uint64_t cnswap_ = 0; // (37) Cumulative nswap for child processes (not maintained).
int32_t exit_signal_ = 0; // (38) Signal to be sent to parent when we die.
int32_t processor_ = 0; // (39) CPU number last executed on.
uint32_t rt_priority_ = 0; // (40) Real-time scheduling priority, a number in the range 1-99 for processes scheduled under a realtime policy, (0 for non-real-time processes)
uint32_t policy_ = 0; // (41) Scheduling policy
SystemClockDuration delayacct_blkio_ticks_{0}; // (42) Aggregated block I/O delays, measured in clock ticks (centiseconds).
SystemClockDuration guest_time_ {0}; // (43) Guest time of the process (time spent running a virtual CPU for a guest operating system), measured in clock ticks
SystemClockDuration cguest_time_ {0}; // (44) Guest time of the process's children, measured in clock ticks
uint64_t start_data_ = 0; // (45) Address above which program initialized and uninitialized (BSS) data are placed.
uint64_t end_data_ = 0; // (46) Address below which program initialized and uninitialized (BSS) data are placed.
uint64_t start_brk_ = 0; // (47) Address above which program heap can be expanded with brk(2).
uint64_t arg_start_ = 0; // (48) Address above which program command-line arguments (argv) are placed
uint64_t arg_end_ = 0; // (49) Address below program command-line arguments (argv) are placed.
uint64_t env_start_ = 0; // (50) Address above which program environment is placed.
uint64_t env_end_ = 0; // (51) Address below which program environment is placed.
int32_t exit_code_ = 0; // (52) The thread's exit status in the form reported by waitpid(2).
};
class ProcessStat {
public:
explicit ProcessStat(const ProcessStatData& data, uint64_t page_size)
: comm_(data.getComm()),
memory_(data.getRss()*page_size),
cpu_time_(data.getUtime() + data.getStime()) {
}
[[nodiscard]] const std::string& getComm() const noexcept { return comm_; }
[[nodiscard]] uint64_t getMemory() const noexcept { return memory_; }
[[nodiscard]] SystemClockDuration getCpuTime() const noexcept { return cpu_time_; }
protected:
std::string comm_;
uint64_t memory_;
SystemClockDuration cpu_time_;
};
} // namespace org::apache::nifi::minifi::extensions::procfs