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)
}
}