summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-08-14 11:17:16 +0100
committerCarl Hetherington <cth@carlh.net>2018-08-14 11:18:18 +0100
commit0fa103385bba4f18939f77accd725efd4833d9f2 (patch)
tree28ffe34f041f41332e2a1e7fa763e8dcc28dc437
parenteb370b3058dacc1b21ee8f576af5d6189670673e (diff)
Partial work on gathering details of job events.
-rw-r--r--src/lib/analytics.cc63
-rw-r--r--src/lib/analytics.h23
-rw-r--r--src/lib/job.cc3
-rw-r--r--src/lib/transcode_job.cc5
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 */