mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 12:53:43 +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 {
 | 
						if len(v) > 0 {
 | 
				
			||||||
		msg = ColorSprintf(format, v...)
 | 
							msg = ColorSprintf(format, v...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						labels := getGoroutineLabels()
 | 
				
			||||||
 | 
						if labels != nil {
 | 
				
			||||||
 | 
							pid, ok := labels["pid"]
 | 
				
			||||||
 | 
							if ok {
 | 
				
			||||||
 | 
								msg = "[" + ColorString(FgHiYellow) + pid + ColorString(Reset) + "] " + msg
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	stack := ""
 | 
						stack := ""
 | 
				
			||||||
	if l.GetStacktraceLevel() <= level {
 | 
						if l.GetStacktraceLevel() <= level {
 | 
				
			||||||
		stack = Stack(skip + 1)
 | 
							stack = Stack(skip + 1)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user