1
1
package slog
2
2
3
3
import (
4
+ json "encoding/json"
4
5
"fmt"
6
+ zmq "github.com/pebbe/zmq3"
5
7
"logger"
6
8
"os"
9
+ "stash.cloudflare.com/go-stream/util"
7
10
"strings"
11
+ "time"
8
12
)
9
13
10
14
var (
11
15
LogPrefix string
12
- glog * logger.Logger // the main logger object
16
+ glog * logger.Logger // the main logger object
17
+ Gm * util.StreamingMetrics // Main metrics object
13
18
)
14
19
15
20
// fatal: outputs a fatal startup error to STDERR, logs it to the
@@ -30,7 +35,7 @@ func exit(code int, l *logger.Logger, format string, v ...interface{}) {
30
35
os .Exit (code )
31
36
}
32
37
33
- func Init (logName * string , logLevel * string , logPrefix * string ) {
38
+ func Init (logName * string , logLevel * string , logPrefix * string , metrics * util. StreamingMetrics , metricsAddr * string ) {
34
39
// Change logger level
35
40
if err := logger .SetLogName (* logName ); err != nil {
36
41
fatal (nil , "Cannot set log name for program" )
@@ -45,6 +50,9 @@ func Init(logName *string, logLevel *string, logPrefix *string) {
45
50
fatal (nil , "Cannot start logger" )
46
51
}
47
52
}
53
+
54
+ Gm = metrics
55
+ go statsSender (metricsAddr , logPrefix )
48
56
}
49
57
50
58
func Logf (level logger.Level , format string , v ... interface {}) {
@@ -56,3 +64,45 @@ func Logf(level logger.Level, format string, v ...interface{}) {
56
64
func Fatalf (format string , v ... interface {}) {
57
65
fatal (glog , format , v )
58
66
}
67
+
68
+ type statsPkg struct {
69
+ Name string
70
+ TotalMsgs int64
71
+ TotalErrors int64
72
+ UpTime int64
73
+ }
74
+
75
+ func statsSender (metricsAddr * string , processName * string ) {
76
+
77
+ rep , err := zmq .NewSocket (zmq .REP )
78
+ if err != nil {
79
+ Logf (logger .Levels .Error , "Stats Sender error: %v" , err .Error ())
80
+ return
81
+ }
82
+ defer rep .Close ()
83
+ err = rep .Bind (* metricsAddr )
84
+ if err != nil {
85
+ Logf (logger .Levels .Error , "Stats Sender error: %v" , err .Error ())
86
+ return
87
+ }
88
+
89
+ Logf (logger .Levels .Info , "Stats sender, listening on %s" , * metricsAddr )
90
+
91
+ // Loop, printing the stats on request
92
+ for {
93
+ _ , err := rep .Recv (0 )
94
+ if err != nil {
95
+ Logf (logger .Levels .Error , "%v" , err .Error ())
96
+ } else {
97
+ timestamp := time .Now ().Unix () - Gm .StartTime
98
+ dBag := statsPkg {* processName , Gm .Total .Count (), Gm .Error .Count (), timestamp }
99
+ stats , err := json .Marshal (dBag )
100
+ if err == nil {
101
+ _ , err = rep .SendBytes (stats , zmq .DONTWAIT )
102
+ if err != nil {
103
+ Logf (logger .Levels .Error , "%v" , err .Error ())
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
0 commit comments