From 1a91beac18d05f791ef3154d03cf015b86091423 Mon Sep 17 00:00:00 2001 From: Shaunak Kashyap Date: Tue, 31 Dec 2019 07:39:21 -0800 Subject: [PATCH] Move HTTP calls to Kibana from New() to Fetch() (#15270) (#15277) * Move HTTP calls to Fetch() from New() This makes the `kibana/stats` metricset resilient to Kibana's unavailability. * Add special handling for errors when xpack.enabled is set to true * Don't reinit usageLastCollectedOn --- metricbeat/module/kibana/stats/stats.go | 96 +++++++++++++------------ 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/metricbeat/module/kibana/stats/stats.go b/metricbeat/module/kibana/stats/stats.go index 139fa00a86d..d84c1dfcfe7 100644 --- a/metricbeat/module/kibana/stats/stats.go +++ b/metricbeat/module/kibana/stats/stats.go @@ -67,46 +67,74 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return nil, err } - statsHTTP, err := helper.NewHTTP(base) + return &MetricSet{ + MetricSet: ms, + }, nil +} + +// Fetch methods implements the data gathering and data conversion to the right format +// It returns the event which is then forward to the output. In case of an error, a +// descriptive error must be returned. +func (m *MetricSet) Fetch(r mb.ReporterV2) error { + err := m.init() if err != nil { - return nil, err + if m.XPackEnabled { + m.Logger().Error(err) + return nil + } + return err } - kibanaVersion, err := kibana.GetVersion(statsHTTP, statsPath) + now := time.Now() + + err = m.fetchStats(r, now) if err != nil { - return nil, err + if m.XPackEnabled { + m.Logger().Error(err) + return nil + } + return err } - isStatsAPIAvailable := kibana.IsStatsAPIAvailable(kibanaVersion) + if m.XPackEnabled { + m.fetchSettings(r, now) + } + + return nil +} + +func (m *MetricSet) init() error { + statsHTTP, err := helper.NewHTTP(m.BaseMetricSet) if err != nil { - return nil, err + return err } - if !isStatsAPIAvailable { - const errorMsg = "The %v metricset is only supported with Kibana >= %v. You are currently running Kibana %v" - return nil, fmt.Errorf(errorMsg, base.FullyQualifiedName(), kibana.StatsAPIAvailableVersion, kibanaVersion) + kibanaVersion, err := kibana.GetVersion(statsHTTP, statsPath) + if err != nil { + return err } - if ms.XPackEnabled { + isStatsAPIAvailable := kibana.IsStatsAPIAvailable(kibanaVersion) + if !isStatsAPIAvailable { + const errorMsg = "the %v metricset is only supported with Kibana >= %v. You are currently running Kibana %v" + return fmt.Errorf(errorMsg, m.FullyQualifiedName(), kibana.StatsAPIAvailableVersion, kibanaVersion) + } + if m.XPackEnabled { // Use legacy API response so we can passthru usage as-is statsHTTP.SetURI(statsHTTP.GetURI() + "&legacy=true") } var settingsHTTP *helper.HTTP - if ms.XPackEnabled { + if m.XPackEnabled { isSettingsAPIAvailable := kibana.IsSettingsAPIAvailable(kibanaVersion) - if err != nil { - return nil, err - } - if !isSettingsAPIAvailable { - const errorMsg = "The %v metricset with X-Pack enabled is only supported with Kibana >= %v. You are currently running Kibana %v" - return nil, fmt.Errorf(errorMsg, ms.FullyQualifiedName(), kibana.SettingsAPIAvailableVersion, kibanaVersion) + const errorMsg = "the %v metricset with X-Pack enabled is only supported with Kibana >= %v. You are currently running Kibana %v" + return fmt.Errorf(errorMsg, m.FullyQualifiedName(), kibana.SettingsAPIAvailableVersion, kibanaVersion) } - settingsHTTP, err = helper.NewHTTP(base) + settingsHTTP, err = helper.NewHTTP(m.BaseMetricSet) if err != nil { - return nil, err + return err } // HACK! We need to do this because there might be a basepath involved, so we @@ -115,33 +143,9 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { settingsHTTP.SetURI(settingsURI) } - return &MetricSet{ - ms, - statsHTTP, - settingsHTTP, - time.Time{}, - kibana.IsUsageExcludable(kibanaVersion), - }, nil -} - -// Fetch methods implements the data gathering and data conversion to the right format -// It returns the event which is then forward to the output. In case of an error, a -// descriptive error must be returned. -func (m *MetricSet) Fetch(r mb.ReporterV2) error { - now := time.Now() - - err := m.fetchStats(r, now) - if err != nil { - if m.XPackEnabled { - m.Logger().Error(err) - return nil - } - return err - } - - if m.XPackEnabled { - m.fetchSettings(r, now) - } + m.statsHTTP = statsHTTP + m.settingsHTTP = settingsHTTP + m.isUsageExcludable = kibana.IsUsageExcludable(kibanaVersion) return nil }