observatory.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package v4
  2. import (
  3. "encoding/json"
  4. "github.com/golang/protobuf/proto"
  5. "github.com/v2fly/v2ray-core/v4/app/observatory/burst"
  6. "github.com/v2fly/v2ray-core/v4/app/observatory/multiObservatory"
  7. "github.com/v2fly/v2ray-core/v4/common/serial"
  8. "github.com/v2fly/v2ray-core/v4/common/taggedfeatures"
  9. "github.com/v2fly/v2ray-core/v4/infra/conf/synthetic/router"
  10. "google.golang.org/protobuf/types/known/anypb"
  11. "github.com/v2fly/v2ray-core/v4/app/observatory"
  12. "github.com/v2fly/v2ray-core/v4/infra/conf/cfgcommon/duration"
  13. )
  14. type ObservatoryConfig struct {
  15. SubjectSelector []string `json:"subjectSelector"`
  16. ProbeURL string `json:"probeURL"`
  17. ProbeInterval duration.Duration `json:"probeInterval"`
  18. }
  19. func (o *ObservatoryConfig) Build() (proto.Message, error) {
  20. return &observatory.Config{SubjectSelector: o.SubjectSelector, ProbeUrl: o.ProbeURL, ProbeInterval: int64(o.ProbeInterval)}, nil
  21. }
  22. type BurstObservatoryConfig struct {
  23. SubjectSelector []string `json:"subjectSelector"`
  24. // health check settings
  25. HealthCheck *router.HealthCheckSettings `json:"pingConfig,omitempty"`
  26. }
  27. func (b BurstObservatoryConfig) Build() (proto.Message, error) {
  28. if result, err := b.HealthCheck.Build(); err == nil {
  29. return &burst.Config{SubjectSelector: b.SubjectSelector, PingConfig: result.(*burst.HealthPingConfig)}, nil
  30. } else {
  31. return nil, err
  32. }
  33. }
  34. type MultiObservatoryItem struct {
  35. MemberType string `json:"type"`
  36. Tag string `json:"tag"`
  37. Value json.RawMessage `json:"settings"`
  38. }
  39. type MultiObservatoryConfig struct {
  40. Observers []MultiObservatoryItem `json:"observers"`
  41. }
  42. func (o *MultiObservatoryConfig) Build() (proto.Message, error) {
  43. ret := &multiObservatory.Config{Holders: &taggedfeatures.Config{Features: make(map[string]*anypb.Any)}}
  44. for _, v := range o.Observers {
  45. switch v.MemberType {
  46. case "burst":
  47. var burstObservatoryConfig BurstObservatoryConfig
  48. err := json.Unmarshal(v.Value, &burstObservatoryConfig)
  49. if err != nil {
  50. return nil, err
  51. }
  52. burstObservatoryConfigPb, err := burstObservatoryConfig.Build()
  53. if err != nil {
  54. return nil, err
  55. }
  56. ret.Holders.Features[v.Tag] = serial.ToTypedMessage(burstObservatoryConfigPb)
  57. break
  58. case "default":
  59. fallthrough
  60. default:
  61. var observatoryConfig ObservatoryConfig
  62. err := json.Unmarshal(v.Value, &observatoryConfig)
  63. if err != nil {
  64. return nil, err
  65. }
  66. observatoryConfigPb, err := observatoryConfig.Build()
  67. if err != nil {
  68. return nil, err
  69. }
  70. ret.Holders.Features[v.Tag] = serial.ToTypedMessage(observatoryConfigPb)
  71. }
  72. }
  73. return ret, nil
  74. }