about summary refs log tree commit diff
path: root/meminfo.c
diff options
context:
space:
mode:
authorHeikki Kallasjoki <fis@zem.fi>2018-11-17 02:52:19 +0000
committerHeikki Kallasjoki <fis@zem.fi>2018-11-30 01:28:01 +0000
commit9784d8743daf4eb4d298c15ae6d3c8fa19faf486 (patch)
tree3403741fc244bef20d991f89f6676f1eab1438b3 /meminfo.c
parent5ed9c0224214147e9e8321e491d7b4556b818e49 (diff)
downloadnano-exporter-9784d8743daf4eb4d298c15ae6d3c8fa19faf486.tar.gz
nano-exporter-9784d8743daf4eb4d298c15ae6d3c8fa19faf486.tar.xz
nano-exporter-9784d8743daf4eb4d298c15ae6d3c8fa19faf486.zip
Add the meminfo collector.
Diffstat (limited to 'meminfo.c')
-rw-r--r--meminfo.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/meminfo.c b/meminfo.c
new file mode 100644
index 0000000..982400a
--- /dev/null
+++ b/meminfo.c
@@ -0,0 +1,76 @@
+#define _POSIX_C_SOURCE 200809L
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "meminfo.h"
+#include "util.h"
+
+// size of input buffer for paths and lines
+#define BUF_SIZE 256
+
+// prefix to add to /proc/meminfo lines; must fit in BUF_SIZE
+#define METRIC_PREFIX "node_memory_"
+#define METRIC_PREFIX_LEN (sizeof METRIC_PREFIX - 1)
+
+// suffix to add for " kB" metrics
+#define BYTES_SUFFIX "_bytes"
+#define BYTES_SUFFIX_LEN (sizeof BYTES_SUFFIX - 1)
+
+static void meminfo_collect(scrape_req *req, void *ctx);
+
+const struct collector meminfo_collector = {
+  .name = "meminfo",
+  .collect = meminfo_collect,
+};
+
+static void meminfo_collect(scrape_req *req, void *ctx) {
+  // buffers
+
+  char buf[BUF_SIZE] = METRIC_PREFIX;
+
+  FILE *f;
+
+  // convert /proc/meminfo to metrics format
+
+  f = fopen("/proc/meminfo", "r");
+  if (!f)
+    return;
+
+  while (fgets_line(buf + METRIC_PREFIX_LEN, sizeof buf - METRIC_PREFIX_LEN, f)) {
+    char *p = buf + METRIC_PREFIX_LEN;
+    while (*p != '\0' && *p != ':') {
+      if (!isalnum((unsigned char)*p))
+        *p = '_';
+      p++;
+    }
+    if (*p != ':')
+      continue;
+    char *metric_end = p;
+
+    while (metric_end > buf + METRIC_PREFIX_LEN && metric_end[-1] == '_')
+      --metric_end;
+    *metric_end = '\0';
+
+    do p++; while (*p == ' ');
+
+    double value = strtod(p, &p);
+    if (*p != '\0' && *p != ' ')
+      continue;
+
+    if (*p == ' ') {
+      do p++; while (*p == ' ');
+      if (p[0] == 'k' && p[1] == 'B') {
+        if ((metric_end - buf) + BYTES_SUFFIX_LEN >= sizeof buf)
+          continue;
+        strcpy(metric_end, BYTES_SUFFIX);
+        value *= 1024.0;
+      }
+    }
+
+    scrape_write(req, buf, 0, value);
+  }
+
+  fclose(f);
+}