observatory.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package v4
  2. import (
  3. "encoding/json"
  4. "github.com/golang/protobuf/proto"
  5. "google.golang.org/protobuf/types/known/anypb"
  6. "github.com/v2fly/v2ray-core/v5/app/observatory"
  7. "github.com/v2fly/v2ray-core/v5/app/observatory/burst"
  8. "github.com/v2fly/v2ray-core/v5/app/observatory/multiobservatory"
  9. "github.com/v2fly/v2ray-core/v5/common/serial"
  10. "github.com/v2fly/v2ray-core/v5/common/taggedfeatures"
  11. "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon/duration"
  12. "github.com/v2fly/v2ray-core/v5/infra/conf/synthetic/router"
  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. result, err := b.HealthCheck.Build()
  29. if err == nil {
  30. return &burst.Config{SubjectSelector: b.SubjectSelector, PingConfig: result.(*burst.HealthPingConfig)}, nil
  31. }
  32. return nil, err
  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. case "default":
  58. fallthrough
  59. default:
  60. var observatoryConfig ObservatoryConfig
  61. err := json.Unmarshal(v.Value, &observatoryConfig)
  62. if err != nil {
  63. return nil, err
  64. }
  65. observatoryConfigPb, err := observatoryConfig.Build()
  66. if err != nil {
  67. return nil, err
  68. }
  69. ret.Holders.Features[v.Tag] = serial.ToTypedMessage(observatoryConfigPb)
  70. }
  71. }
  72. return ret, nil
  73. }