validate.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 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. return validate(cli, validationQueryFor(config), config)
  16. }
  17. func validationQueryFor(config *OpenCostPrometheusConfig) string {
  18. if config.Offset != "" {
  19. return fmt.Sprintf("%s offset %s", UpQuery, config.Offset)
  20. }
  21. return UpQuery
  22. }
  23. // validate executes the prometheus query against the provided client.
  24. func validate(cli prometheus.Client, q string, config *OpenCostPrometheusConfig) (*PrometheusMetadata, error) {
  25. ctx := NewContext(cli, config)
  26. resUp, _, err := ctx.QuerySync(q)
  27. if err != nil {
  28. return &PrometheusMetadata{
  29. Running: false,
  30. KubecostDataExists: false,
  31. }, err
  32. }
  33. if len(resUp) == 0 {
  34. return &PrometheusMetadata{
  35. Running: false,
  36. KubecostDataExists: false,
  37. }, fmt.Errorf("no running jobs on Prometheus at %s", ctx.QueryURL().Path)
  38. }
  39. for _, result := range resUp {
  40. job, err := result.GetString("job")
  41. if err != nil {
  42. return &PrometheusMetadata{
  43. Running: false,
  44. KubecostDataExists: false,
  45. }, fmt.Errorf("up query does not have job names")
  46. }
  47. if job == config.JobName {
  48. return &PrometheusMetadata{
  49. Running: true,
  50. KubecostDataExists: true,
  51. }, err
  52. }
  53. }
  54. return &PrometheusMetadata{
  55. Running: true,
  56. KubecostDataExists: false,
  57. }, nil
  58. }