...
1 package cmdopts
2
3 import (
4 "context"
5 "fmt"
6 "math"
7
8 "gopkg.in/yaml.v3"
9 )
10
11 type MetricCommand struct {
12 owner *Options
13 PrintInit MetricPrintInitCommand `command:"print-init" description:"Get and print init SQL for a given metric or preset"`
14 PrintSQL MetricPrintSQLCommand `command:"print-sql" description:"Get and print SQL for a given metric"`
15 List MetricListCommand `command:"list" description:"List available metrics and presets"`
16 }
17
18 func NewMetricCommand(owner *Options) *MetricCommand {
19 return &MetricCommand{
20 owner: owner,
21 PrintInit: MetricPrintInitCommand{owner: owner},
22 PrintSQL: MetricPrintSQLCommand{owner: owner},
23 List: MetricListCommand{owner: owner},
24 }
25 }
26
27 type MetricPrintInitCommand struct {
28 owner *Options
29 }
30
31 func (cmd *MetricPrintInitCommand) Execute(args []string) error {
32 err := cmd.owner.InitMetricReader(context.Background())
33 if err != nil {
34 return err
35 }
36 metrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
37 if err != nil {
38 return err
39 }
40 metrics, err = metrics.FilterByNames(args)
41 if err != nil {
42 return err
43 }
44 w := cmd.owner.OutputWriter
45 for mname, mdef := range metrics.MetricDefs {
46 if mdef.InitSQL > "" {
47 fmt.Fprintln(w, "--", mname)
48 fmt.Fprintln(w, mdef.InitSQL)
49 }
50 }
51 cmd.owner.CompleteCommand(ExitCodeOK)
52 return nil
53 }
54
55 type MetricPrintSQLCommand struct {
56 owner *Options
57 Version int `short:"v" long:"version" description:"PostgreSQL version to get SQL for"`
58 }
59
60 func (cmd *MetricPrintSQLCommand) Execute(args []string) error {
61 err := cmd.owner.InitMetricReader(context.Background())
62 if err != nil {
63 return err
64 }
65 metrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
66 if err != nil {
67 return err
68 }
69 metrics, err = metrics.FilterByNames(args)
70 if err != nil {
71 return err
72 }
73 w := cmd.owner.OutputWriter
74 if cmd.Version == 0 {
75 cmd.Version = math.MaxInt32
76 }
77 for _, name := range args {
78 if m, ok := metrics.MetricDefs[name]; ok {
79 if v := m.GetSQL(cmd.Version); v > "" {
80 fmt.Fprintln(w, "--", name)
81 fmt.Fprintln(w, v)
82 }
83 }
84 }
85 cmd.owner.CompleteCommand(ExitCodeOK)
86 return nil
87 }
88
89 type MetricListCommand struct {
90 owner *Options
91 }
92
93 func (cmd *MetricListCommand) Execute(args []string) error {
94 err := cmd.owner.InitMetricReader(context.Background())
95 if err != nil {
96 return err
97 }
98 allMetrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
99 if err != nil {
100 return err
101 }
102 result, err := allMetrics.FilterByNames(args)
103 if err != nil {
104 return err
105 }
106 w := cmd.owner.OutputWriter
107
108 yamlData, _ := yaml.Marshal(result)
109 fmt.Fprint(w, string(yamlData))
110 cmd.owner.CompleteCommand(ExitCodeOK)
111 return nil
112 }
113