observatory.go 2.5 KB

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