View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
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     * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServiceCount()
92     */
93    @Override
94    public int getServiceCount() {
95      return services.size();
96    }
97  
98    /**
99     * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServiceCount()
156    */
157   @Override
158   public int getNormalServiceCount() {
159     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.NORMAL));
160   }
161 
162   /**
163    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServiceCount()
164    */
165   @Override
166   public int getWarningServiceCount() {
167     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.WARNING));
168   }
169 
170   /**
171    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServiceCount()
172    */
173   @Override
174   public int getErrorServiceCount() {
175     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.ERROR));
176   }
177 
178   /**
179    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServicesByNode()
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 }