metricsconfig.go 2.5 KB

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