Add 'app' and 'data' fields to report API (#6)

This commit is contained in:
Richard van der Hoff 2017-04-11 12:21:30 +01:00 committed by GitHub
parent 3568dc9efa
commit 112158fd47
2 changed files with 25 additions and 9 deletions

View file

@ -40,6 +40,8 @@ The body of the request should be a JSON object with the following fields:
* `user_agent`: Application user-agent. Included in the `details.log.gz` file. * `user_agent`: Application user-agent. Included in the `details.log.gz` file.
* `app`: Identifier for the application (eg 'riot-web').
* `version`: Application version. Included in the `details.log.gz` file. * `version`: Application version. Included in the `details.log.gz` file.
* `logs`: an of log files. Each entry in the list should be an object with the * `logs`: an of log files. Each entry in the list should be an object with the
@ -48,3 +50,7 @@ The body of the request should be a JSON object with the following fields:
* `id`: textual identifier for the logs. Currently ignored. * `id`: textual identifier for the logs. Currently ignored.
* `lines`: log data. Lines should be separated by newline characters (encoded * `lines`: log data. Lines should be separated by newline characters (encoded
as `\n`, as normal in JSON). as `\n`, as normal in JSON).
* `data`: a set of arbitrary name/value strings to include in the
`details.log.gz` file. (Note that the values must be strings; numbers,
objects and arrays will be rejected).

View file

@ -42,9 +42,11 @@ type submitServer struct {
type payload struct { type payload struct {
Text string `json:"text"` Text string `json:"text"`
AppName string `json:"app"`
Version string `json:"version"` Version string `json:"version"`
UserAgent string `json:"user_agent"` UserAgent string `json:"user_agent"`
Logs []logEntry `json:"logs"` Logs []logEntry `json:"logs"`
Data map[string]string `json:"data"`
} }
type logEntry struct { type logEntry struct {
@ -72,7 +74,7 @@ func (s *submitServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
} }
var p payload var p payload
if err := json.NewDecoder(req.Body).Decode(&p); err != nil { if err := json.NewDecoder(req.Body).Decode(&p); err != nil {
respond(400, w) http.Error(w, fmt.Sprintf("Could not decode payload: %s", err.Error()), 400)
return return
} }
@ -93,12 +95,20 @@ func (s *submitServer) saveReport(ctx context.Context, p payload) error {
// "bugreport-20170115-112233-N.log.gz" => oldest log // "bugreport-20170115-112233-N.log.gz" => oldest log
t := time.Now().UTC() t := time.Now().UTC()
prefix := t.Format("2006-01-02/150405") prefix := t.Format("2006-01-02/150405")
summary := fmt.Sprintf(
"%s\n\nNumber of logs: %d\nVersion: %s\nUser-Agent: %s\n", p.Text, len(p.Logs), p.Version, p.UserAgent, var summaryBuf bytes.Buffer
fmt.Fprintf(
&summaryBuf,
"%s\n\nNumber of logs: %d\nApplication: %s\nVersion: %s\nUser-Agent: %s\n",
p.Text, len(p.Logs), p.AppName, p.Version, p.UserAgent,
) )
if err := gzipAndSave([]byte(summary), prefix, "details.log.gz"); err != nil { for k, v := range p.Data {
fmt.Fprintf(&summaryBuf, "%s: %s\n", k, v)
}
if err := gzipAndSave(summaryBuf.Bytes(), prefix, "details.log.gz"); err != nil {
return err return err
} }
for i, log := range p.Logs { for i, log := range p.Logs {
if err := gzipAndSave([]byte(log.Lines), prefix, fmt.Sprintf("logs-%d.log.gz", i)); err != nil { if err := gzipAndSave([]byte(log.Lines), prefix, fmt.Sprintf("logs-%d.log.gz", i)); err != nil {
return err // TODO: Rollback? return err // TODO: Rollback?