in pkg/sls-plugin.go [673:763]
func (ds *SlsDatasource) BuildFlowGraph(logs []map[string]string, xcol string, ycols []string, frames *data.Frames) (err error) {
if len(logs) == 0 {
frames = &data.Frames{}
return
}
if len(ycols) < 2 {
return
}
if ycols[0] == "" && ycols[1] != "" {
ds.BuildFlowGraphV2(logs, xcol, ycols, frames)
return
}
var frame *data.Frame
if compatible {
frame = data.NewFrame("response")
} else {
frame = data.NewFrame("")
}
fieldMap := make(map[int]map[int64]float64)
timeSet := make(map[int64]bool)
labelSet := make(map[string]bool)
var labelArr []string
for _, alog := range logs {
if !labelSet[alog[ycols[0]]] {
labelArr = append(labelArr, alog[ycols[0]])
}
timeSet[toTime(alog[xcol]).Unix()] = true
labelSet[alog[ycols[0]]] = true
}
var timeArr []int64
for k := range timeSet {
timeArr = append(timeArr, k)
}
sort.Slice(timeArr, func(i, j int) bool {
if timeArr[i] < timeArr[j] {
return true
}
return false
})
fieldSet := make(map[string]bool)
labelToIndex := make(map[string]int)
for i := range labelArr {
fieldMap[i] = map[int64]float64{}
labelToIndex[labelArr[i]] = i
}
if len(labelArr)*len(timeArr) > maxPointsLimit {
s := fmt.Sprintf("BuildFlowGraph, More than %d points : %d", maxPointsLimit, len(labelArr)*len(timeArr))
log.DefaultLogger.Error(s)
err = errors.New(s)
return
}
for i := range labelArr {
for _, t0 := range timeArr {
fieldMap[i][t0] = 0
}
}
for _, alog := range logs {
label := alog[ycols[0]]
t := alog[xcol]
if !fieldSet[t+label] {
fieldSet[t+label] = true
floatV, err1 := strconv.ParseFloat(alog[ycols[1]], 64)
if err1 != nil {
log.DefaultLogger.Debug("BuildFlowGraph", "ParseFloat", err, "value", alog[ycols[1]])
}
fieldMap[labelToIndex[label]][toTime(t).Unix()] = floatV
}
}
var frameLen int
for i, k := range labelArr {
v := fieldMap[i]
if len(v) > 0 {
if frameLen == 0 {
frameLen = len(v)
}
if len(v) == frameLen {
arr := mapToSlice(timeArr, v)
frame.Fields = append(frame.Fields, data.NewField(k, nil, arr))
}
}
}
var times []time.Time
for _, k := range timeArr {
times = append(times, time.Unix(k, 0))
}
if len(times) == frameLen {
frame.Fields = append([]*data.Field{data.NewField("time", nil, times)}, frame.Fields...)
}
*frames = append(*frames, frame)
return
}