// retoor #include "stats_collector.h" #include #include #include #include static long long g_prev_user = 0; static long long g_prev_nice = 0; static long long g_prev_system = 0; static long long g_prev_idle = 0; double stats_get_cpu_usage(void) { long long user, nice, system, idle, iowait, irq, softirq; FILE *f = fopen("/proc/stat", "r"); if (!f) return 0.0; if (fscanf(f, "cpu %lld %lld %lld %lld %lld %lld %lld", &user, &nice, &system, &idle, &iowait, &irq, &softirq) != 7) { fclose(f); return 0.0; } fclose(f); long long prev_total = g_prev_user + g_prev_nice + g_prev_system + g_prev_idle; long long total = user + nice + system + idle; long long totald = total - prev_total; long long idled = idle - g_prev_idle; g_prev_user = user; g_prev_nice = nice; g_prev_system = system; g_prev_idle = idle; return totald == 0 ? 0.0 : (double)(totald - idled) * 100.0 / totald; } void stats_get_memory_usage(double *used_gb) { struct sysinfo info; if (sysinfo(&info) != 0) { *used_gb = 0; return; } *used_gb = (double)(info.totalram - info.freeram - info.bufferram) * info.mem_unit / (1024.0 * 1024.0 * 1024.0); } void stats_get_network(long long *bytes_sent, long long *bytes_recv) { FILE *f = fopen("/proc/net/dev", "r"); if (!f) { *bytes_sent = 0; *bytes_recv = 0; return; } char line[256]; if (!fgets(line, sizeof(line), f) || !fgets(line, sizeof(line), f)) { fclose(f); *bytes_sent = 0; *bytes_recv = 0; return; } long long total_recv = 0, total_sent = 0; while (fgets(line, sizeof(line), f)) { char iface[32]; long long r, t; if (sscanf(line, "%31[^:]: %lld %*d %*d %*d %*d %*d %*d %*d %lld", iface, &r, &t) == 3) { char *trimmed = iface; while (*trimmed == ' ') trimmed++; if (strcmp(trimmed, "lo") != 0) { total_recv += r; total_sent += t; } } } fclose(f); *bytes_sent = total_sent; *bytes_recv = total_recv; } void stats_get_disk(long long *sectors_read, long long *sectors_written) { FILE *f = fopen("/proc/diskstats", "r"); if (!f) { *sectors_read = 0; *sectors_written = 0; return; } char line[2048]; long long total_read = 0, total_written = 0; while (fgets(line, sizeof(line), f)) { char device[64]; long long sr = 0, sw = 0; char major[16], minor[16], dev[64]; char rc[32], rm[32], srd[32], rtm[32], rtm2[32], wc[32], wm[32], swd[32]; int nfields = sscanf(line, "%15s %15s %63s %31s %31s %31s %31s %31s %31s %31s %31s %31s", major, minor, dev, rc, rm, srd, rtm, rtm2, wc, wm, swd, swd); if (nfields >= 11) { strncpy(device, dev, sizeof(device) - 1); device[sizeof(device) - 1] = '\0'; char *endptr; sr = strtoll(srd, &endptr, 10); if (endptr == srd) sr = 0; sw = strtoll(swd, &endptr, 10); if (endptr == swd) sw = 0; if (strncmp(device, "loop", 4) != 0 && strncmp(device, "ram", 3) != 0) { size_t len = strlen(device); if ((strncmp(device, "sd", 2) == 0 && len == 3) || (strncmp(device, "nvme", 4) == 0 && strstr(device, "n1p") == NULL) || (strncmp(device, "vd", 2) == 0 && len == 3) || (strncmp(device, "hd", 2) == 0 && len == 3)) { total_read += sr; total_written += sw; } } } } fclose(f); *sectors_read = total_read; *sectors_written = total_written; } void stats_get_load_averages(double *load1, double *load5, double *load15) { FILE *f = fopen("/proc/loadavg", "r"); if (!f) { *load1 = *load5 = *load15 = 0.0; return; } if (fscanf(f, "%lf %lf %lf", load1, load5, load15) != 3) { *load1 = *load5 = *load15 = 0.0; } fclose(f); }