...
1 package metrics
2
3 import (
4 "context"
5 _ "embed"
6 "os"
7
8 "gopkg.in/yaml.v3"
9 )
10
11 func NewYAMLMetricReaderWriter(ctx context.Context, path string) (ReaderWriter, error) {
12 if path == "" {
13 return NewDefaultMetricReader(ctx)
14 }
15 return &fileMetricReader{
16 ctx: ctx,
17 path: path,
18 }, nil
19 }
20
21 type fileMetricReader struct {
22 ctx context.Context
23 path string
24 }
25
26 func (fmr *fileMetricReader) WriteMetrics(metricDefs *Metrics) error {
27 yamlData, _ := yaml.Marshal(metricDefs)
28 return os.WriteFile(fmr.path, yamlData, 0644)
29 }
30
31
32 var defaultMetricsYAML []byte
33
34 func (fmr *fileMetricReader) GetMetrics() (metrics *Metrics, err error) {
35 metrics = new(Metrics)
36 var s []byte
37 if fmr.path == "" {
38 s = defaultMetricsYAML
39 } else {
40 if s, err = os.ReadFile(fmr.path); err != nil {
41 return nil, err
42 }
43 }
44 if err = yaml.Unmarshal(s, metrics); err != nil {
45 return nil, err
46 }
47 return
48 }
49
50 func (fmr *fileMetricReader) DeleteMetric(metricName string) error {
51 metrics, err := fmr.GetMetrics()
52 if err != nil {
53 return err
54 }
55 delete(metrics.MetricDefs, metricName)
56 return fmr.WriteMetrics(metrics)
57 }
58
59 func (fmr *fileMetricReader) UpdateMetric(metricName string, metric Metric) error {
60 metrics, err := fmr.GetMetrics()
61 if err != nil {
62 return err
63 }
64 metrics.MetricDefs[metricName] = metric
65 return fmr.WriteMetrics(metrics)
66 }
67
68 func (fmr *fileMetricReader) DeletePreset(presetName string) error {
69 metrics, err := fmr.GetMetrics()
70 if err != nil {
71 return err
72 }
73 delete(metrics.PresetDefs, presetName)
74 return fmr.WriteMetrics(metrics)
75 }
76
77 func (fmr *fileMetricReader) UpdatePreset(presetName string, preset Preset) error {
78 metrics, err := fmr.GetMetrics()
79 if err != nil {
80 return err
81 }
82 metrics.PresetDefs[presetName] = preset
83 return fmr.WriteMetrics(metrics)
84 }
85