The manager is the ONLY thing that talks to InfluxDB, both directions; hosts hold
no token and never reach it.
- influx.go: influxSink implements MetricsSink — each agent HealthSnapshot is
written as a fleet_health point, identity (serial/hostnqn/starship) as TAGS
from the AUTHENTICATED stream (a host can only write its own series), telemetry
as fields. QueryField answers the SPA's read: a Flux query built with a strict
FIELD WHITELIST + hex-serial guard + parsed-duration range, so no caller input
is interpolated raw (injection-safe). Server-side influxdb-client-go/v2.
- admin.go: GET /api/hosts/{serial}/metrics?field=&range= -> time-series JSON;
503 when InfluxDB isn't wired, 400 on a bad range, 404 for unknown host.
- main.go: sink created when FLEET_MGR_INFLUX_URL+_TOKEN set, fed to the agent
hub; nil -> no-op sink so the manager runs without metrics.
Tests: snapshotPoint tags/fields/time, fluxQuery contents + %q quoting, and
QueryField rejects a non-hex serial + non-whitelisted field. build/test/vet/gofmt
clean. Live InfluxDB path validated in the compose bench (ckpt 6).
32 lines
1.3 KiB
AMPL
32 lines
1.3 KiB
AMPL
// fleet-manager — server-side fleet control plane for the diskless kiosk fleet:
|
|
// inventory, enrolment authorisation, lifecycle (desired-state) control, and the
|
|
// metrics gateway that fronts InfluxDB. Backend for the admin SPA. See
|
|
// docs/fleet-management-design.md and docs/tpm-enrolment-design.md §5.
|
|
//
|
|
// Unlike fleet-hostapi / fleet-enrol (baked into the reproducible verity image,
|
|
// so stdlib-only), this is a SERVER-SIDE service that ships as its own container
|
|
// on the mgmt network — external deps are acceptable here. They are added at the
|
|
// build checkpoint that needs them:
|
|
// - google.golang.org/grpc + protobuf : the agent bidi stream (added ckpt 2)
|
|
// - github.com/influxdata/influxdb-client-go/v2 : metrics read/write (ckpt 4)
|
|
module fleet-manager
|
|
|
|
go 1.25.0
|
|
|
|
require (
|
|
github.com/influxdata/influxdb-client-go/v2 v2.14.0
|
|
google.golang.org/grpc v1.82.0
|
|
google.golang.org/protobuf v1.36.11
|
|
)
|
|
|
|
require (
|
|
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
|
|
github.com/google/uuid v1.6.0 // indirect
|
|
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
|
|
github.com/oapi-codegen/runtime v1.0.0 // indirect
|
|
golang.org/x/net v0.53.0 // indirect
|
|
golang.org/x/sys v0.43.0 // indirect
|
|
golang.org/x/text v0.36.0 // indirect
|
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
|
)
|