add usage report
This commit is contained in:
parent
dd5ae29f82
commit
2bea8b7c84
|
@ -1,4 +1,4 @@
|
||||||
package engine
|
package conv
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
|
@ -119,25 +119,26 @@ func MustLoad(fpaths ...string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
RunMode string
|
RunMode string
|
||||||
ClusterName string
|
ClusterName string
|
||||||
BusiGroupLabelKey string
|
BusiGroupLabelKey string
|
||||||
EngineDelay int64
|
EngineDelay int64
|
||||||
Log logx.Config
|
DisableUsageReport bool
|
||||||
HTTP httpx.Config
|
Log logx.Config
|
||||||
BasicAuth gin.Accounts
|
HTTP httpx.Config
|
||||||
SMTP SMTPConfig
|
BasicAuth gin.Accounts
|
||||||
Heartbeat HeartbeatConfig
|
SMTP SMTPConfig
|
||||||
Alerting Alerting
|
Heartbeat HeartbeatConfig
|
||||||
NoData NoData
|
Alerting Alerting
|
||||||
Redis storage.RedisConfig
|
NoData NoData
|
||||||
Gorm storage.Gorm
|
Redis storage.RedisConfig
|
||||||
MySQL storage.MySQL
|
Gorm storage.Gorm
|
||||||
Postgres storage.Postgres
|
MySQL storage.MySQL
|
||||||
WriterOpt writer.GlobalOpt
|
Postgres storage.Postgres
|
||||||
Writers []writer.Options
|
WriterOpt writer.GlobalOpt
|
||||||
Reader reader.Options
|
Writers []writer.Options
|
||||||
Ibex Ibex
|
Reader reader.Options
|
||||||
|
Ibex Ibex
|
||||||
}
|
}
|
||||||
|
|
||||||
type HeartbeatConfig struct {
|
type HeartbeatConfig struct {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/toolkits/pkg/str"
|
"github.com/toolkits/pkg/str"
|
||||||
|
|
||||||
"github.com/didi/nightingale/v5/src/models"
|
"github.com/didi/nightingale/v5/src/models"
|
||||||
|
"github.com/didi/nightingale/v5/src/server/common/conv"
|
||||||
"github.com/didi/nightingale/v5/src/server/config"
|
"github.com/didi/nightingale/v5/src/server/config"
|
||||||
"github.com/didi/nightingale/v5/src/server/memsto"
|
"github.com/didi/nightingale/v5/src/server/memsto"
|
||||||
"github.com/didi/nightingale/v5/src/server/naming"
|
"github.com/didi/nightingale/v5/src/server/naming"
|
||||||
|
@ -106,7 +107,7 @@ func (r RuleEval) Work() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r.judge(ConvertVectors(value))
|
r.judge(conv.ConvertVectors(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
type WorkersType struct {
|
type WorkersType struct {
|
||||||
|
@ -172,7 +173,7 @@ func (ws *WorkersType) Build(rids []int64) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r RuleEval) judge(vectors []Vector) {
|
func (r RuleEval) judge(vectors []conv.Vector) {
|
||||||
// 有可能rule的一些配置已经发生变化,比如告警接收人、callbacks等
|
// 有可能rule的一些配置已经发生变化,比如告警接收人、callbacks等
|
||||||
// 这些信息的修改是不会引起worker restart的,但是确实会影响告警处理逻辑
|
// 这些信息的修改是不会引起worker restart的,但是确实会影响告警处理逻辑
|
||||||
// 所以,这里直接从memsto.AlertRuleCache中获取并覆盖
|
// 所以,这里直接从memsto.AlertRuleCache中获取并覆盖
|
||||||
|
|
|
@ -13,8 +13,8 @@ import (
|
||||||
"github.com/toolkits/pkg/ginx"
|
"github.com/toolkits/pkg/ginx"
|
||||||
|
|
||||||
"github.com/didi/nightingale/v5/src/server/common"
|
"github.com/didi/nightingale/v5/src/server/common"
|
||||||
|
"github.com/didi/nightingale/v5/src/server/common/conv"
|
||||||
"github.com/didi/nightingale/v5/src/server/config"
|
"github.com/didi/nightingale/v5/src/server/config"
|
||||||
"github.com/didi/nightingale/v5/src/server/engine"
|
|
||||||
"github.com/didi/nightingale/v5/src/server/idents"
|
"github.com/didi/nightingale/v5/src/server/idents"
|
||||||
"github.com/didi/nightingale/v5/src/server/memsto"
|
"github.com/didi/nightingale/v5/src/server/memsto"
|
||||||
"github.com/didi/nightingale/v5/src/server/reader"
|
"github.com/didi/nightingale/v5/src/server/reader"
|
||||||
|
@ -41,7 +41,7 @@ func queryPromql(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(200, engine.ConvertVectors(value))
|
c.JSON(200, conv.ConvertVectors(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
func remoteWrite(c *gin.Context) {
|
func remoteWrite(c *gin.Context) {
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/didi/nightingale/v5/src/server/reader"
|
"github.com/didi/nightingale/v5/src/server/reader"
|
||||||
"github.com/didi/nightingale/v5/src/server/router"
|
"github.com/didi/nightingale/v5/src/server/router"
|
||||||
"github.com/didi/nightingale/v5/src/server/stat"
|
"github.com/didi/nightingale/v5/src/server/stat"
|
||||||
|
"github.com/didi/nightingale/v5/src/server/usage"
|
||||||
"github.com/didi/nightingale/v5/src/server/writer"
|
"github.com/didi/nightingale/v5/src/server/writer"
|
||||||
"github.com/didi/nightingale/v5/src/storage"
|
"github.com/didi/nightingale/v5/src/storage"
|
||||||
)
|
)
|
||||||
|
@ -153,6 +154,10 @@ func (s Server) initialize() (func(), error) {
|
||||||
// register ident and nodata logic
|
// register ident and nodata logic
|
||||||
idents.Handle(ctx)
|
idents.Handle(ctx)
|
||||||
|
|
||||||
|
if !config.C.DisableUsageReport {
|
||||||
|
go usage.Report()
|
||||||
|
}
|
||||||
|
|
||||||
// release all the resources
|
// release all the resources
|
||||||
return fns.Ret(), nil
|
return fns.Ret(), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
package usage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/didi/nightingale/v5/src/server/common/conv"
|
||||||
|
"github.com/didi/nightingale/v5/src/server/reader"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
url = "http://n9e.io/report"
|
||||||
|
request = "sum(rate(n9e_server_samples_received_total[5m]))"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Usage struct {
|
||||||
|
Samples float64 `json:"samples"` // per second
|
||||||
|
Maintainer string `json:"maintainer"`
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSamples() (float64, error) {
|
||||||
|
value, warns, err := reader.Reader.Client.Query(context.Background(), request, time.Now())
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(warns) > 0 {
|
||||||
|
return 0, fmt.Errorf("occur some warnings: %v", warns)
|
||||||
|
}
|
||||||
|
|
||||||
|
lst := conv.ConvertVectors(value)
|
||||||
|
if len(lst) == 0 {
|
||||||
|
return 0, fmt.Errorf("convert result is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
return lst[0].Value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Report() {
|
||||||
|
for {
|
||||||
|
time.Sleep(time.Minute * 10)
|
||||||
|
report()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func report() {
|
||||||
|
sps, err := getSamples()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
hostname, err := os.Hostname()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
maintainer := "blank"
|
||||||
|
|
||||||
|
u := Usage{
|
||||||
|
Samples: sps,
|
||||||
|
Hostname: hostname,
|
||||||
|
Maintainer: maintainer,
|
||||||
|
}
|
||||||
|
|
||||||
|
post(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func post(u Usage) error {
|
||||||
|
body, err := json.Marshal(u)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("POST", url, bytes.NewReader(body))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cli := http.Client{
|
||||||
|
Timeout: time.Second * 10,
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := cli.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
return fmt.Errorf("got %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = ioutil.ReadAll(resp.Body)
|
||||||
|
return err
|
||||||
|
}
|
Loading…
Reference in New Issue