* [PATCH 0/1] Error reporting tool
@ 2014-02-13 15:28 Andreea Proca
2014-02-13 15:28 ` [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur Andreea Proca
2014-02-14 11:50 ` [PATCH 0/1] Error reporting tool David Nyström
0 siblings, 2 replies; 4+ messages in thread
From: Andreea Proca @ 2014-02-13 15:28 UTC (permalink / raw)
To: openembedded-core
Hello,
This patch together with the web app from git://git.yoctoproject.org/error-report-web
form an error reporting system similar to kernel-oops service.
This tool proposes a way of keeping track of the errors appeared during builds
by dumping the debug information of the build into a database which can be analyzed.
The data collected consists of the log file of the tasks that failed and common configuration variables
(such as machine, distro, host distro, etc as well as the version of the build system - branch/commit id, which
is commonly missing from bug reports :) ).
The project will benefit from the multitude of build results published by quickly identifying the issues and the areas of interest for the contributors.
The objectives of the application were achieved by creating a client-server system. The client (basically this bitbake class) collects all the information needed
for solving the errors and the server receives that data and saves in a database (see the Django web app at git://git.yoctoproject.org/error-report-web).
All the debug information collected during a build which failed is stored on the user's machine, in a JSON format and its path is displayed
in the output of the build as well as the command that the contributor can run a script to send the error report file to the server. The
script will give the user a link corresponding to his entry in the database. The scripts accepts a parameter which is the hostname
to the web app instance (by default it's localhost).
Contributors can search by certain configurations (e.g. machine, component, error, task) and see statistics through the web interface.
Thanks,
Andreea
The following changes since commit abf22bed20870e6283853674a51a39f44af93936:
Revert "nss: avoid to use the hardcode kernel version" (2014-02-13 12:06:01 +0000)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib andreeap/report-poky
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=andreeap/report-poky
Andreea Proca (1):
report-error.bbclass: new class to save build information when errors
occur
meta/classes/report-error.bbclass | 67 +++++++++++++++++++++++++++++++
scripts/send-error-report | 78 +++++++++++++++++++++++++++++++++++++
2 files changed, 145 insertions(+)
create mode 100644 meta/classes/report-error.bbclass
create mode 100755 scripts/send-error-report
--
1.7.9.5
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur 2014-02-13 15:28 [PATCH 0/1] Error reporting tool Andreea Proca @ 2014-02-13 15:28 ` Andreea Proca 2014-02-13 23:37 ` Richard Purdie 2014-02-14 11:50 ` [PATCH 0/1] Error reporting tool David Nyström 1 sibling, 1 reply; 4+ messages in thread From: Andreea Proca @ 2014-02-13 15:28 UTC (permalink / raw) To: openembedded-core Class is used to save data about errors after every task that failed. Debug data is saved in json files in ERROR_REPORT_DIR (defaults to tmp/log/error-report). To use this class one has to add INHERIT += "report-error" to local.conf. scripts/send-error-report is a simple script that sends the json file to a HTTP server that collects data (git://git.yoctoproject.org/error-report-web is a Django web interface that can be used to receive and visualize the error reports). The script will give you an URL where you can find your report. Signed-off-by: Andreea Proca <andreea.b.proca@intel.com> --- meta/classes/report-error.bbclass | 67 +++++++++++++++++++++++++++++++ scripts/send-error-report | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 meta/classes/report-error.bbclass create mode 100755 scripts/send-error-report diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass new file mode 100644 index 0000000..149b36c --- /dev/null +++ b/meta/classes/report-error.bbclass @@ -0,0 +1,67 @@ +# +# Collects debug information in order to create error report files. +# +# Copyright (C) 2013 Intel Corporation +# Author: Andreea Brandusa Proca <andreea.b.proca@intel.com> +# +# Licensed under the MIT license, see COPYING.MIT for details + +ERR_REPORT_DIR ?= "${LOG_DIR}/error-report" + +def getdata(e): + logpath = e.data.getVar('ERR_REPORT_DIR', True) + datafile = os.path.join(logpath, "error-report.txt") + f = open(datafile, "r") + data = f.read() + f.close() + return data + +def savedata(e, newdata, file): + import json + logpath = e.data.getVar('ERR_REPORT_DIR', True) + bb.utils.mkdirhier(logpath) + datafile = os.path.join(logpath, file) + f = open(datafile, "w") + json.dump(newdata, f, indent=4, sort_keys=True) + f.close() + return datafile + +python report () { + import os, re, sys, json + + if isinstance(e, bb.event.BuildStarted): + data = {} + machine = e.data.getVar("MACHINE") + data['machine'] = machine + data['build_sys'] = e.data.getVar("BUILD_SYS", True) + data['nativelsb'] = e.data.getVar("NATIVELSBSTRING") + data['distro'] = e.data.getVar("DISTRO") + data['target_sys'] = e.data.getVar("TARGET_SYS", True) + data['failures'] = [] + data['component'] = e.getPkgs()[0] + data['branch_commit'] = base_detect_branch(e.data) + ": " + base_detect_revision(e.data) + savedata(e, data, "error-report.txt") + + elif isinstance(e, bb.build.TaskFailed): + task = e.task + taskdata={} + log = e.data.getVar('BB_LOGFILE', True) + logFile = open(log, 'r') + taskdata['package'] = e.data.expand("${PF}") + taskdata['task'] = task + taskdata['log'] = logFile.read() + logFile.close() + jsondata = json.loads(getdata(e)) + jsondata['failures'].append(taskdata) + savedata(e, jsondata, "error-report.txt") + + elif isinstance(e, bb.event.BuildCompleted): + jsondata = json.loads(getdata(e)) + failures = jsondata['failures'] + if(len(failures) > 0): + filename = "error_report_" + e.data.getVar("BUILDNAME")+".txt" + datafile = savedata(e, jsondata, filename) + bb.note("The errors of this build are stored in: %s. You can send the errors to an upstream server by running: send-error-report %s [server]" % (datafile, datafile)) +} + +addhandler report diff --git a/scripts/send-error-report b/scripts/send-error-report new file mode 100755 index 0000000..0d85776 --- /dev/null +++ b/scripts/send-error-report @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +# Sends an error report (if the report-error class was enabled) to a remote server. +# +# Copyright (C) 2013 Intel Corporation +# Author: Andreea Proca <andreea.b.proca@intel.com> + + + +import httplib, urllib, os, sys, json + + +def sendData(json_file, server): + + if os.path.isfile(json_file): + + home = os.path.expanduser("~") + userfile = os.path.join(home, ".oe-send-error") + if os.path.isfile(userfile): + with open(userfile) as g: + username = g.readline() + email = g.readline() + else: + print("Please enter your name and your email (optionally), they'll be saved in the file you send.") + username = raw_input("Name: ") + email = raw_input("E-mail (not required): ") + if len(username) > 0 and len(username) < 50: + with open(userfile, "w") as g: + g.write(username + "\n") + g.write(email + "\n") + else: + print("Invalid inputs, try again.") + return + + with open(json_file) as f: + data = f.read() + + try: + jsondata = json.loads(data) + jsondata['username'] = username.strip() + jsondata['email'] = email.strip() + data = json.dumps(jsondata, indent=4, sort_keys=True) + except: + print("Invalid json data") + return + + try: + params = urllib.urlencode({'data': data}) + headers = {"Content-type": "application/json"} + conn = httplib.HTTPConnection(server) + conn.request("POST", "/ClientPost/", params, headers) + response = conn.getresponse() + print response.status, response.reason + res = response.read() + if response.status == 200: + print res + else: + print("There was a problem submiting your data") + conn.close() + except: + print("Server connection failed") + + else: + print("No data file found.") + + +if __name__ == '__main__': + print ("\nSends an error report (if the report-error class was enabled) to a remote server.") + if len(sys.argv) < 2: + print("\nThis scripts sends the contents of a file to an upstream server.") + print("\nUsage: send-error-report <error_fileName> [server]") + print("\nIf this is the first when sending a report you'll be asked for your name and optionally your email address.") + print("They will be associated with your report.\n") + + elif len(sys.argv) == 3: + sendData(sys.argv[1], sys.argv[2]) + else: + sendData(sys.argv[1], "localhost:8000") -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur 2014-02-13 15:28 ` [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur Andreea Proca @ 2014-02-13 23:37 ` Richard Purdie 0 siblings, 0 replies; 4+ messages in thread From: Richard Purdie @ 2014-02-13 23:37 UTC (permalink / raw) To: Andreea Proca; +Cc: openembedded-core On Thu, 2014-02-13 at 17:28 +0200, Andreea Proca wrote: > Class is used to save data about errors after every task that failed. > Debug data is saved in json files in ERROR_REPORT_DIR (defaults to tmp/log/error-report). > To use this class one has to add INHERIT += "report-error" to local.conf. > > scripts/send-error-report is a simple script that sends the json file > to a HTTP server that collects data (git://git.yoctoproject.org/error-report-web > is a Django web interface that can be used to receive and visualize > the error reports). The script will give you an URL where you can > find your report. > > Signed-off-by: Andreea Proca <andreea.b.proca@intel.com> > --- > meta/classes/report-error.bbclass | 67 +++++++++++++++++++++++++++++++ > scripts/send-error-report | 78 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 145 insertions(+) > create mode 100644 meta/classes/report-error.bbclass > create mode 100755 scripts/send-error-report > > diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass > new file mode 100644 > index 0000000..149b36c > --- /dev/null > +++ b/meta/classes/report-error.bbclass > @@ -0,0 +1,67 @@ > +# > +# Collects debug information in order to create error report files. > +# > +# Copyright (C) 2013 Intel Corporation > +# Author: Andreea Brandusa Proca <andreea.b.proca@intel.com> > +# > +# Licensed under the MIT license, see COPYING.MIT for details > + > +ERR_REPORT_DIR ?= "${LOG_DIR}/error-report" > + > +def getdata(e): > + logpath = e.data.getVar('ERR_REPORT_DIR', True) > + datafile = os.path.join(logpath, "error-report.txt") > + f = open(datafile, "r") > + data = f.read() > + f.close() > + return data > + > +def savedata(e, newdata, file): > + import json > + logpath = e.data.getVar('ERR_REPORT_DIR', True) > + bb.utils.mkdirhier(logpath) > + datafile = os.path.join(logpath, file) > + f = open(datafile, "w") > + json.dump(newdata, f, indent=4, sort_keys=True) > + f.close() > + return datafile Since these functions will end up in the main namespace, could we prefix them so something like errorreport_getdata and errorreport_savedata? This makes it clearer when you look at the names out of context of this class. > +python report () { > + import os, re, sys, json > + > + if isinstance(e, bb.event.BuildStarted): > + data = {} > + machine = e.data.getVar("MACHINE") > + data['machine'] = machine > + data['build_sys'] = e.data.getVar("BUILD_SYS", True) > + data['nativelsb'] = e.data.getVar("NATIVELSBSTRING") > + data['distro'] = e.data.getVar("DISTRO") > + data['target_sys'] = e.data.getVar("TARGET_SYS", True) > + data['failures'] = [] > + data['component'] = e.getPkgs()[0] > + data['branch_commit'] = base_detect_branch(e.data) + ": " + base_detect_revision(e.data) > + savedata(e, data, "error-report.txt") > + > + elif isinstance(e, bb.build.TaskFailed): > + task = e.task > + taskdata={} > + log = e.data.getVar('BB_LOGFILE', True) > + logFile = open(log, 'r') > + taskdata['package'] = e.data.expand("${PF}") > + taskdata['task'] = task > + taskdata['log'] = logFile.read() > + logFile.close() > + jsondata = json.loads(getdata(e)) > + jsondata['failures'].append(taskdata) > + savedata(e, jsondata, "error-report.txt") > + > + elif isinstance(e, bb.event.BuildCompleted): > + jsondata = json.loads(getdata(e)) > + failures = jsondata['failures'] > + if(len(failures) > 0): > + filename = "error_report_" + e.data.getVar("BUILDNAME")+".txt" > + datafile = savedata(e, jsondata, filename) > + bb.note("The errors of this build are stored in: %s. You can send the errors to an upstream server by running: send-error-report %s [server]" % (datafile, datafile)) > +} > + > +addhandler report Could you name this something like errorreport_handler for the same reason as the functions and add an eventmask: errorreport_handler[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted bb.build.TaskFailed" which means that handler only gets the events it is interested in. I suspect this syntax was added after you started work on this code but it would be nice to add. I'm really looking forward to seeing this in action! Cheers, Richard > diff --git a/scripts/send-error-report b/scripts/send-error-report > new file mode 100755 > index 0000000..0d85776 > --- /dev/null > +++ b/scripts/send-error-report > @@ -0,0 +1,78 @@ > +#!/usr/bin/env python > + > +# Sends an error report (if the report-error class was enabled) to a remote server. > +# > +# Copyright (C) 2013 Intel Corporation > +# Author: Andreea Proca <andreea.b.proca@intel.com> > + > + > + > +import httplib, urllib, os, sys, json > + > + > +def sendData(json_file, server): > + > + if os.path.isfile(json_file): > + > + home = os.path.expanduser("~") > + userfile = os.path.join(home, ".oe-send-error") > + if os.path.isfile(userfile): > + with open(userfile) as g: > + username = g.readline() > + email = g.readline() > + else: > + print("Please enter your name and your email (optionally), they'll be saved in the file you send.") > + username = raw_input("Name: ") > + email = raw_input("E-mail (not required): ") > + if len(username) > 0 and len(username) < 50: > + with open(userfile, "w") as g: > + g.write(username + "\n") > + g.write(email + "\n") > + else: > + print("Invalid inputs, try again.") > + return > + > + with open(json_file) as f: > + data = f.read() > + > + try: > + jsondata = json.loads(data) > + jsondata['username'] = username.strip() > + jsondata['email'] = email.strip() > + data = json.dumps(jsondata, indent=4, sort_keys=True) > + except: > + print("Invalid json data") > + return > + > + try: > + params = urllib.urlencode({'data': data}) > + headers = {"Content-type": "application/json"} > + conn = httplib.HTTPConnection(server) > + conn.request("POST", "/ClientPost/", params, headers) > + response = conn.getresponse() > + print response.status, response.reason > + res = response.read() > + if response.status == 200: > + print res > + else: > + print("There was a problem submiting your data") > + conn.close() > + except: > + print("Server connection failed") > + > + else: > + print("No data file found.") > + > + > +if __name__ == '__main__': > + print ("\nSends an error report (if the report-error class was enabled) to a remote server.") > + if len(sys.argv) < 2: > + print("\nThis scripts sends the contents of a file to an upstream server.") > + print("\nUsage: send-error-report <error_fileName> [server]") > + print("\nIf this is the first when sending a report you'll be asked for your name and optionally your email address.") > + print("They will be associated with your report.\n") > + > + elif len(sys.argv) == 3: > + sendData(sys.argv[1], sys.argv[2]) > + else: > + sendData(sys.argv[1], "localhost:8000") ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 0/1] Error reporting tool 2014-02-13 15:28 [PATCH 0/1] Error reporting tool Andreea Proca 2014-02-13 15:28 ` [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur Andreea Proca @ 2014-02-14 11:50 ` David Nyström 1 sibling, 0 replies; 4+ messages in thread From: David Nyström @ 2014-02-14 11:50 UTC (permalink / raw) To: Andreea Proca, openembedded-core On 2014-02-13 16:28, Andreea Proca wrote: > > Hello, > > This patch together with the web app from git://git.yoctoproject.org/error-report-web > form an error reporting system similar to kernel-oops service. > This tool proposes a way of keeping track of the errors appeared during builds > by dumping the debug information of the build into a database which can be analyzed. > > The data collected consists of the log file of the tasks that failed and common configuration variables > (such as machine, distro, host distro, etc as well as the version of the build system - branch/commit id, which > is commonly missing from bug reports :) ). > The project will benefit from the multitude of build results published by quickly identifying the issues and the areas of interest for the contributors. > The objectives of the application were achieved by creating a client-server system. The client (basically this bitbake class) collects all the information needed > for solving the errors and the server receives that data and saves in a database (see the Django web app at git://git.yoctoproject.org/error-report-web). > > All the debug information collected during a build which failed is stored on the user's machine, in a JSON format and its path is displayed > in the output of the build as well as the command that the contributor can run a script to send the error report file to the server. The > script will give the user a link corresponding to his entry in the database. The scripts accepts a parameter which is the hostname > to the web app instance (by default it's localhost). > Contributors can search by certain configurations (e.g. machine, component, error, task) and see statistics through the web interface. > > > Thanks, > Andreea > +1 Good initiative ! kerneloops-daemon/www.kerneloops.org for bitbake as far as I understand the explanation above. Br, David ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-02-14 11:51 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-02-13 15:28 [PATCH 0/1] Error reporting tool Andreea Proca 2014-02-13 15:28 ` [PATCH 1/1] report-error.bbclass: new class to save build information when errors occur Andreea Proca 2014-02-13 23:37 ` Richard Purdie 2014-02-14 11:50 ` [PATCH 0/1] Error reporting tool David Nyström
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox