a2f5aa8c9aabf87dc8623b2b9ac99a9023cb84ae
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 **/
20 #include "collectd.h"
22 #include "common.h"
23 #include "plugin.h"
26 static const char *config_keys[] = {
27 "ValuesAbsolute",
28 "ValuesPercentage"
29 };
30 static int config_keys_num = STATIC_ARRAY_SIZE(config_keys);
32 static _Bool values_absolute = 1;
33 static _Bool values_percentage = 0;
36 static int fhcount_config(const char *key, const char *value) {
37 int ret = -1;
39 if (strcasecmp(key, "ValuesAbsolute") == 0) {
40 if (IS_TRUE(value)) {
41 values_absolute = 1;
42 } else {
43 values_absolute = 0;
44 }
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 }
54 ret = 0;
55 }
57 return(ret);
58 }
61 static void fhcount_submit(
62 const char *type, const char *type_instance, gauge_t value) {
63 value_list_t vl = VALUE_LIST_INIT;
65 vl.values = &(value_t) { .gauge = value };
66 vl.values_len = 1;
68 // Compose the metric
69 sstrncpy(vl.host, hostname_g, sizeof(vl.host));
70 sstrncpy(vl.plugin, "fhcount", sizeof(vl.plugin));
71 sstrncpy(vl.type, type, sizeof(vl.type));
72 sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
74 // Dispatch the metric
75 plugin_dispatch_values(&vl);
76 }
78 static int fhcount_read(void) {
79 int numfields = 0;
80 int buffer_len = 60;
81 gauge_t used, unused, max;
82 int prc_used, prc_unused;
83 char *fields[3];
84 char buffer[buffer_len];
85 char errbuf[1024];
86 FILE *fp;
88 // Open file
89 fp = fopen("/proc/sys/fs/file-nr" , "r");
90 if (fp == NULL) {
91 ERROR("fhcount: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
92 return(EXIT_FAILURE);
93 }
94 if (fgets(buffer, buffer_len, fp) == NULL) {
95 ERROR("fhcount: fgets: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
96 fclose(fp);
97 return(EXIT_FAILURE);
98 }
99 fclose(fp);
101 // Tokenize string
102 numfields = strsplit(buffer, fields, STATIC_ARRAY_SIZE(fields));
104 if (numfields != 3) {
105 ERROR("fhcount: Line doesn't contain 3 fields");
106 return(EXIT_FAILURE);
107 }
109 // Define the values
110 strtogauge(fields[0], &used);
111 strtogauge(fields[1], &unused);
112 strtogauge(fields[2], &max);
113 prc_used = (gauge_t) used/max*100;
114 prc_unused = (gauge_t) unused/max*100;
116 // Submit values
117 if (values_absolute) {
118 fhcount_submit("file_handles", "used", (gauge_t) used);
119 fhcount_submit("file_handles", "unused", (gauge_t) unused);
120 fhcount_submit("file_handles", "max", (gauge_t) max);
121 }
122 if (values_percentage) {
123 fhcount_submit("percent", "used", (gauge_t) prc_used);
124 fhcount_submit("percent", "unused", (gauge_t) prc_unused);
125 }
127 return(0);
128 }
131 void module_register(void) {
132 plugin_register_config(
133 "fhcount", fhcount_config, config_keys, config_keys_num);
134 plugin_register_read("fhcount", fhcount_read);
135 }