Add missing kstat definitions
[collectd.git] / src / fhcount.c
1 /**
2  *
3  * collectd - src/fhcount.c
4  * Copyright (c) 2015, Jiri Tyr <jiri.tyr at gmail.com>
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  **/
19
20 #include "collectd.h"
21 #include "common.h"
22 #include "plugin.h"
23 #include "configfile.h"
24
25
26 static const char *config_keys[] = {
27   "ValuesAbsolute",
28   "ValuesPercentage"
29 };
30 static int config_keys_num = STATIC_ARRAY_SIZE(config_keys);
31
32 static _Bool values_absolute = 1;
33 static _Bool values_percentage = 0;
34
35
36 static int fhcount_config(const char *key, const char *value) {
37   int ret = -1;
38
39   if (strcasecmp(key, "ValuesAbsolute") == 0) {
40     if (IS_TRUE(value)) {
41       values_absolute = 1;
42     } else {
43       values_absolute = 0;
44     }
45
46     ret = 0;
47   } else if (strcasecmp(key, "ValuesPercentage") == 0) {
48     if (IS_TRUE(value)) {
49       values_percentage = 1;
50     } else {
51       values_percentage = 0;
52     }
53
54     ret = 0;
55   }
56
57   return(ret);
58 }
59
60
61 static void fhcount_submit(
62     const char *type, const char *type_instance, gauge_t value) {
63
64   value_t values[1];
65   value_list_t vl = VALUE_LIST_INIT;
66
67   values[0].gauge = value;
68
69   vl.values = values;
70   vl.values_len = 1;
71
72   // Compose the metric
73   sstrncpy(vl.host, hostname_g, sizeof(vl.host));
74   sstrncpy(vl.plugin, "fhcount", sizeof(vl.plugin));
75   sstrncpy(vl.type, type, sizeof(vl.type));
76   sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
77
78   // Dispatch the metric
79   plugin_dispatch_values(&vl);
80 }
81
82
83 static int fhcount_read(void) {
84   int numfields = 0;
85   int buffer_len = 60;
86   gauge_t used, unused, max;
87   int prc_used, prc_unused;
88   char *fields[3];
89   char buffer[buffer_len];
90   char errbuf[1024];
91   FILE *fp;
92
93   // Open file
94   fp = fopen("/proc/sys/fs/file-nr" , "r");
95   if (fp == NULL) {
96     ERROR("fhcount: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
97     return(EXIT_FAILURE);
98   }
99   if (fgets(buffer, buffer_len, fp) == NULL) {
100     ERROR("fhcount: fgets: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
101     return(EXIT_FAILURE);
102   }
103   fclose(fp);
104
105   // Tokenize string
106   numfields = strsplit(buffer, fields, STATIC_ARRAY_SIZE(fields));
107
108   if (numfields != 3) {
109     ERROR("fhcount: Line doesn't contain 3 fields");
110     return(EXIT_FAILURE);
111   }
112
113   // Define the values
114   strtogauge(fields[0], &used);
115   strtogauge(fields[1], &unused);
116   strtogauge(fields[2], &max);
117   prc_used = (gauge_t) used/max*100;
118   prc_unused = (gauge_t) unused/max*100;
119
120   // Submit values
121   if (values_absolute) {
122     fhcount_submit("file_handles", "used", (gauge_t) used);
123     fhcount_submit("file_handles", "unused", (gauge_t) unused);
124     fhcount_submit("file_handles", "max", (gauge_t) max);
125   }
126   if (values_percentage) {
127     fhcount_submit("percent", "used", (gauge_t) prc_used);
128     fhcount_submit("percent", "unused", (gauge_t) prc_unused);
129   }
130
131   return(0);
132 }
133
134
135 void module_register(void) {
136   plugin_register_config(
137     "fhcount", fhcount_config, config_keys, config_keys_num);
138   plugin_register_read("fhcount", fhcount_read);
139 }