collect.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. package consul
  3. import (
  4. "fmt"
  5. "net/http"
  6. "slices"
  7. "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
  8. )
  9. const (
  10. precision = 1000
  11. )
  12. func (c *Consul) collect() (map[string]int64, error) {
  13. if c.cfg == nil {
  14. if err := c.collectConfiguration(); err != nil {
  15. return nil, err
  16. }
  17. c.addGlobalChartsOnce.Do(c.addGlobalCharts)
  18. }
  19. mx := make(map[string]int64)
  20. if err := c.collectChecks(mx); err != nil {
  21. return nil, err
  22. }
  23. if c.isServer() {
  24. if !c.isCloudManaged() {
  25. c.addServerAutopilotChartsOnce.Do(c.addServerAutopilotHealthCharts)
  26. // 'operator/autopilot/health' is disabled in Cloud managed (403: Operation is not allowed in managed Consul clusters)
  27. if err := c.collectAutopilotHealth(mx); err != nil {
  28. return nil, err
  29. }
  30. }
  31. if err := c.collectNetworkRTT(mx); err != nil {
  32. return nil, err
  33. }
  34. }
  35. if c.isTelemetryPrometheusEnabled() {
  36. if err := c.collectMetricsPrometheus(mx); err != nil {
  37. return nil, err
  38. }
  39. }
  40. return mx, nil
  41. }
  42. func (c *Consul) isTelemetryPrometheusEnabled() bool {
  43. return c.cfg.DebugConfig.Telemetry.PrometheusOpts.Expiration != "0s"
  44. }
  45. func (c *Consul) isCloudManaged() bool {
  46. return c.cfg.DebugConfig.Cloud.ClientSecret != "" || c.cfg.DebugConfig.Cloud.ResourceID != ""
  47. }
  48. func (c *Consul) hasLicense() bool {
  49. return c.cfg.Stats.License.ID != ""
  50. }
  51. func (c *Consul) isServer() bool {
  52. return c.cfg.Config.Server
  53. }
  54. func (c *Consul) client(statusCodes ...int) *web.Client {
  55. return web.DoHTTP(c.httpClient).OnNokCode(func(resp *http.Response) (bool, error) {
  56. return slices.Contains(statusCodes, resp.StatusCode), nil
  57. })
  58. }
  59. func (c *Consul) createRequest(urlPath string) (*http.Request, error) {
  60. req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPath)
  61. if err != nil {
  62. return nil, fmt.Errorf("failed to create '%s' request: %w", urlPath, err)
  63. }
  64. if c.ACLToken != "" {
  65. req.Header.Set("X-Consul-Token", c.ACLToken)
  66. }
  67. return req, nil
  68. }