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     return i;
109   }
110 
111   /**
112    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServiceCountByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServiceCount()
152    */
153   @Override
154   public int getNormalServiceCount() {
155     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.NORMAL));
156   }
157 
158   /**
159    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServiceCount()
160    */
161   @Override
162   public int getWarningServiceCount() {
163     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.WARNING));
164   }
165 
166   /**
167    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServiceCount()
168    */
169   @Override
170   public int getErrorServiceCount() {
171     return CollectionUtils.countMatches(services.values(), PredicateUtils.equalPredicate(ServiceState.ERROR));
172   }
173 
174   /**
175    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getNormalServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getWarningServicesByNode()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServices()
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    * @see org.opencastproject.serviceregistry.impl.jmx.ServicesStatisticsMXBean#getErrorServicesByNode()
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 }