github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/logsender/worker.go (about)

     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  }