Skip to content

Commit

Permalink
Move HTTP calls to Kibana from New() to Fetch() (#15270) (#15277)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
ycombinator committed Dec 31, 2019
1 parent dfa3f02 commit 1a91bea
Showing 1 changed file with 50 additions and 46 deletions.
96 changes: 50 additions & 46 deletions metricbeat/module/kibana/stats/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
Expand Down

0 comments on commit 1a91bea

Please sign in to comment.