mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 06:24:11 +01:00 
			
		
		
		
	Add auto logging of goroutine pid label (#19212)
* Add auto logging of goroutine pid label This PR uses unsafe to export the hidden runtime_getProfLabel function from the runtime package and then casts the result to a map[string]string. We can then interrogate this map to get the pid label from the goroutine allowing us to log it with any logging request. Reference #19202 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									c1198284bc
								
							
						
					
					
						commit
						70628bd870
					
				
							
								
								
									
										20
									
								
								modules/log/groutinelabel.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								modules/log/groutinelabel.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
// Copyright 2022 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package log
 | 
			
		||||
 | 
			
		||||
import "unsafe"
 | 
			
		||||
 | 
			
		||||
//go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel
 | 
			
		||||
func runtime_getProfLabel() unsafe.Pointer // nolint
 | 
			
		||||
 | 
			
		||||
type labelMap map[string]string
 | 
			
		||||
 | 
			
		||||
func getGoroutineLabels() map[string]string {
 | 
			
		||||
	l := (*labelMap)(runtime_getProfLabel())
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return *l
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								modules/log/groutinelabel_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								modules/log/groutinelabel_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
// Copyright 2022 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package log
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"runtime/pprof"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Test_getGoroutineLabels(t *testing.T) {
 | 
			
		||||
	pprof.Do(context.Background(), pprof.Labels(), func(ctx context.Context) {
 | 
			
		||||
		currentLabels := getGoroutineLabels()
 | 
			
		||||
		pprof.ForLabels(ctx, func(key, value string) bool {
 | 
			
		||||
			assert.EqualValues(t, value, currentLabels[key])
 | 
			
		||||
			return true
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		pprof.Do(ctx, pprof.Labels("Test_getGoroutineLabels", "Test_getGoroutineLabels_child1"), func(ctx context.Context) {
 | 
			
		||||
			currentLabels := getGoroutineLabels()
 | 
			
		||||
			pprof.ForLabels(ctx, func(key, value string) bool {
 | 
			
		||||
				assert.EqualValues(t, value, currentLabels[key])
 | 
			
		||||
				return true
 | 
			
		||||
			})
 | 
			
		||||
			if assert.NotNil(t, currentLabels) {
 | 
			
		||||
				assert.EqualValues(t, "Test_getGoroutineLabels_child1", currentLabels["Test_getGoroutineLabels"])
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@ -72,6 +72,13 @@ func (l *MultiChannelledLogger) Log(skip int, level Level, format string, v ...i
 | 
			
		||||
	if len(v) > 0 {
 | 
			
		||||
		msg = ColorSprintf(format, v...)
 | 
			
		||||
	}
 | 
			
		||||
	labels := getGoroutineLabels()
 | 
			
		||||
	if labels != nil {
 | 
			
		||||
		pid, ok := labels["pid"]
 | 
			
		||||
		if ok {
 | 
			
		||||
			msg = "[" + ColorString(FgHiYellow) + pid + ColorString(Reset) + "] " + msg
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	stack := ""
 | 
			
		||||
	if l.GetStacktraceLevel() <= level {
 | 
			
		||||
		stack = Stack(skip + 1)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user