1
2
3
4
5
6
7
8
9
10
11 package psiprobe.beans.stats.collectors;
12
13 import jakarta.inject.Inject;
14
15 import java.util.List;
16 import java.util.Map;
17 import java.util.TreeMap;
18
19 import org.jfree.data.xy.XYDataItem;
20
21 import psiprobe.Utils;
22 import psiprobe.beans.stats.listeners.StatsCollectionEvent;
23 import psiprobe.beans.stats.listeners.StatsCollectionListener;
24 import psiprobe.model.stats.StatsCollection;
25
26
27
28
29 public abstract class AbstractStatsCollectorBean {
30
31
32 @Inject
33 protected StatsCollection statsCollection;
34
35
36 private int maxSeries = 240;
37
38
39 private List<StatsCollectionListener> listeners;
40
41
42 private final Map<String, Long> previousData = new TreeMap<>();
43
44
45 private final Map<String, Entry> previousData2D = new TreeMap<>();
46
47
48
49
50
51
52 public int getMaxSeries() {
53 return maxSeries;
54 }
55
56
57
58
59
60
61 public void setMaxSeries(int maxSeries) {
62 this.maxSeries = maxSeries;
63 }
64
65
66
67
68
69
70 public List<StatsCollectionListener> getListeners() {
71 return listeners;
72 }
73
74
75
76
77
78
79 public void setListeners(List<StatsCollectionListener> listeners) {
80 this.listeners = listeners;
81 }
82
83
84
85
86
87
88 public abstract void collect() throws Exception;
89
90
91
92
93
94
95
96
97
98
99
100 protected long buildDeltaStats(String name, long value) throws InterruptedException {
101 return buildDeltaStats(name, value, System.currentTimeMillis());
102 }
103
104
105
106
107
108
109
110
111
112
113
114
115 protected long buildDeltaStats(String name, long value, long time) throws InterruptedException {
116 long delta = 0;
117 if (statsCollection != null) {
118 long previousValue = Utils.toLong(previousData.get(name), 0);
119 delta = value - previousValue;
120 delta = delta > 0 ? delta : 0;
121 buildAbsoluteStats(name, delta, time);
122 previousData.put(name, value);
123 }
124 return delta;
125 }
126
127
128
129
130
131
132
133
134
135 protected void buildAbsoluteStats(String name, long value) throws InterruptedException {
136 buildAbsoluteStats(name, value, System.currentTimeMillis());
137 }
138
139
140
141
142
143
144
145
146
147
148 protected void buildAbsoluteStats(String name, long value, long time)
149 throws InterruptedException {
150
151 List<XYDataItem> stats = statsCollection.getStats(name);
152 if (stats == null) {
153 statsCollection.newStats(name, maxSeries);
154 } else {
155 XYDataItem data = new XYDataItem(time, value);
156 statsCollection.lockForUpdate();
157 try {
158 stats.add(data);
159 houseKeepStats(stats);
160 } finally {
161 statsCollection.releaseLock();
162 }
163 if (listeners != null) {
164 StatsCollectionEvent event = new StatsCollectionEvent(name, data);
165 for (StatsCollectionListener listener : listeners) {
166 if (listener.isEnabled()) {
167 listener.statsCollected(event);
168 }
169 }
170 }
171 }
172 }
173
174
175
176
177 private static class Entry {
178
179
180 long time;
181
182
183 long value;
184
185
186
187
188 public Entry() {
189
190 }
191
192 }
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215 protected void buildTimePercentageStats(String name, long value, long time)
216 throws InterruptedException {
217
218 Entry entry = previousData2D.get(name);
219 if (entry == null) {
220 entry = new Entry();
221 entry.value = value;
222 entry.time = time;
223 previousData2D.put(name, entry);
224 } else {
225 double valueDelta = (double) value - entry.value;
226 double timeDelta = (double) time - entry.time;
227 double statValue = valueDelta * 100 / timeDelta;
228 statsCollection.lockForUpdate();
229 try {
230 List<XYDataItem> stats = statsCollection.getStats(name);
231 if (stats == null) {
232 stats = statsCollection.newStats(name, maxSeries);
233 }
234 stats.add(stats.size(), new XYDataItem(time, statValue));
235 houseKeepStats(stats);
236 } finally {
237 statsCollection.releaseLock();
238 }
239 }
240 }
241
242
243
244
245
246
247 protected void resetStats(String name) {
248 statsCollection.resetStats(name);
249 }
250
251
252
253
254
255
256 private void houseKeepStats(List<XYDataItem> stats) {
257 while (stats.size() > maxSeries) {
258 stats.remove(0);
259 }
260 }
261 }