observatory.go 2.5 KB

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