Added mongo::client::initialize() call and default value support to emperor_mongodb monitor

This commit is contained in:
Евгений Протозанов
2015-05-21 00:17:00 +04:00
parent 9f696030a2
commit 3119a0ad77
2 changed files with 46 additions and 22 deletions
+44 -22
View File
@@ -2,6 +2,8 @@
#include "client/dbclient.h"
#include <vector>
extern struct uwsgi_server uwsgi;
extern struct uwsgi_instance *ui;
@@ -10,6 +12,7 @@ struct uwsgi_emperor_mongodb_state {
char *address;
char *collection;
char *json;
char *defaults;
char *database;
char *username;
char *password;
@@ -25,7 +28,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
// requested fields
mongo::BSONObjBuilder builder;
builder.appendElements(BSON("name" << 1 << "config" << 1 << "ts" << 1 << "uid" << 1 << "gid" << 1 << "socket" << 1 ));
builder.appendElements(BSON("name" << 1 << "config" << 1 << "ts" << 1 << "uid" << 1 << "gid" << 1 << "socket" << 1 ));
struct uwsgi_string_list *e_attrs = uwsgi.emperor_collect_attributes;
while(e_attrs) {
builder.appendElements(BSON(e_attrs->value << 1));
@@ -33,6 +36,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
}
mongo::BSONObj p = builder.obj();
mongo::BSONObj q = mongo::fromjson(uems->json);
mongo::BSONObj d = mongo::fromjson(uems->defaults);
// the connection object (will be automatically destroyed at each cycle)
mongo::DBClientConnection c;
// set the socket timeout
@@ -51,7 +55,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
// run the query
std::auto_ptr<mongo::DBClientCursor> cursor = c.query(uems->collection, q, 0, 0, &p);
while(cursor.get() && cursor->more() ) {
mongo::BSONObj p = cursor->next();
mongo::BSONObj p = cursor->next();
// checking for an empty string is not required, but we reduce the load
// in case of badly strctured databases
@@ -88,7 +92,24 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
while(e_attrs) {
const char *attr_value = p.getStringField(e_attrs->value);
if (strlen(attr_value) == 0) attr_value = NULL;
if (attr_value) {
if (!attr_value) {
mongo::BSONElement tmp = d.getField(e_attrs->value);
if (tmp.type() == mongo::Array) {
std::vector< mongo::BSONElement > v = tmp.Array();
for(std::vector< mongo::BSONElement >::size_type i = 0; i != v.size(); i++) {
char *value = uwsgi_str((char *)v[i].valuestr());
uwsgi_dyn_dict_new(&attrs, e_attrs->value, e_attrs->len, value, strlen(value));
}
}
else if(tmp.type() == mongo::String){
char *value = uwsgi_str((char *)tmp.valuestr());
uwsgi_dyn_dict_new(&attrs, e_attrs->value, e_attrs->len, value, strlen(value));
}
}
else {
// the value memory is always reallocated
char *value = uwsgi_str((char *)attr_value);
uwsgi_dyn_dict_new(&attrs, e_attrs->value, e_attrs->len, value, strlen(value));
@@ -107,10 +128,10 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
// now check for removed instances
struct uwsgi_instance *c_ui = ui->ui_next;
struct uwsgi_instance *c_ui = ui->ui_next;
while (c_ui) {
if (c_ui->scanner == ues) {
while (c_ui) {
if (c_ui->scanner == ues) {
mongo::BSONObjBuilder b;
b.appendElements(q);
b.append("name", c_ui->name);
@@ -121,11 +142,11 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
uwsgi_log("JSON: %s\n", q2.toString().c_str());
#endif
if (!cursor->more()) {
emperor_stop(c_ui);
emperor_stop(c_ui);
}
}
c_ui = c_ui->ui_next;
}
}
c_ui = c_ui->ui_next;
}
}
@@ -139,7 +160,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb(struct uwsgi_emperor_scanner *ues
extern "C" void uwsgi_imperial_monitor_mongodb_init(struct uwsgi_emperor_scanner *ues) {
// allocate a new state
ues->data = uwsgi_calloc(sizeof(struct uwsgi_emperor_mongodb_state));
ues->data = uwsgi_calloc(sizeof(struct uwsgi_emperor_mongodb_state));
size_t arg_len = strlen(ues->arg);
struct uwsgi_emperor_mongodb_state *uems = (struct uwsgi_emperor_mongodb_state *) ues->data;
@@ -164,18 +185,18 @@ done:
// setup a new mongodb imperial monitor (keyval based)
extern "C" void uwsgi_imperial_monitor_mongodb_init2(struct uwsgi_emperor_scanner *ues) {
mongo::client::initialize();
// allocate a new state
ues->data = uwsgi_calloc(sizeof(struct uwsgi_emperor_mongodb_state));
size_t arg_len = strlen(ues->arg);
struct uwsgi_emperor_mongodb_state *uems = (struct uwsgi_emperor_mongodb_state *) ues->data;
// allocate a new state
ues->data = uwsgi_calloc(sizeof(struct uwsgi_emperor_mongodb_state));
size_t arg_len = strlen(ues->arg);
struct uwsgi_emperor_mongodb_state *uems = (struct uwsgi_emperor_mongodb_state *) ues->data;
// parse args/ set defaults
uems->address = (char *) "127.0.0.1:27017";
uems->collection = (char *) "uwsgi.emperor.vassals";
uems->json = (char *) "";
// parse args/ set defaults
uems->address = (char *) "127.0.0.1:27017";
uems->collection = (char *) "uwsgi.emperor.vassals";
uems->json = (char *) "";
char *args = NULL;
if (arg_len <= 11) goto done;
if (arg_len <= 11) goto done;
args = ues->arg+11;
if (uwsgi_kvlist_parse(args, strlen(args), ',', '=',
"addr", &uems->address,
@@ -184,6 +205,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb_init2(struct uwsgi_emperor_scanne
"collection", &uems->collection,
"coll", &uems->collection,
"json", &uems->json,
"defaults", &uems->defaults,
"database", &uems->database,
"db", &uems->database,
"username", &uems->username,
@@ -195,7 +217,7 @@ extern "C" void uwsgi_imperial_monitor_mongodb_init2(struct uwsgi_emperor_scanne
exit(1);
}
done:
uwsgi_log("[emperor] enabled emperor MongoDB monitor for %s on collection %s\n", uems->address, uems->collection);
uwsgi_log("[emperor] enabled emperor MongoDB monitor for %s on collection %s\n", uems->address, uems->collection);
}
+2
View File
@@ -13,5 +13,7 @@ if 'UWSGI_MONGODB_NOLIB' not in os.environ:
LIBS.append('-lmongoclient')
LIBS.append('-lboost_thread')
LIBS.append('-lboost_filesystem')
LIBS.append('-lboost_regex')
GCC_LIST = ['plugin', 'emperor_mongodb.cc']