metricsconfig.go 2.4 KB

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