fix golint issues in core/stat (#515)

* change to use ServiceGroup to make it more clear

* fix golint issues in core/stat
This commit is contained in:
Kevin Wan
2021-02-24 15:13:56 +08:00
committed by GitHub
parent 56ad4776d4
commit acdaee0fb6
9 changed files with 53 additions and 23 deletions

View File

@@ -37,6 +37,7 @@ func init() {
}
}
// Report reports given message.
func Report(msg string) {
lock.RLock()
fn := reporter
@@ -63,6 +64,7 @@ func Report(msg string) {
}
}
// SetReporter sets the given reporter.
func SetReporter(fn func(string)) {
lock.Lock()
defer lock.Unlock()

View File

@@ -2,8 +2,10 @@
package stat
// Report reports given message.
func Report(string) {
}
// SetReporter sets the given reporter.
func SetReporter(func(string)) {
}

View File

@@ -7,20 +7,23 @@ import (
"github.com/tal-tech/go-zero/core/executors"
"github.com/tal-tech/go-zero/core/logx"
"github.com/tal-tech/go-zero/core/syncx"
)
var (
LogInterval = time.Minute
logInterval = time.Minute
writerLock sync.Mutex
reportWriter Writer = nil
logEnabled = syncx.ForAtomicBool(true)
)
type (
// Writer interface wraps the Write method.
Writer interface {
Write(report *StatReport) error
}
// A StatReport is a stat report entry.
StatReport struct {
Name string `json:"name"`
Timestamp int64 `json:"tm"`
@@ -34,18 +37,26 @@ type (
Top99p9th float32 `json:"t99p9"`
}
// A Metrics is used to log and report stat reports.
Metrics struct {
executor *executors.PeriodicalExecutor
container *metricsContainer
}
)
// DisableLog disables logs of stats.
func DisableLog() {
logEnabled.Set(false)
}
// SetReportWriter sets the report writer.
func SetReportWriter(writer Writer) {
writerLock.Lock()
reportWriter = writer
writerLock.Unlock()
}
// NewMetrics returns a Metrics.
func NewMetrics(name string) *Metrics {
container := &metricsContainer{
name: name,
@@ -53,21 +64,24 @@ func NewMetrics(name string) *Metrics {
}
return &Metrics{
executor: executors.NewPeriodicalExecutor(LogInterval, container),
executor: executors.NewPeriodicalExecutor(logInterval, container),
container: container,
}
}
// Add adds task to m.
func (m *Metrics) Add(task Task) {
m.executor.Add(task)
}
// AddDrop adds a drop to m.
func (m *Metrics) AddDrop() {
m.executor.Add(Task{
Drop: true,
})
}
// SetName sets the name of m.
func (m *Metrics) SetName(name string) {
m.executor.Sync(func() {
m.container.name = name
@@ -113,7 +127,7 @@ func (c *metricsContainer) Execute(v interface{}) {
Name: c.name,
Timestamp: time.Now().Unix(),
Pid: c.pid,
ReqsPerSecond: float32(size) / float32(LogInterval/time.Second),
ReqsPerSecond: float32(size) / float32(logInterval/time.Second),
Drops: drops,
}
@@ -192,10 +206,12 @@ func getTopDuration(tasks []Task) float32 {
func log(report *StatReport) {
writeReport(report)
logx.Statf("(%s) - qps: %.1f/s, drops: %d, avg time: %.1fms, med: %.1fms, "+
"90th: %.1fms, 99th: %.1fms, 99.9th: %.1fms",
report.Name, report.ReqsPerSecond, report.Drops, report.Average, report.Median,
report.Top90th, report.Top99th, report.Top99p9th)
if logEnabled.True() {
logx.Statf("(%s) - qps: %.1f/s, drops: %d, avg time: %.1fms, med: %.1fms, "+
"90th: %.1fms, 99th: %.1fms, 99.9th: %.1fms",
report.Name, report.ReqsPerSecond, report.Drops, report.Average, report.Median,
report.Top90th, report.Top99th, report.Top99p9th)
}
}
func writeReport(report *StatReport) {

View File

@@ -6,9 +6,14 @@ import (
"time"
"github.com/stretchr/testify/assert"
"github.com/tal-tech/go-zero/core/logx"
)
func TestMetrics(t *testing.T) {
logx.Disable()
DisableLog()
defer logEnabled.Set(true)
counts := []int{1, 5, 10, 100, 1000, 1000}
for _, count := range counts {
m := NewMetrics("foo")

View File

@@ -12,12 +12,15 @@ import (
const httpTimeout = time.Second * 5
// ErrWriteFailed is an error that indicates failed to submit a StatReport.
var ErrWriteFailed = errors.New("submit failed")
// A RemoteWriter is a writer to write StatReport.
type RemoteWriter struct {
endpoint string
}
// NewRemoteWriter returns a RemoteWriter.
func NewRemoteWriter(endpoint string) Writer {
return &RemoteWriter{
endpoint: endpoint,

View File

@@ -2,6 +2,7 @@ package stat
import "time"
// A Task is a task that is reported to Metrics.
type Task struct {
Drop bool
Duration time.Duration

View File

@@ -44,6 +44,7 @@ func init() {
}()
}
// CpuUsage returns current cpu usage.
func CpuUsage() int64 {
return atomic.LoadInt64(&cpuUsage)
}