add preview api
This commit is contained in:
parent
c314e44b34
commit
1bb10dce50
|
@ -14,6 +14,7 @@ func init() {
|
||||||
insight := InsightAPI{}
|
insight := InsightAPI{}
|
||||||
api.HandleAPIMethod(api.POST, "/elasticsearch/:id/visualization/metadata", insight.HandleGetMetadata)
|
api.HandleAPIMethod(api.POST, "/elasticsearch/:id/visualization/metadata", insight.HandleGetMetadata)
|
||||||
api.HandleAPIMethod(api.POST, "/elasticsearch/:id/visualization/data", insight.HandleGetMetricData)
|
api.HandleAPIMethod(api.POST, "/elasticsearch/:id/visualization/data", insight.HandleGetMetricData)
|
||||||
|
api.HandleAPIMethod(api.POST, "/elasticsearch/:id/visualization/preview", insight.HandleGetPreview)
|
||||||
|
|
||||||
api.HandleAPIMethod(api.GET, "/insight/visualization/:visualization_id", insight.getVisualization)
|
api.HandleAPIMethod(api.GET, "/insight/visualization/:visualization_id", insight.getVisualization)
|
||||||
api.HandleAPIMethod(api.POST, "/insight/visualization", insight.createVisualization)
|
api.HandleAPIMethod(api.POST, "/insight/visualization", insight.createVisualization)
|
||||||
|
|
|
@ -14,8 +14,113 @@ import (
|
||||||
"infini.sh/framework/core/util"
|
"infini.sh/framework/core/util"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (h *InsightAPI) HandleGetPreview(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
|
||||||
|
clusterID := ps.MustGetParameter("id")
|
||||||
|
reqBody := struct {
|
||||||
|
IndexPattern string `json:"index_pattern"`
|
||||||
|
ViewID string `json:"view_id"`
|
||||||
|
TimeField string `json:"time_field"`
|
||||||
|
Filter interface{} `json:"filter"`
|
||||||
|
}{}
|
||||||
|
err := h.DecodeJSON(req, &reqBody)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
h.WriteJSON(w, util.MapStr{
|
||||||
|
"error": err.Error(),
|
||||||
|
}, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if reqBody.ViewID != "" {
|
||||||
|
view := elastic.View{
|
||||||
|
ID: reqBody.ViewID,
|
||||||
|
}
|
||||||
|
exists, err := orm.Get(&view)
|
||||||
|
if err != nil || !exists {
|
||||||
|
h.WriteJSON(w, util.MapStr{
|
||||||
|
"error": err.Error(),
|
||||||
|
}, http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
reqBody.IndexPattern = view.Title
|
||||||
|
reqBody.TimeField = view.TimeFieldName
|
||||||
|
|
||||||
|
}
|
||||||
|
var timeFields []string
|
||||||
|
if reqBody.TimeField == "" {
|
||||||
|
fieldsMeta, err := getFieldsMetadata(reqBody.IndexPattern, clusterID)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
h.WriteJSON(w, util.MapStr{
|
||||||
|
"error": err.Error(),
|
||||||
|
}, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for fieldName := range fieldsMeta.Dates {
|
||||||
|
timeFields = append(timeFields, fieldName)
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
timeFields = []string{reqBody.TimeField}
|
||||||
|
}
|
||||||
|
|
||||||
|
aggs := util.MapStr{
|
||||||
|
"doc_count": util.MapStr{
|
||||||
|
"value_count": util.MapStr{"field": "_id"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tfield := range timeFields {
|
||||||
|
aggs["maxTime_"+tfield] = util.MapStr{
|
||||||
|
"max": util.MapStr{ "field": tfield },
|
||||||
|
}
|
||||||
|
aggs["minTime_"+tfield] = util.MapStr{
|
||||||
|
"min": util.MapStr{ "field": tfield },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
query := util.MapStr{
|
||||||
|
"aggs": aggs,
|
||||||
|
}
|
||||||
|
if reqBody.Filter != nil {
|
||||||
|
query["query"] = reqBody.Filter
|
||||||
|
}
|
||||||
|
|
||||||
|
esClient := elastic.GetClient(clusterID)
|
||||||
|
searchRes, err := esClient.SearchWithRawQueryDSL(reqBody.IndexPattern, util.MustToJSONBytes(query))
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
h.WriteJSON(w, util.MapStr{
|
||||||
|
"error": err.Error(),
|
||||||
|
}, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result := util.MapStr{
|
||||||
|
"doc_count": searchRes.Aggregations["doc_count"].Value,
|
||||||
|
}
|
||||||
|
tfieldsM := map[string]util.MapStr{}
|
||||||
|
for ak, av := range searchRes.Aggregations {
|
||||||
|
if strings.HasPrefix(ak,"maxTime_") {
|
||||||
|
tfield := ak[8:]
|
||||||
|
if _, ok := tfieldsM[tfield]; !ok {
|
||||||
|
tfieldsM[tfield] = util.MapStr{}
|
||||||
|
}
|
||||||
|
tfieldsM[tfield]["max"] = av.Value
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(ak,"minTime_") {
|
||||||
|
tfield := ak[8:]
|
||||||
|
if _, ok := tfieldsM[tfield]; !ok {
|
||||||
|
tfieldsM[tfield] = util.MapStr{}
|
||||||
|
}
|
||||||
|
tfieldsM[tfield]["min"] = av.Value
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result["time_fields"] = tfieldsM
|
||||||
|
h.WriteJSON(w, result, http.StatusOK)
|
||||||
|
|
||||||
|
}
|
||||||
func (h *InsightAPI) HandleGetMetadata(w http.ResponseWriter, req *http.Request, ps httprouter.Params){
|
func (h *InsightAPI) HandleGetMetadata(w http.ResponseWriter, req *http.Request, ps httprouter.Params){
|
||||||
clusterID := ps.MustGetParameter("id")
|
clusterID := ps.MustGetParameter("id")
|
||||||
reqBody := struct {
|
reqBody := struct {
|
||||||
|
|
Loading…
Reference in New Issue