Partial work on gathering details of job events.
authorCarl Hetherington <cth@carlh.net>
Tue, 14 Aug 2018 10:17:16 +0000 (11:17 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 14 Aug 2018 10:18:18 +0000 (11:18 +0100)
src/lib/analytics.cc
src/lib/analytics.h
src/lib/job.cc
src/lib/transcode_job.cc

index a4582d7efa32175ba85469d3e8c0ca64fbf690cc..59abfba0249729db45752d99f3749b919cae8e28 100644 (file)
@@ -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 */
 }
index 302a41a6e5db3ec2fe6208b96a7962d8bce95abf..f4cafe9868c8c5bab5f5b888dbe0a5b5292481ca 100644 (file)
 #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;
 };
index 06416d1fe014b3e55a810c7f0dc89392486791bb..d8914406f9733aea943fb82183179f9743168df2 100644 (file)
@@ -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 */
index 23f30991e77787ebc339eec95d785e27c6602bf0..a066e53eead653c98b56cc8e9517d4a229dcbffb 100644 (file)
@@ -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 */