/** * Creates an {@link ObjectNameBuilder} given the JMX domain. * * @param domain the JMX domain * @return The ObjectNameBuilder */ public static ObjectNameBuilder forDomain(String domain) { return new ObjectNameBuilder(domain); }
/** * Create an MBean for a {@link com.netflix.servo.monitor.Monitor}. * * @param domain passed in to the object name created to identify the beans * @param monitor monitor to expose to jmx * @param mapper the mapper which maps the monitor to ObjectName */ MonitorMBean(String domain, Monitor<?> monitor, ObjectNameMapper mapper) { this.monitor = monitor; this.objectName = createObjectName(mapper, domain); this.beanInfo = createBeanInfo(); }
/** * Adds the {@link TagList} as {@link ObjectName} properties. * * @param tagList the tag list to add * @return This builder */ public ObjectNameBuilder addProperties(TagList tagList) { for (Tag tag : tagList) { addProperty(tag); } return this; }
@Override public ObjectName createObjectName(String domain, Monitor<?> monitor) { ObjectNameBuilder objNameBuilder = ObjectNameBuilder.forDomain(domain); objNameBuilder.addProperty("name", monitor.getConfig().getName()); objNameBuilder.addProperties(monitor.getConfig().getTags()); return objNameBuilder.build(); }
@Test public void testInvalidCharactersSanitized() { ObjectName name = ObjectNameBuilder.forDomain("test*Domain&") .addProperty("foo%", "$bar") .build(); assertEquals(name.getDomain(), "test_Domain_"); assertEquals(name.getKeyPropertyListString(), "foo_=_bar"); }
/** * Register a new monitor in the registry. */ @Override public void register(Monitor<?> monitor) { try { List<MonitorMBean> beans = MonitorMBean.createMBeans(name, monitor, mapper); for (MonitorMBean bean : beans) { register(bean.getObjectName(), bean); } monitors.put(monitor.getConfig(), monitor); updatePending.set(true); } catch (Exception e) { LOG.warn("Unable to register Monitor:" + monitor.getConfig(), e); } }
@Test public void testOrderedTagsWithAppend() { ObjectNameMapper mapper = new OrderedObjectNameMapper(true, "name", DataSourceType.KEY, "foo", "notPresentKey"); ObjectName name = mapper.createObjectName(TEST_DOMAIN, TEST_COUNTER); assertEquals(name.getDomain(), TEST_DOMAIN); assertEquals(name.getKeyPropertyListString(), String.format("name=testName,%s=COUNTER,foo=bar,aaa=aaaVal,zzz=zzzVal", DataSourceType.KEY)); }
@Override public boolean isRegistered(Monitor<?> monitor) { try { List<MonitorMBean> beans = MonitorMBean.createMBeans(name, monitor, mapper); for (MonitorMBean bean : beans) { if (mBeanServer.isRegistered(bean.getObjectName())) { return true; } } } catch (Exception e) { return false; } return false; }
private static void createMBeans(List<MonitorMBean> mbeans, String domain, Monitor<?> monitor, ObjectNameMapper mapper) { if (monitor instanceof CompositeMonitor<?>) { for (Monitor<?> m : ((CompositeMonitor<?>) monitor).getMonitors()) { createMBeans(mbeans, domain, m, mapper); } } else { mbeans.add(new MonitorMBean(domain, monitor, mapper)); } }
private ObjectName createObjectName(ObjectNameMapper mapper, String domain) { return mapper.createObjectName(domain, monitor); }
private ObjectNameBuilder(String domain) { nameStrBuilder = new StringBuilder(sanitizeValue(domain)); nameStrBuilder.append(":"); }
/** * Create a set of MBeans for a {@link com.netflix.servo.monitor.Monitor}. This method will * recursively select all of the sub-monitors if a composite type is used. * * @param domain passed in to the object name created to identify the beans * @param monitor monitor to expose to jmx * @param mapper the mapper which maps the Monitor to ObjectName * @return flattened list of simple monitor mbeans */ public static List<MonitorMBean> createMBeans(String domain, Monitor<?> monitor, ObjectNameMapper mapper) { List<MonitorMBean> mbeans = new ArrayList<>(); createMBeans(mbeans, domain, monitor, mapper); return mbeans; }
private void register(ObjectName objectName, DynamicMBean mbean) throws Exception { synchronized (getLock(objectName)) { if (mBeanServer.isRegistered(objectName)) { mBeanServer.unregisterMBean(objectName); } mBeanServer.registerMBean(mbean, objectName); } }
private MBeanInfo createBeanInfo() { MBeanAttributeInfo[] attrs = new MBeanAttributeInfo[1]; attrs[0] = createAttributeInfo(monitor); return new MBeanInfo( this.getClass().getName(), "MonitorMBean", attrs, null, // constructors null, // operators null); // notifications }
@Test public void testOrderedTagsWithoutNameExplicitlyOrdered() { ObjectNameMapper mapper = new OrderedObjectNameMapper(true, "foo", DataSourceType.KEY); ObjectName name = mapper.createObjectName(TEST_DOMAIN, TEST_COUNTER); assertEquals(name.getDomain(), TEST_DOMAIN); assertEquals(name.getKeyPropertyListString(), String.format("foo=bar,%s=COUNTER,name=testName,aaa=aaaVal,zzz=zzzVal", DataSourceType.KEY)); }
/** * Adds the {@link Tag} as a {@link ObjectName} property. * * @param tag the tag to add * @return This builder */ public ObjectNameBuilder addProperty(Tag tag) { return addProperty(tag.getKey(), tag.getValue()); }
@Override public ObjectName createObjectName(String domain, Monitor<?> monitor) { return ObjectNameMapper.DEFAULT.createObjectName(domain + ".Renamed", monitor); }
/** * Adds the key/value as a {@link ObjectName} property. * * @param key the key to add * @param value the value to add * @return This builder */ public ObjectNameBuilder addProperty(String key, String value) { nameStrBuilder.append(sanitizeValue(key)) .append('=') .append(sanitizeValue(value)).append(","); return this; }
@Test public void testOrderedTagsWithoutAppend() { ObjectNameMapper mapper = new OrderedObjectNameMapper(false, Arrays.asList("name", DataSourceType.KEY, "foo", "notPresentKey")); ObjectName name = mapper.createObjectName(TEST_DOMAIN, TEST_COUNTER); assertEquals(name.getDomain(), TEST_DOMAIN); assertEquals(name.getKeyPropertyListString(), String.format("name=testName,%s=COUNTER,foo=bar", DataSourceType.KEY)); }
private void addName(ObjectNameBuilder builder, Monitor<?> monitor) { builder.addProperty("name", monitor.getConfig().getName()); }