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/src/main/java/io | |
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/src/main/java/io')
5 files changed, 230 insertions, 0 deletions
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; + } +} |