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 }