in connectors/grafana-plugin/pkg/plugin/plugin.go [210:321]
func (d *IoTDBDataSource) query(cxt context.Context, pCtx backend.PluginContext, query backend.DataQuery) backend.DataResponse {
response := backend.DataResponse{}
instanceSettings := pCtx.DataSourceInstanceSettings
var authorization = ""
if password, exists := instanceSettings.DecryptedSecureJSONData["password"]; exists {
// Use the decrypted API key.
authorization = "Basic " + base64.StdEncoding.EncodeToString([]byte(d.Username+":"+password))
}
// Unmarshal the JSON into our queryModel.
var qdReq QueryDataReq
qp, msg := verifyQuery(query)
if msg == "none" {
return response
} else if msg != "" {
response.Error = errors.New(msg)
return response
}
qp.StartTime = query.TimeRange.From.UnixNano() / 1000000
qp.EndTime = query.TimeRange.To.UnixNano() / 1000000
if qp.SqlType == "SQL: Drop-down List" {
qp.Control = ""
var expressions []string = qp.Paths[len(qp.Paths)-1:]
var paths []string = qp.Paths[0 : len(qp.Paths)-1]
path := "root." + strings.Join(paths, ".")
var prefixPaths = []string{path}
if qp.AggregateFun != "" {
expressions[0] = qp.AggregateFun + "(" + expressions[0] + ")"
}
if qp.GroupBy.SamplingInterval != "" && qp.GroupBy.Step == "" {
qp.Control += " group by([" + strconv.FormatInt(qp.StartTime, 10) + "," + strconv.FormatInt(qp.EndTime, 10) + ")," + qp.GroupBy.SamplingInterval + ")"
}
if qp.GroupBy.SamplingInterval != "" && qp.GroupBy.Step != "" {
qp.Control += " group by([" + strconv.FormatInt(qp.StartTime, 10) + "," + strconv.FormatInt(qp.EndTime, 10) + ")," + qp.GroupBy.SamplingInterval + "," + qp.GroupBy.Step + ")"
}
if qp.GroupBy.GroupByLevel != "" {
qp.Control += " " + qp.GroupBy.GroupByLevel
}
if qp.FillClauses != "" {
qp.Control += " fill" + qp.FillClauses
}
qdReq = *NewQueryDataReq(expressions, prefixPaths, qp.StartTime, qp.EndTime, qp.Condition, qp.Control)
} else if qp.SqlType == "SQL: Full Customized" {
qdReq = *NewQueryDataReq(qp.Expression, qp.PrefixPath, qp.StartTime, qp.EndTime, qp.Condition, qp.Control)
} else {
return response
}
qpJson, _ := json.Marshal(qdReq)
reader := bytes.NewReader(qpJson)
var dataSourceUrl = DataSourceUrlHandler(d.Ulr)
request, _ := http.NewRequest(http.MethodPost, dataSourceUrl+"/grafana/v1/query/expression", reader)
request.Header.Set("Content-Type", "application/json")
request.Header.Add("Authorization", authorization)
rsp, _ := d.httpClient.Do(request)
body, err := io.ReadAll(rsp.Body)
if err != nil {
response.Error = errors.New("Data source is not working properly")
log.DefaultLogger.Error("Data source is not working properly", err)
return response
}
var queryDataResp QueryDataResponse
err = json.Unmarshal(body, &queryDataResp)
if err != nil {
response.Error = errors.New("Parsing JSON error")
log.DefaultLogger.Error("Parsing JSON error", err)
return response
}
defer rsp.Body.Close()
if queryDataResp.Code > 0 {
response.Error = errors.New(queryDataResp.Message)
log.DefaultLogger.Error(queryDataResp.Message)
return response
}
// create data frame response.
frame := data.NewFrame("response")
for i := 0; i < len(queryDataResp.Expressions); i++ {
if queryDataResp.Timestamps != nil && len(queryDataResp.Timestamps) > 0 {
times := make([]time.Time, len(queryDataResp.Timestamps))
for c := 0; c < len(queryDataResp.Timestamps); c++ {
times[c] = time.Unix(0, queryDataResp.Timestamps[c]*1000000)
}
if queryDataResp.Values != nil && len(queryDataResp.Values) > 0 {
values := recoverType(queryDataResp.Values[i])
frame.Fields = append(frame.Fields,
data.NewField("time", nil, times),
data.NewField(queryDataResp.Expressions[i], nil, values),
)
}
} else {
if queryDataResp.Values != nil && len(queryDataResp.Values) > 0 {
values := recoverType(queryDataResp.Values[i])
frame.Fields = append(frame.Fields,
data.NewField(queryDataResp.Expressions[i], nil, values),
)
}
}
}
response.Frames = append(response.Frames, frame)
return response
}