1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.opencastproject.serviceregistry.impl.jmx;
23
24 import org.opencastproject.serviceregistry.api.ServiceRegistration;
25 import org.opencastproject.serviceregistry.api.ServiceState;
26 import org.opencastproject.serviceregistry.api.ServiceStatistics;
27 import org.opencastproject.util.data.Tuple;
28 import org.opencastproject.util.jmx.JmxUtil;
29
30 import org.apache.commons.collections4.CollectionUtils;
31 import org.apache.commons.collections4.PredicateUtils;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.Map.Entry;
40
41 import javax.management.MBeanNotificationInfo;
42 import javax.management.Notification;
43 import javax.management.NotificationBroadcasterSupport;
44
45 public class ServicesStatistics extends NotificationBroadcasterSupport implements ServicesStatisticsMXBean {
46
47 private static final Logger logger = LoggerFactory.getLogger(ServicesStatistics.class);
48
49 private static final String DELIMITER = ";";
50
51 private Map<Tuple<String, String>, ServiceState> services = new HashMap<Tuple<String, String>, ServiceState>();
52 private long sequenceNumber = 1;
53 private final String hostName;
54
55 public ServicesStatistics(String hostName, List<ServiceStatistics> statistics) {
56 this.hostName = hostName;
57 for (ServiceStatistics stats : statistics) {
58 if (!stats.getServiceRegistration().isActive()) {
59 logger.trace("Ignoring inactive service '{}'", stats);
60 continue;
61 }
62 String host = stats.getServiceRegistration().getHost();
63 String serviceType = stats.getServiceRegistration().getServiceType();
64 ServiceState serviceState = stats.getServiceRegistration().getServiceState();
65 services.put(Tuple.tuple(host, serviceType), serviceState);
66 }
67 }
68
69 public void updateService(ServiceRegistration registration) {
70 if (!registration.isActive()) {
71 services.remove(Tuple.tuple(registration.getHost(), registration.getServiceType()));
72 logger.trace("Removing inactive service '{}'", registration);
73 } else {
74 services.put(Tuple.tuple(registration.getHost(), registration.getServiceType()), registration.getServiceState());
75 }
76
77 sendNotification(JmxUtil.createUpdateNotification(this, sequenceNumber++, "Service updated"));
78 }
79
80 @Override
81 public MBeanNotificationInfo[] getNotificationInfo() {
82 String[] types = new String[] { JmxUtil.OPENCAST_UPDATE_NOTIFICATION };
83
84 String name = Notification.class.getName();
85 String description = "An update was executed";
86 MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
87 return new MBeanNotificationInfo[] { info };
88 }
89
90
91
92
93 @Override
94 public int getServiceCount() {
95 return services.size();
96 }
97
98
99
100
101 @Override
102 public int getServiceCountByNode() {
103 int i = 0;
104 for (Tuple<String, String> key : services.keySet()) {
105 if (key.getA().equals(hostName)) {
106 i++;
107 }
108 }
109 return i;
110 }
111
112
113
114
115 @Override
116 public int getNormalServiceCountByNode() {
117 int i = 0;
118 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
119 if (entry.getKey().getA().equals(hostName) && ServiceState.NORMAL.equals(entry.getValue())) {
120 i++;
121 }
122 }
123 return i;
124 }
125
126
127
128
129 @Override
130 public int getWarningServiceCountByNode() {
131 int i = 0;
132 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
133 if (entry.getKey().getA().equals(hostName) && ServiceState.WARNING.equals(entry.getValue())) {
134 i++;
135 }
136 }
137 return i;
138 }
139
140
141
142
143 @Override
144 public int getErrorServiceCountByNode() {
145 int i = 0;
146 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
147 if (entry.getKey().getA().equals(hostName) && ServiceState.ERROR.equals(entry.getValue())) {
148 i++;
149 }
150 }
151 return i;
152 }
153
154
155
156
157 @Override
158 public int getNormalServiceCount() {
159 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.NORMAL));
160 }
161
162
163
164
165 @Override
166 public int getWarningServiceCount() {
167 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.WARNING));
168 }
169
170
171
172
173 @Override
174 public int getErrorServiceCount() {
175 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.ERROR));
176 }
177
178
179
180
181 @Override
182 public String[] getServices() {
183 List<String> serviceList = new ArrayList<String>();
184 for (Tuple<String, String> key : services.keySet()) {
185 serviceList.add(key.getA() + DELIMITER + key.getB());
186 }
187 return serviceList.toArray(new String[serviceList.size()]);
188 }
189
190
191
192
193 @Override
194 public String[] getServicesByNode() {
195 List<String> serviceList = new ArrayList<String>();
196 for (Tuple<String, String> key : services.keySet()) {
197 if (key.getA().equals(hostName)) {
198 serviceList.add(key.getA() + DELIMITER + key.getB());
199 }
200 }
201 return serviceList.toArray(new String[serviceList.size()]);
202 }
203
204
205
206
207 @Override
208 public String[] getNormalServices() {
209 List<String> normalServices = new ArrayList<String>();
210 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
211 if (ServiceState.NORMAL.equals(entry.getValue())) {
212 normalServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
213 }
214 }
215 return normalServices.toArray(new String[normalServices.size()]);
216 }
217
218
219
220
221 @Override
222 public String[] getNormalServicesByNode() {
223 List<String> normalServices = new ArrayList<String>();
224 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
225 if (entry.getKey().getA().equals(hostName) && ServiceState.NORMAL.equals(entry.getValue())) {
226 normalServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
227 }
228 }
229 return normalServices.toArray(new String[normalServices.size()]);
230 }
231
232
233
234
235 @Override
236 public String[] getWarningServices() {
237 List<String> warningServices = new ArrayList<String>();
238 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
239 if (ServiceState.WARNING.equals(entry.getValue())) {
240 warningServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
241 }
242 }
243 return warningServices.toArray(new String[warningServices.size()]);
244 }
245
246
247
248
249 @Override
250 public String[] getWarningServicesByNode() {
251 List<String> warningServices = new ArrayList<String>();
252 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
253 if (entry.getKey().getA().equals(hostName) && ServiceState.WARNING.equals(entry.getValue())) {
254 warningServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
255 }
256 }
257 return warningServices.toArray(new String[warningServices.size()]);
258 }
259
260
261
262
263 @Override
264 public String[] getErrorServices() {
265 List<String> erroServices = new ArrayList<String>();
266 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
267 if (ServiceState.ERROR.equals(entry.getValue())) {
268 erroServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
269 }
270 }
271 return erroServices.toArray(new String[erroServices.size()]);
272 }
273
274
275
276
277 @Override
278 public String[] getErrorServicesByNode() {
279 List<String> erroServices = new ArrayList<String>();
280 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
281 if (entry.getKey().getA().equals(hostName) && ServiceState.ERROR.equals(entry.getValue())) {
282 erroServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
283 }
284 }
285 return erroServices.toArray(new String[erroServices.size()]);
286 }
287
288 }