func()

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
}