metricsconfig.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package metrics
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "os"
  6. "path"
  7. "sync"
  8. "github.com/opencost/opencost/pkg/env"
  9. "github.com/opencost/opencost/pkg/util/watcher"
  10. )
  11. var (
  12. metricsConfigLock = new(sync.Mutex)
  13. metricsFilePath = path.Join(env.GetCostAnalyzerVolumeMountPath(), "metrics.json")
  14. )
  15. type MetricsConfig struct {
  16. DisabledMetrics []string `json:"disabledMetrics"`
  17. UseLabelsWhitelist bool `json:"useLabelsWhitelist,omitempty"`
  18. LabelsWhitelist map[string]bool `json:"labelsWhiteList,omitempty"`
  19. }
  20. // Gets map of disabled metrics to empty structs
  21. func (mc MetricsConfig) GetDisabledMetricsMap() map[string]struct{} {
  22. disabledMetricsMap := make(map[string]struct{})
  23. for i := range mc.DisabledMetrics {
  24. disabledMetricsMap[mc.DisabledMetrics[i]] = struct{}{}
  25. }
  26. return disabledMetricsMap
  27. }
  28. // Unmarshals metrics.json to a MetricsConfig struct
  29. func GetMetricsConfig() (*MetricsConfig, error) {
  30. metricsConfigLock.Lock()
  31. defer metricsConfigLock.Unlock()
  32. mc := &MetricsConfig{}
  33. body, err := os.ReadFile(metricsFilePath)
  34. if os.IsNotExist(err) {
  35. return mc, nil
  36. } else if err != nil {
  37. return mc, fmt.Errorf("error reading metrics config file: %s", err)
  38. }
  39. err = json.Unmarshal(body, mc)
  40. if err != nil {
  41. return mc, fmt.Errorf("error decoding metrics config: %s", err)
  42. }
  43. return mc, nil
  44. }
  45. // Writes MetricsConfig struct to json file
  46. func UpdateMetricsConfig(mc *MetricsConfig) (*MetricsConfig, error) {
  47. metricsConfigLock.Lock()
  48. defer metricsConfigLock.Unlock()
  49. mcb, err := json.Marshal(mc)
  50. if err != nil {
  51. return nil, fmt.Errorf("error encoding metrics config struct: %s", err)
  52. }
  53. err = os.WriteFile(metricsFilePath, mcb, 0644)
  54. if err != nil {
  55. return nil, fmt.Errorf("error writing to metrics config file: %s", err)
  56. }
  57. return mc, nil
  58. }
  59. // Updates metric config file from configmap
  60. func UpdateMetricsConfigFromConfigmap(data map[string]string) error {
  61. mc := &MetricsConfig{}
  62. key := "metrics.json"
  63. cdata, ok := data[key]
  64. if !ok {
  65. return fmt.Errorf("error finding metrics config data")
  66. }
  67. err := json.Unmarshal([]byte(cdata), &mc)
  68. if err != nil {
  69. return fmt.Errorf("failed to unmarshal metrics configs: %s", err)
  70. }
  71. _, err = UpdateMetricsConfig(mc)
  72. if err != nil {
  73. return err
  74. }
  75. return nil
  76. }
  77. // Returns ConfigMapWatcher for metrics configuration configmap
  78. func GetMetricsConfigWatcher() *watcher.ConfigMapWatcher {
  79. return &watcher.ConfigMapWatcher{
  80. ConfigMapName: env.GetMetricsConfigmapName(),
  81. WatchFunc: func(name string, data map[string]string) error {
  82. err := UpdateMetricsConfigFromConfigmap(data)
  83. return err
  84. },
  85. }
  86. }