github.com/annwntech/go-micro/v2@v2.9.5/debug/service/client.go (about)

     1  // Package service provides the service log
     2  package service
     3  
     4  import (
     5  	"context"
     6  	"time"
     7  
     8  	"github.com/annwntech/go-micro/v2/client"
     9  	"github.com/annwntech/go-micro/v2/debug/log"
    10  	pb "github.com/annwntech/go-micro/v2/debug/service/proto"
    11  )
    12  
    13  // Debug provides debug service client
    14  type debugClient struct {
    15  	Client pb.DebugService
    16  }
    17  
    18  func (d *debugClient) Trace() ([]*pb.Span, error) {
    19  	rsp, err := d.Client.Trace(context.Background(), &pb.TraceRequest{})
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  	return rsp.Spans, nil
    24  }
    25  
    26  // Logs queries the services logs and returns a channel to read the logs from
    27  func (d *debugClient) Log(since time.Time, count int, stream bool) (log.Stream, error) {
    28  	req := &pb.LogRequest{}
    29  	if !since.IsZero() {
    30  		req.Since = since.Unix()
    31  	}
    32  
    33  	if count > 0 {
    34  		req.Count = int64(count)
    35  	}
    36  
    37  	// set whether to stream
    38  	req.Stream = stream
    39  
    40  	// get the log stream
    41  	serverStream, err := d.Client.Log(context.Background(), req)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	lg := &logStream{
    47  		stream: make(chan log.Record),
    48  		stop:   make(chan bool),
    49  	}
    50  
    51  	// go stream logs
    52  	go d.streamLogs(lg, serverStream)
    53  
    54  	return lg, nil
    55  }
    56  
    57  func (d *debugClient) streamLogs(lg *logStream, stream pb.Debug_LogService) {
    58  	defer stream.Close()
    59  	defer lg.Stop()
    60  
    61  	for {
    62  		resp, err := stream.Recv()
    63  		if err != nil {
    64  			break
    65  		}
    66  
    67  		metadata := make(map[string]string)
    68  		for k, v := range resp.Metadata {
    69  			metadata[k] = v
    70  		}
    71  
    72  		record := log.Record{
    73  			Timestamp: time.Unix(resp.Timestamp, 0),
    74  			Message:   resp.Message,
    75  			Metadata:  metadata,
    76  		}
    77  
    78  		select {
    79  		case <-lg.stop:
    80  			return
    81  		case lg.stream <- record:
    82  		}
    83  	}
    84  }
    85  
    86  // NewClient provides a debug client
    87  func NewClient(name string) *debugClient {
    88  	// create default client
    89  	cli := client.DefaultClient
    90  
    91  	return &debugClient{
    92  		Client: pb.NewDebugService(name, cli),
    93  	}
    94  }