metricsconfig.go 2.4 KB

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