Add configurable device aliases
This commit is contained in:
@@ -3,6 +3,8 @@ package pipeline
|
||||
import (
|
||||
"context"
|
||||
"log/slog"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
@@ -11,19 +13,22 @@ import (
|
||||
"mqqt-scrubber/internal/parser"
|
||||
)
|
||||
|
||||
var invalidDeviceAliasCharacters = regexp.MustCompile(`[^a-z0-9_]+`)
|
||||
|
||||
type writer interface {
|
||||
Write(ctx context.Context, records []model.Record) error
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
config config.Config
|
||||
influxClient writer
|
||||
input chan model.RawMessage
|
||||
received atomic.Uint64
|
||||
parsed atomic.Uint64
|
||||
written atomic.Uint64
|
||||
dropped atomic.Uint64
|
||||
failed atomic.Uint64
|
||||
config config.Config
|
||||
deviceAliases map[string]string
|
||||
influxClient writer
|
||||
input chan model.RawMessage
|
||||
received atomic.Uint64
|
||||
parsed atomic.Uint64
|
||||
written atomic.Uint64
|
||||
dropped atomic.Uint64
|
||||
failed atomic.Uint64
|
||||
}
|
||||
|
||||
type Snapshot struct {
|
||||
@@ -36,9 +41,10 @@ type Snapshot struct {
|
||||
|
||||
func NewService(cfg config.Config, influxClient writer) *Service {
|
||||
return &Service{
|
||||
config: cfg,
|
||||
influxClient: influxClient,
|
||||
input: make(chan model.RawMessage, cfg.App.BufferSize),
|
||||
config: cfg,
|
||||
deviceAliases: normalizeDeviceAliases(cfg.DeviceAliases),
|
||||
influxClient: influxClient,
|
||||
input: make(chan model.RawMessage, cfg.App.BufferSize),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,6 +92,8 @@ func (service *Service) Run(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
service.applyDeviceAliases(records)
|
||||
|
||||
service.parsed.Add(uint64(len(records)))
|
||||
batch = append(batch, records...)
|
||||
|
||||
@@ -150,3 +158,49 @@ func (service *Service) Snapshot() Snapshot {
|
||||
Failed: service.failed.Load(),
|
||||
}
|
||||
}
|
||||
|
||||
func (service *Service) applyDeviceAliases(records []model.Record) {
|
||||
if len(service.deviceAliases) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
for index := range records {
|
||||
device := normalizeDeviceKey(records[index].Tags["device"])
|
||||
alias, ok := service.deviceAliases[device]
|
||||
if !ok || alias == "" {
|
||||
continue
|
||||
}
|
||||
records[index].Fields["device_alias"] = alias
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeDeviceAliases(aliases map[string]string) map[string]string {
|
||||
if len(aliases) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
normalized := make(map[string]string, len(aliases))
|
||||
for device, alias := range aliases {
|
||||
cleanDevice := normalizeDeviceKey(device)
|
||||
cleanAlias := strings.TrimSpace(alias)
|
||||
if cleanDevice == "" || cleanAlias == "" {
|
||||
continue
|
||||
}
|
||||
normalized[cleanDevice] = cleanAlias
|
||||
}
|
||||
|
||||
if len(normalized) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return normalized
|
||||
}
|
||||
|
||||
func normalizeDeviceKey(value string) string {
|
||||
normalized := strings.ToLower(strings.TrimSpace(value))
|
||||
normalized = strings.ReplaceAll(normalized, "-", "_")
|
||||
normalized = strings.ReplaceAll(normalized, " ", "_")
|
||||
normalized = invalidDeviceAliasCharacters.ReplaceAllString(normalized, "_")
|
||||
normalized = strings.Trim(normalized, "_")
|
||||
return normalized
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user