mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
63 lines
2.4 KiB
Go
63 lines
2.4 KiB
Go
// SPDX-FileCopyrightText: 2023 Free Mobile
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
package console
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"akvorado/common/schema"
|
|
"akvorado/console/query"
|
|
)
|
|
|
|
// graphCommonHandlerInput is for bits common to graphLineHandlerInput and
|
|
// graphSankeyHandlerInput.
|
|
type graphCommonHandlerInput struct {
|
|
schema *schema.Component
|
|
Start time.Time `json:"start" binding:"required"`
|
|
End time.Time `json:"end" binding:"required,gtfield=Start"`
|
|
Dimensions []query.Column `json:"dimensions"` // group by ...
|
|
Limit int `json:"limit" binding:"min=1"` // limit product of dimensions
|
|
LimitType string `json:"limitType" validate:"oneof=avg max last"`
|
|
Filter query.Filter `json:"filter"` // where ...
|
|
TruncateAddrV4 int `json:"truncate-v4" binding:"min=0,max=32"` // 0 or 32 = no truncation
|
|
TruncateAddrV6 int `json:"truncate-v6" binding:"min=0,max=128"` // 0 or 128 = no truncation
|
|
Units string `json:"units" binding:"required,oneof=pps l3bps l2bps inl2% outl2%"`
|
|
}
|
|
|
|
// sourceSelect builds a SELECT query to use as a source for data. Notably, it
|
|
// will do IP truncation.
|
|
func (input graphCommonHandlerInput) sourceSelect() string {
|
|
if input.TruncateAddrV4 == 0 {
|
|
input.TruncateAddrV4 = 32
|
|
}
|
|
if input.TruncateAddrV6 == 0 {
|
|
input.TruncateAddrV6 = 128
|
|
}
|
|
truncated := []string{}
|
|
for _, qc := range input.Dimensions {
|
|
if column, _ := input.schema.LookupColumnByKey(qc.Key()); column.ConsoleTruncateIP {
|
|
if input.TruncateAddrV4 == 32 && input.TruncateAddrV6 == 128 {
|
|
continue
|
|
}
|
|
if input.TruncateAddrV6 == input.TruncateAddrV4+96 {
|
|
truncated = append(truncated,
|
|
fmt.Sprintf("tupleElement(IPv6CIDRToRange(%s, %d), 1) AS %s",
|
|
qc.String(), input.TruncateAddrV6, qc.String()))
|
|
} else {
|
|
truncated = append(truncated,
|
|
fmt.Sprintf("tupleElement(IPv6CIDRToRange(%s, if(tupleElement(IPv6CIDRToRange(%s, 96), 1) = toIPv6('::ffff:0.0.0.0'), %d, %d)), 1) AS %s",
|
|
qc.String(), qc.String(),
|
|
input.TruncateAddrV4+96, input.TruncateAddrV6,
|
|
qc.String()))
|
|
}
|
|
}
|
|
}
|
|
if len(truncated) == 0 {
|
|
return "SELECT * FROM {{ .Table }} SETTINGS asterisk_include_alias_columns = 1"
|
|
}
|
|
return fmt.Sprintf("SELECT * REPLACE (%s) FROM {{ .Table }} SETTINGS asterisk_include_alias_columns = 1", strings.Join(truncated, ", "))
|
|
}
|