|
|
|
@ -4,12 +4,13 @@ import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
cmap "github.com/orcaman/concurrent-map"
|
|
|
|
|
"net"
|
|
|
|
|
"net/http"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
cmap "github.com/orcaman/concurrent-map"
|
|
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
|
|
|
"github.com/golang/snappy"
|
|
|
|
|
"github.com/prometheus/client_golang/api"
|
|
|
|
@ -48,7 +49,7 @@ type WriterType struct {
|
|
|
|
|
|
|
|
|
|
var lock = sync.RWMutex{}
|
|
|
|
|
|
|
|
|
|
func (w WriterType) Write(items []*prompb.TimeSeries) {
|
|
|
|
|
func (w WriterType) Write(items []*prompb.TimeSeries, headers ...map[string]string) {
|
|
|
|
|
if len(items) == 0 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
@ -63,34 +64,13 @@ func (w WriterType) Write(items []*prompb.TimeSeries) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := w.Post(snappy.Encode(nil, data), nil); err != nil {
|
|
|
|
|
if err := w.Post(snappy.Encode(nil, data), headers...); err != nil {
|
|
|
|
|
logger.Warningf("post to %s got error: %v", w.Opts.Url, err)
|
|
|
|
|
logger.Warning("example timeseries:", items[0].String())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w WriterType) WriteWithHeader(items []*prompb.TimeSeries, headerMap map[string]string) {
|
|
|
|
|
if len(items) == 0 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
req := &prompb.WriteRequest{
|
|
|
|
|
Timeseries: items,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data, err := proto.Marshal(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Warningf("marshal prom data to proto got error: %v, data: %+v", err, items)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := w.Post(snappy.Encode(nil, data), headerMap); err != nil {
|
|
|
|
|
logger.Warningf("post to %s got error: %v", w.Opts.Url, err)
|
|
|
|
|
logger.Warning("example timeseries:", items[0].String())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w WriterType) Post(req []byte, headerMap map[string]string) error {
|
|
|
|
|
func (w WriterType) Post(req []byte, headers ...map[string]string) error {
|
|
|
|
|
httpReq, err := http.NewRequest("POST", w.Opts.Url, bytes.NewReader(req))
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Warningf("create remote write request got error: %s", err.Error())
|
|
|
|
@ -102,8 +82,8 @@ func (w WriterType) Post(req []byte, headerMap map[string]string) error {
|
|
|
|
|
httpReq.Header.Set("User-Agent", "n9e")
|
|
|
|
|
httpReq.Header.Set("X-Prometheus-Remote-Write-Version", "0.1.0")
|
|
|
|
|
|
|
|
|
|
if headerMap != nil {
|
|
|
|
|
for k, v := range headerMap {
|
|
|
|
|
if len(headers) > 0 {
|
|
|
|
|
for k, v := range headers[0] {
|
|
|
|
|
httpReq.Header.Set(k, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -229,23 +209,19 @@ func (ws *WritersType) InitIdentChanWorker(ident string, data chan *prompb.TimeS
|
|
|
|
|
//
|
|
|
|
|
// postPrometheus 发送数据至prometheus
|
|
|
|
|
// @Author: quzhihao
|
|
|
|
|
// @Description:
|
|
|
|
|
// @receiver ws
|
|
|
|
|
// @param ident
|
|
|
|
|
// @param series
|
|
|
|
|
//
|
|
|
|
|
func (ws *WritersType) postPrometheus(ident string, series []*prompb.TimeSeries) {
|
|
|
|
|
// 发送至prom
|
|
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
|
wg.Add(len(ws.m))
|
|
|
|
|
headerMap := make(map[string]string, 1)
|
|
|
|
|
headerMap["ident"] = ident
|
|
|
|
|
|
|
|
|
|
headers := map[string]string{"ident": ident}
|
|
|
|
|
for key := range ws.m {
|
|
|
|
|
go func(key string) {
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
ws.m[key].WriteWithHeader(series, headerMap)
|
|
|
|
|
ws.m[key].Write(series, headers)
|
|
|
|
|
}(key)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wg.Wait()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|