parent
dd5ae29f82
commit
2bea8b7c84
@ -1,4 +1,4 @@
|
||||
package engine
|
||||
package conv
|
||||
|
||||
import (
|
||||
"math"
|
@ -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