Files
cloudpods/pkg/monitor/tsdb/driver/influxdb/query_parser.go
2020-03-02 20:00:08 +08:00

98 lines
2.4 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package influxdb
import (
"time"
api "yunion.io/x/onecloud/pkg/apis/monitor"
"yunion.io/x/onecloud/pkg/monitor/tsdb"
)
type InfluxdbQueryParser struct{}
func (qp *InfluxdbQueryParser) Parse(model *tsdb.Query, dsInfo *tsdb.DataSource) (*Query, error) {
policy := "default"
if model.Policy != "" {
policy = model.Policy
}
alias := model.Alias
tz := model.Tz
measurement := model.Measurement
resultFormat := model.ResultFormat
tags := model.Tags
groupBys, err := qp.parseGroupBy(model.GroupBy)
if err != nil {
return nil, err
}
selects, err := qp.parseSelects(model.Selects)
if err != nil {
return nil, err
}
parsedInterval, err := tsdb.GetIntervalFrom(dsInfo, model, time.Millisecond*1)
if err != nil {
return nil, err
}
return &Query{
Measurement: measurement,
Policy: policy,
ResultFormat: resultFormat,
GroupBy: groupBys,
Tags: tags,
Selects: selects,
Interval: parsedInterval,
Alias: alias,
Tz: tz,
}, nil
}
func (qp *InfluxdbQueryParser) parseSelects(selects []api.MetricQuerySelect) ([]*Select, error) {
var result []*Select
for _, selectObj := range selects {
var parts Select
for _, part := range selectObj {
queryPart, err := qp.parseQueryPart(part)
if err != nil {
return nil, err
}
parts = append(parts, *queryPart)
}
result = append(result, &parts)
}
return result, nil
}
func (qp *InfluxdbQueryParser) parseGroupBy(groupBy []api.MetricQueryPart) ([]*QueryPart, error) {
var result []*QueryPart
for _, gb := range groupBy {
queryPart, err := qp.parseQueryPart(gb)
if err != nil {
return nil, err
}
result = append(result, queryPart)
}
return result, nil
}
func (qp *InfluxdbQueryParser) parseQueryPart(part api.MetricQueryPart) (*QueryPart, error) {
return NewQueryPart(part.Type, part.Params)
}