Create & Init Project...
This commit is contained in:
73
app/job/main/passport-game-cloud/service/prom.go
Normal file
73
app/job/main/passport-game-cloud/service/prom.go
Normal file
@ -0,0 +1,73 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"go-common/library/log"
|
||||
"go-common/library/stat/prom"
|
||||
)
|
||||
|
||||
const (
|
||||
_timeFormat = "2006-01-02 15:04:05"
|
||||
)
|
||||
|
||||
var (
|
||||
_names = make(map[string]struct{})
|
||||
|
||||
_loc = time.Now().Location()
|
||||
)
|
||||
|
||||
// IntervalConfig interval config.
|
||||
type IntervalConfig struct {
|
||||
Name string
|
||||
Rate int64
|
||||
}
|
||||
|
||||
// Interval prom interval.
|
||||
type Interval struct {
|
||||
name string
|
||||
rate int64
|
||||
counter int64
|
||||
}
|
||||
|
||||
// NewInterval new a interval instance.
|
||||
func NewInterval(c *IntervalConfig) *Interval {
|
||||
if _, ok := _names[c.Name]; ok {
|
||||
panic(fmt.Sprintf("%s already exists", c.Name))
|
||||
}
|
||||
_names[c.Name] = struct{}{}
|
||||
if c.Rate <= 0 {
|
||||
c.Rate = 1000
|
||||
}
|
||||
return &Interval{
|
||||
name: c.Name,
|
||||
rate: c.Rate,
|
||||
counter: 0,
|
||||
}
|
||||
}
|
||||
|
||||
// MTS get mtime ts from mtime str with interval's counter.
|
||||
func (s *Interval) MTS(c context.Context, mtStr string) int64 {
|
||||
s.counter++
|
||||
if s.counter%s.rate == 0 {
|
||||
return 0
|
||||
}
|
||||
if mtStr == "" {
|
||||
return 0
|
||||
}
|
||||
t, err := time.ParseInLocation(_timeFormat, mtStr, _loc)
|
||||
if err != nil {
|
||||
log.Error("failed to parse mtime str for %s, time.ParseInLocation(%s, %s, %v) error(%v)", s.name, _timeFormat, mtStr, _loc, err)
|
||||
return 0
|
||||
}
|
||||
return t.Unix()
|
||||
}
|
||||
|
||||
// Prom prom interval if mts > 0.
|
||||
func (s *Interval) Prom(c context.Context, mts int64) {
|
||||
if mts > 0 {
|
||||
prom.BusinessInfoCount.State(s.name, time.Now().Unix()-mts)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user