-
Notifications
You must be signed in to change notification settings - Fork 153
/
metric.go
139 lines (117 loc) · 3.54 KB
/
metric.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
130
131
132
133
134
135
136
137
138
139
package metric
import (
"fmt"
"sync"
"time"
"github.com/didi/falcon-log-agent/common/dlog"
)
type MetricTags struct {
sync.RWMutex
Counters map[string]int64
}
func (m *MetricTags) HasKey(k string) bool {
m.RLock()
defer m.RUnlock()
if _, ok := m.Counters[k]; ok {
return true
} else {
return false
}
}
func (m *MetricTags) AddCount(k string, v int64) {
m.Lock()
defer m.Unlock()
if _, ok := m.Counters[k]; !ok {
if _, ok := m.Counters[k]; !ok {
m.Counters[k] = 0
}
}
m.Counters[k] = m.Counters[k] + v
}
// 自监控结构体
type SelfMonitMetrics struct {
MemUsedMB int64 `json:"mem_used_mb"`
ReadLineCnt *MetricTags `json:"read_line_cnt"`
DropLineCnt *MetricTags `json:"drop_line_cnt"`
AnalysisCnt *MetricTags `json:"analysis_cnt"`
AnalysisSuccCnt *MetricTags `json:"analysis_succ_cnt"`
PushCnt int64 `json:"push_cnt"`
PushErrorCnt int64 `json:"push_err_cnt"`
PushLatency int64 `json:"push_latency"`
NewTms int64
}
var (
globalSelfMonit *SelfMonitMetrics = newSelfMonitMetrics()
)
func newSelfMonitMetrics() *SelfMonitMetrics {
return &SelfMonitMetrics{
MemUsedMB: 0,
ReadLineCnt: newMetricTags(),
DropLineCnt: newMetricTags(),
AnalysisCnt: newMetricTags(),
AnalysisSuccCnt: newMetricTags(),
PushCnt: 0,
PushErrorCnt: 0,
PushLatency: 0,
NewTms: time.Now().Unix(),
}
}
func newMetricTags() *MetricTags {
return &MetricTags{
Counters: make(map[string]int64),
}
}
func clearGlobalCnt() {
globalSelfMonit = newSelfMonitMetrics()
}
// 将统计落实成一个个的监控点
// 此处只打印日志,若需要上报自监控指标,可以修改此方法
// TODO:此处只对齐至最近的时间点,统计并非十分精准
func HandleMetrics(step int64) {
statSelfMonit := globalSelfMonit
clearGlobalCnt()
statTms := statSelfMonit.NewTms
tms := statTms + (step - statTms%step)
logFormat := fmt.Sprintf("self monit [metric:%%s][tms:%d][value:%%v]", tms)
dlog.Debugf(logFormat, "log.agent.mem.used.mb", statSelfMonit.MemUsedMB)
dlog.Debugf(logFormat, "log.agent.push.cnt", statSelfMonit.PushCnt)
dlog.Debugf(logFormat, "log.agent.push.err.cnt", statSelfMonit.PushErrorCnt)
dlog.Debugf(logFormat, "log.agent.read.line.cnt", statSelfMonit.ReadLineCnt)
dlog.Debugf(logFormat, "log.agent.drop.line.cnt", statSelfMonit.DropLineCnt)
dlog.Debugf(logFormat, "log.agent.analysis.cnt", statSelfMonit.AnalysisCnt)
dlog.Debugf(logFormat, "log.agent.analysis.succ", statSelfMonit.AnalysisSuccCnt)
if statSelfMonit.PushCnt != 0 {
latency := statSelfMonit.PushLatency / statSelfMonit.PushCnt
dlog.Debugf(logFormat, "log.agent.push.latency.avg", latency)
}
}
func MetricMem(size int64) {
globalSelfMonit.MemUsedMB = size
}
func MetricReadLine(file string, num int64) {
globalSelfMonit.ReadLineCnt.AddCount(file, num)
}
func MetricDropLine(file string, num int64) {
globalSelfMonit.DropLineCnt.AddCount(file, num)
}
func MetricAnalysis(file string, num int64) {
globalSelfMonit.AnalysisCnt.AddCount(file, num)
}
func MetricAnalysisSucc(file string, num int64) {
globalSelfMonit.AnalysisSuccCnt.AddCount(file, num)
}
func MetricPushCnt(num int64, succ bool) {
globalSelfMonit.PushCnt = globalSelfMonit.PushCnt + num
if !succ {
globalSelfMonit.PushErrorCnt = globalSelfMonit.PushErrorCnt + num
}
}
func MetricPushLatency(latency int64) {
globalSelfMonit.PushLatency = globalSelfMonit.PushLatency + latency
}
func MetricLoop(step int64) {
for {
HandleMetrics(step)
time.Sleep(time.Duration(step) * time.Second)
}
}