-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdlog.go
129 lines (114 loc) · 3.46 KB
/
dlog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package goserver
import (
"bufio"
"context"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"time"
"github.com/brotherlogic/goserver/utils"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"google.golang.org/grpc/peer"
)
func (s *GoServer) hasScratch() bool {
file, _ := os.Open("/proc/mounts")
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
fields := strings.Fields(scanner.Text())
if len(fields) > 2 && fields[1] == "/media/scratch" {
return true
}
}
return false
}
var (
logSize = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dlog_size",
Help: "The number of server requests",
})
badWrites = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dlog_bad_write",
Help: "The number of server requests",
})
)
func dirSize(path string) (int64, error) {
var size int64
err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
size += info.Size()
}
return err
})
return size, err
}
// DLog writes to the dlog
func (s *GoServer) DLog(ctx context.Context, text string) {
if s.dlogHandle != nil {
code, err := utils.GetContextKey(ctx)
if err != nil {
server := "unknown"
if s.Registry != nil {
server = s.Registry.Identifier
}
badWrites.Inc()
peer, ok := peer.FromContext(ctx)
s.RaiseIssue("Logging error", fmt.Sprintf("Log line %v had no context key (%v) -> %v [%v/%v]", text, server, err, peer, ok))
code = "NONE"
}
s.dlogHandle.WriteString(fmt.Sprintf("%v|%v|%v|%v\n", time.Now().Format(time.RFC3339Nano), s.Registry.GetIdentifier(), code, text))
if time.Since(s.lastLogCheck) > time.Minute {
if _, err := os.Stat(fmt.Sprintf("/media/scratch/dlogs/%v", s.Registry.GetName())); !os.IsNotExist(err) {
size, err := dirSize(fmt.Sprintf("/media/scratch/dlogs/%v", s.Registry.GetName()))
if err != nil {
if s.Registry != nil {
s.RaiseIssue("Bad log problem", fmt.Sprintf("Error reeading logs on %v: %v", s.Registry.Identifier, err))
}
} else {
s.lastLogCheck = time.Now()
logSize.Set(float64(size))
}
}
}
}
}
func (s *GoServer) prepDLog(serviceName string) {
s.preppedDLog = true
if s.hasScratch() {
filename := fmt.Sprintf("/media/scratch/dlogs/%v/%v.logs", serviceName, time.Now().Unix())
os.MkdirAll(fmt.Sprintf("/media/scratch/dlogs/%v/", serviceName), 0777)
//Delete all files a week old
files, _ := ioutil.ReadDir(fmt.Sprintf("/media/scratch/dlogs/%v/", serviceName))
count := 0
for _, file := range files {
if time.Since(file.ModTime()) > time.Hour*24*7 {
os.Remove(fmt.Sprintf("/media/scratch/dlogs/%v/%v", serviceName, file.Name()))
count++
}
}
fhandle, _ := os.Create(filename)
s.dlogHandle = fhandle
} else if serviceName == "gobuildslave" {
filename := fmt.Sprintf("/home/simon/gobuildslave.tlog")
fhandle, _ := os.Create(filename)
s.dlogHandle = fhandle
} else if serviceName == "gobuildmaster" {
filename := fmt.Sprintf("/home/simon/gobuildmaster.tlog")
fhandle, _ := os.Create(filename)
s.dlogHandle = fhandle
} else if serviceName == "provisioner" {
filename := fmt.Sprintf("/home/simon/provisioner.tlog")
fhandle, _ := os.Create(filename)
s.dlogHandle = fhandle
} else {
hn, err := os.Hostname()
s.RaiseIssue("Missing Disk Logs", fmt.Sprintf("%v,%v,%v has not disk logging potential", hn, err, s.Registry.GetIdentifier()))
}
}