~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/worker/logsender/worker.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2015 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package logsender
 
5
 
 
6
import (
 
7
        "fmt"
 
8
 
 
9
        "github.com/juju/errors"
 
10
        "github.com/juju/loggo"
 
11
 
 
12
        "github.com/juju/juju/api/logsender"
 
13
        "github.com/juju/juju/apiserver/params"
 
14
        "github.com/juju/juju/worker"
 
15
)
 
16
 
 
17
const loggerName = "juju.worker.logsender"
 
18
 
 
19
// New starts a logsender worker which reads log message structs from
 
20
// a channel and sends them to the JES via the logsink API.
 
21
func New(logs LogRecordCh, logSenderAPI *logsender.API) worker.Worker {
 
22
        loop := func(stop <-chan struct{}) error {
 
23
                logWriter, err := logSenderAPI.LogWriter()
 
24
                if err != nil {
 
25
                        return errors.Annotate(err, "logsender dial failed")
 
26
                }
 
27
                defer logWriter.Close()
 
28
                for {
 
29
                        select {
 
30
                        case rec := <-logs:
 
31
                                err := logWriter.WriteLog(&params.LogRecord{
 
32
                                        Time:     rec.Time,
 
33
                                        Module:   rec.Module,
 
34
                                        Location: rec.Location,
 
35
                                        Level:    rec.Level.String(),
 
36
                                        Message:  rec.Message,
 
37
                                })
 
38
                                if err != nil {
 
39
                                        return errors.Trace(err)
 
40
                                }
 
41
                                if rec.DroppedAfter > 0 {
 
42
                                        // If messages were dropped after this one, report
 
43
                                        // the count (the source of the log messages -
 
44
                                        // BufferedLogWriter - handles the actual dropping
 
45
                                        // and counting).
 
46
                                        //
 
47
                                        // Any logs indicated as dropped here are will
 
48
                                        // never end up in the logs DB in the JES
 
49
                                        // (although will still be in the local agent log
 
50
                                        // file). Message dropping by the
 
51
                                        // BufferedLogWriter is last resort protection
 
52
                                        // against memory exhaustion and should only
 
53
                                        // happen if API connectivity is lost for extended
 
54
                                        // periods. The maximum in-memory log buffer is
 
55
                                        // quite large (see the InstallBufferedLogWriter
 
56
                                        // call in jujuDMain).
 
57
                                        err := logWriter.WriteLog(&params.LogRecord{
 
58
                                                Time:    rec.Time,
 
59
                                                Module:  loggerName,
 
60
                                                Level:   loggo.WARNING.String(),
 
61
                                                Message: fmt.Sprintf("%d log messages dropped due to lack of API connectivity", rec.DroppedAfter),
 
62
                                        })
 
63
                                        if err != nil {
 
64
                                                return errors.Trace(err)
 
65
                                        }
 
66
                                }
 
67
 
 
68
                        case <-stop:
 
69
                                return nil
 
70
                        }
 
71
                }
 
72
        }
 
73
        return worker.NewSimpleWorker(loop)
 
74
}