mirror of
https://github.com/zeromicro/go-zero.git
synced 2025-02-02 16:28:39 +08:00
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:
parent
56ad4776d4
commit
acdaee0fb6
@ -25,29 +25,29 @@ type (
|
||||
Stopper
|
||||
}
|
||||
|
||||
// A Group is a group of services.
|
||||
Group struct {
|
||||
// A ServiceGroup is a group of services.
|
||||
ServiceGroup struct {
|
||||
services []Service
|
||||
stopOnce func()
|
||||
}
|
||||
)
|
||||
|
||||
// NewGroup returns a Group.
|
||||
func NewGroup() *Group {
|
||||
sg := new(Group)
|
||||
// NewServiceGroup returns a ServiceGroup.
|
||||
func NewServiceGroup() *ServiceGroup {
|
||||
sg := new(ServiceGroup)
|
||||
sg.stopOnce = syncx.Once(sg.doStop)
|
||||
return sg
|
||||
}
|
||||
|
||||
// Add adds service into sg.
|
||||
func (sg *Group) Add(service Service) {
|
||||
func (sg *ServiceGroup) Add(service Service) {
|
||||
sg.services = append(sg.services, service)
|
||||
}
|
||||
|
||||
// Start starts the Group.
|
||||
// Start starts the ServiceGroup.
|
||||
// There should not be any logic code after calling this method, because this method is a blocking one.
|
||||
// Also, quitting this method will close the logx output.
|
||||
func (sg *Group) Start() {
|
||||
func (sg *ServiceGroup) Start() {
|
||||
proc.AddShutdownListener(func() {
|
||||
log.Println("Shutting down...")
|
||||
sg.stopOnce()
|
||||
@ -56,12 +56,12 @@ func (sg *Group) Start() {
|
||||
sg.doStart()
|
||||
}
|
||||
|
||||
// Stop stops the Group.
|
||||
func (sg *Group) Stop() {
|
||||
// Stop stops the ServiceGroup.
|
||||
func (sg *ServiceGroup) Stop() {
|
||||
sg.stopOnce()
|
||||
}
|
||||
|
||||
func (sg *Group) doStart() {
|
||||
func (sg *ServiceGroup) doStart() {
|
||||
routineGroup := threading.NewRoutineGroup()
|
||||
|
||||
for i := range sg.services {
|
||||
@ -74,7 +74,7 @@ func (sg *Group) doStart() {
|
||||
routineGroup.Wait()
|
||||
}
|
||||
|
||||
func (sg *Group) doStop() {
|
||||
func (sg *ServiceGroup) doStop() {
|
||||
for _, service := range sg.services {
|
||||
service.Stop()
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ func TestServiceGroup(t *testing.T) {
|
||||
multipliers := []int{2, 3, 5, 7}
|
||||
want := 1
|
||||
|
||||
group := NewGroup()
|
||||
group := NewServiceGroup()
|
||||
for _, multiplier := range multipliers {
|
||||
want *= multiplier
|
||||
service := newMockedService(multiplier)
|
||||
@ -68,7 +68,7 @@ func TestServiceGroup_WithStart(t *testing.T) {
|
||||
var wait sync.WaitGroup
|
||||
var lock sync.Mutex
|
||||
wait.Add(len(multipliers))
|
||||
group := NewGroup()
|
||||
group := NewServiceGroup()
|
||||
for _, multiplier := range multipliers {
|
||||
var mul = multiplier
|
||||
group.Add(WithStart(func() {
|
||||
@ -95,7 +95,7 @@ func TestServiceGroup_WithStarter(t *testing.T) {
|
||||
var wait sync.WaitGroup
|
||||
var lock sync.Mutex
|
||||
wait.Add(len(multipliers))
|
||||
group := NewGroup()
|
||||
group := NewServiceGroup()
|
||||
for _, multiplier := range multipliers {
|
||||
var mul = multiplier
|
||||
group.Add(WithStarter(mockedStarter{
|
||||
|
@ -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()
|
||||
|
@ -2,8 +2,10 @@
|
||||
|
||||
package stat
|
||||
|
||||
// Report reports given message.
|
||||
func Report(string) {
|
||||
}
|
||||
|
||||
// SetReporter sets the given reporter.
|
||||
func SetReporter(func(string)) {
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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")
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -44,6 +44,7 @@ func init() {
|
||||
}()
|
||||
}
|
||||
|
||||
// CpuUsage returns current cpu usage.
|
||||
func CpuUsage() int64 {
|
||||
return atomic.LoadInt64(&cpuUsage)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user