2
0

metricsquerier_test.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. package collector
  2. import (
  3. "cmp"
  4. "reflect"
  5. "slices"
  6. "testing"
  7. "time"
  8. "github.com/opencost/opencost/core/pkg/source"
  9. "github.com/opencost/opencost/core/pkg/util"
  10. "github.com/opencost/opencost/modules/collector-source/pkg/metric"
  11. )
  12. var Start1Str = "2025-01-01T00:00:00Z"
  13. var End1Str = "2025-01-01T01:00:00Z"
  14. type MockStoreProvider struct {
  15. metricsCollector metric.MetricStore
  16. }
  17. func (m *MockStoreProvider) GetStore(start, end time.Time) metric.MetricStore {
  18. return m.metricsCollector
  19. }
  20. // QueryDataCoverage is not implemented for this mock
  21. func (m *MockStoreProvider) GetDailyDataCoverage(limitDays int) (time.Time, time.Time, error) {
  22. return time.Time{}, time.Time{}, nil
  23. }
  24. func GetMockCollectorProvider() StoreProvider {
  25. collector := NewOpenCostMetricStore()
  26. start, _ := time.Parse(time.RFC3339, Start1Str)
  27. time1 := time.Date(2025, 1, 1, 0, 30, 0, 0, time.UTC)
  28. end, _ := time.Parse(time.RFC3339, End1Str)
  29. node1Info := map[string]string{
  30. "node": "node1",
  31. "provider_id": "node1",
  32. }
  33. localStorage1Info := map[string]string{
  34. source.InstanceLabel: "node1",
  35. source.DeviceLabel: "local",
  36. }
  37. cluster1Info := map[string]string{
  38. "provisioner_name": "GKE",
  39. }
  40. gpu1Info := map[string]string{
  41. source.NamespaceLabel: "namespace1",
  42. source.PodLabel: "pod1",
  43. source.UIDLabel: "pod-uuid1",
  44. "container": "container1",
  45. "gpu": "0",
  46. "UUID": "GPU-1",
  47. "pci_bus_id": "00000000:00:0A.0",
  48. "device": "nvidia0",
  49. "modelName": "Tesla T4",
  50. "Hostname": "localhost",
  51. }
  52. pod1Info := map[string]string{
  53. source.NamespaceLabel: "namespace1",
  54. source.NodeLabel: "node1",
  55. source.InstanceLabel: "node1",
  56. source.PodLabel: "pod1",
  57. source.UIDLabel: "pod-uuid1",
  58. }
  59. container1Info := map[string]string{
  60. source.NamespaceLabel: "namespace1",
  61. source.NodeLabel: "node1",
  62. source.InstanceLabel: "node1",
  63. source.PodLabel: "pod1",
  64. source.UIDLabel: "pod-uuid1",
  65. source.ContainerLabel: "container1",
  66. }
  67. container2Info := map[string]string{
  68. source.NamespaceLabel: "kube-system",
  69. source.NodeLabel: "node1",
  70. source.InstanceLabel: "node1",
  71. source.PodLabel: "pod2",
  72. source.UIDLabel: "pod-uuid2",
  73. source.ContainerLabel: "container2",
  74. }
  75. networkZone1Info := map[string]string{
  76. source.PodNameLabel: "pod1",
  77. source.NamespaceLabel: "namespace1",
  78. source.InternetLabel: "false",
  79. source.SameRegionLabel: "true",
  80. source.SameZoneLabel: "false",
  81. source.ServiceLabel: "service1",
  82. }
  83. networkRegion1Info := map[string]string{
  84. source.PodNameLabel: "pod1",
  85. source.NamespaceLabel: "namespace1",
  86. source.InternetLabel: "false",
  87. source.SameRegionLabel: "false",
  88. source.SameZoneLabel: "false",
  89. source.ServiceLabel: "service1",
  90. }
  91. networkInternet1Info := map[string]string{
  92. source.PodNameLabel: "pod1",
  93. source.NamespaceLabel: "namespace1",
  94. source.InternetLabel: "true",
  95. source.SameRegionLabel: "false",
  96. source.SameZoneLabel: "false",
  97. source.ServiceLabel: "service1",
  98. }
  99. networkInternet2Info := map[string]string{
  100. source.PodNameLabel: "pod1",
  101. source.NamespaceLabel: "namespace1",
  102. source.InternetLabel: "true",
  103. source.SameRegionLabel: "false",
  104. source.SameZoneLabel: "false",
  105. source.ServiceLabel: "service2",
  106. }
  107. collector.Update(metric.KubeNodeLabels, node1Info, 0, start, nil)
  108. collector.Update(metric.KubeNodeLabels, node1Info, 0, end, nil)
  109. collector.Update(metric.NodeTotalHourlyCost, node1Info, 0, start, nil)
  110. collector.Update(metric.NodeTotalHourlyCost, node1Info, 0, end, nil)
  111. collector.Update(metric.NodeFSCapacityBytes, localStorage1Info, 2*GiB, start, nil)
  112. collector.Update(metric.ContainerFSUsageBytes, localStorage1Info, 1*GiB, start, nil)
  113. collector.Update(metric.ContainerFSUsageBytes, localStorage1Info, 1*GiB, end, nil)
  114. collector.Update(metric.KubeNodeStatusCapacityMemoryBytes, node1Info, 4*GiB, start, nil)
  115. collector.Update(metric.ContainerMemoryWorkingSetBytes, container1Info, 1*GiB, start, nil)
  116. collector.Update(metric.ContainerMemoryWorkingSetBytes, container2Info, 2*GiB, start, nil)
  117. collector.Update(metric.ContainerCPUUsageSecondsTotal, container1Info, 0, start, nil)
  118. collector.Update(metric.ContainerCPUUsageSecondsTotal, container1Info, 60*60*4, time1, nil)
  119. collector.Update(metric.ContainerCPUUsageSecondsTotal, container1Info, 60*60*10, end, nil)
  120. collector.Update(metric.KubecostClusterManagementCost, cluster1Info, 0.1, start, nil)
  121. collector.Update(metric.KubecostClusterManagementCost, cluster1Info, 0.1, end, nil)
  122. collector.Update(metric.DCGMFIDEVDECUTIL, gpu1Info, 0, start, nil)
  123. collector.Update(metric.DCGMFIPROFGRENGINEACTIVE, gpu1Info, 0, start, nil)
  124. collector.Update(metric.DCGMFIPROFGRENGINEACTIVE, gpu1Info, 1, end, nil)
  125. collector.Update(metric.KubecostNetworkZoneEgressCost, nil, 1, start, nil)
  126. collector.Update(metric.KubecostNetworkRegionEgressCost, nil, 2, start, nil)
  127. collector.Update(metric.KubecostNetworkInternetEgressCost, nil, 3, start, nil)
  128. collector.Update(metric.ContainerNetworkTransmitBytesTotal, pod1Info, 3*GiB, start, nil)
  129. collector.Update(metric.ContainerNetworkTransmitBytesTotal, pod1Info, 13*GiB, end, nil)
  130. collector.Update(metric.ContainerNetworkReceiveBytesTotal, pod1Info, 30*GiB, start, nil)
  131. collector.Update(metric.ContainerNetworkReceiveBytesTotal, pod1Info, 130*GiB, end, nil)
  132. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkRegion1Info, 1*GiB, start, nil)
  133. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkZone1Info, 0*GiB, start, nil)
  134. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkInternet1Info, 1*GiB, start, nil)
  135. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkInternet2Info, 1*GiB, start, nil)
  136. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkRegion1Info, 2*GiB, end, nil)
  137. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkZone1Info, 2*GiB, end, nil)
  138. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkInternet1Info, 4*GiB, end, nil)
  139. collector.Update(metric.KubecostPodNetworkEgressBytesTotal, networkInternet2Info, 5*GiB, end, nil)
  140. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkRegion1Info, 10*GiB, start, nil)
  141. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkZone1Info, 0*GiB, start, nil)
  142. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkInternet1Info, 10*GiB, start, nil)
  143. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkInternet2Info, 10*GiB, start, nil)
  144. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkRegion1Info, 20*GiB, end, nil)
  145. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkZone1Info, 20*GiB, end, nil)
  146. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkInternet1Info, 40*GiB, end, nil)
  147. collector.Update(metric.KubecostPodNetworkIngressBytesTotal, networkInternet2Info, 50*GiB, end, nil)
  148. return &MockStoreProvider{
  149. metricsCollector: collector,
  150. }
  151. }
  152. func TestCollectorMetricsQuerier_QueryNodeActiveMinutes(t *testing.T) {
  153. start1, _ := time.Parse(time.RFC3339, Start1Str)
  154. end1, _ := time.Parse(time.RFC3339, End1Str)
  155. c := collectorMetricsQuerier{
  156. collectorProvider: GetMockCollectorProvider(),
  157. }
  158. resCh := c.QueryNodeActiveMinutes(time.Now(), time.Now())
  159. res, err := resCh.Await()
  160. if err != nil {
  161. t.Errorf("unexpected error: %v", err.Error())
  162. }
  163. expected := []*source.NodeActiveMinutesResult{
  164. {
  165. Cluster: "",
  166. Node: "node1",
  167. ProviderID: "node1",
  168. Data: []*util.Vector{
  169. {
  170. Timestamp: float64(start1.Unix()),
  171. Value: 1,
  172. },
  173. {
  174. Timestamp: float64(end1.Unix()),
  175. Value: 1,
  176. },
  177. },
  178. },
  179. }
  180. if len(res) != len(expected) {
  181. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  182. }
  183. for i, got := range res {
  184. if !reflect.DeepEqual(got, expected[i]) {
  185. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  186. }
  187. }
  188. }
  189. func TestCollectorMetricsQuerier_QueryNodeRAMSystemPercent(t *testing.T) {
  190. start1, _ := time.Parse(time.RFC3339, Start1Str)
  191. end1, _ := time.Parse(time.RFC3339, End1Str)
  192. c := collectorMetricsQuerier{
  193. collectorProvider: GetMockCollectorProvider(),
  194. }
  195. resCh := c.QueryNodeRAMSystemPercent(start1, end1)
  196. res, err := resCh.Await()
  197. if err != nil {
  198. t.Errorf("unexpected error: %v", err.Error())
  199. }
  200. expected := []*source.NodeRAMSystemPercentResult{
  201. {
  202. UID: "pod-uuid2",
  203. Cluster: "",
  204. Instance: "node1",
  205. Data: []*util.Vector{
  206. {
  207. Value: .5,
  208. },
  209. },
  210. },
  211. }
  212. if len(res) != len(expected) {
  213. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  214. }
  215. for i, got := range res {
  216. if !reflect.DeepEqual(got, expected[i]) {
  217. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  218. }
  219. }
  220. }
  221. func TestCollectorMetricsQuerier_QueryNodeRAMUserPercent(t *testing.T) {
  222. start1, _ := time.Parse(time.RFC3339, Start1Str)
  223. end1, _ := time.Parse(time.RFC3339, End1Str)
  224. c := collectorMetricsQuerier{
  225. collectorProvider: GetMockCollectorProvider(),
  226. }
  227. resCh := c.QueryNodeRAMUserPercent(start1, end1)
  228. res, err := resCh.Await()
  229. if err != nil {
  230. t.Errorf("unexpected error: %v", err.Error())
  231. }
  232. expected := []*source.NodeRAMUserPercentResult{
  233. {
  234. UID: "pod-uuid1",
  235. Cluster: "",
  236. Instance: "node1",
  237. Data: []*util.Vector{
  238. {
  239. Value: .25,
  240. },
  241. },
  242. },
  243. }
  244. if len(res) != len(expected) {
  245. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  246. }
  247. for i, got := range res {
  248. if !reflect.DeepEqual(got, expected[i]) {
  249. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  250. }
  251. }
  252. }
  253. func TestCollectorMetricsQuerier_QueryClusterManagementDuration(t *testing.T) {
  254. start1, _ := time.Parse(time.RFC3339, Start1Str)
  255. end1, _ := time.Parse(time.RFC3339, End1Str)
  256. c := collectorMetricsQuerier{
  257. collectorProvider: GetMockCollectorProvider(),
  258. }
  259. resCh := c.QueryClusterManagementDuration(start1, end1)
  260. res, err := resCh.Await()
  261. if err != nil {
  262. t.Errorf("unexpected error: %v", err.Error())
  263. }
  264. expected := []*source.ClusterManagementDurationResult{
  265. {
  266. Cluster: "",
  267. Provisioner: "GKE",
  268. Data: []*util.Vector{
  269. {
  270. Timestamp: float64(start1.Unix()),
  271. Value: 1,
  272. },
  273. {
  274. Timestamp: float64(end1.Unix()),
  275. Value: 1,
  276. },
  277. },
  278. },
  279. }
  280. if len(res) != len(expected) {
  281. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  282. }
  283. for i, got := range res {
  284. if !reflect.DeepEqual(got, expected[i]) {
  285. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  286. }
  287. }
  288. }
  289. func Test_collectorMetricsQuerier_QueryCPUUsageAvg(t *testing.T) {
  290. start1, _ := time.Parse(time.RFC3339, Start1Str)
  291. end1, _ := time.Parse(time.RFC3339, End1Str)
  292. c := collectorMetricsQuerier{
  293. collectorProvider: GetMockCollectorProvider(),
  294. }
  295. resCh := c.QueryCPUUsageAvg(start1, end1)
  296. res, err := resCh.Await()
  297. if err != nil {
  298. t.Errorf("unexpected error: %v", err.Error())
  299. }
  300. expected := []*source.CPUUsageAvgResult{
  301. {
  302. UID: "pod-uuid1",
  303. Cluster: "",
  304. Namespace: "namespace1",
  305. Node: "node1",
  306. Instance: "node1",
  307. Pod: "pod1",
  308. Container: "container1",
  309. Data: []*util.Vector{
  310. {
  311. Value: 10,
  312. },
  313. },
  314. },
  315. }
  316. if len(res) != len(expected) {
  317. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  318. }
  319. for i, got := range res {
  320. if !reflect.DeepEqual(got, expected[i]) {
  321. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  322. }
  323. }
  324. }
  325. func Test_collectorMetricsQuerier_QueryCPUUsageMax(t *testing.T) {
  326. start1, _ := time.Parse(time.RFC3339, Start1Str)
  327. end1, _ := time.Parse(time.RFC3339, End1Str)
  328. c := collectorMetricsQuerier{
  329. collectorProvider: GetMockCollectorProvider(),
  330. }
  331. resCh := c.QueryCPUUsageMax(start1, end1)
  332. res, err := resCh.Await()
  333. if err != nil {
  334. t.Errorf("unexpected error: %v", err.Error())
  335. }
  336. expected := []*source.CPUUsageMaxResult{
  337. {
  338. UID: "pod-uuid1",
  339. Cluster: "",
  340. Namespace: "namespace1",
  341. Node: "node1",
  342. Instance: "node1",
  343. Pod: "pod1",
  344. Container: "container1",
  345. Data: []*util.Vector{
  346. {
  347. Value: 12,
  348. },
  349. },
  350. },
  351. }
  352. if len(res) != len(expected) {
  353. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  354. }
  355. for i, got := range res {
  356. if !reflect.DeepEqual(got, expected[i]) {
  357. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  358. }
  359. }
  360. }
  361. func TestCollectorMetricsQuerier_QueryGPUsUsageAvg(t *testing.T) {
  362. start1, _ := time.Parse(time.RFC3339, Start1Str)
  363. end1, _ := time.Parse(time.RFC3339, End1Str)
  364. c := collectorMetricsQuerier{
  365. collectorProvider: GetMockCollectorProvider(),
  366. }
  367. resCh := c.QueryGPUsUsageAvg(start1, end1)
  368. res, err := resCh.Await()
  369. if err != nil {
  370. t.Errorf("unexpected error: %v", err.Error())
  371. }
  372. expected := []*source.GPUsUsageAvgResult{
  373. {
  374. UID: "pod-uuid1",
  375. Cluster: "",
  376. Namespace: "namespace1",
  377. Pod: "pod1",
  378. Container: "container1",
  379. Data: []*util.Vector{
  380. {
  381. Value: 0.5,
  382. },
  383. },
  384. },
  385. }
  386. if len(res) != len(expected) {
  387. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  388. }
  389. for i, got := range res {
  390. if !reflect.DeepEqual(got, expected[i]) {
  391. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  392. }
  393. }
  394. }
  395. func TestCollectorMetricsQuerier_QueryGPUsUsageMax(t *testing.T) {
  396. start1, _ := time.Parse(time.RFC3339, Start1Str)
  397. end1, _ := time.Parse(time.RFC3339, End1Str)
  398. c := collectorMetricsQuerier{
  399. collectorProvider: GetMockCollectorProvider(),
  400. }
  401. resCh := c.QueryGPUsUsageMax(start1, end1)
  402. res, err := resCh.Await()
  403. if err != nil {
  404. t.Errorf("unexpected error: %v", err.Error())
  405. }
  406. expected := []*source.GPUsUsageMaxResult{
  407. {
  408. UID: "pod-uuid1",
  409. Cluster: "",
  410. Namespace: "namespace1",
  411. Pod: "pod1",
  412. Container: "container1",
  413. Data: []*util.Vector{
  414. {
  415. Value: 1.0,
  416. },
  417. },
  418. },
  419. }
  420. if len(res) != len(expected) {
  421. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  422. }
  423. for i, got := range res {
  424. if !reflect.DeepEqual(got, expected[i]) {
  425. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  426. }
  427. }
  428. }
  429. func TestCollectorMetricsQuerier_QueryGPUInfo(t *testing.T) {
  430. start1, _ := time.Parse(time.RFC3339, Start1Str)
  431. end1, _ := time.Parse(time.RFC3339, End1Str)
  432. c := collectorMetricsQuerier{
  433. collectorProvider: GetMockCollectorProvider(),
  434. }
  435. resCh := c.QueryGPUInfo(start1, end1)
  436. res, err := resCh.Await()
  437. if err != nil {
  438. t.Errorf("unexpected error: %v", err.Error())
  439. }
  440. expected := []*source.GPUInfoResult{
  441. {
  442. UID: "pod-uuid1",
  443. Cluster: "",
  444. Namespace: "namespace1",
  445. Pod: "pod1",
  446. Container: "container1",
  447. Device: "nvidia0",
  448. ModelName: "Tesla T4",
  449. UUID: "GPU-1",
  450. Data: []*util.Vector{
  451. {
  452. Value: 1,
  453. },
  454. },
  455. },
  456. }
  457. if len(res) != len(expected) {
  458. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  459. }
  460. for i, got := range res {
  461. if !reflect.DeepEqual(got, expected[i]) {
  462. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  463. }
  464. }
  465. }
  466. func Test_collectorMetricsQuerier_QueryNetZoneGiB(t *testing.T) {
  467. start1, _ := time.Parse(time.RFC3339, Start1Str)
  468. end1, _ := time.Parse(time.RFC3339, End1Str)
  469. c := collectorMetricsQuerier{
  470. collectorProvider: GetMockCollectorProvider(),
  471. }
  472. resCh := c.QueryNetZoneGiB(start1, end1)
  473. res, err := resCh.Await()
  474. if err != nil {
  475. t.Errorf("unexpected error: %v", err.Error())
  476. }
  477. expected := []*source.NetZoneGiBResult{
  478. {
  479. Cluster: "",
  480. Namespace: "namespace1",
  481. Pod: "pod1",
  482. Data: []*util.Vector{
  483. {
  484. Value: 2,
  485. },
  486. },
  487. },
  488. }
  489. if len(res) != len(expected) {
  490. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  491. }
  492. for i, got := range res {
  493. if !reflect.DeepEqual(got, expected[i]) {
  494. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  495. }
  496. }
  497. }
  498. func Test_collectorMetricsQuerier_QueryNetZonePricePerGiB(t *testing.T) {
  499. start1, _ := time.Parse(time.RFC3339, Start1Str)
  500. end1, _ := time.Parse(time.RFC3339, End1Str)
  501. c := collectorMetricsQuerier{
  502. collectorProvider: GetMockCollectorProvider(),
  503. }
  504. resCh := c.QueryNetZonePricePerGiB(start1, end1)
  505. res, err := resCh.Await()
  506. if err != nil {
  507. t.Errorf("unexpected error: %v", err.Error())
  508. }
  509. expected := []*source.NetZonePricePerGiBResult{
  510. {
  511. Cluster: "",
  512. Data: []*util.Vector{
  513. {
  514. Value: 1,
  515. },
  516. },
  517. },
  518. }
  519. if len(res) != len(expected) {
  520. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  521. }
  522. for i, got := range res {
  523. if !reflect.DeepEqual(got, expected[i]) {
  524. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  525. }
  526. }
  527. }
  528. func Test_collectorMetricsQuerier_QueryNetRegionGiB(t *testing.T) {
  529. start1, _ := time.Parse(time.RFC3339, Start1Str)
  530. end1, _ := time.Parse(time.RFC3339, End1Str)
  531. c := collectorMetricsQuerier{
  532. collectorProvider: GetMockCollectorProvider(),
  533. }
  534. resCh := c.QueryNetRegionGiB(start1, end1)
  535. res, err := resCh.Await()
  536. if err != nil {
  537. t.Errorf("unexpected error: %v", err.Error())
  538. }
  539. expected := []*source.NetRegionGiBResult{
  540. {
  541. Cluster: "",
  542. Namespace: "namespace1",
  543. Pod: "pod1",
  544. Data: []*util.Vector{
  545. {
  546. Value: 1,
  547. },
  548. },
  549. },
  550. }
  551. if len(res) != len(expected) {
  552. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  553. }
  554. for i, got := range res {
  555. if !reflect.DeepEqual(got, expected[i]) {
  556. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  557. }
  558. }
  559. }
  560. func Test_collectorMetricsQuerier_QueryNetRegionPricePerGiB(t *testing.T) {
  561. start1, _ := time.Parse(time.RFC3339, Start1Str)
  562. end1, _ := time.Parse(time.RFC3339, End1Str)
  563. c := collectorMetricsQuerier{
  564. collectorProvider: GetMockCollectorProvider(),
  565. }
  566. resCh := c.QueryNetRegionPricePerGiB(start1, end1)
  567. res, err := resCh.Await()
  568. if err != nil {
  569. t.Errorf("unexpected error: %v", err.Error())
  570. }
  571. expected := []*source.NetRegionPricePerGiBResult{
  572. {
  573. Cluster: "",
  574. Data: []*util.Vector{
  575. {
  576. Value: 2,
  577. },
  578. },
  579. },
  580. }
  581. if len(res) != len(expected) {
  582. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  583. }
  584. for i, got := range res {
  585. if !reflect.DeepEqual(got, expected[i]) {
  586. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  587. }
  588. }
  589. }
  590. func Test_collectorMetricsQuerier_QueryNetInternetGiB(t *testing.T) {
  591. start1, _ := time.Parse(time.RFC3339, Start1Str)
  592. end1, _ := time.Parse(time.RFC3339, End1Str)
  593. c := collectorMetricsQuerier{
  594. collectorProvider: GetMockCollectorProvider(),
  595. }
  596. resCh := c.QueryNetInternetGiB(start1, end1)
  597. res, err := resCh.Await()
  598. if err != nil {
  599. t.Errorf("unexpected error: %v", err.Error())
  600. }
  601. expected := []*source.NetInternetGiBResult{
  602. {
  603. Cluster: "",
  604. Namespace: "namespace1",
  605. Pod: "pod1",
  606. Data: []*util.Vector{
  607. {
  608. Value: 7,
  609. },
  610. },
  611. },
  612. }
  613. if len(res) != len(expected) {
  614. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  615. }
  616. for i, got := range res {
  617. if !reflect.DeepEqual(got, expected[i]) {
  618. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  619. }
  620. }
  621. }
  622. func Test_collectorMetricsQuerier_QueryNetInternetPricePerGiB(t *testing.T) {
  623. start1, _ := time.Parse(time.RFC3339, Start1Str)
  624. end1, _ := time.Parse(time.RFC3339, End1Str)
  625. c := collectorMetricsQuerier{
  626. collectorProvider: GetMockCollectorProvider(),
  627. }
  628. resCh := c.QueryNetInternetPricePerGiB(start1, end1)
  629. res, err := resCh.Await()
  630. if err != nil {
  631. t.Errorf("unexpected error: %v", err.Error())
  632. }
  633. expected := []*source.NetInternetPricePerGiBResult{
  634. {
  635. Cluster: "",
  636. Data: []*util.Vector{
  637. {
  638. Value: 3,
  639. },
  640. },
  641. },
  642. }
  643. if len(res) != len(expected) {
  644. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  645. }
  646. for i, got := range res {
  647. if !reflect.DeepEqual(got, expected[i]) {
  648. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  649. }
  650. }
  651. }
  652. func Test_collectorMetricsQuerier_QueryNetInternetServiceGiB(t *testing.T) {
  653. start1, _ := time.Parse(time.RFC3339, Start1Str)
  654. end1, _ := time.Parse(time.RFC3339, End1Str)
  655. c := collectorMetricsQuerier{
  656. collectorProvider: GetMockCollectorProvider(),
  657. }
  658. resCh := c.QueryNetInternetServiceGiB(start1, end1)
  659. res, err := resCh.Await()
  660. if err != nil {
  661. t.Errorf("unexpected error: %v", err.Error())
  662. }
  663. expected := []*source.NetInternetServiceGiBResult{
  664. {
  665. Cluster: "",
  666. Namespace: "namespace1",
  667. Pod: "pod1",
  668. Service: "service1",
  669. Data: []*util.Vector{
  670. {
  671. Value: 3,
  672. },
  673. },
  674. },
  675. {
  676. Cluster: "",
  677. Namespace: "namespace1",
  678. Pod: "pod1",
  679. Service: "service2",
  680. Data: []*util.Vector{
  681. {
  682. Value: 4,
  683. },
  684. },
  685. },
  686. }
  687. if len(res) != len(expected) {
  688. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  689. }
  690. slices.SortFunc(res, func(a, b *source.NetInternetServiceGiBResult) int {
  691. return cmp.Compare(a.Service, b.Service)
  692. })
  693. for i, got := range res {
  694. if !reflect.DeepEqual(got, expected[i]) {
  695. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  696. }
  697. }
  698. }
  699. func Test_collectorMetricsQuerier_QueryNetTransferBytes(t *testing.T) {
  700. start1, _ := time.Parse(time.RFC3339, Start1Str)
  701. end1, _ := time.Parse(time.RFC3339, End1Str)
  702. c := collectorMetricsQuerier{
  703. collectorProvider: GetMockCollectorProvider(),
  704. }
  705. resCh := c.QueryNetTransferBytes(start1, end1)
  706. res, err := resCh.Await()
  707. if err != nil {
  708. t.Errorf("unexpected error: %v", err.Error())
  709. }
  710. expected := []*source.NetTransferBytesResult{
  711. {
  712. UID: "pod-uuid1",
  713. Cluster: "",
  714. Namespace: "namespace1",
  715. Pod: "pod1",
  716. Data: []*util.Vector{
  717. {
  718. Value: 10 * GiB,
  719. },
  720. },
  721. },
  722. }
  723. if len(res) != len(expected) {
  724. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  725. }
  726. for i, got := range res {
  727. if !reflect.DeepEqual(got, expected[i]) {
  728. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  729. }
  730. }
  731. }
  732. func Test_collectorMetricsQuerier_QueryNetZoneIngressGiB(t *testing.T) {
  733. start1, _ := time.Parse(time.RFC3339, Start1Str)
  734. end1, _ := time.Parse(time.RFC3339, End1Str)
  735. c := collectorMetricsQuerier{
  736. collectorProvider: GetMockCollectorProvider(),
  737. }
  738. resCh := c.QueryNetZoneIngressGiB(start1, end1)
  739. res, err := resCh.Await()
  740. if err != nil {
  741. t.Errorf("unexpected error: %v", err.Error())
  742. }
  743. expected := []*source.NetZoneIngressGiBResult{
  744. {
  745. Cluster: "",
  746. Namespace: "namespace1",
  747. Pod: "pod1",
  748. Data: []*util.Vector{
  749. {
  750. Value: 20,
  751. },
  752. },
  753. },
  754. }
  755. if len(res) != len(expected) {
  756. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  757. }
  758. for i, got := range res {
  759. if !reflect.DeepEqual(got, expected[i]) {
  760. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  761. }
  762. }
  763. }
  764. func Test_collectorMetricsQuerier_QueryNetRegionIngressGiB(t *testing.T) {
  765. start1, _ := time.Parse(time.RFC3339, Start1Str)
  766. end1, _ := time.Parse(time.RFC3339, End1Str)
  767. c := collectorMetricsQuerier{
  768. collectorProvider: GetMockCollectorProvider(),
  769. }
  770. resCh := c.QueryNetRegionIngressGiB(start1, end1)
  771. res, err := resCh.Await()
  772. if err != nil {
  773. t.Errorf("unexpected error: %v", err.Error())
  774. }
  775. expected := []*source.NetRegionIngressGiBResult{
  776. {
  777. Cluster: "",
  778. Namespace: "namespace1",
  779. Pod: "pod1",
  780. Data: []*util.Vector{
  781. {
  782. Value: 10,
  783. },
  784. },
  785. },
  786. }
  787. if len(res) != len(expected) {
  788. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  789. }
  790. for i, got := range res {
  791. if !reflect.DeepEqual(got, expected[i]) {
  792. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  793. }
  794. }
  795. }
  796. func Test_collectorMetricsQuerier_QueryNetInternetIngressGiB(t *testing.T) {
  797. start1, _ := time.Parse(time.RFC3339, Start1Str)
  798. end1, _ := time.Parse(time.RFC3339, End1Str)
  799. c := collectorMetricsQuerier{
  800. collectorProvider: GetMockCollectorProvider(),
  801. }
  802. resCh := c.QueryNetInternetIngressGiB(start1, end1)
  803. res, err := resCh.Await()
  804. if err != nil {
  805. t.Errorf("unexpected error: %v", err.Error())
  806. }
  807. expected := []*source.NetInternetIngressGiBResult{
  808. {
  809. Cluster: "",
  810. Namespace: "namespace1",
  811. Pod: "pod1",
  812. Data: []*util.Vector{
  813. {
  814. Value: 70,
  815. },
  816. },
  817. },
  818. }
  819. if len(res) != len(expected) {
  820. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  821. }
  822. for i, got := range res {
  823. if !reflect.DeepEqual(got, expected[i]) {
  824. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  825. }
  826. }
  827. }
  828. func Test_collectorMetricsQuerier_QueryNetInternetServiceIngressGiB(t *testing.T) {
  829. start1, _ := time.Parse(time.RFC3339, Start1Str)
  830. end1, _ := time.Parse(time.RFC3339, End1Str)
  831. c := collectorMetricsQuerier{
  832. collectorProvider: GetMockCollectorProvider(),
  833. }
  834. resCh := c.QueryNetInternetServiceIngressGiB(start1, end1)
  835. res, err := resCh.Await()
  836. if err != nil {
  837. t.Errorf("unexpected error: %v", err.Error())
  838. }
  839. expected := []*source.NetInternetServiceIngressGiBResult{
  840. {
  841. Cluster: "",
  842. Namespace: "namespace1",
  843. Pod: "pod1",
  844. Service: "service1",
  845. Data: []*util.Vector{
  846. {
  847. Value: 30,
  848. },
  849. },
  850. },
  851. {
  852. Cluster: "",
  853. Namespace: "namespace1",
  854. Pod: "pod1",
  855. Service: "service2",
  856. Data: []*util.Vector{
  857. {
  858. Value: 40,
  859. },
  860. },
  861. },
  862. }
  863. if len(res) != len(expected) {
  864. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  865. }
  866. slices.SortFunc(res, func(a, b *source.NetInternetServiceIngressGiBResult) int {
  867. return cmp.Compare(a.Service, b.Service)
  868. })
  869. for i, got := range res {
  870. if !reflect.DeepEqual(got, expected[i]) {
  871. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  872. }
  873. }
  874. }
  875. func Test_collectorMetricsQuerier_QueryNetReceiveBytes(t *testing.T) {
  876. start1, _ := time.Parse(time.RFC3339, Start1Str)
  877. end1, _ := time.Parse(time.RFC3339, End1Str)
  878. c := collectorMetricsQuerier{
  879. collectorProvider: GetMockCollectorProvider(),
  880. }
  881. resCh := c.QueryNetReceiveBytes(start1, end1)
  882. res, err := resCh.Await()
  883. if err != nil {
  884. t.Errorf("unexpected error: %v", err.Error())
  885. }
  886. expected := []*source.NetReceiveBytesResult{
  887. {
  888. UID: "pod-uuid1",
  889. Cluster: "",
  890. Namespace: "namespace1",
  891. Pod: "pod1",
  892. Data: []*util.Vector{
  893. {
  894. Value: 100 * GiB,
  895. },
  896. },
  897. },
  898. }
  899. if len(res) != len(expected) {
  900. t.Errorf("length of result was not as expected: got = %d, want %d", len(res), len(expected))
  901. }
  902. for i, got := range res {
  903. if !reflect.DeepEqual(got, expected[i]) {
  904. t.Errorf("result at index %d did not match: got = %v, want %v", i, got, expected[i])
  905. }
  906. }
  907. }