Files
akvorado/console/graph.go
2025-02-21 10:03:30 +01:00

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