fix(hub): preserve custom DNS resolvers when syncing monitors (#2448)

This commit is contained in:
user01010111
2026-09-29 11:49:43 +13:00
committed by GitHub
parent c556dc478d
commit 083b28a1fc
2 changed files with 26 additions and 10 deletions

View File

@@ -100,9 +100,23 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
}()
collection, err := app.FindCachedCollectionByNameOrId("network_monitors")
require.NoError(t, err)
probe := core.NewRecord(collection)
probe.Load(map[string]any{"system": sys.Id, "target": "localhost", "protocol": "tcp", "port": 80, "interval": 60, "enabled": true})
require.NoError(t, app.SaveNoValidate(probe))
configs := []monitor.Config{
{Target: "localhost", Protocol: "tcp", Port: 80, Interval: 60},
{Target: "localhost", Protocol: "dns", Interval: 60},
{Target: "localhost", Protocol: "dns", Server: "127.0.0.1:5353", Interval: 60},
}
var probes []*core.Record
for i := range configs {
cfg := &configs[i]
probe := core.NewRecord(collection)
probe.Load(map[string]any{
"system": sys.Id, "target": cfg.Target, "protocol": cfg.Protocol,
"port": cfg.Port, "server": cfg.Server, "interval": cfg.Interval, "enabled": true,
})
require.NoError(t, app.SaveNoValidate(probe))
cfg.ID = probe.Id
probes = append(probes, probe)
}
fetch := func() {
t.Helper()
_, err := sys.fetchDataFromAgent(common.DataRequestOptions{})
@@ -120,7 +134,7 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
}
}
fetch()
require.Equal(t, probe.Id, receive().Configs[0].ID)
require.ElementsMatch(t, configs, receive().Configs)
require.False(t, sys.monitorsNeedSync.Load())
fetch()
require.Empty(t, requests, "steady-state fetch must not resync")
@@ -128,22 +142,24 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
// Simulate loss of the agent process/connection and its in-memory monitors.
require.NoError(t, sys.client.Load().Close())
fetch()
require.Equal(t, probe.Id, receive().Configs[0].ID)
require.ElementsMatch(t, configs, receive().Configs)
require.False(t, sys.monitorsNeedSync.Load())
// Failed replacements are retried on the next successful stats fetch.
require.NoError(t, sys.client.Load().Close())
failSync.Store(true)
fetch()
receive()
require.ElementsMatch(t, configs, receive().Configs)
require.True(t, sys.monitorsNeedSync.Load())
failSync.Store(false)
fetch()
receive()
require.ElementsMatch(t, configs, receive().Configs)
require.False(t, sys.monitorsNeedSync.Load())
probe.Set("enabled", false)
require.NoError(t, app.SaveNoValidate(probe))
for _, probe := range probes {
probe.Set("enabled", false)
require.NoError(t, app.SaveNoValidate(probe))
}
require.NoError(t, sys.client.Load().Close())
fetch()
require.Empty(t, receive().Configs, "empty replacement must clear stale monitors")

View File

@@ -380,7 +380,7 @@ func (sm *SystemManager) resetFailedSmartFetchState(systemID string) {
func (sm *SystemManager) GetMonitorConfigsForSystem(systemID string) ([]monitor.Config, error) {
var configs []monitor.Config
err := sm.hub.DB().
NewQuery("SELECT id, target, protocol, port, interval FROM network_monitors WHERE system = {:system} AND enabled = true").
NewQuery("SELECT id, target, protocol, port, interval, server FROM network_monitors WHERE system = {:system} AND enabled = true").
Bind(dbx.Params{"system": systemID}).
All(&configs)
return configs, err