2
0

queryservice.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package customcost
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/julienschmidt/httprouter"
  6. "github.com/opencost/opencost/core/pkg/util/httputil"
  7. "go.opentelemetry.io/otel"
  8. )
  9. const tracerName = "github.com/opencost/opencost/pkg/customcost"
  10. type QueryService struct {
  11. Querier Querier
  12. }
  13. func NewQueryService(querier Querier) *QueryService {
  14. return &QueryService{
  15. Querier: querier,
  16. }
  17. }
  18. func (qs *QueryService) GetCustomCostTotalHandler() func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  19. return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  20. tracer := otel.Tracer(tracerName)
  21. ctx, span := tracer.Start(r.Context(), "Service.GetCustomCostTotalHandler")
  22. defer span.End()
  23. // If Query Service is nil, always return 501
  24. if qs == nil {
  25. http.Error(w, "Query Service is nil", http.StatusNotImplemented)
  26. return
  27. }
  28. if qs.Querier == nil {
  29. http.Error(w, "CustomCost Query Service is nil", http.StatusNotImplemented)
  30. return
  31. }
  32. qp := httputil.NewQueryParams(r.URL.Query())
  33. request, err := ParseCustomCostTotalRequest(qp)
  34. if err != nil {
  35. http.Error(w, err.Error(), http.StatusBadRequest)
  36. return
  37. }
  38. resp, err := qs.Querier.QueryTotal(ctx, *request)
  39. if err != nil {
  40. http.Error(w, fmt.Sprintf("Internal server error: %s", err), http.StatusInternalServerError)
  41. return
  42. }
  43. _, spanResp := tracer.Start(ctx, "write response")
  44. w.Header().Set("Content-Type", "application/json")
  45. protocol.WriteData(w, resp)
  46. spanResp.End()
  47. }
  48. }
  49. func (qs *QueryService) GetCustomCostTimeseriesHandler() func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  50. return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  51. tracer := otel.Tracer(tracerName)
  52. ctx, span := tracer.Start(r.Context(), "Service.GetCustomCostTimeseriesHandler")
  53. defer span.End()
  54. // If Query Service is nil, always return 501
  55. if qs == nil {
  56. http.Error(w, "Query Service is nil", http.StatusNotImplemented)
  57. return
  58. }
  59. if qs.Querier == nil {
  60. http.Error(w, "CustomCost Query Service is nil", http.StatusNotImplemented)
  61. return
  62. }
  63. qp := httputil.NewQueryParams(r.URL.Query())
  64. request, err := ParseCustomCostTimeseriesRequest(qp)
  65. if err != nil {
  66. http.Error(w, err.Error(), http.StatusBadRequest)
  67. return
  68. }
  69. resp, err := qs.Querier.QueryTimeseries(ctx, *request)
  70. if err != nil {
  71. http.Error(w, fmt.Sprintf("Internal server error: %s", err), http.StatusInternalServerError)
  72. return
  73. }
  74. _, spanResp := tracer.Start(ctx, "write response")
  75. w.Header().Set("Content-Type", "application/json")
  76. protocol.WriteData(w, resp)
  77. spanResp.End()
  78. }
  79. }