mirror of
https://github.com/grafana/grafana.git
synced 2024-11-28 03:34:15 -06:00
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package cloudwatch
|
|
|
|
import (
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
|
)
|
|
|
|
func groupResponseFrame(frame *data.Frame, statsGroups []string) (data.Frames, error) {
|
|
var dataFrames data.Frames
|
|
|
|
// When a query of the form "stats ... by ..." is made, we want to return
|
|
// one series per group defined in the query, but due to the format
|
|
// the query response is in, there does not seem to be a way to tell
|
|
// by the response alone if/how the results should be grouped.
|
|
// Because of this, if the frontend sees that a "stats ... by ..." query is being made
|
|
// the "statsGroups" parameter is sent along with the query to the backend so that we
|
|
// can correctly group the CloudWatch logs response.
|
|
// Check if we have time field though as it makes sense to split only for time series.
|
|
if hasTimeField(frame) {
|
|
if len(statsGroups) > 0 && len(frame.Fields) > 0 {
|
|
groupedFrames, err := groupResults(frame, statsGroups)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dataFrames = groupedFrames
|
|
} else {
|
|
setPreferredVisType(frame, "logs")
|
|
dataFrames = data.Frames{frame}
|
|
}
|
|
} else {
|
|
dataFrames = data.Frames{frame}
|
|
}
|
|
return dataFrames, nil
|
|
}
|
|
|
|
func hasTimeField(frame *data.Frame) bool {
|
|
for _, field := range frame.Fields {
|
|
if field.Type() == data.FieldTypeNullableTime {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func setPreferredVisType(frame *data.Frame, visType data.VisType) {
|
|
if frame.Meta != nil {
|
|
frame.Meta.PreferredVisualization = visType
|
|
} else {
|
|
frame.Meta = &data.FrameMeta{
|
|
PreferredVisualization: visType,
|
|
}
|
|
}
|
|
}
|