remotewriter.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package stat
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "net/http"
  7. "time"
  8. "github.com/wuntsong-org/go-zero-plus/core/logx"
  9. )
  10. const (
  11. httpTimeout = time.Second * 5
  12. jsonContentType = "application/json; charset=utf-8"
  13. )
  14. // ErrWriteFailed is an error that indicates failed to submit a StatReport.
  15. var ErrWriteFailed = errors.New("submit failed")
  16. // A RemoteWriter is a writer to write StatReport.
  17. type RemoteWriter struct {
  18. endpoint string
  19. }
  20. // NewRemoteWriter returns a RemoteWriter.
  21. func NewRemoteWriter(endpoint string) Writer {
  22. return &RemoteWriter{
  23. endpoint: endpoint,
  24. }
  25. }
  26. func (rw *RemoteWriter) Write(report *StatReport) error {
  27. bs, err := json.Marshal(report)
  28. if err != nil {
  29. return err
  30. }
  31. client := &http.Client{
  32. Timeout: httpTimeout,
  33. }
  34. resp, err := client.Post(rw.endpoint, jsonContentType, bytes.NewReader(bs))
  35. if err != nil {
  36. return err
  37. }
  38. defer resp.Body.Close()
  39. if resp.StatusCode != http.StatusOK {
  40. logx.Errorf("write report failed, code: %d, reason: %s", resp.StatusCode, resp.Status)
  41. return ErrWriteFailed
  42. }
  43. return nil
  44. }