func()

in pkg/sls-plugin.go [606:671]


func (ds *SlsDatasource) BuildFlowGraphV2(logs []map[string]string, xcol string, ycols []string, frames *data.Frames) {
	if len(logs) == 0 {
		return
	}
	ds.SortLogs(logs, xcol)
	metricNames := strings.Split(ycols[1], ",")
	metricMap := make(map[string]bool)
	for _, n := range metricNames {
		metricMap[n] = true
	}
	var labelNames []string
	for k := range logs[0] {
		if k != "__source__" && k != "__time__" && !metricMap[k] && k != xcol {
			labelNames = append(labelNames, k)
		}
	}
	sort.Strings(labelNames)
	timeFields := make(map[string][]time.Time)
	nameMetricFields := make(map[string]map[string][]float64)
	for _, n := range metricNames {
		nameMetricFields[n] = make(map[string][]float64)
	}
	frameLabelsMap := make(map[string]map[string]string)

	for _, alog := range logs {
		timeVal := alog[xcol]
		labels := map[string]string{}
		labelsKey := ""
		for _, l := range labelNames {
			labels[l] = alog[l]
			labelsKey += alog[l]
		}
		if _, ok := frameLabelsMap[labelsKey]; !ok {
			frameLabelsMap[labelsKey] = labels
		}
		if _, ok := timeFields[labelsKey]; ok {
			timeFields[labelsKey] = append(timeFields[labelsKey], toTime(timeVal))
		} else {
			timeFields[labelsKey] = []time.Time{toTime(timeVal)}
		}
		for _, n := range metricNames {
			metricVal := alog[n]
			floatV, err := strconv.ParseFloat(metricVal, 64)
			if err != nil {
				log.DefaultLogger.Debug("BuildFlowGraphV2", "ParseFloat", err, "value", metricVal)
			}
			if _, ok := nameMetricFields[n][labelsKey]; ok {
				nameMetricFields[n][labelsKey] = append(nameMetricFields[n][labelsKey], floatV)
			} else {
				nameMetricFields[n][labelsKey] = []float64{floatV}
			}
		}
	}
	for k, v := range timeFields {
		frame := data.NewFrame("")
		frame.Fields = append(frame.Fields, data.NewField("Time", nil, v))
		if len(metricNames) == 1 {
			frame.Fields = append(frame.Fields, data.NewField("Value", frameLabelsMap[k], nameMetricFields[metricNames[0]][k]))
		} else {
			for _, n := range metricNames {
				frame.Fields = append(frame.Fields, data.NewField(n, frameLabelsMap[k], nameMetricFields[n][k]))
			}
		}
		*frames = append(*frames, frame)
	}
}