query.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package opencost
  2. import (
  3. "strings"
  4. "time"
  5. "github.com/opencost/opencost/core/pkg/filter"
  6. )
  7. // Querier is an aggregate interface which has the ability to query each Kubecost store type
  8. type Querier interface {
  9. AllocationQuerier
  10. SummaryAllocationQuerier
  11. AssetQuerier
  12. }
  13. // AllocationQuerier interface defining api for requesting Allocation data
  14. type AllocationQuerier interface {
  15. QueryAllocation(start, end time.Time, opts *AllocationQueryOptions) (*AllocationSetRange, error)
  16. }
  17. // SummaryAllocationQuerier interface defining api for requesting SummaryAllocation data
  18. type SummaryAllocationQuerier interface {
  19. QuerySummaryAllocation(start, end time.Time, opts *AllocationQueryOptions) (*SummaryAllocationSetRange, error)
  20. }
  21. // AssetQuerier interface defining api for requesting Asset data
  22. type AssetQuerier interface {
  23. QueryAsset(start, end time.Time, opts *AssetQueryOptions) (*AssetSetRange, error)
  24. }
  25. // AllocationQueryOptions defines optional parameters for querying an Allocation Store
  26. type AllocationQueryOptions struct {
  27. Accumulate AccumulateOption
  28. AggregateBy []string
  29. Compute bool
  30. Filter filter.Filter
  31. IdleByNode bool
  32. IncludeExternal bool
  33. IncludeIdle bool
  34. LabelConfig *LabelConfig
  35. MergeUnallocated bool
  36. Reconcile bool
  37. ReconcileNetwork bool
  38. ShareFuncs []AllocationMatchFunc
  39. SharedHourlyCosts map[string]float64
  40. ShareIdle string
  41. ShareSplit string
  42. ShareTenancyCosts bool
  43. SplitIdle bool
  44. Step time.Duration
  45. }
  46. type AccumulateOption string
  47. const (
  48. AccumulateOptionNone AccumulateOption = ""
  49. AccumulateOptionAll AccumulateOption = "all"
  50. AccumulateOptionHour AccumulateOption = "hour"
  51. AccumulateOptionDay AccumulateOption = "day"
  52. AccumulateOptionWeek AccumulateOption = "week"
  53. AccumulateOptionMonth AccumulateOption = "month"
  54. AccumulateOptionQuarter AccumulateOption = "quarter"
  55. )
  56. // ParseAccumulate converts a string to an AccumulateOption
  57. func ParseAccumulate(acc string) AccumulateOption {
  58. var opt AccumulateOption
  59. switch strings.ToLower(acc) {
  60. case "quarter":
  61. opt = AccumulateOptionQuarter
  62. case "month":
  63. opt = AccumulateOptionMonth
  64. case "week":
  65. opt = AccumulateOptionWeek
  66. case "day":
  67. opt = AccumulateOptionDay
  68. case "hour":
  69. opt = AccumulateOptionHour
  70. case "true":
  71. opt = AccumulateOptionAll
  72. default:
  73. opt = AccumulateOptionNone
  74. }
  75. return opt
  76. }
  77. // AssetQueryOptions defines optional parameters for querying an Asset Store
  78. type AssetQueryOptions struct {
  79. Accumulate bool
  80. AggregateBy []string
  81. Compute bool
  82. DisableAdjustments bool
  83. Filter filter.Filter
  84. IncludeCloud bool
  85. SharedHourlyCosts map[string]float64
  86. Step time.Duration
  87. LabelConfig *LabelConfig
  88. }
  89. // QueryAllocationAsync provide a functions for retrieving results from any AllocationQuerier Asynchronously
  90. func QueryAllocationAsync(allocationQuerier AllocationQuerier, start, end time.Time, opts *AllocationQueryOptions) (chan *AllocationSetRange, chan error) {
  91. asrCh := make(chan *AllocationSetRange)
  92. errCh := make(chan error)
  93. go func(asrCh chan *AllocationSetRange, errCh chan error) {
  94. defer close(asrCh)
  95. defer close(errCh)
  96. asr, err := allocationQuerier.QueryAllocation(start, end, opts)
  97. if err != nil {
  98. errCh <- err
  99. return
  100. }
  101. asrCh <- asr
  102. }(asrCh, errCh)
  103. return asrCh, errCh
  104. }
  105. // QuerySummaryAllocationAsync provide a functions for retrieving results from any SummaryAllocationQuerier Asynchronously
  106. func QuerySummaryAllocationAsync(summaryAllocationQuerier SummaryAllocationQuerier, start, end time.Time, opts *AllocationQueryOptions) (chan *SummaryAllocationSetRange, chan error) {
  107. asrCh := make(chan *SummaryAllocationSetRange)
  108. errCh := make(chan error)
  109. go func(asrCh chan *SummaryAllocationSetRange, errCh chan error) {
  110. defer close(asrCh)
  111. defer close(errCh)
  112. asr, err := summaryAllocationQuerier.QuerySummaryAllocation(start, end, opts)
  113. if err != nil {
  114. errCh <- err
  115. return
  116. }
  117. asrCh <- asr
  118. }(asrCh, errCh)
  119. return asrCh, errCh
  120. }
  121. // QueryAsseetAsync provide a functions for retrieving results from any AssetQuerier Asynchronously
  122. func QueryAssetAsync(assetQuerier AssetQuerier, start, end time.Time, opts *AssetQueryOptions) (chan *AssetSetRange, chan error) {
  123. asrCh := make(chan *AssetSetRange)
  124. errCh := make(chan error)
  125. go func(asrCh chan *AssetSetRange, errCh chan error) {
  126. defer close(asrCh)
  127. defer close(errCh)
  128. asr, err := assetQuerier.QueryAsset(start, end, opts)
  129. if err != nil {
  130. errCh <- err
  131. return
  132. }
  133. asrCh <- asr
  134. }(asrCh, errCh)
  135. return asrCh, errCh
  136. }