validate.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package prom
  2. import (
  3. "fmt"
  4. "github.com/opencost/opencost/pkg/env"
  5. prometheus "github.com/prometheus/client_golang/api"
  6. )
  7. var (
  8. prometheusValidateQuery string = "up"
  9. thanosValidateQuery string = fmt.Sprintf("up offset %s", env.GetThanosOffset())
  10. )
  11. // PrometheusMetadata represents a validation result for prometheus/thanos running
  12. // opencost.
  13. type PrometheusMetadata struct {
  14. Running bool `json:"running"`
  15. KubecostDataExists bool `json:"kubecostDataExists"`
  16. }
  17. // Validate tells the model what data prometheus has on it.
  18. func Validate(cli prometheus.Client) (*PrometheusMetadata, error) {
  19. if IsThanos(cli) {
  20. return validate(cli, thanosValidateQuery)
  21. }
  22. return validate(cli, prometheusValidateQuery)
  23. }
  24. // validate executes the prometheus query against the provided client.
  25. func validate(cli prometheus.Client, q string) (*PrometheusMetadata, error) {
  26. ctx := NewContext(cli)
  27. resUp, _, err := ctx.QuerySync(q)
  28. if err != nil {
  29. return &PrometheusMetadata{
  30. Running: false,
  31. KubecostDataExists: false,
  32. }, err
  33. }
  34. if len(resUp) == 0 {
  35. return &PrometheusMetadata{
  36. Running: false,
  37. KubecostDataExists: false,
  38. }, fmt.Errorf("no running jobs on Prometheus at %s", ctx.QueryURL().Path)
  39. }
  40. for _, result := range resUp {
  41. job, err := result.GetString("job")
  42. if err != nil {
  43. return &PrometheusMetadata{
  44. Running: false,
  45. KubecostDataExists: false,
  46. }, fmt.Errorf("up query does not have job names")
  47. }
  48. if job == "kubecost" {
  49. return &PrometheusMetadata{
  50. Running: true,
  51. KubecostDataExists: true,
  52. }, err
  53. }
  54. }
  55. return &PrometheusMetadata{
  56. Running: true,
  57. KubecostDataExists: false,
  58. }, nil
  59. }