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 return i;
109 }
110
111
112
113
114 @Override
115 public int getNormalServiceCountByNode() {
116 int i = 0;
117 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
118 if (entry.getKey().getA().equals(hostName) && ServiceState.NORMAL.equals(entry.getValue()))
119 i++;
120 }
121 return i;
122 }
123
124
125
126
127 @Override
128 public int getWarningServiceCountByNode() {
129 int i = 0;
130 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
131 if (entry.getKey().getA().equals(hostName) && ServiceState.WARNING.equals(entry.getValue()))
132 i++;
133 }
134 return i;
135 }
136
137
138
139
140 @Override
141 public int getErrorServiceCountByNode() {
142 int i = 0;
143 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
144 if (entry.getKey().getA().equals(hostName) && ServiceState.ERROR.equals(entry.getValue()))
145 i++;
146 }
147 return i;
148 }
149
150
151
152
153 @Override
154 public int getNormalServiceCount() {
155 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.NORMAL));
156 }
157
158
159
160
161 @Override
162 public int getWarningServiceCount() {
163 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.WARNING));
164 }
165
166
167
168
169 @Override
170 public int getErrorServiceCount() {
171 return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.ERROR));
172 }
173
174
175
176
177 @Override
178 public String[] getServices() {
179 List<String> serviceList = new ArrayList<String>();
180 for (Tuple<String, String> key : services.keySet()) {
181 serviceList.add(key.getA() + DELIMITER + key.getB());
182 }
183 return serviceList.toArray(new String[serviceList.size()]);
184 }
185
186
187
188
189 @Override
190 public String[] getServicesByNode() {
191 List<String> serviceList = new ArrayList<String>();
192 for (Tuple<String, String> key : services.keySet()) {
193 if (key.getA().equals(hostName))
194 serviceList.add(key.getA() + DELIMITER + key.getB());
195 }
196 return serviceList.toArray(new String[serviceList.size()]);
197 }
198
199
200
201
202 @Override
203 public String[] getNormalServices() {
204 List<String> normalServices = new ArrayList<String>();
205 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
206 if (ServiceState.NORMAL.equals(entry.getValue()))
207 normalServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
208 }
209 return normalServices.toArray(new String[normalServices.size()]);
210 }
211
212
213
214
215 @Override
216 public String[] getNormalServicesByNode() {
217 List<String> normalServices = new ArrayList<String>();
218 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
219 if (entry.getKey().getA().equals(hostName) && ServiceState.NORMAL.equals(entry.getValue()))
220 normalServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
221 }
222 return normalServices.toArray(new String[normalServices.size()]);
223 }
224
225
226
227
228 @Override
229 public String[] getWarningServices() {
230 List<String> warningServices = new ArrayList<String>();
231 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
232 if (ServiceState.WARNING.equals(entry.getValue()))
233 warningServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
234 }
235 return warningServices.toArray(new String[warningServices.size()]);
236 }
237
238
239
240
241 @Override
242 public String[] getWarningServicesByNode() {
243 List<String> warningServices = new ArrayList<String>();
244 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
245 if (entry.getKey().getA().equals(hostName) && ServiceState.WARNING.equals(entry.getValue()))
246 warningServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
247 }
248 return warningServices.toArray(new String[warningServices.size()]);
249 }
250
251
252
253
254 @Override
255 public String[] getErrorServices() {
256 List<String> erroServices = new ArrayList<String>();
257 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
258 if (ServiceState.ERROR.equals(entry.getValue()))
259 erroServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
260 }
261 return erroServices.toArray(new String[erroServices.size()]);
262 }
263
264
265
266
267 @Override
268 public String[] getErrorServicesByNode() {
269 List<String> erroServices = new ArrayList<String>();
270 for (Entry<Tuple<String, String>, ServiceState> entry : services.entrySet()) {
271 if (entry.getKey().getA().equals(hostName) && ServiceState.ERROR.equals(entry.getValue()))
272 erroServices.add(entry.getKey().getA() + DELIMITER + entry.getKey().getB());
273 }
274 return erroServices.toArray(new String[erroServices.size()]);
275 }
276
277 }