ebpf_exporter

Форк
0
/
walker.go 
71 строка · 1.4 Кб
1
package cgroup
2

3
import (
4
	"io/fs"
5
	"log"
6
	"path/filepath"
7
)
8

9
type walkerMonitor struct {
10
	path    string
11
	mapping map[int]string
12
}
13

14
func newWalkerMonitor(path string) (*walkerMonitor, error) {
15
	mapping, err := walk(path)
16
	if err != nil {
17
		return nil, err
18
	}
19

20
	return &walkerMonitor{path: path, mapping: mapping}, nil
21
}
22

23
func (m *walkerMonitor) Resolve(id int) string {
24
	// Try to resolve in cache first
25
	if existing, ok := m.mapping[id]; ok {
26
		return existing
27
	}
28

29
	// Refresh mapping to see if we a new cgroup appeared since last time
30
	if mapping, err := walk(m.path); err != nil {
31
		log.Printf("Error refreshing mapping: %v", err)
32
	} else {
33
		for id, name := range mapping {
34
			m.mapping[id] = name
35
		}
36
	}
37

38
	// If no new cgroup appeared, cache negative resolution to prevent constant refreshes
39
	if _, ok := m.mapping[id]; !ok {
40
		m.mapping[id] = ""
41
	}
42

43
	// Return whatever we have now (either newly resolved or cached negative value)
44
	return m.mapping[id]
45
}
46

47
func walk(dir string) (map[int]string, error) {
48
	mapping := map[int]string{}
49

50
	err := filepath.WalkDir(dir, func(path string, entry fs.DirEntry, err error) error {
51
		if err != nil {
52
			return err
53
		}
54

55
		if !entry.IsDir() {
56
			return nil
57
		}
58

59
		inode, err := inode(path)
60
		if err != nil {
61
			log.Printf("Error resolving inode for %q: %v", path, err)
62
			return nil
63
		}
64

65
		mapping[inode] = path
66

67
		return nil
68
	})
69

70
	return mapping, err
71
}
72

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.