github.com/matrixorigin/matrixone@v0.7.0/pkg/util/trace/impl/motrace/report_log.go (about)

     1  // Copyright 2022 Matrix Origin
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package motrace
    16  
    17  import (
    18  	"context"
    19  	"github.com/matrixorigin/matrixone/pkg/util/export/table"
    20  	"github.com/matrixorigin/matrixone/pkg/util/trace"
    21  	"time"
    22  	"unsafe"
    23  
    24  	"github.com/matrixorigin/matrixone/pkg/util/batchpipe"
    25  	"go.uber.org/zap"
    26  	"go.uber.org/zap/buffer"
    27  	"go.uber.org/zap/zapcore"
    28  )
    29  
    30  var _ batchpipe.HasName = (*MOZapLog)(nil)
    31  
    32  // MOZapLog implement export.IBuffer2SqlItem and export.CsvFields
    33  type MOZapLog struct {
    34  	Level       zapcore.Level      `json:"Level"`
    35  	SpanContext *trace.SpanContext `json:"span"`
    36  	Timestamp   time.Time          `json:"timestamp"`
    37  	LoggerName  string
    38  	Caller      string `json:"caller"` // like "util/trace/trace.go:666"
    39  	Message     string `json:"message"`
    40  	Extra       string `json:"extra"` // like json text
    41  	Stack       string `json:"stack"`
    42  }
    43  
    44  func newMOZap() *MOZapLog {
    45  	return &MOZapLog{}
    46  }
    47  
    48  func (m *MOZapLog) GetName() string {
    49  	return logView.OriginTable.GetName()
    50  }
    51  
    52  // Size 计算近似值
    53  func (m *MOZapLog) Size() int64 {
    54  	return int64(unsafe.Sizeof(m) + unsafe.Sizeof(len(m.LoggerName)+len(m.Caller)+len(m.Message)+len(m.Extra)))
    55  }
    56  
    57  func (m *MOZapLog) Free() {
    58  	m.SpanContext = nil
    59  	m.LoggerName = ""
    60  	m.Caller = ""
    61  	m.Message = ""
    62  	m.Extra = ""
    63  }
    64  
    65  func (m *MOZapLog) GetTable() *table.Table { return logView.OriginTable }
    66  
    67  func (m *MOZapLog) FillRow(ctx context.Context, row *table.Row) {
    68  	row.Reset()
    69  	row.SetColumnVal(rawItemCol, logView.Table)
    70  	row.SetColumnVal(traceIDCol, m.SpanContext.TraceID.String())
    71  	row.SetColumnVal(spanIDCol, m.SpanContext.SpanID.String())
    72  	row.SetColumnVal(spanKindCol, m.SpanContext.Kind.String())
    73  	row.SetColumnVal(nodeUUIDCol, GetNodeResource().NodeUuid)
    74  	row.SetColumnVal(nodeTypeCol, GetNodeResource().NodeType)
    75  	row.SetColumnVal(timestampCol, m.Timestamp)
    76  	row.SetColumnVal(loggerNameCol, m.LoggerName)
    77  	row.SetColumnVal(levelCol, m.Level.String())
    78  	row.SetColumnVal(callerCol, m.Caller)
    79  	row.SetColumnVal(messageCol, m.Message)
    80  	row.SetColumnVal(extraCol, m.Extra)
    81  	row.SetColumnVal(stackCol, m.Stack)
    82  }
    83  
    84  func ReportZap(jsonEncoder zapcore.Encoder, entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {
    85  	var needReport = true
    86  	if !GetTracerProvider().IsEnable() {
    87  		return jsonEncoder.EncodeEntry(entry, []zap.Field{})
    88  	}
    89  	log := newMOZap()
    90  	log.LoggerName = entry.LoggerName
    91  	log.Level = entry.Level
    92  	log.Message = entry.Message
    93  	log.Caller = entry.Caller.TrimmedPath()
    94  	log.Timestamp = entry.Time
    95  	log.SpanContext = DefaultSpanContext()
    96  	log.Stack = entry.Stack
    97  	// find SpanContext
    98  	endIdx := len(fields) - 1
    99  	for idx, v := range fields {
   100  		if trace.IsSpanField(v) {
   101  			log.SpanContext = v.Interface.(*trace.SpanContext)
   102  			// find endIdx
   103  			for ; idx < endIdx && trace.IsSpanField(fields[endIdx]); endIdx-- {
   104  			}
   105  			if idx <= endIdx {
   106  				fields[idx], fields[endIdx] = fields[endIdx], fields[idx]
   107  				endIdx--
   108  			}
   109  			continue
   110  		}
   111  		if idx == endIdx {
   112  			break
   113  		}
   114  	}
   115  	if !needReport {
   116  		log.Free()
   117  		return jsonEncoder.EncodeEntry(entry, []zap.Field{})
   118  	}
   119  	buffer, err := jsonEncoder.EncodeEntry(entry, fields[:endIdx+1])
   120  	log.Extra = buffer.String()
   121  	GetGlobalBatchProcessor().Collect(DefaultContext(), log)
   122  	return buffer, err
   123  }