Packages

Prometheus.io process collector Collector exports the current state of process metrics including cpu, memory, file descriptor usage and native threads count as well as the process start and up times.

Retired package: Release invalid - breaks rebar3 compatibility

Current section

Files

Jump to
prometheus_process_collector c_src prometheus_process_info_linux.cc
Raw

c_src/prometheus_process_info_linux.cc

#include "prometheus_process_info.h"
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
namespace Prometheus
{
static long pagesize(void)
{
auto ret = sysconf(_SC_PAGESIZE);
if (ret == -1)
{
throw ProcessInfoException();
}
else
{
return ret;
}
}
static long clk_tck()
{
long result = sysconf(_SC_CLK_TCK);
if (result == -1 || result == 0)
{
throw ProcessInfoException();
}
return result;
}
static long system_boot_time()
{
std::ifstream file("/proc/stat");
std::string line;
long boot_time;
while (std::getline(file, line) &&
!sscanf(line.c_str(), "btime %ld", &boot_time))
{
}
return boot_time;
}
static std::vector<std::string> read_proc_stat(pid_t pid)
{
static char stat_path[32];
std::sprintf(stat_path, "/proc/%d/stat", pid);
std::ifstream file(stat_path);
std::string line;
std::getline(file, line);
std::istringstream ils(line);
return std::vector<std::string>{std::istream_iterator<std::string>{ils},
std::istream_iterator<std::string>{}};
}
static unsigned long get_process_stat(int index, const std::vector<std::string> &stat)
{
return std::stoul(stat[index]);
}
int ProcessInfo::get_fds_total()
{
static char fd_path[32];
std::sprintf(fd_path, "/proc/%d/fd", pid);
DIR *dirp = opendir(fd_path);
if (dirp == NULL)
{
throw ProcessInfoException();
}
int file_total = 0;
struct dirent *entry;
while ((entry = readdir(dirp)) != NULL)
{
if (entry->d_type == DT_LNK)
{
file_total++;
}
}
closedir(dirp);
return file_total;
}
void ProcessInfo::set_proc_stat()
{
long ticks = clk_tck();
long boot_time = system_boot_time();
const auto &stat = read_proc_stat(pid);
start_time_seconds = get_process_stat(21, stat) / ticks + boot_time;
uptime_seconds = now - start_time_seconds;
threads_total = get_process_stat(19, stat);
vm_bytes = get_process_stat(22, stat);
rm_bytes = get_process_stat(23, stat) * pagesize();
}
}