validate.go 1.8 KB

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