settings.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package metrics
  2. import (
  3. "strings"
  4. "time"
  5. "github.com/grafana/grafana/pkg/metrics/graphitebridge"
  6. "github.com/grafana/grafana/pkg/setting"
  7. "github.com/prometheus/client_golang/prometheus"
  8. ini "gopkg.in/ini.v1"
  9. )
  10. type MetricSettings struct {
  11. Enabled bool
  12. IntervalSeconds int64
  13. GraphiteBridgeConfig *graphitebridge.Config
  14. }
  15. func ReadSettings(file *ini.File) *MetricSettings {
  16. var settings = &MetricSettings{
  17. Enabled: false,
  18. }
  19. var section, err = file.GetSection("metrics")
  20. if err != nil {
  21. metricsLogger.Crit("Unable to find metrics config section", "error", err)
  22. return nil
  23. }
  24. settings.Enabled = section.Key("enabled").MustBool(false)
  25. settings.IntervalSeconds = section.Key("interval_seconds").MustInt64(10)
  26. if !settings.Enabled {
  27. return settings
  28. }
  29. cfg, err := parseGraphiteSettings(settings, file)
  30. if err != nil {
  31. metricsLogger.Crit("Unable to parse metrics graphite section", "error", err)
  32. return nil
  33. }
  34. settings.GraphiteBridgeConfig = cfg
  35. return settings
  36. }
  37. func parseGraphiteSettings(settings *MetricSettings, file *ini.File) (*graphitebridge.Config, error) {
  38. graphiteSection, err := setting.Raw.GetSection("metrics.graphite")
  39. if err != nil {
  40. return nil, nil
  41. }
  42. address := graphiteSection.Key("address").String()
  43. if address == "" {
  44. return nil, nil
  45. }
  46. cfg := &graphitebridge.Config{
  47. URL: address,
  48. Prefix: graphiteSection.Key("prefix").MustString("prod.grafana.%(instance_name)s"),
  49. CountersAsDelta: true,
  50. Gatherer: prometheus.DefaultGatherer,
  51. Interval: time.Duration(settings.IntervalSeconds) * time.Second,
  52. Timeout: 10 * time.Second,
  53. Logger: &logWrapper{logger: metricsLogger},
  54. ErrorHandling: graphitebridge.ContinueOnError,
  55. }
  56. safeInstanceName := strings.Replace(setting.InstanceName, ".", "_", -1)
  57. prefix := graphiteSection.Key("prefix").Value()
  58. if prefix == "" {
  59. prefix = "prod.grafana.%(instance_name)s."
  60. }
  61. cfg.Prefix = strings.Replace(prefix, "%(instance_name)s", safeInstanceName, -1)
  62. return cfg, nil
  63. }