diff options
author | Jan Srnicek <jsrnicek@cisco.com> | 2017-09-12 08:22:07 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2017-09-12 06:48:17 +0000 |
commit | dbc30d321bd385e5cd5bce1e6f567ade9ca1aa25 (patch) | |
tree | 80620eb992e8ee12254b8162e369ceee469d07d0 /infra/footprint/footprint-impl | |
parent | 61ae76644a2d68823aaeabf4c0310c1717f52236 (diff) |
HONEYCOMB-392 - Footprint measuring support
Change-Id: I079c8ceef84cda43159e1823fe42ad77cdc981e8
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
Diffstat (limited to 'infra/footprint/footprint-impl')
7 files changed, 318 insertions, 0 deletions
diff --git a/infra/footprint/footprint-impl/asciidoc/Readme.adoc b/infra/footprint/footprint-impl/asciidoc/Readme.adoc new file mode 100644 index 000000000..79306b52e --- /dev/null +++ b/infra/footprint/footprint-impl/asciidoc/Readme.adoc @@ -0,0 +1,19 @@ += impl + +== To read footprint + +[source,java] +---- +HttpResponse<String> response = Unirest.get("http://localhost:8183/restconf/operational/footprint:memory-footprint-state") + .header("authorization", "Basic YWRtaW46YWRtaW4=") + .header("content-type", "application/json") + .asString(); +---- + +[source,shell] +---- +curl --request GET \ + --url http://localhost:8183/restconf/operational/footprint:memory-footprint-state \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' +----
\ No newline at end of file diff --git a/infra/footprint/footprint-impl/pom.xml b/infra/footprint/footprint-impl/pom.xml new file mode 100644 index 000000000..6649f7f5c --- /dev/null +++ b/infra/footprint/footprint-impl/pom.xml @@ -0,0 +1,69 @@ +<?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>impl-parent</artifactId> + <version>1.17.10-SNAPSHOT</version> + <relativePath>../../../common/impl-parent</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <groupId>io.fd.honeycomb.footprint</groupId> + <artifactId>impl</artifactId> + <version>1.17.10-SNAPSHOT</version> + <name>${project.artifactId}</name> + + <dependencies> + <dependency> + <groupId>io.fd.honeycomb.footprint</groupId> + <artifactId>api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4j.version}</version> + </dependency> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>translate-api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>translate-spi</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>translate-impl</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-multibindings</artifactId> + </dependency> + </dependencies> +</project>
\ No newline at end of file diff --git a/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintCustomizer.java b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintCustomizer.java new file mode 100644 index 000000000..6d1db6776 --- /dev/null +++ b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintCustomizer.java @@ -0,0 +1,55 @@ +/* + * 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.footprint; + +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ReaderCustomizer; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.footprint.rev170830.MemoryFootprintState; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.footprint.rev170830.MemoryFootprintStateBuilder; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class FootprintCustomizer implements ReaderCustomizer<MemoryFootprintState, MemoryFootprintStateBuilder> { + + private final FootprintReader footprintReader; + + public FootprintCustomizer(@Nonnull final FootprintReader footprintReader) { + this.footprintReader = footprintReader; + } + + @Nonnull + @Override + public MemoryFootprintStateBuilder getBuilder(@Nonnull final InstanceIdentifier<MemoryFootprintState> id) { + return new MemoryFootprintStateBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<MemoryFootprintState> id, + @Nonnull final MemoryFootprintStateBuilder builder, + @Nonnull final ReadContext ctx) throws ReadFailedException { + builder.setFootprint((long) footprintReader.readCurrentFootprint()).setPid((long) footprintReader.getPid()); + } + + @Override + public void merge(@Nonnull final Builder<? extends DataObject> parentBuilder, + @Nonnull final MemoryFootprintState readValue) { + //NOOP + } +} diff --git a/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintModule.java b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintModule.java new file mode 100644 index 000000000..6792d71df --- /dev/null +++ b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintModule.java @@ -0,0 +1,31 @@ +/* + * 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.footprint; + +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; +import io.fd.honeycomb.translate.read.ReaderFactory; + +public class FootprintModule extends AbstractModule { + @Override + protected void configure() { + final Multibinder<ReaderFactory> setBinder = + Multibinder.newSetBinder(binder(), ReaderFactory.class); + setBinder.addBinding().to(FootprintReaderFactory.class); + bind(FootprintReader.class).to(FootprintReaderImpl.class).asEagerSingleton(); + } +} diff --git a/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReader.java b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReader.java new file mode 100644 index 000000000..28e5f77f2 --- /dev/null +++ b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReader.java @@ -0,0 +1,33 @@ +/* + * 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.footprint; + +/** + * Allows reading of footprint of its own JVM + */ +public interface FootprintReader { + + /** + * @return Nr of kilobytes occupied by this JVM + */ + int readCurrentFootprint(); + + /** + * @return Process id associated with this JVM + */ + int getPid(); +} diff --git a/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderFactory.java b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderFactory.java new file mode 100644 index 000000000..0ff54c8ee --- /dev/null +++ b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderFactory.java @@ -0,0 +1,37 @@ +/* + * 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.footprint; + +import com.google.inject.Inject; +import io.fd.honeycomb.translate.impl.read.GenericReader; +import io.fd.honeycomb.translate.read.ReaderFactory; +import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.footprint.rev170830.MemoryFootprintState; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class FootprintReaderFactory implements ReaderFactory { + + @Inject + private FootprintReader footprintReader; + + @Override + public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { + registry.add(new GenericReader(InstanceIdentifier.create(MemoryFootprintState.class), + new FootprintCustomizer(footprintReader))); + } +} diff --git a/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderImpl.java b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderImpl.java new file mode 100644 index 000000000..817c5d4c4 --- /dev/null +++ b/infra/footprint/footprint-impl/src/main/java/io/fd/honeycomb/footprint/FootprintReaderImpl.java @@ -0,0 +1,74 @@ +/* + * 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.footprint; + +import static java.lang.String.format; + +import com.google.common.base.Charsets; +import com.google.common.io.CharStreams; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.management.ManagementFactory; +import java.util.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class FootprintReaderImpl implements FootprintReader { + + private static final Logger LOG = LoggerFactory.getLogger(FootprintReaderImpl.class); + + private final int pid; + + public FootprintReaderImpl() { + pid = initPID(); + LOG.info("Footprint marker initialized for pid {}", pid); + } + + + private static int initPID() { + final String processName = ManagementFactory.getRuntimeMXBean().getName(); + return Integer.parseInt(processName.substring(0, processName.indexOf("@"))); + } + + @Override + public int readCurrentFootprint() { + try { + final Process process = Runtime.getRuntime().exec(" ps -eo rss,pid"); + + final BufferedInputStream input = new BufferedInputStream(process.getInputStream()); + final String processOut = CharStreams.toString(new InputStreamReader(input, Charsets.UTF_8)); + + final String pidLine = Arrays.stream(processOut.split(System.lineSeparator())) + .skip(1)// skip header + .map(String::trim) + .filter(line -> Integer.parseInt(line.split("\\s+")[1]) == pid) + .findFirst() + .orElseThrow( + () -> new IllegalStateException(format("Unable to find memory stats for pid %s", pid))); + + return Integer.parseInt(pidLine.split(" ")[0]); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public int getPid() { + return pid; + } +} |