mirror of https://github.com/grafana/grafana.git
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
|
|
package api
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||
|
|
m "github.com/grafana/grafana/pkg/models"
|
||
|
|
"github.com/grafana/grafana/pkg/plugins"
|
||
|
|
"github.com/grafana/grafana/pkg/setting"
|
||
|
|
"github.com/grafana/grafana/pkg/tsdb"
|
||
|
|
)
|
||
|
|
|
||
|
|
// POST /api/tsdb/transform
|
||
|
|
// This enpoint is tempory, will be part of v2 query endpoint.
|
||
|
|
func (hs *HTTPServer) Transform(c *m.ReqContext, reqDto dtos.MetricRequest) Response {
|
||
|
|
if !setting.IsExpressionsEnabled() {
|
||
|
|
return Error(404, "Expressions feature toggle is not enabled", nil)
|
||
|
|
}
|
||
|
|
if plugins.Transform == nil {
|
||
|
|
return Error(http.StatusServiceUnavailable, "transform plugin is not loaded", nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
timeRange := tsdb.NewTimeRange(reqDto.From, reqDto.To)
|
||
|
|
|
||
|
|
if len(reqDto.Queries) == 0 {
|
||
|
|
return Error(400, "No queries found in query", nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
var datasourceID int64
|
||
|
|
for _, query := range reqDto.Queries {
|
||
|
|
name, err := query.Get("datasource").String()
|
||
|
|
if err != nil {
|
||
|
|
return Error(500, "datasource missing name", err)
|
||
|
|
}
|
||
|
|
datasourceID, err = query.Get("datasourceId").Int64()
|
||
|
|
if err != nil {
|
||
|
|
return Error(400, "GEL datasource missing ID", nil)
|
||
|
|
}
|
||
|
|
if name == "-- GEL --" {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
ds, err := hs.DatasourceCache.GetDatasource(datasourceID, c.SignedInUser, c.SkipCache)
|
||
|
|
if err != nil {
|
||
|
|
if err == m.ErrDataSourceAccessDenied {
|
||
|
|
return Error(403, "Access denied to datasource", err)
|
||
|
|
}
|
||
|
|
return Error(500, "Unable to load datasource meta data", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
request := &tsdb.TsdbQuery{TimeRange: timeRange, Debug: reqDto.Debug}
|
||
|
|
|
||
|
|
for _, query := range reqDto.Queries {
|
||
|
|
request.Queries = append(request.Queries, &tsdb.Query{
|
||
|
|
RefId: query.Get("refId").MustString("A"),
|
||
|
|
MaxDataPoints: query.Get("maxDataPoints").MustInt64(100),
|
||
|
|
IntervalMs: query.Get("intervalMs").MustInt64(1000),
|
||
|
|
Model: query,
|
||
|
|
DataSource: ds,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
resp, err := plugins.Transform.Transform(c.Req.Context(), ds, request)
|
||
|
|
if err != nil {
|
||
|
|
return Error(500, "Transform request error", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
statusCode := 200
|
||
|
|
for _, res := range resp.Results {
|
||
|
|
if res.Error != nil {
|
||
|
|
res.ErrorString = res.Error.Error()
|
||
|
|
resp.Message = res.ErrorString
|
||
|
|
statusCode = 400
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return JSON(statusCode, &resp)
|
||
|
|
}
|