func MetricColumnsElement()

in pkg/display/graph/gauge/gauge.go [143:181]


func MetricColumnsElement(columns []*MetricColumn) []grid.Element {
	var metricColumns []grid.Element
	var columnWidthPerc int

	// For the best display effect, the maximum number of columns that can be displayed
	const MaxColumnNum = 4
	// For the best display effect, the maximum number of gauges
	// that can be displayed in each column
	const MaxGaugeNum = 6
	const TitleHeight = 10

	// Number of columns to display, each column represents a global metric
	// The number should be less than or equal to MaxColumnNum
	columnNum := int(math.Min(MaxColumnNum, float64(len(columns))))

	// columnWidthPerc should be in the range (0, 100)
	if columnNum > 1 {
		columnWidthPerc = 100 / columnNum
	} else {
		columnWidthPerc = 99
	}

	for i := 0; i < columnNum; i++ {
		var column []grid.Element
		column = append(column, grid.RowHeightPerc(TitleHeight, grid.Widget(columns[i].title)))

		// Number of gauge in a column, each gauge represents a service or endpoint
		// The number should be less than or equal to MaxGaugeNum
		gaugeNum := int(math.Min(MaxGaugeNum, float64(len(columns[i].gauges))))
		gaugeHeight := int(math.Floor(float64(99-TitleHeight) / float64(gaugeNum)))

		for j := 0; j < gaugeNum; j++ {
			column = append(column, grid.RowHeightPerc(gaugeHeight, grid.Widget(columns[i].gauges[j])))
		}
		metricColumns = append(metricColumns, grid.ColWidthPerc(columnWidthPerc, column...))
	}

	return metricColumns
}