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) | ||
|  | } |