github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/actor/v2action/logging.go (about)

     1  package v2action
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/cloudfoundry/sonde-go/events"
     7  )
     8  
     9  type LogMessage struct {
    10  	message        string
    11  	messageType    events.LogMessage_MessageType
    12  	timestamp      time.Time
    13  	sourceType     string
    14  	sourceInstance string
    15  }
    16  
    17  func (log LogMessage) Message() string {
    18  	return log.message
    19  }
    20  
    21  func (log LogMessage) Type() string {
    22  	if log.messageType == events.LogMessage_OUT {
    23  		return "OUT"
    24  	}
    25  	return "ERR"
    26  }
    27  
    28  func (log LogMessage) Timestamp() time.Time {
    29  	return log.timestamp
    30  }
    31  
    32  func (log LogMessage) SourceType() string {
    33  	return log.sourceType
    34  }
    35  
    36  func (log LogMessage) SourceInstance() string {
    37  	return log.sourceInstance
    38  }
    39  
    40  func NewLogMessage(message string, messageType int, timestamp time.Time, sourceType string, sourceInstance string) *LogMessage {
    41  	return &LogMessage{
    42  		message:        message,
    43  		messageType:    events.LogMessage_MessageType(messageType),
    44  		timestamp:      timestamp,
    45  		sourceType:     sourceType,
    46  		sourceInstance: sourceInstance,
    47  	}
    48  }
    49  
    50  func (actor Actor) GetStreamingLogs(appGUID string, client NOAAClient) (<-chan *LogMessage, <-chan error) {
    51  	// Do not pass in token because client should have a TokenRefresher set
    52  	eventStream, errStream := client.TailingLogs(appGUID, "")
    53  
    54  	messages := make(chan *LogMessage)
    55  	errs := make(chan error)
    56  
    57  	go func() {
    58  		defer close(messages)
    59  		defer close(errs)
    60  
    61  	dance:
    62  		for {
    63  			select {
    64  			case event, ok := <-eventStream:
    65  				if !ok {
    66  					break dance
    67  				}
    68  
    69  				messages <- &LogMessage{
    70  					message:        string(event.GetMessage()),
    71  					messageType:    event.GetMessageType(),
    72  					timestamp:      time.Unix(0, event.GetTimestamp()),
    73  					sourceInstance: event.GetSourceInstance(),
    74  					sourceType:     event.GetSourceType(),
    75  				}
    76  			case err, ok := <-errStream:
    77  				if !ok {
    78  					break dance
    79  				}
    80  				errs <- err
    81  			}
    82  		}
    83  	}()
    84  
    85  	return messages, errs
    86  }