diff options
Diffstat (limited to 'infra/it/management')
8 files changed, 344 insertions, 0 deletions
diff --git a/infra/it/management/asciidoc/Readme.adoc b/infra/it/management/asciidoc/Readme.adoc new file mode 100644 index 000000000..89bbf65d3 --- /dev/null +++ b/infra/it/management/asciidoc/Readme.adoc @@ -0,0 +1,35 @@ += management + +This modules is used to enable JMX monitoring on honeycomb Instance. + += Tutorial +== Configure +To build honeycomb with management module incldued + + mvn clean install -DskipTests -Pmanagement + +After this management module must be included to honeycomb module configuration. +In /minimal-distribution/modules , just include fully qualified name of management module like so + + io.fd.honeycomb.management.jmx.HoneycombManagementModule + +This will start all necessary beans to allow jmx connections to honeycomb instance. +Also in logs , you will see all available JMX beans + +== Use + +To get any available JMX bean, +use interface *JMXBeanProvider* that defines utility method to get *JMXConnector* + + // get configured instance of jxm connection url according to HoneycombManagementConfig + @Inject JMXServiceUrl url; + + // creates JMX connector + final JMXConnector connector = getConnector(url); + // to get any available bean + final String beanType = "java.lang:type=Memory"; + final String beanName = "HeapMemoryUsage"; + final Object jmxBean = getJMXAttribute(connector, beanType, beanName); + + + diff --git a/infra/it/management/pom.xml b/infra/it/management/pom.xml new file mode 100644 index 000000000..0a8e97200 --- /dev/null +++ b/infra/it/management/pom.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright (c) 2017 Cisco and/or its affiliates. + ~ + ~ Licensed 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. + --> + +<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"> + <parent> + <groupId>io.fd.honeycomb.common</groupId> + <artifactId>honeycomb-parent</artifactId> + <version>1.17.04-SNAPSHOT</version> + <relativePath>../../../common/honeycomb-parent</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <properties> + <jetty-jmx.version>9.3.11.v20160721</jetty-jmx.version> + </properties> + + <groupId>io.fd.honeycomb.it</groupId> + <artifactId>management</artifactId> + <version>1.17.04-SNAPSHOT</version> + + <dependencies> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-jmx</artifactId> + <version>${jetty-jmx.version}</version> + </dependency> + + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>minimal-distribution</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> +</project>
\ No newline at end of file diff --git a/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/ConnectorServerProvider.java b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/ConnectorServerProvider.java new file mode 100644 index 000000000..625c63cb8 --- /dev/null +++ b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/ConnectorServerProvider.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed 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 io.fd.honeycomb.management.jmx; + +import com.google.inject.Inject; +import io.fd.honeycomb.infra.distro.ProviderTrait; +import org.eclipse.jetty.jmx.ConnectorServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.management.remote.JMXServiceURL; + +/** + * Provides and start JMX connector server + * */ +public class ConnectorServerProvider extends ProviderTrait<ConnectorServer> { + + private static final Logger LOG = LoggerFactory.getLogger(ConnectorServerProvider.class); + + @Inject + private HoneycombManagementConfig config; + + @Inject + private JMXServiceURL jmxServiceUrl; + + @Override + protected ConnectorServer create() { + try { + final ConnectorServer connectorServer = new ConnectorServer(jmxServiceUrl, + "org.eclipse.jetty.jmx:name="+HoneycombManagementConfig.JXM_CONNECTOR_SERVER_NAME); + + LOG.info("Starting connector server {}", connectorServer); + connectorServer.doStart(); + + return connectorServer; + } catch (Exception e) { + throw new IllegalStateException("Unable to create jmx connector server", e); + } + } +} diff --git a/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementConfig.java b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementConfig.java new file mode 100644 index 000000000..2362b6f43 --- /dev/null +++ b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementConfig.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed 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 io.fd.honeycomb.management.jmx; + + +import net.jmob.guice.conf.core.BindConfig; +import net.jmob.guice.conf.core.InjectConfig; +import net.jmob.guice.conf.core.Syntax; + +import java.util.Optional; + +@BindConfig(value = "management", syntax = Syntax.JSON) +public class HoneycombManagementConfig { + + public static final String JMX_PROTOCOL = "rmi"; + public static final String JXM_CONNECTOR_SERVER_NAME = "rmi"; + + public static final String PROP_JMX_HOST = "jetty.jmxrmihost"; + public static final String PROP_JMX_PORT = "jetty.jmxrmiport"; + + + @InjectConfig(PROP_JMX_HOST) + private String jmxHost; + + @InjectConfig(PROP_JMX_PORT) + private String jmxPort; + + public String getJmxHost() { + return Optional.ofNullable(jmxHost).orElse("localhost"); + } + + public int getJmxPort() { + return Integer.parseInt(Optional.ofNullable(jmxPort).orElse("1099")); + } +} diff --git a/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementModule.java b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementModule.java new file mode 100644 index 000000000..bc75cd01f --- /dev/null +++ b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/HoneycombManagementModule.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed 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 io.fd.honeycomb.management.jmx; + + +import com.google.inject.AbstractModule; +import net.jmob.guice.conf.core.ConfigurationModule; +import org.eclipse.jetty.jmx.ConnectorServer; +import org.eclipse.jetty.jmx.MBeanContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.management.ObjectInstance; +import javax.management.remote.JMXServiceURL; +import java.lang.management.ManagementFactory; + +public class HoneycombManagementModule extends AbstractModule { + + private static final Logger LOG = LoggerFactory.getLogger(HoneycombManagementModule.class); + + @Override + protected void configure() { + install(ConfigurationModule.create()); + requestInjection(HoneycombManagementConfig.class); + bind(MBeanContainer.class).toInstance(new MBeanContainer(ManagementFactory.getPlatformMBeanServer())); + bind(JMXServiceURL.class).toProvider(JMXServiceUrlProvider.class); + // .asEagerSingleton(); will cause also start defined in provider + bind(ConnectorServer.class).toProvider(ConnectorServerProvider.class).asEagerSingleton(); + + showAvailableBeans(); + } + + /** + * Prints all available JMX beans + */ + protected static void showAvailableBeans() { + for (final ObjectInstance instance : ManagementFactory.getPlatformMBeanServer().queryMBeans(null, null)) { + LOG.info("MBean Found:"); + LOG.info("Class Name:{}", instance.getClassName()); + LOG.info("Object Name:{}", instance.getObjectName()); + LOG.info("****************************************"); + } + } +} diff --git a/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXBeanProvider.java b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXBeanProvider.java new file mode 100644 index 000000000..557acb464 --- /dev/null +++ b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXBeanProvider.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed 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 io.fd.honeycomb.management.jmx; + +import javax.annotation.Nonnull; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; +import java.io.IOException; + +public interface JMXBeanProvider { + + /** + * Provides JMX connector to specified url + */ + default JMXConnector getConnector(@Nonnull final JMXServiceURL url) { + try { + return JMXConnectorFactory.connect(url); + } catch (IOException e) { + throw new IllegalStateException("Unable to create JMX connector", e); + } + } + + /** + * Requests specified jxm bean from provided connector + */ + default Object getJMXAttribute(@Nonnull final JMXConnector connector, @Nonnull final String beanType, + @Nonnull final String beanName) { + try { + return connector.getMBeanServerConnection().getAttribute(new ObjectName(beanType), beanName); + } catch (Exception e) { + throw new IllegalStateException( + String.format("Unable to query mbean of type %s, name %s", beanType, beanName), e); + } + } +} diff --git a/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXServiceUrlProvider.java b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXServiceUrlProvider.java new file mode 100644 index 000000000..1b9136501 --- /dev/null +++ b/infra/it/management/src/main/java/io/fd/honeycomb/management/jmx/JMXServiceUrlProvider.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed 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 io.fd.honeycomb.management.jmx; + +import com.google.inject.Inject; +import io.fd.honeycomb.infra.distro.ProviderTrait; + +import javax.management.remote.JMXServiceURL; +import java.net.MalformedURLException; + +/** + * Provides properly binded {@link JMXServiceURL} + */ +public class JMXServiceUrlProvider extends ProviderTrait<JMXServiceURL> { + + @Inject + private HoneycombManagementConfig config; + + @Override + protected JMXServiceURL create() { + try { + return new JMXServiceURL( + HoneycombManagementConfig.JMX_PROTOCOL, + config.getJmxHost(), + config.getJmxPort(), + "/jndi/rmi://" + config.getJmxHost() + ":" + config.getJmxPort() + "/jmxrmi"); + } catch (MalformedURLException e) { + throw new IllegalStateException("Unable to create JXM Service url", e); + } + } +} diff --git a/infra/it/management/src/main/resources/management.json b/infra/it/management/src/main/resources/management.json new file mode 100644 index 000000000..7a73a41bf --- /dev/null +++ b/infra/it/management/src/main/resources/management.json @@ -0,0 +1,2 @@ +{ +}
\ No newline at end of file |