/
stats.go
72 lines (65 loc) · 1.67 KB
/
stats.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
/*
* Copyright 2021 Wang Min Xiang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package service
import (
"context"
"github.com/aacfactory/errors"
"time"
)
func tryReportStats(ctx context.Context, service string, fn string, err errors.CodeError, span Span) {
ec := 0
en := ""
if err != nil {
ec = err.Code()
en = err.Name()
}
latency := time.Duration(0)
if span != nil {
latency = span.Latency()
}
TryFork(ctx, &reportStatsTask{
s: &Metric{
Service: service,
Fn: fn,
Succeed: err != nil,
ErrorCode: ec,
ErrorName: en,
Latency: latency,
},
})
}
type reportStatsTask struct {
s *Metric
}
func (task *reportStatsTask) Name() (name string) {
name = "stats-reporter"
return
}
func (task *reportStatsTask) Execute(ctx context.Context) {
ts, hasService := GetEndpoint(ctx, "stats")
if !hasService {
return
}
_ = ts.Request(ctx, "report", NewArgument(task.s))
}
type Metric struct {
Service string `json:"service"`
Fn string `json:"fn"`
Succeed bool `json:"succeed"`
ErrorCode int `json:"errorCode"`
ErrorName string `json:"errorName"`
Latency time.Duration `json:"latency"`
}