23 #include "rrd_thread.h"
25 #include <core/exceptions/system.h>
26 #include <core/threading/scoped_rwlock.h>
27 #include <utils/misc/string_conversions.h>
28 #include <utils/system/file.h>
35 using namespace fawkes;
50 __rrd_aspect_inifin(this)
65 __cfg_graph_interval = 30.;
67 __cfg_graph_interval =
config->
get_float(
"/plugins/rrd/graph_interval");
95 std::vector<fawkes::RRDGraphDefinition *>::iterator g;
96 for (g = __graphs.begin(); g != __graphs.end(); ++g) {
98 const char **argv = (*g)->get_argv(argc);
106 rrd_info_t *i = rrd_graph_v(argc, (
char **)argv);
108 throw Exception(
"Creating graph %s (for RRD %s) failed: %s",
109 (*g)->get_name(), (*g)->get_rrd_def()->get_name(),
121 if (asprintf(&filename,
"%s/%s.rrd",
".", rrd_def->
get_name()) == -1) {
129 std::string size_s = StringConversions::to_string(rrd_def->
get_step_sec());
133 size_t rrd_argc = 6 + rrd_def->
get_ds().size() + rrd_def->
get_rra().size();
134 const char *rrd_argv[rrd_argc];
136 rrd_argv[i++] =
"create";
138 rrd_argv[i++] =
"--step";
139 rrd_argv[i++] = size_s.c_str();
140 rrd_argv[i++] =
"--start";
143 std::vector<RRDDataSource>::const_iterator d;
144 for (d = rrd_def->
get_ds().begin();
145 d != rrd_def->
get_ds().end() && i < rrd_argc;
148 rrd_argv[i++] = d->to_string();
151 std::vector<RRDArchive>::const_iterator a;
152 for (a = rrd_def->
get_rra().begin();
153 a != rrd_def->
get_rra().end() && i < rrd_argc;
156 rrd_argv[i++] = a->to_string();
166 if (rrd_create(i, (
char **)rrd_argv) == -1) {
167 throw Exception(
"Creating RRD %s failed: %s",
168 rrd_def->
get_name(), rrd_get_error());
174 for (r = __rrds.begin(); r != __rrds.end(); ++r) {
175 if (strcmp((*r)->get_name(), rrd_def->
get_name()) == 0) {
176 throw Exception(
"RRD with name %s has already been registered",
182 __rrds.push_back(rrd_def);
190 for (r = __rrds.begin(); r != __rrds.end(); ++r) {
191 if (strcmp((*r)->get_name(), rrd_def->
get_name()) == 0) {
198 bool graphs_modified =
false;
200 graphs_modified =
false;
202 for (g = __graphs.begin(); g != __graphs.end(); ++g) {
203 if (strcmp((*g)->get_rrd_def()->get_name(), rrd_def->
get_name()) == 0) {
205 graphs_modified =
true;
209 }
while (graphs_modified);
217 if (asprintf(&filename,
"%s/%s.png",
".",
227 for (g = __graphs.begin(); g != __graphs.end(); ++g) {
228 if (strcmp((*g)->get_name(), rrd_graph_def->
get_name()) == 0) {
229 throw Exception(
"RRD graph with name %s has already been registered",
233 __graphs.push_back(rrd_graph_def);
241 std::vector<RRDDefinition *>::const_iterator d;
242 for (d = __rrds.begin(); d != __rrds.end(); ++d) {
244 if (strcmp(rrd_name, rrd_def->
get_name()) == 0) {
247 va_start(arg, format);
248 if (vasprintf(&data, format, arg) == -1) {
257 const char *rrd_argv[rrd_argc];
259 rrd_argv[i++] =
"update";
261 rrd_argv[i++] = data;
269 if (rrd_update(i, (
char **)rrd_argv) == -1) {
271 throw Exception(
"Failed to update RRD %s: %s", rrd_name, rrd_get_error());
279 throw Exception(
"No RRD named %s registered", rrd_name);