diff options
-rw-r--r-- | kamon-sigar/.gitignore | 5 | ||||
-rw-r--r-- | kamon-sigar/readme.md | 27 | ||||
-rw-r--r-- | kamon-sigar/src/main/java/kamon/sigar/SigarAgent.java | 175 | ||||
-rw-r--r-- | kamon-sigar/src/main/resources/META-INF/LICENSE | 201 | ||||
-rw-r--r-- | kamon-sigar/src/main/resources/readme.md | 27 | ||||
-rw-r--r-- | kamon-sigar/src/test/java/kamon/sigar/SigarAgentMain.java | 41 | ||||
-rw-r--r-- | kamon-sigar/src/test/java/kamon/sigar/SigarAgentTest.java | 48 | ||||
-rw-r--r-- | kamon-sigar/src/test/resources/readme-test.md | 27 | ||||
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsBanner.scala (renamed from kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala) | 25 | ||||
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala | 38 | ||||
-rw-r--r-- | project/Dependencies.scala | 8 | ||||
-rw-r--r-- | project/Projects.scala | 10 | ||||
-rw-r--r-- | project/Sigar.scala | 115 | ||||
-rw-r--r-- | project/UnzipTask.scala | 64 |
14 files changed, 34 insertions, 777 deletions
diff --git a/kamon-sigar/.gitignore b/kamon-sigar/.gitignore deleted file mode 100644 index 81f1d13d..00000000 --- a/kamon-sigar/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ - -# -# Default sigar extract location. -# -/native/ diff --git a/kamon-sigar/readme.md b/kamon-sigar/readme.md deleted file mode 100644 index 4e32c2b1..00000000 --- a/kamon-sigar/readme.md +++ /dev/null @@ -1,27 +0,0 @@ - -### Kamon Sigar 1) agent 2) extractor 3) loader. - -To load as JVM agent: -``` -java -javaagent:/path/to/kamon-sigar.jar -# OR -java -javaagent:/path/to/kamon-sigar.jar=/path/to/sigar/extract/folder ... - -``` - -To load from your code: -``` - import java.io.File; - import kamon.sigar.SigarAgent; - import org.hyperic.sigar.Sigar; - - SigarAgent.provision(); - final Sigar sigar = new Sigar(); - -// OR - - final File extractLocation = new File("./target/native"); - SigarAgent.provision(extractLocation); - final Sigar sigar = new Sigar(); - -``` diff --git a/kamon-sigar/src/main/java/kamon/sigar/SigarAgent.java b/kamon-sigar/src/main/java/kamon/sigar/SigarAgent.java deleted file mode 100644 index f80ca8d2..00000000 --- a/kamon-sigar/src/main/java/kamon/sigar/SigarAgent.java +++ /dev/null @@ -1,175 +0,0 @@ -/* ========================================================================================= - * Copyright © 2013-2014 the kamon project <http://kamon.io/> - * - * 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 kamon.sigar; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.instrument.Instrumentation; -import java.util.logging.Logger; - -import org.hyperic.sigar.Sigar; -import org.hyperic.sigar.SigarLoader; - -/** - * ### Kamon Sigar 1) agent 2) extractor 3) loader. - * - * To load as JVM agent: - * - * <pre> - * java -javaagent:/path/to/kamon-sigar.jar=/path/to/sigar/extract/folder ... - * </pre> - */ -public class SigarAgent { - - private static final Logger logger = Logger.getLogger(SigarAgent.class - .getName()); - - /** Agent command line options. */ - private static volatile String options; - - /** Agent injected JVM instrumentation. */ - private static volatile Instrumentation instrumentation; - - /** - * Location of native libraries. - * - * <pre> - * when stored in kamon-sigar.jar: /${LIB_DIR}/libsigar-xxx.so - * after agent default extraction: ${user.dir}/${LIB_DIR}/libsigar-xxx.so - * </pre> - */ - public static final String LIB_DIR = "native"; - - static final int EOF = -1; - static final int SIZE = 10 * 1024; - - /** Perform stream copy. */ - public static void transfer(final InputStream input, - final OutputStream output) throws Exception { - final byte[] data = new byte[SIZE]; - while (true) { - final int count = input.read(data, 0, SIZE); - if (count == EOF) { - break; - } - output.write(data, 0, count); - } - } - - /** Default sigar library extract location. */ - public static String defaultLocation() { - return System.getProperty("user.dir") + File.separator + LIB_DIR; - } - - /** Extract and load native sigar library in the default folder. */ - public static void provision() throws Exception { - provision(new File(defaultLocation())); - } - - /** Extract and load native sigar library in the provided folder. */ - public static void provision(final File folder) throws Exception { - - if (!folder.exists()) { - folder.mkdirs(); - } - - final SigarLoader sigarLoader = new SigarLoader(Sigar.class); - - /** Library name for given architecture. */ - final String libraryName = sigarLoader.getLibraryName(); - - /** Library location embedded in the jar class path. */ - final String sourcePath = "/" + LIB_DIR + "/" + libraryName; - - /** Absolute path to the extracted library the on file system. */ - final File targetPath = new File(folder, libraryName).getAbsoluteFile(); - - /** Extract library form the jar to the local file system. */ - final InputStream sourceStream = SigarAgent.class - .getResourceAsStream(sourcePath); - final OutputStream targetStream = new FileOutputStream(targetPath); - transfer(sourceStream, targetStream); - sourceStream.close(); - targetStream.close(); - - /** Load library via absolute path. */ - final String libraryPath = targetPath.getAbsolutePath(); - System.load(libraryPath); - - /** Tell sigar loader that the library is already loaded. */ - System.setProperty("org.hyperic.sigar.path", "-"); - sigarLoader.load(); - - logger.info("Sigar library provisioned: " + libraryPath); - - } - - /** Contract: starting agents after JVM startup. */ - public static void agentmain(final String options, - final Instrumentation instrumentation) throws Exception { - logger.info("Sigar loader via agent-main."); - configure(options, instrumentation); - } - - /** Contract: starting agents via command-line interface. */ - public static void premain(final String options, - final Instrumentation instrumentation) throws Exception { - logger.info("Sigar loader via pre-main."); - configure(options, instrumentation); - } - - /** Agent mode configuration. */ - public static synchronized void configure(final String options, - final Instrumentation instrumentation) throws Exception { - - if (SigarAgent.instrumentation != null) { - logger.severe("Duplicate agent setup attempt."); - return; - } - - SigarAgent.options = options; - SigarAgent.instrumentation = instrumentation; - - logger.info("Sigar loader options: " + options); - - final String location; - if (options == null) { - logger.info("Sigar using default library extract location."); - location = defaultLocation(); - } else { - logger.info("Sigar using provided library extract location."); - location = options; - } - - final File folder = new File(location); - - provision(folder); - - } - - /** Agent command line options. */ - public static String options() { - return options; - } - - /** Injected JVM instrumentation instance. */ - public static Instrumentation instrumentation() { - return instrumentation; - } - -} diff --git a/kamon-sigar/src/main/resources/META-INF/LICENSE b/kamon-sigar/src/main/resources/META-INF/LICENSE deleted file mode 100644 index 11069edd..00000000 --- a/kamon-sigar/src/main/resources/META-INF/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -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. diff --git a/kamon-sigar/src/main/resources/readme.md b/kamon-sigar/src/main/resources/readme.md deleted file mode 100644 index 4e32c2b1..00000000 --- a/kamon-sigar/src/main/resources/readme.md +++ /dev/null @@ -1,27 +0,0 @@ - -### Kamon Sigar 1) agent 2) extractor 3) loader. - -To load as JVM agent: -``` -java -javaagent:/path/to/kamon-sigar.jar -# OR -java -javaagent:/path/to/kamon-sigar.jar=/path/to/sigar/extract/folder ... - -``` - -To load from your code: -``` - import java.io.File; - import kamon.sigar.SigarAgent; - import org.hyperic.sigar.Sigar; - - SigarAgent.provision(); - final Sigar sigar = new Sigar(); - -// OR - - final File extractLocation = new File("./target/native"); - SigarAgent.provision(extractLocation); - final Sigar sigar = new Sigar(); - -``` diff --git a/kamon-sigar/src/test/java/kamon/sigar/SigarAgentMain.java b/kamon-sigar/src/test/java/kamon/sigar/SigarAgentMain.java deleted file mode 100644 index 5559a4ee..00000000 --- a/kamon-sigar/src/test/java/kamon/sigar/SigarAgentMain.java +++ /dev/null @@ -1,41 +0,0 @@ -/* ========================================================================================= - * Copyright © 2013-2014 the kamon project <http://kamon.io/> - * - * 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 kamon.sigar; - -import java.util.logging.Logger; - -import org.hyperic.sigar.Sigar; - -/** Verify sigar loader operation when invoked as agent. */ -public class SigarAgentMain { - - private static final Logger logger = Logger.getLogger(SigarAgentMain.class - .getName()); - - public static void main(final String... args) throws Exception { - - /** Sigar must be availbale now. */ - final Sigar sigar = new Sigar(); - - logger.info("Process id: " + sigar.getPid()); - logger.info("Host FQDN: " + sigar.getFQDN()); - logger.info("CPU info: " + sigar.getCpu()); - logger.info("MEM info: " + sigar.getMem()); - logger.info("CPU load: " + sigar.getLoadAverage()[0]); - - } - -} diff --git a/kamon-sigar/src/test/java/kamon/sigar/SigarAgentTest.java b/kamon-sigar/src/test/java/kamon/sigar/SigarAgentTest.java deleted file mode 100644 index c910e5fe..00000000 --- a/kamon-sigar/src/test/java/kamon/sigar/SigarAgentTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* ========================================================================================= - * Copyright © 2013-2014 the kamon project <http://kamon.io/> - * - * 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 kamon.sigar; - -import static org.junit.Assert.assertTrue; - -import java.io.File; - -import org.hyperic.sigar.Sigar; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** Verify sigar loader operation. */ -public class SigarAgentTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void provision() throws Exception { - - final File extractLocation = new File("target/native"); - SigarAgent.provision(extractLocation); - final Sigar sigar = new Sigar(); - assertTrue(sigar.getPid() > 0); - - logger.info("Process id: {}", sigar.getPid()); - logger.info("Host FQDN: {}", sigar.getFQDN()); - logger.info("CPU info: {}", sigar.getCpu()); - logger.info("MEM info: {}", sigar.getMem()); - logger.info("CPU load: {}", sigar.getLoadAverage()[0]); - - } - -} diff --git a/kamon-sigar/src/test/resources/readme-test.md b/kamon-sigar/src/test/resources/readme-test.md deleted file mode 100644 index 4e32c2b1..00000000 --- a/kamon-sigar/src/test/resources/readme-test.md +++ /dev/null @@ -1,27 +0,0 @@ - -### Kamon Sigar 1) agent 2) extractor 3) loader. - -To load as JVM agent: -``` -java -javaagent:/path/to/kamon-sigar.jar -# OR -java -javaagent:/path/to/kamon-sigar.jar=/path/to/sigar/extract/folder ... - -``` - -To load from your code: -``` - import java.io.File; - import kamon.sigar.SigarAgent; - import org.hyperic.sigar.Sigar; - - SigarAgent.provision(); - final Sigar sigar = new Sigar(); - -// OR - - final File extractLocation = new File("./target/native"); - SigarAgent.provision(extractLocation); - final Sigar sigar = new Sigar(); - -``` diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsBanner.scala index 1b33fd6f..99e09da9 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsBanner.scala @@ -14,29 +14,17 @@ * ========================================================================================= */ -package kamon.system.sigar +package kamon.system -import java.io._ -import java.util.logging.Logger -import kamon.sigar.SigarAgent +import akka.actor.ActorLogging import org.hyperic.sigar._ -import scala.util.control.{ NoStackTrace, NonFatal } -object SigarLoader { - private val log = Logger.getLogger("SigarLoader") +import scala.util.control.NoStackTrace - lazy val instance = init(new File(System.getProperty("java.io.tmpdir"))) +trait SystemMetricsBanner { + self: ActorLogging ⇒ - private[sigar] def init(baseTmp: File): SigarProxy = try { - SigarAgent.provision(baseTmp) - val sigar = new Sigar() - printBanner(sigar) - sigar - } catch { - case NonFatal(t) ⇒ throw new UnexpectedSigarException("Failed to load sigar") - } - - private[sigar] def printBanner(sigar: Sigar) = { + def printBanner(sigar: Sigar) = { val os = OperatingSystem.getInstance def loadAverage(sigar: Sigar) = try { @@ -98,5 +86,6 @@ object SigarLoader { """.stripMargin.format(uptime(sigar), os.getDescription, loadAverage(sigar), os.getName, os.getVersion, os.getArch) log.info(message) } + class UnexpectedSigarException(message: String) extends RuntimeException(message) with NoStackTrace } diff --git a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala index b1ebf402..bb7fa105 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala @@ -15,7 +15,7 @@ */ package kamon.system -import java.io.IOException +import java.io.{ File, IOException } import akka.actor.{ Actor, ActorLogging, Props } import kamon.Kamon @@ -26,19 +26,24 @@ import kamon.metrics.MemoryMetrics.MemoryMetricRecorder import kamon.metrics.NetworkMetrics.NetworkMetricRecorder import kamon.metrics.ProcessCPUMetrics.ProcessCPUMetricsRecorder import kamon.metrics._ -import kamon.system.sigar.SigarLoader -import org.hyperic.sigar.{ Mem, NetInterfaceStat, SigarProxy } +import kamon.sigar.SigarProvisioner +import org.hyperic.sigar.{ Sigar, Mem, NetInterfaceStat, SigarProxy } import scala.concurrent.duration.FiniteDuration import scala.io.Source +import scala.util.control.NonFatal -class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with ActorLogging with SigarExtensionProvider { +class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with ActorLogging with SystemMetricsBanner { import kamon.system.SystemMetricsCollector._ import kamon.system.SystemMetricsExtension._ - val collectSchedule = context.system.scheduler.schedule(collectInterval, collectInterval, self, Collect)(context.dispatcher) + lazy val sigar = createSigarInstance + def pid = sigar.getPid + + val interfaces: Set[String] = sigar.getNetInterfaceList.toSet val systemMetricsExtension = Kamon(Metrics)(context.system) + val collectSchedule = context.system.scheduler.schedule(collectInterval, collectInterval, self, Collect)(context.dispatcher) val cpuRecorder = systemMetricsExtension.register(CPUMetrics(CPU), CPUMetrics.Factory) val processCpuRecorder = systemMetricsExtension.register(ProcessCPUMetrics(ProcessCPU), ProcessCPUMetrics.Factory) @@ -152,6 +157,19 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with rcs.perProcessNonVoluntary.record(perProcessNonVoluntary) rcs.global.record(contextSwitches) } + + def createSigarInstance: SigarProxy = { + val tempFolder = new File(System.getProperty("java.io.tmpdir")) + + try { + SigarProvisioner.provision(tempFolder) + val sigar = new Sigar() + printBanner(sigar) + sigar + } catch { + case NonFatal(t) ⇒ throw new UnexpectedSigarException("Failed to load sigar") + } + } } object SystemMetricsCollector { @@ -162,12 +180,4 @@ object SystemMetricsCollector { } def props(collectInterval: FiniteDuration): Props = Props[SystemMetricsCollector](new SystemMetricsCollector(collectInterval)) -} - -trait SigarExtensionProvider { - lazy val sigar = SigarLoader.instance - - def pid = sigar.getPid - - val interfaces: Set[String] = sigar.getNetInterfaceList.toSet -} +}
\ No newline at end of file diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5b1b9724..4eec01c1 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -27,7 +27,6 @@ object Dependencies { val aspectjVersion = "1.8.4" val slf4jVersion = "1.7.6" val playVersion = "2.3.5" - val sigarVersion = "1.6.5.132" val sprayJson = "io.spray" %% "spray-json" % "1.3.0" val sprayJsonLenses = "net.virtual-void" %% "json-lenses" % "0.5.4" @@ -51,13 +50,8 @@ object Dependencies { val slf4Api = "org.slf4j" % "slf4j-api" % slf4jVersion val slf4nop = "org.slf4j" % "slf4j-nop" % slf4jVersion val scalaCompiler = "org.scala-lang" % "scala-compiler" % Settings.ScalaVersion - val sigar = "org.fusesource" % "sigar" % "1.6.4" // TODO remove val scalazConcurrent = "org.scalaz" %% "scalaz-concurrent" % "7.1.0" - // - val sigarJar = "org.hyperic" % "sigar" % sigarVersion withSources() withJavadoc() - val sigarZip = "org.hyperic" % "sigar-dist" % sigarVersion - val junit = "junit" % "junit" % "4.11" - val junitInterface = "com.novocode" % "junit-interface" % "0.11" + val sigarLoader = "io.kamon" % "sigar-loader" % "1.6.5-rev001" def compile (deps: ModuleID*): Seq[ModuleID] = deps map (_ % "compile") def provided (deps: ModuleID*): Seq[ModuleID] = deps map (_ % "provided") diff --git a/project/Projects.scala b/project/Projects.scala index dfdf5c0e..a284da11 100644 --- a/project/Projects.scala +++ b/project/Projects.scala @@ -23,7 +23,7 @@ object Projects extends Build { lazy val root = Project("root", file(".")) .aggregate(kamonCore, kamonSpray, kamonNewrelic, kamonPlayground, kamonDashboard, kamonTestkit, kamonPlay, kamonStatsD, - kamonDatadog, kamonSystemMetrics, kamonLogReporter, kamonAkkaRemote, kamonSigar) + kamonDatadog, kamonSystemMetrics, kamonLogReporter, kamonAkkaRemote) .settings(basicSettings: _*) .settings(formatSettings: _*) .settings(noPublishing: _*) @@ -168,15 +168,9 @@ object Projects extends Build { .settings(fork in Test := true) .settings( libraryDependencies ++= - compile(sigar) ++ + compile(sigarLoader) ++ test(scalatest, akkaTestKit, slf4Api, slf4nop)) .dependsOn(kamonCore) - .dependsOn(kamonSigar) - - lazy val kamonSigar = Project("kamon-sigar", file("kamon-sigar")) - .settings(basicSettings: _*) - .settings(formatSettings: _*) - .settings(Sigar.settings: _*) val noPublishing = Seq(publish := (), publishLocal := (), publishArtifact := false) } diff --git a/project/Sigar.scala b/project/Sigar.scala deleted file mode 100644 index 621938c2..00000000 --- a/project/Sigar.scala +++ /dev/null @@ -1,115 +0,0 @@ -/* ========================================================================================= - * Copyright © 2013-2014 the kamon project <http://kamon.io/> - * - * 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. - * ========================================================================================= - */ - -import sbt._ -import Keys._ - -/** Sigar build specific settings. */ -object Sigar { - import UnzipTask._ - import sbt.Package._ - import Dependencies._ - - /** Helper settings for extracted sigar sources. */ - lazy val sigarSources = SettingKey[File]("sigar-sources", "Location of extracted sigar sources.") - - /** Native o/s libraries folder inside kamon-sigar.jar. Hardcoded in [SigarAgent.java]. */ - lazy val nativeFolder = "native" - - /** Full class name of the sigar load time agent. Provides Agent-Class and Premain-Class contracts. */ - lazy val agentClass = "kamon.sigar.SigarAgent" - - /** A name filter which matches java source files. */ - lazy val sourceFilter: NameFilter = new PatternFilter( - java.util.regex.Pattern.compile("""(.+\.java)""") - ) - - /** A name filter which matches java class files. */ - lazy val classFilter: NameFilter = new PatternFilter( - java.util.regex.Pattern.compile("""(.+\.class)""") - ) - - /** A name filter which matches native o/s libraries. */ - lazy val nativeFilter: NameFilter = new PatternFilter( - java.util.regex.Pattern.compile("""(.+\.dll)|(.+\.dylib)|(.+\.lib)|(.+\.sl)|(.+\.so)""") - ) - - /** Location of latest sigar artifacts. */ - lazy val redhatResolver = "RedHat/JBoss Repository" at "http://repository.jboss.org/nexus/content/groups/public-jboss" - - /** Sigar build specific settings. */ - lazy val settings = Seq( - - /** Pure java build.*/ - autoScalaLibrary := false, - - /** Use RedHat artifacts. */ - resolvers += redhatResolver, - - /** Ensure no transitive dependency. */ - libraryDependencies ++= - provided(sigarJar, sigarZip) ++ - test(junit, junitInterface, slf4Api, logback), - - /** Location of sigar source extraction. */ - sigarSources := target.value / "sigar-sources", - - /** Origianl sigar resources extraction and relocation. */ - unzipTask := { - val log = streams.value.log - val report = update.value - - log.debug(s"Unpack SRC: ${sigarJar}") - val srcTarget = sigarSources.value - val srcArtifact = locateArtifact(report, sigarJar, "sources") - val srcFileList = extractArtifact(srcArtifact, srcTarget, sourceFilter, false) - - log.debug(s"Unpack JAR: ${sigarJar}") - val jarTarget = (classDirectory in Compile).value - val jarArtifact = locateArtifact(report, sigarJar) - val jarFileList = extractArtifact(jarArtifact, jarTarget, classFilter, false) - - log.debug(s"Unpack ZIP ${sigarZip}") - val zipTarget = jarTarget / nativeFolder - val zipArtifact = locateArtifact(report, sigarZip) - val zipFileList = extractArtifact(zipArtifact, zipTarget, nativeFilter, true) - }, - - /** Unpack sigar resources before compile. */ - (Keys.compile in Compile) <<= (Keys.compile in Compile) dependsOn unzipTask, - - /** Include original sigar sources as our own. */ - (packageSrc in Compile) <<= (packageSrc in Compile) dependsOn unzipTask, - (mappings in (Compile, packageSrc)) ++= { - val base = sigarSources.value - val finder = base ** sourceFilter - val pairList = finder x relativeTo(base) - pairList - }, - - /** Invoke verbose tesing in separate JVM. */ - testOptions += Tests.Argument(TestFrameworks.JUnit, "-v", "-a"), - fork in Test := true, - - /** Ensure JVM agent packaging. */ - packageOptions in (Compile, packageBin) ++= Seq( - ManifestAttributes("Agent-Class" -> agentClass), - ManifestAttributes("Premain-Class" -> agentClass), - ManifestAttributes("Kamon-Sigar-Version" -> sigarVersion) - ) - - ) - -} diff --git a/project/UnzipTask.scala b/project/UnzipTask.scala deleted file mode 100644 index 022f485e..00000000 --- a/project/UnzipTask.scala +++ /dev/null @@ -1,64 +0,0 @@ -/* ========================================================================================= - * Copyright © 2013-2014 the kamon project <http://kamon.io/> - * - * 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. - * ========================================================================================= - */ - -import sbt._ -import Keys._ - -/** Helper task for jar/zip artifact unpacking. */ -object UnzipTask { - - /** Helper task for jar/zip artifact unpacking. */ - lazy val unzipTask = TaskKey[Unit]("unzip-task", "Unpack the jar/zip archive.") - - /** Find artifact path by the module and classifier. */ - def locateArtifact(report: UpdateReport, module: ModuleID, - classifier: String = ""): File = - { - val mf = moduleFilter( - organization = module.organization, name = module.name, revision = module.revision - ) - val af = artifactFilter( - classifier = classifier - ) - val pathList = report.select(module = mf, artifact = af) - require(pathList.size == 1, s"Wrong select: ${pathList}") - pathList(0) - } - - /** Extract zip/jar artifact content into a target dir. */ - def extractArtifact(zip: File, dir: File, - filter: NameFilter = AllPassFilter, flatten: Boolean = false): Set[java.io.File] = - { - IO createDirectory dir - if (flatten) { - /** Remove original directory structure. */ - val tmp = IO createTemporaryDirectory - val sourceList = IO unzip (zip, tmp, filter) - val targetList = for { - source <- sourceList - } yield { - val target = dir / source.name - IO copyFile (source, target) - target - } - IO delete tmp - targetList - } else { - /** Prserve original directory structure. */ - IO unzip (zip, dir, filter) - } - } - -} |