diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-08-14 11:17:16 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-08-14 11:18:18 +0100 |
| commit | 0fa103385bba4f18939f77accd725efd4833d9f2 (patch) | |
| tree | 28ffe34f041f41332e2a1e7fa763e8dcc28dc437 | |
| parent | eb370b3058dacc1b21ee8f576af5d6189670673e (diff) | |
Partial work on gathering details of job events.
| -rw-r--r-- | src/lib/analytics.cc | 63 | ||||
| -rw-r--r-- | src/lib/analytics.h | 23 | ||||
| -rw-r--r-- | src/lib/job.cc | 3 | ||||
| -rw-r--r-- | src/lib/transcode_job.cc | 5 |
4 files changed, 80 insertions, 14 deletions
diff --git a/src/lib/analytics.cc b/src/lib/analytics.cc index a4582d7ef..59abfba02 100644 --- a/src/lib/analytics.cc +++ b/src/lib/analytics.cc @@ -35,19 +35,64 @@ using boost::algorithm::trim; Analytics* Analytics::_instance; int const Analytics::_current_version = 1; +Event::Event (cxml::ConstNodePtr node) +{ + _time.tv_sec = node->number_child<int64_t>("Time"); + _time.tv_usec = 0; + BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children()) { + set(i->name(), i->content()); + } +} + +void +Event::set (string k, string v) +{ + _data[k] = v; +} + +void +Event::as_xml (cxml::NodePtr parent) +{ + /* It would be nice if this had timezone */ + parent->add_child("Time")->add_child_text(raw_convert<int64_t>(_time.tv_sec)); + for (map<string, string>::const_iterator i = _data.begin(); i != _data.end(); ++i) { + parent->add_child(i->first)->add_child_text(i->second); + } +} + Analytics::Analytics () - : _successful_dcp_encodes (0) { } +int +Analytics::successful_dcp_encodes () const +{ + boost::mutex::scoped_lock lm (_mutex); + BOOST_FOREACH (Event e, _events) { + cout << e.dump() << "\n"; + } +} + void -Analytics::successful_dcp_encode () +Analytics::job_state_changed (shared_ptr<Job> job) { - ++_successful_dcp_encodes; + Event ev; + ev.set ("type", "job-state"); + ev.set ("json_name", job->json_name()); + ev.set ("sub_name", job->sub_name()); + ev.set ("error-summary", job->error_summary()); + ev.set ("error-details", job->error_details()); + ev.set ("status", job->json_status()); + + { + boost::mutex::scoped_lock lm (_mutex); + _events.push_back (ev); + } + write (); - if (_successful_dcp_encodes == 3) { + if (successful_dcp_encodes() == 3) { emit ( boost::bind( boost::ref(Message), @@ -84,7 +129,10 @@ Analytics::write () const xmlpp::Element* root = doc.create_root_node ("Analytics"); root->add_child("Version")->add_child_text(raw_convert<string>(_current_version)); - root->add_child("SuccessfulDCPEncodes")->add_child_text(raw_convert<string>(_successful_dcp_encodes)); + boost::mutex::scoped_lock lm (_mutex); + BOOST_FOREACH (Event e, _events) { + e.as_xml (root->add_child("Event")); + } try { doc.write_to_file_formatted(path("analytics.xml").string()); @@ -101,7 +149,10 @@ try { cxml::Document f ("Analytics"); f.read_file (path("analytics.xml")); - _successful_dcp_encodes = f.number_child<int>("SuccessfulDCPEncodes"); + boost::mutex::scoped_lock lm (_mutex); + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("Event")) { + _events.push_back (Event(i)); + } } catch (...) { /* Never mind */ } diff --git a/src/lib/analytics.h b/src/lib/analytics.h index 302a41a6e..f4cafe986 100644 --- a/src/lib/analytics.h +++ b/src/lib/analytics.h @@ -22,12 +22,28 @@ #include "signaller.h" #include <boost/signals2.hpp> +class Event +{ +public: + Event (); + Event (cxml::ConstNodePtr node); + + void set (std::string k, std::string v); + + void as_xml (cxml::NodePtr parent) const; + std::string dump () const; + +private: + struct timeval _time; + std::map<std::string k, std::string v) _data; +}; + class Analytics : public State, public Signaller { public: Analytics (); - void successful_dcp_encode (); + void job_state_changed (boost::shared_ptr<Job> job); void write () const; void read (); @@ -37,8 +53,9 @@ public: static Analytics* instance (); private: - int _successful_dcp_encodes; - + /** Mutex to protect _events */ + boost::mutex _mutex; + std::list<Event> _events; static Analytics* _instance; static int const _current_version; }; diff --git a/src/lib/job.cc b/src/lib/job.cc index 06416d1fe..d8914406f 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -286,11 +286,14 @@ Job::set_state (State s) finished = true; _sub_name.clear (); } + } if (finished) { emit (boost::bind (boost::ref (Finished))); } + + Analytics::instance()->job_state_changed (this); } /** @return DCPTime (in seconds) that this sub-job has been running */ diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc index 23f30991e..a066e53ee 100644 --- a/src/lib/transcode_job.cc +++ b/src/lib/transcode_job.cc @@ -23,7 +23,6 @@ */ #include "transcode_job.h" -#include "analytics.h" #include "dcp_encoder.h" #include "upload_job.h" #include "job_manager.h" @@ -95,10 +94,6 @@ TranscodeJob::run () LOG_GENERAL (N_("Transcode job completed successfully: %1 fps"), fps); - if (dynamic_pointer_cast<DCPEncoder>(_encoder)) { - Analytics::instance()->successful_dcp_encode(); - } - _encoder.reset (); /* XXX: this shouldn't be here */ |
