Repository: karaf-decanter Updated Branches: refs/heads/master a142a9906 -> ccdd75ad0
[KARAF-3697] - Decanter: Camel collector Project: http://git-wip-us.apache.org/repos/asf/karaf-decanter/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-decanter/commit/ccdd75ad Tree: http://git-wip-us.apache.org/repos/asf/karaf-decanter/tree/ccdd75ad Diff: http://git-wip-us.apache.org/repos/asf/karaf-decanter/diff/ccdd75ad Branch: refs/heads/master Commit: ccdd75ad0d98cbca0a815bf74261123e3f4d4389 Parents: a142a99 Author: anierbeck <[email protected]> Authored: Fri Apr 24 21:26:32 2015 +0200 Committer: anierbeck <[email protected]> Committed: Fri Apr 24 21:26:32 2015 +0200 ---------------------------------------------------------------------- assembly/src/main/feature/feature.xml | 5 + collector/camel/.gitignore | 1 + collector/camel/pom.xml | 81 +++++++++++++ .../decanter/collector/camel/Activator.java | 43 +++++++ .../collector/camel/CamelCollector.java | 117 +++++++++++++++++++ .../decanter/collector/jmx/JmxCollector.java | 2 + collector/pom.xml | 1 + 7 files changed, 250 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/assembly/src/main/feature/feature.xml ---------------------------------------------------------------------- diff --git a/assembly/src/main/feature/feature.xml b/assembly/src/main/feature/feature.xml index 1cc46b0..4920b26 100644 --- a/assembly/src/main/feature/feature.xml +++ b/assembly/src/main/feature/feature.xml @@ -38,6 +38,11 @@ <bundle>mvn:org.apache.karaf.decanter.collector/org.apache.karaf.decanter.collector.jmx/${project.version}</bundle> </feature> + <feature name="decanter-collector-camel" version="${project.version}" description="Karaf Decanter Camel Collector"> + <feature version="${project.version}">decanter-common</feature> + <bundle>mvn:org.apache.karaf.decanter.collector/org.apache.karaf.decanter.collector.camel/${project.version}</bundle> + </feature> + <feature name="decanter-appender-log" version="${project.version}" description="Karaf Decanter Log Appender"> <feature version="${project.version}">decanter-common</feature> <bundle>mvn:org.apache.karaf.decanter.appender/org.apache.karaf.decanter.appender.log/${project.version}</bundle> http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/camel/.gitignore ---------------------------------------------------------------------- diff --git a/collector/camel/.gitignore b/collector/camel/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/collector/camel/.gitignore @@ -0,0 +1 @@ +/target/ http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/camel/pom.xml ---------------------------------------------------------------------- diff --git a/collector/camel/pom.xml b/collector/camel/pom.xml new file mode 100644 index 0000000..f6702e0 --- /dev/null +++ b/collector/camel/pom.xml @@ -0,0 +1,81 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <!-- Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with this + work for additional information regarding copyright ownership. The ASF licenses + this file to You under the Apache License, Version 2.0 (the "License"); you + may not use this file except in compliance with the License. You may obtain + a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless + required by applicable law or agreed to in writing, software distributed + under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + OR CONDITIONS OF ANY KIND, either express or implied. See the License for + the specific language governing permissions and limitations under the License. --> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.karaf.decanter</groupId> + <artifactId>org.apache.karaf.decanter.collector</artifactId> + <version>3.0.0-SNAPSHOT</version> + </parent> + <groupId>org.apache.karaf.decanter.collector</groupId> + <artifactId>org.apache.karaf.decanter.collector.camel</artifactId> + <packaging>bundle</packaging> + <name>Apache Karaf :: Decanter :: Collector :: Camel</name> + + <dependencies> + + <!-- Decanter API --> + <dependency> + <groupId>org.apache.karaf.decanter</groupId> + <artifactId>org.apache.karaf.decanter.api</artifactId> + </dependency> + + <!-- OSGi --> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + </dependency> + + <!-- SLF4J --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <!-- Test dependencies --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <inherited>true</inherited> + <extensions>true</extensions> + <configuration> + <instructions> + <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> + <Bundle-Version>${project.version}</Bundle-Version> + <Bundle-Activator>org.apache.karaf.decanter.collector.camel.Activator</Bundle-Activator> + <Import-Package> + org.apache.karaf.decanter.api;version=${project.version}, + org.slf4j;version="[1.7,2)";resolution:=optional, + * + </Import-Package> + </instructions> + </configuration> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/Activator.java ---------------------------------------------------------------------- diff --git a/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/Activator.java b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/Activator.java new file mode 100644 index 0000000..9c559c3 --- /dev/null +++ b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/Activator.java @@ -0,0 +1,43 @@ +package org.apache.karaf.decanter.collector.camel; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.event.EventAdmin; +import org.osgi.util.tracker.ServiceTracker; + +public class Activator implements BundleActivator { + + private ServiceTracker<EventAdmin, ServiceRegistration> tracker; + + public void start(final BundleContext bundleContext) throws Exception { + tracker = new ServiceTracker<EventAdmin, ServiceRegistration>(bundleContext, EventAdmin.class, null) { + + @Override + public ServiceRegistration<?> addingService(ServiceReference<EventAdmin> reference) { + EventAdmin eventAdmin = bundleContext.getService(reference); + CamelCollector collector = new CamelCollector(eventAdmin); + Dictionary<String, String> properties = new Hashtable<String, String>(); + properties.put("decanter.collector.name", "camel"); + return bundleContext.registerService(Runnable.class, collector, properties); + } + + @Override + public void removedService(ServiceReference<EventAdmin> reference, ServiceRegistration reg) { + reg.unregister(); + super.removedService(reference, reg); + } + + }; + tracker.open(); + } + + public void stop(BundleContext bundleContext) throws Exception { + tracker.close(); + } + +} http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/CamelCollector.java ---------------------------------------------------------------------- diff --git a/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/CamelCollector.java b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/CamelCollector.java new file mode 100644 index 0000000..b49535f --- /dev/null +++ b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/CamelCollector.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.karaf.decanter.collector.camel; + +import java.lang.management.ManagementFactory; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; + +import org.osgi.service.event.Event; +import org.osgi.service.event.EventAdmin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Decanter Camel Pooling Collector + */ +public class CamelCollector implements Runnable { + + private final static Logger LOGGER = LoggerFactory.getLogger(CamelCollector.class); + private EventAdmin eventAdmin; + + public CamelCollector(EventAdmin eventAdmin) { + this.eventAdmin = eventAdmin; + } + + @Override + public void run() { + LOGGER.debug("Karaf Decanter Camel Collector starts harvesting ..."); + + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + //ObjectName: org.apache.camel:context=*,type=routes,name="*" + Set<ObjectName> names = Collections.emptySet(); + try { + names = server.queryNames(new ObjectName("org.apache.camel:context=*,type=routes,name=\"*\""), null); + } catch (MalformedObjectNameException e1) { + LOGGER.warn("Error retrieving information from mbean-server for camel data"); + } + for (ObjectName name : names) { + try { + Map<String, Object> data = harvestBean(server, name); + Event event = new Event("decanter/camel/" + getTopic(name), data); + eventAdmin.postEvent(event); + } catch (Exception e) { + LOGGER.warn("Error reading mbean " + name, e); + } + } + + LOGGER.debug("Karaf Decanter Camel Collector harvesting done"); + } + + private String getTopic(ObjectName name) { + return name.getDomain().replace(".", "/"); + } + + Map<String, Object> harvestBean(MBeanServer server, ObjectName name) throws Exception { + MBeanAttributeInfo[] attributes = server.getMBeanInfo(name).getAttributes(); + Map<String, Object> data = new HashMap<>(); + data.put("type", "camel"); + for (MBeanAttributeInfo attribute : attributes) { + try { + // TODO add SLA check on attributes and filtering + Object attributeObject = server.getAttribute(name, attribute.getName()); + if (attributeObject instanceof String) { + data.put(attribute.getName(), (String)attributeObject); + } else if (attributeObject instanceof ObjectName) { + data.put(attribute.getName(), ((ObjectName)attributeObject).toString()); + } else if (attributeObject instanceof CompositeDataSupport) { + CompositeDataSupport cds = (CompositeDataSupport)attributeObject; + CompositeType compositeType = cds.getCompositeType(); + Set<String> keySet = compositeType.keySet(); + Map<String, Object> composite = new HashMap<String, Object>(); + for (String key : keySet) { + Object cdsObject = cds.get(key); + composite.put(key, cdsObject); + } + data.put(attribute.getName(), composite); + } else if (attributeObject instanceof Long + || attributeObject instanceof Integer + || attributeObject instanceof Boolean + || attributeObject instanceof Float + || attributeObject instanceof Double){ + data.put(attribute.getName(), attributeObject); + } + } catch (SecurityException se) { + LOGGER.error("SecurityException: ", se); + } catch (Exception e) { + LOGGER.debug("Could not read attribute " + name.toString() + " " + attribute.getName()); + } + + } + return data; + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java ---------------------------------------------------------------------- diff --git a/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java b/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java index 59da402..fcc5f9b 100644 --- a/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java +++ b/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java @@ -97,6 +97,8 @@ public class JmxCollector implements Runnable { || attributeObject instanceof Double){ data.put(attribute.getName(), attributeObject); } + } catch (SecurityException se) { + LOGGER.error("SecurityException: ", se); } catch (Exception e) { LOGGER.debug("Could not read attribute " + name.toString() + " " + attribute.getName()); } http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/ccdd75ad/collector/pom.xml ---------------------------------------------------------------------- diff --git a/collector/pom.xml b/collector/pom.xml index 426327e..ae58c5f 100644 --- a/collector/pom.xml +++ b/collector/pom.xml @@ -37,6 +37,7 @@ <module>jmx</module> <module>log</module> <!-- TODO camel tracer <module>camel</module> --> + <module>camel</module> </modules> </project> \ No newline at end of file
