From fc799b125c342fdb3aa0499fe4a8e22500636182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Alvarez=20Pi=C3=B1eiro?= <95703246+emilioalvap@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:08:41 +0200 Subject: [PATCH 1/4] [Heartbeat] Fix linting issues introduced by auto-merge #41077 (#41128) (cherry picked from commit efb563c8904f792ae7ca54036e0f442c4fcbab61) # Conflicts: # heartbeat/monitors/monitor.go # heartbeat/monitors/monitor_test.go --- heartbeat/monitors/monitor.go | 8 ++++ heartbeat/monitors/monitor_test.go | 60 ++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/heartbeat/monitors/monitor.go b/heartbeat/monitors/monitor.go index 29e7713145ca..678dac37675f 100644 --- a/heartbeat/monitors/monitor.go +++ b/heartbeat/monitors/monitor.go @@ -71,6 +71,14 @@ type Monitor struct { stats plugin.RegistryRecorder monitorStateTracker *monitorstate.Tracker +<<<<<<< HEAD +======= + statusReporter status.StatusReporter +} + +func (m *Monitor) SetStatusReporter(statusReporter status.StatusReporter) { + m.statusReporter = statusReporter +>>>>>>> efb563c890 ([Heartbeat] Fix linting issues introduced by auto-merge #41077 (#41128)) } // String prints a description of the monitor in a threadsafe way. It is important that this use threadsafe diff --git a/heartbeat/monitors/monitor_test.go b/heartbeat/monitors/monitor_test.go index 3176d27a2fa8..6e0afd18f241 100644 --- a/heartbeat/monitors/monitor_test.go +++ b/heartbeat/monitors/monitor_test.go @@ -131,3 +131,63 @@ func TestCheckInvalidConfig(t *testing.T) { require.Error(t, checkMonitorConfig(serverMonConf, reg)) } +<<<<<<< HEAD +======= + +type MockStatusReporter struct { + us func(status status.Status, msg string) +} + +func (sr *MockStatusReporter) UpdateStatus(status status.Status, msg string) { + sr.us(status, msg) +} + +func TestStatusReporter(t *testing.T) { + confMap := map[string]interface{}{ + "type": "fail", + "urls": []string{"http://example.net"}, + "schedule": "@every 1ms", + "name": "myName", + "id": "myId", + } + cfg, err := conf.NewConfigFrom(confMap) + require.NoError(t, err) + + reg, _, _ := mockPluginsReg() + pipel := &MockPipeline{} + monReg := monitoring.NewRegistry() + + mockDegradedPluginFactory := plugin.PluginFactory{ + Name: "fail", + Aliases: []string{"failAlias"}, + Make: func(s string, cfg *conf.C) (plugin.Plugin, error) { + return plugin.Plugin{}, fmt.Errorf("error plugin") + }, + Stats: plugin.NewPluginCountersRecorder("fail", monReg), + } + _ = reg.Add(mockDegradedPluginFactory) + + sched := scheduler.Create(1, monitoring.NewRegistry(), time.Local, nil, true) + defer sched.Stop() + + c, err := pipel.Connect() + require.NoError(t, err) + m, err := newMonitor(cfg, reg, c, sched.Add, nil, nil) + require.NoError(t, err) + + // Track status marked as failed during run_once execution + failed := false + m.SetStatusReporter(&MockStatusReporter{ + us: func(s status.Status, msg string) { + if s == status.Failed { + failed = true + } + }, + }) + m.Start() + + sched.WaitForRunOnce() + + require.True(t, failed) +} +>>>>>>> efb563c890 ([Heartbeat] Fix linting issues introduced by auto-merge #41077 (#41128)) From bf63383e97337b1b98d748f1a1a755b2b6d2ca28 Mon Sep 17 00:00:00 2001 From: emilioalvap Date: Fri, 4 Oct 2024 21:20:39 +0200 Subject: [PATCH 2/4] Merge conflicts --- heartbeat/monitors/monitor.go | 4 +--- heartbeat/monitors/monitor_test.go | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/heartbeat/monitors/monitor.go b/heartbeat/monitors/monitor.go index 678dac37675f..c30da5a73b34 100644 --- a/heartbeat/monitors/monitor.go +++ b/heartbeat/monitors/monitor.go @@ -34,6 +34,7 @@ import ( "github.com/elastic/beats/v7/heartbeat/monitors/wrappers" "github.com/elastic/beats/v7/heartbeat/scheduler" "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/management/status" ) // ErrMonitorDisabled is returned when the monitor plugin is marked as disabled. @@ -71,14 +72,11 @@ type Monitor struct { stats plugin.RegistryRecorder monitorStateTracker *monitorstate.Tracker -<<<<<<< HEAD -======= statusReporter status.StatusReporter } func (m *Monitor) SetStatusReporter(statusReporter status.StatusReporter) { m.statusReporter = statusReporter ->>>>>>> efb563c890 ([Heartbeat] Fix linting issues introduced by auto-merge #41077 (#41128)) } // String prints a description of the monitor in a threadsafe way. It is important that this use threadsafe diff --git a/heartbeat/monitors/monitor_test.go b/heartbeat/monitors/monitor_test.go index 6e0afd18f241..0890a1697bec 100644 --- a/heartbeat/monitors/monitor_test.go +++ b/heartbeat/monitors/monitor_test.go @@ -18,6 +18,7 @@ package monitors import ( + "fmt" "testing" "time" @@ -32,7 +33,9 @@ import ( "github.com/elastic/go-lookslike/testslike" "github.com/elastic/go-lookslike/validator" + "github.com/elastic/beats/v7/heartbeat/monitors/plugin" "github.com/elastic/beats/v7/heartbeat/scheduler" + "github.com/elastic/beats/v7/libbeat/management/status" ) // TestMonitorBasic tests a basic config @@ -131,8 +134,6 @@ func TestCheckInvalidConfig(t *testing.T) { require.Error(t, checkMonitorConfig(serverMonConf, reg)) } -<<<<<<< HEAD -======= type MockStatusReporter struct { us func(status status.Status, msg string) @@ -190,4 +191,3 @@ func TestStatusReporter(t *testing.T) { require.True(t, failed) } ->>>>>>> efb563c890 ([Heartbeat] Fix linting issues introduced by auto-merge #41077 (#41128)) From 6508cba3b8fa3ab9c5b514f4f5fec6b33b035316 Mon Sep 17 00:00:00 2001 From: emilioalvap Date: Wed, 2 Oct 2024 16:21:54 +0200 Subject: [PATCH 3/4] [Heartbeat] Add status reporter at monitor factory level --- heartbeat/monitors/monitor.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/heartbeat/monitors/monitor.go b/heartbeat/monitors/monitor.go index c30da5a73b34..8fa82c10ea14 100644 --- a/heartbeat/monitors/monitor.go +++ b/heartbeat/monitors/monitor.go @@ -181,6 +181,9 @@ func newMonitorUnsafe( logp.L().Error(fullErr) p.Jobs = []jobs.Job{func(event *beat.Event) ([]jobs.Job, error) { + // if statusReporter is set, as it is for running managed-mode, update the input status + // to failed, specifying the error + m.updateStatus(status.Failed, fmt.Sprintf("monitor could not be started: %s, err: %s", m.stdFields.ID, fullErr)) return nil, fullErr }} @@ -243,6 +246,7 @@ func (m *Monitor) Start() { m.stats.StartMonitor(int64(m.endpoints)) m.state = MON_STARTED + m.updateStatus(status.Running, "") } // Stop stops the monitor without freeing it in global dedup @@ -268,4 +272,11 @@ func (m *Monitor) Stop() { m.stats.StopMonitor(int64(m.endpoints)) m.state = MON_STOPPED + m.updateStatus(status.Stopped, "") +} + +func (m *Monitor) updateStatus(status status.Status, msg string) { + if m.statusReporter != nil { + m.statusReporter.UpdateStatus(status, msg) + } } From 686e487797831aeaf10a9d9dd6f3085eef0d9833 Mon Sep 17 00:00:00 2001 From: emilioalvap Date: Fri, 4 Oct 2024 17:21:06 +0200 Subject: [PATCH 4/4] Add unit test and changelog --- CHANGELOG.next.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 66e3e961d1fa..3fcc30297d91 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -324,6 +324,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - Added status to monitor run log report. - Upgrade node to latest LTS v18.20.3. {pull}40038[40038] - Add journey duration to synthetics browser events. {pull}40230[40230] +- Add monitor status reporter under managed mode. {pull}41077[41077] *Metricbeat*