Move to i_s / p_s and add user info (not quite complete)
[pstop.git] / p_s / table_io_waits_summary_by_table / table_io_waits_summary_by_table.go
1 // p_s - library routines for pstop.
2 //
3 // This file contains the library routines for managing the
4 // table_io_waits_by_table table.
5 package table_io_waits_summary_by_table
6
7 import (
8         "database/sql"
9         "fmt"
10         "time"
11
12         "github.com/sjmudd/pstop/lib"
13         "github.com/sjmudd/pstop/p_s"
14 )
15
16 // a table of rows
17 type Table_io_waits_summary_by_table struct {
18         p_s.RelativeStats
19         p_s.InitialTime
20         want_latency bool
21         initial      table_io_waits_summary_by_table_rows // initial data for relative values
22         current      table_io_waits_summary_by_table_rows // last loaded values
23         results      table_io_waits_summary_by_table_rows // results (maybe with subtraction)
24         totals       table_io_waits_summary_by_table_row  // totals of results
25 }
26
27 func (t *Table_io_waits_summary_by_table) SetWantsLatency(want_latency bool) {
28         t.want_latency = want_latency
29 }
30
31 func (t Table_io_waits_summary_by_table) WantsLatency() bool {
32         return t.want_latency
33 }
34
35 // Collect() collects data from the db, updating initial
36 // values if needed, and then subtracting initial values if we want
37 // relative values, after which it stores totals.
38 func (t *Table_io_waits_summary_by_table) Collect(dbh *sql.DB) {
39         start := time.Now()
40         // lib.Logger.Println("Table_io_waits_summary_by_table.Collect() BEGIN")
41         t.current = select_tiwsbt_rows(dbh)
42         lib.Logger.Println("t.current collected", len(t.current), "row(s) from SELECT")
43
44         if len(t.initial) == 0 && len(t.current) > 0 {
45                 lib.Logger.Println("t.initial: copying from t.current (initial setup)")
46                 t.initial = make(table_io_waits_summary_by_table_rows, len(t.current))
47                 copy(t.initial, t.current)
48         }
49
50         // check for reload initial characteristics
51         if t.initial.needs_refresh(t.current) {
52                 lib.Logger.Println("t.initial: copying from t.current (data needs refreshing)")
53                 t.initial = make(table_io_waits_summary_by_table_rows, len(t.current))
54                 copy(t.initial, t.current)
55         }
56
57         t.make_results()
58
59         // lib.Logger.Println( "t.initial:", t.initial )
60         // lib.Logger.Println( "t.current:", t.current )
61         lib.Logger.Println("t.initial.totals():", t.initial.totals())
62         lib.Logger.Println("t.current.totals():", t.current.totals())
63         // lib.Logger.Println("t.results:", t.results)
64         // lib.Logger.Println("t.totals:", t.totals)
65         lib.Logger.Println("Table_io_waits_summary_by_table.Collect() END, took:", time.Duration(time.Since(start)).String())
66 }
67
68 func (t *Table_io_waits_summary_by_table) make_results() {
69         // lib.Logger.Println( "- t.results set from t.current" )
70         t.results = make(table_io_waits_summary_by_table_rows, len(t.current))
71         copy(t.results, t.current)
72         if t.WantRelativeStats() {
73                 // lib.Logger.Println( "- subtracting t.initial from t.results as WantRelativeStats()" )
74                 t.results.subtract(t.initial)
75         }
76
77         // lib.Logger.Println( "- sorting t.results" )
78         t.results.Sort(t.want_latency)
79         // lib.Logger.Println( "- collecting t.totals from t.results" )
80         t.totals = t.results.totals()
81 }
82
83 // reset the statistics to current values
84 func (t *Table_io_waits_summary_by_table) SyncReferenceValues() {
85         // lib.Logger.Println( "Table_io_waits_summary_by_table.SyncReferenceValues() BEGIN" )
86
87         t.initial = make(table_io_waits_summary_by_table_rows, len(t.current))
88         copy(t.initial, t.current)
89
90         t.make_results()
91
92         // lib.Logger.Println( "Table_io_waits_summary_by_table.SyncReferenceValues() END" )
93 }
94
95 func (t *Table_io_waits_summary_by_table) Headings() string {
96         if t.want_latency {
97                 return t.latencyHeadings()
98         } else {
99                 return t.opsHeadings()
100         }
101 }
102
103 func (t Table_io_waits_summary_by_table) RowContent(max_rows int) []string {
104         if t.want_latency {
105                 return t.latencyRowContent(max_rows)
106         } else {
107                 return t.opsRowContent(max_rows)
108         }
109 }
110
111 func (t Table_io_waits_summary_by_table) EmptyRowContent() string {
112         if t.want_latency {
113                 return t.emptyLatencyRowContent()
114         } else {
115                 return t.emptyOpsRowContent()
116         }
117 }
118
119 func (t Table_io_waits_summary_by_table) TotalRowContent() string {
120         if t.want_latency {
121                 return t.totalLatencyRowContent()
122         } else {
123                 return t.totalOpsRowContent()
124         }
125 }
126
127 func (t Table_io_waits_summary_by_table) Description() string {
128         if t.want_latency {
129                 return t.latencyDescription()
130         } else {
131                 return t.opsDescription()
132         }
133 }
134
135 func (t *Table_io_waits_summary_by_table) latencyHeadings() string {
136         var r table_io_waits_summary_by_table_row
137
138         return r.latency_headings()
139 }
140
141 func (t *Table_io_waits_summary_by_table) opsHeadings() string {
142         var r table_io_waits_summary_by_table_row
143
144         return r.ops_headings()
145 }
146
147 func (t Table_io_waits_summary_by_table) opsRowContent(max_rows int) []string {
148         rows := make([]string, 0, max_rows)
149
150         for i := range t.results {
151                 if i < max_rows {
152                         rows = append(rows, t.results[i].ops_row_content(t.totals))
153                 }
154         }
155
156         return rows
157 }
158
159 func (t Table_io_waits_summary_by_table) latencyRowContent(max_rows int) []string {
160         rows := make([]string, 0, max_rows)
161
162         for i := range t.results {
163                 if i < max_rows {
164                         rows = append(rows, t.results[i].latency_row_content(t.totals))
165                 }
166         }
167
168         return rows
169 }
170
171 func (t Table_io_waits_summary_by_table) emptyOpsRowContent() string {
172         var r table_io_waits_summary_by_table_row
173
174         return r.ops_row_content(r)
175 }
176
177 func (t Table_io_waits_summary_by_table) emptyLatencyRowContent() string {
178         var r table_io_waits_summary_by_table_row
179
180         return r.latency_row_content(r)
181 }
182
183 func (t Table_io_waits_summary_by_table) totalOpsRowContent() string {
184         return t.totals.ops_row_content(t.totals)
185 }
186
187 func (t Table_io_waits_summary_by_table) totalLatencyRowContent() string {
188         return t.totals.latency_row_content(t.totals)
189 }
190
191 func (t Table_io_waits_summary_by_table) latencyDescription() string {
192         count := t.count_rows()
193         return fmt.Sprintf("Latency by Table Name (table_io_waits_summary_by_table) %d rows", count)
194 }
195
196 func (t Table_io_waits_summary_by_table) opsDescription() string {
197         count := t.count_rows()
198         return fmt.Sprintf("Operations by Table Name (table_io_waits_summary_by_table) %d rows", count)
199 }
200
201 func (t Table_io_waits_summary_by_table) count_rows() int {
202         var count int
203         for row := range t.results {
204                 if t.results[row].SUM_TIMER_WAIT > 0 {
205                         count++
206                 }
207         }
208         return count
209 }