diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/stats/events.cc | 121 | ||||
-rw-r--r-- | base/stats/events.hh | 2 |
2 files changed, 108 insertions, 15 deletions
diff --git a/base/stats/events.cc b/base/stats/events.cc index b579981e9..ed25e2423 100644 --- a/base/stats/events.cc +++ b/base/stats/events.cc @@ -26,6 +26,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <vector> + #ifdef USE_MYSQL #include "base/cprintf.hh" #include "base/misc.hh" @@ -33,9 +35,9 @@ #include "base/stats/events.hh" #include "base/stats/mysql.hh" #include "base/stats/mysql_run.hh" -#include "base/str.hh" #endif +#include "base/str.hh" #include "sim/host.hh" #include "sim/universe.hh" @@ -45,20 +47,80 @@ namespace Stats { Tick EventStart = ULL(0xffffffffffffffff); +vector<string> event_ignore; +vector<vector<string> > ignore_tokens; +vector<int> ignore_size; +int event_ignore_size; + +bool +ignoreEvent(const string &name) +{ + vector<string> name_tokens; + tokenize(name_tokens, name, '.'); + int ntsize = name_tokens.size(); + + for (int i = 0; i < event_ignore_size; ++i) { + bool match = true; + int jstop = ignore_size[i]; + for (int j = 0; j < jstop; ++j) { + if (j >= ntsize) + break; + + const string &ignore = ignore_tokens[i][j]; + if (ignore != "*" && ignore != name_tokens[j]) { + match = false; + break; + } + } + + if (match == true) + return true; + } + + return false; +} + #ifdef USE_MYSQL -typedef map<string, uint32_t> event_map_t; -event_map_t event_map; +class InsertEvent +{ + private: + char *query; + int size; + bool first; + static const int maxsize = 1024*1024; + + typedef map<string, uint32_t> event_map_t; + event_map_t events; + + MySQL::Connection &mysql; + uint16_t run; + + public: + InsertEvent() + : mysql(MySqlDB.conn()), run(MySqlDB.run()) + { + query = new char[maxsize + 1]; + size = 0; + first = true; + flush(); + } + ~InsertEvent() + { + flush(); + } + + void flush(); + void insert(const string &stat); +}; void -__event(const string &stat) +InsertEvent::insert(const string &stat) { - MySQL::Connection &mysql = MySqlDB.conn(); - uint16_t run = MySqlDB.run(); assert(mysql.connected()); - event_map_t::iterator i = event_map.find(stat); + event_map_t::iterator i = events.find(stat); uint32_t event; - if (i == event_map.end()) { + if (i == events.end()) { mysql.query( csprintf("SELECT en_id " "from event_names " @@ -90,16 +152,45 @@ __event(const string &stat) event = (*i).second; } - mysql.query( - csprintf("INSERT INTO " - "events(ev_event, ev_run, ev_tick)" - "values(%d, %d, %d)", - event, run, curTick)); + if (size + 1024 > maxsize) + flush(); + + if (!first) { + query[size++] = ','; + query[size] = '\0'; + } - if (mysql.error) - panic("could not get a run\n%s\n", mysql.error); + first = false; + size += sprintf(query + size, "(%u,%u,%llu)", + event, run, curTick); } + +void +InsertEvent::flush() +{ + if (size) { + MySQL::Connection &mysql = MySqlDB.conn(); + assert(mysql.connected()); + mysql.query(query); + } + + query[0] = '\0'; + size = 0; + first = true; + strcpy(query, "INSERT INTO " + "events(ev_event, ev_run, ev_tick)" + "values"); + size = strlen(query); +} + +void +__event(const string &stat) +{ + static InsertEvent event; + event.insert(stat); +} + #endif /* namespace Stats */ } diff --git a/base/stats/events.hh b/base/stats/events.hh index 49c060645..3a7d85644 100644 --- a/base/stats/events.hh +++ b/base/stats/events.hh @@ -42,6 +42,8 @@ void __event(const std::string &stat); bool MySqlConnected(); #endif +bool ignoreEvent(const std::string &name); + inline void recordEvent(const std::string &stat) { |