alert.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //go:build linux
  2. package stat
  3. import (
  4. "flag"
  5. "fmt"
  6. "strings"
  7. "sync"
  8. "sync/atomic"
  9. "time"
  10. "github.com/wuntsong-org/go-zero-plus/core/executors"
  11. "github.com/wuntsong-org/go-zero-plus/core/logx"
  12. "github.com/wuntsong-org/go-zero-plus/core/proc"
  13. "github.com/wuntsong-org/go-zero-plus/core/sysx"
  14. )
  15. const (
  16. clusterNameKey = "CLUSTER_NAME"
  17. testEnv = "test.v"
  18. timeFormat = "2006-01-02 15:04:05"
  19. )
  20. var (
  21. reporter = logx.Alert
  22. lock sync.RWMutex
  23. lessExecutor = executors.NewLessExecutor(time.Minute * 5)
  24. dropped int32
  25. clusterName = proc.Env(clusterNameKey)
  26. )
  27. func init() {
  28. if flag.Lookup(testEnv) != nil {
  29. SetReporter(nil)
  30. }
  31. }
  32. // Report reports given message.
  33. func Report(msg string) {
  34. lock.RLock()
  35. fn := reporter
  36. lock.RUnlock()
  37. if fn != nil {
  38. reported := lessExecutor.DoOrDiscard(func() {
  39. var builder strings.Builder
  40. builder.WriteString(fmt.Sprintln(time.Now().Format(timeFormat)))
  41. if len(clusterName) > 0 {
  42. builder.WriteString(fmt.Sprintf("cluster: %s\n", clusterName))
  43. }
  44. builder.WriteString(fmt.Sprintf("host: %s\n", sysx.Hostname()))
  45. dp := atomic.SwapInt32(&dropped, 0)
  46. if dp > 0 {
  47. builder.WriteString(fmt.Sprintf("dropped: %d\n", dp))
  48. }
  49. builder.WriteString(strings.TrimSpace(msg))
  50. fn(builder.String())
  51. })
  52. if !reported {
  53. atomic.AddInt32(&dropped, 1)
  54. }
  55. }
  56. }
  57. // SetReporter sets the given reporter.
  58. func SetReporter(fn func(string)) {
  59. lock.Lock()
  60. defer lock.Unlock()
  61. reporter = fn
  62. }