Simple JVM Profiler Using StatsD and Other Metrics Backends

Overview

statsd-jvm-profiler Build Status

statsd-jvm-profiler is a JVM agent profiler that sends profiling data to StatsD. Inspired by riemann-jvm-profiler, it was primarily built for profiling Hadoop jobs, but can be used with any JVM process.

Read the blog post that introduced statsd-jvm-profiler on Code as Craft, Etsy's engineering blog.

Also check out the blog post reflecting on the experience of open-sourcing the project.

Mailing List

There is a mailing list for this project at https://groups.google.com/forum/#!forum/statsd-jvm-profiler. If you have questions or suggestions for the project send them here!

Installation

You will need the statsd-jvm-profiler JAR on the machine where the JVM will be running. If you are profiling Hadoop jobs, that means the JAR will need to be on all of the datanodes.

The JAR can be built with mvn package. You will need a relatively recent Maven (at least Maven 3).

statsd-jvm-profiler is available in Maven Central:

<dependency>
  <groupId>com.etsy</groupId>
  <artifactId>statsd-jvm-profiler</artifactId>
  <version>2.0.0</version>
</dependency>

If you would like an uberjar containing all of the dependencies instead of the standard JAR, use the jar-with-dependencies classifier:

<dependency>
  <groupId>com.etsy</groupId>
  <artifactId>statsd-jvm-profiler</artifactId>
  <version>2.0.0</version>
  <classifier>jar-with-dependencies</classifier>
</dependency>

Usage

The profiler is enabled using the JVM's -javaagent argument. You are required to specify at least the StatsD host and port number to use. You can also specify the prefix for metrics and a whitelist of packages to be included in the CPU profiling. Arguments can be specified like so:

-javaagent:/usr/etsy/statsd-jvm-profiler/statsd-jvm-profiler.jar=server=hostname,port=num

You should use the uberjar when starting the profiler in this manner so that all the profiler's dependencies are available.

The profiler can also be loaded dynamically (after the JVM has already started), but this technique requires relying on Sun's tools.jar, meaning it's an implementation-specific solution that might not work for all JVMs. For more information see the Dynamic Loading section.

An example of setting up Cascading/Scalding jobs to use the profiler can be found in the example directory.

Global Options

Name Meaning
server The hostname to which the reporter should send data (required)
port The port number for the server to which the reporter should send data (required)
prefix The prefix for metrics (optional, defaults to statsd-jvm-profiler)
packageWhitelist Colon-delimited whitelist for packages to include (optional, defaults to include everything)
packageBlacklist Colon-delimited whitelist for packages to exclude (optional, defaults to exclude nothing)
profilers Colon-delimited list of profiler class names (optional, defaults to CPUTracingProfiler and MemoryProfiler)
reporter Class name of the reporter to use (optional, defaults to StatsDReporter)
httpServerEnabled Determines if the embedded HTTP server should be started. (optional, defaults to true)
httpPort The port on which to bind the embedded HTTP server (optional, defaults to 5005). If this port is already in use, the next free port will be taken.

Embedded HTTP Server

statsd-jvm-profiler embeds an HTTP server to support simple interactions with the profiler while it is in operation. You can configure the port on which this server runs with the httpPort option. You can disable it altogether using the httpServerEnabled=false argument.

Endpoint Usage
/profilers List the currently enabled profilers
/isRunning List the running profilers. This should be the same as /profilers.
/disable/:profiler Disable the profiler specified by :profiler. The name must match what is returned by /profilers.
/errors List the past 10 errors from the running profilers and reporters.
/status/profiler/:profiler Displays a status message with the number of recorded stats for the requested profiler.

Reporters

statsd-jvm-profiler supports multiple backends. StatsD is the default, but InfluxDB is also supported. You can select the backend to use by passing the reporter argument to the profiler; StatsDReporter and InfluxDBReporter are the supported values.

Some reporters may require additional arguments.

StatsDReporter

This reporter does not have any additional arguments.

InfluxDBReporter

Name Meaning
username The username with which to connect to InfluxDB (required)
password The password with which to connect to InfluxDB (required)
database The database to which to write metrics (required)
tagMapping A mapping of tag names from the metric prefix (optional, defaults to no mapping)
useHttps A flag indicating if https connecition should be used (optional, defaults to false)
Tag Mapping

InfluxDB 0.9 supports tagging measurements and querying based on those tags. statsd-jvm-profilers uses these tags to support richer querying of the produced data. For compatibility with other metric backends, the tags are extracted from the metric prefix.

If the tagMapping argument is not defined, only the prefix tag will be added, with the value of the entire prefix.

tagMapping should be a period-delimited set of tag names. It must have the same number of components as prefix, or else an exception would be thrown. Each component of tagMapping is the name of the tag. The component in the corresponding position of prefix will be the value.

If you do not want to include a component of prefix as a tag, use the special name SKIP in tagMapping for that position.

Profilers

statsd-jvm-profiler offers 3 profilers: MemoryProfiler, CPUTracingProfiler and CPULoadProfiler.

The metrics for all these profilers will prefixed with the value from the prefix argument or it's default value: statsd-jvm-profiler.

You can enable specific profilers through the profilers argument like so:

  1. Memory metrics only: profilers=MemoryProfiler
  2. CPU Tracing metrics only: profilers=CPUTracingProfiler
  3. JVM/System CPU load metrics only: profilers=CPULoadProfiler

Default value: profilers=MemoryProfiler:CPUTracingProfiler

Garbage Collector and Memory Profiler: MemoryProfiler

This profiler will record:

  1. Heap and non-heap memory usage
  2. Number of GC pauses and GC time

Assuming you use the default prefix of statsd-jvm-profiler, the memory usage metrics will be under statsd-jvm-profiler.heap and statsd-jvm-profiler.nonheap, the GC metrics will be under statsd-jvm-profiler.gc.

Memory and GC metrics are reported once every 10 seconds.

CPU Tracing Profiler: CPUTracingProfiler

This profiler records the time spent in each function across all Threads.

Assuming you use the default prefix of statsd-jvm-profiler, the the CPU time metrics will be under statsd-jvm-profiler.cpu.trace.

The CPU time is sampled every millisecond, but only reported every 10 seconds. The CPU time metrics represent the total time spent in that function.

Profiling a long-running process or a lot of processes simultaneously will produce a lot of data, so be careful with the capacity of your StatsD instance. The packageWhitelist and packageBlacklist arguments can be used to limit the number of functions that are reported. Any function whose stack trace contains a function in one of the whitelisted packages will be included.

The visualization directory contains some utilities for visualizing the output of this profiler.

JVM And System CPU Load Profiler: CPULoadProfiler

This profiler will record the JVM's and the overall system's CPU load, if the JVM is capable of providing this information.

Assuming you use the default prefix of statsd-jvm-profiler, the JVM CPU load metrics will be under statsd-jvm-profiler.cpu.jvm, and the System CPU load wil be under statsd-jvm-profiler.cpu.system.

The reported metrics will be percentages in the range of [0, 100] with 1 decimal precision.

CPU load metrics are sampled and reported once every 10 seconds.

Important notes:

  • This Profiler is not enabled by default. To enable use the argument profilers=CPULoadProfiler
  • This Profiler relies on Sun/Oracle-specific JVM implementations that offer a JMX bean that might not be available in other JVMs. Even if you are using the right JVM, there's no guarantee this JMX bean will remain there in the future.
  • The minimum required JVM version that offers support for this is for Java 7.
  • See com.sun.management.OperatingSystemMXBean for more information.
  • If the JVM doesn't support the required operations, the metrics above won't be reported at all.

Dynamic Loading of Agent

  1. Make sure you have the tools.jar available in your classpath during compilation and runtime. This JAR is usually found in the JAVA_HOME directory under the /lib folder for Oracle Java installations.
  2. Make sure the jvm-profiler JAR is available during runtime.
  3. During your application boostrap process, do the following:
  val jarPath: String = s"$ABSOLUTE_PATH_TO/com.etsy.statsd-jvm-profiler-$VERSION.jar"
  val agentArgs: String = s"server=$SERVER,port=$PORT"
  attachJvmAgent(jarPath, agentArgs)

  def attachJvmAgent(profilerJarPath: String, agentArgs: String): Unit = {
    val nameOfRunningVM: String = java.lang.management.ManagementFactory.getRuntimeMXBean.getName
    val p: Integer = nameOfRunningVM.indexOf('@')
    val pid: String = nameOfRunningVM.substring(0, p)

    try {
      val vm: com.sun.tools.attach.VirtualMachine = com.sun.tools.attach.VirtualMachine.attach(pid)
      vm.loadAgent(profilerJarPath, agentArgs)
      vm.detach()
      LOGGER.info("Dynamically loaded StatsD JVM Profiler Agent...");
    } catch {
      case e: Exception => LOGGER.warn(s"Could not dynamically load StatsD JVM Profiler Agent ($profilerJarPath)", e);
    }
  }

Contributing

Contributions are highly encouraged! Check out the contribution guidlines.

Any ideas you have are welcome, but check out some ideas for contributions.

Comments
  • Out of memory in a mapreduce job (when launched with profiler)

    Out of memory in a mapreduce job (when launched with profiler)

    I am not sure that this happens due to the profiler, but without the profiler this same job with the same input data worked fine. I see by stacktrace that CPUTraces.getDataToFlush is working and is interrupted. Don't you think that this is the reason for memory consumption?

    Here is the screenshot of my memory parameters: http://postimg.org/image/8sdq8l6al/

    2015-07-21 10:12:43,981 INFO [main] org.apache.gora.mapreduce.GoraRecordReader: gora.buffer.read.limit = 10000 2015-07-21 10:12:44,329 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:983) at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:401) at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) at org.apache.hadoop.mapred.MapTask$NewOutputCollector.(MapTask.java:695) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:767) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)

    2015-07-21 10:12:44,383 ERROR [Thread-2] org.apache.hadoop.yarn.YarnUncaughtExceptionHandler: Thread Thread[Thread-2,5,main] threw an Throwable, but we are shutting down, so ignoring this java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922) at java.util.HashMap$KeyIterator.next(HashMap.java:956) at com.etsy.statsd.profiler.util.CPUTraces.getDataToFlush(CPUTraces.java:45) at com.etsy.statsd.profiler.profilers.CPUProfiler.recordMethodCounts(CPUProfiler.java:116) at com.etsy.statsd.profiler.profilers.CPUProfiler.flushData(CPUProfiler.java:71) at com.etsy.statsd.profiler.worker.ProfilerShutdownHookWorker.run(ProfilerShutdownHookWorker.java:22) at java.lang.Thread.run(Thread.java:745)

    opened by ibobak 35
  • Error on flamegraph output

    Error on flamegraph output

    I ran the profiler, and see the CPU trace metrics in graphite. However, when I ran graphite_dump.py, it fails with this error:

    $ /usr/local/graphite_dump.py -o 127.0.0.1 -s 20:25_20150312 -e 20:50_20150312 -p stats.gauges.bigdata.profiler.hadoop.com.shazam.TitleExtractor.C83612C60A954CB4A442C56597331C5E.1.cpu.trace
    Traceback (most recent call last):
      File "/usr/local/graphite_dump.py", line 82, in <module>
        format_output(args.prefix, results)
      File "/usr/local/graphite_dump.py", line 67, in format_output
        print '%s %d' % (format_metric(metric, prefix), value)
    TypeError: %d format: a number is required, not NoneType
    

    Adding a null check to value on line 67 produces no output. Let me know if the error is in my StatsD/Graphite setup (I've used a default configuration)

    opened by danosipov 13
  • graphite_dump.py isn't liking current stats format

    graphite_dump.py isn't liking current stats format

    Running curl to see what's been dumped into graphite shows the following: curl "http://127.0.0.1/metrics/expand?query=stats.gauges.statsd-jvm-profiler.cpu.trace.*&leavesOnly=1"

    {"results": ["stats.gauges.statsd-jvm-profiler.cpu.trace.1", "stats.gauges.statsd-jvm-profiler.cpu.trace.72", "stats.gauges.statsd-jvm-profiler.cpu.trace.73", "stats.gauges.statsd-jvm-profiler.cpu.trace.74", "stats.gauges.statsd-jvm-profiler.cpu.trace.75", "stats.gauges.statsd-jvm-profiler.cpu.trace.77", "stats.gauges.statsd-jvm-profiler.cpu.trace.org-apache-commons-daemon-support-DaemonLoader-load-200"]}

    Running graphite_dump.py against the same server bails out like this: python2.7 ./graphite_dump.py -o 127.0.0.1 -s 12:40_20160316 -e 12:41_20160316 -p stats.gauges.statsd-jvm-profiler.cpu.trace

    Traceback (most recent call last): File "./graphite_dump.py", line 83, in results = get_tree(host, args.prefix, args.start, args.end) File "./graphite_dump.py", line 49, in get_tree (min, max) = get_bounds(host, prefix) File "./graphite_dump.py", line 34, in get_bounds bounds = [int(bound.replace(prefix + '.', '')) for bound in json_results['results']] ValueError: invalid literal for int() with base 10: 'org-apache-commons-daemon-support-DaemonLoader-load-200'

    Looking at the code, it's expecting the stats to be prefix + '.' and the rest a number, where the value it's choking on has a "-" for the separator.

    opened by Ikariusrb 12
  • Loading agent dynamically after VM has started

    Loading agent dynamically after VM has started

    This PR adds the ability for the JVM Profiler Agent to be loaded dynamically after the VM has already started.

    The code was inspired from a blog post and from reading: Oracle's Starting Agents After VM Startup

    opened by AlejandroRivera 11
  • Problems with dashboard.

    Problems with dashboard.

    Andrew,

    there is one more issue with the dashboard. Here is the stacktrace - see below. Feel free to ask me any data that you might need (e.g. to send you the backup of InfluxDB or anything like that). Just give me instructions how to give it to you.

    Also feel free to give me any debug scripts to temporarily place instead of normal ones (to dump my data on the screen - I will paste it here).

    Thanks.

    GET /scripts/bootstrap.min.js 304 3.740 ms - - GET /css/style.css 200 430.211 ms - - /opt/influxdb-dashboard/public/scripts/influxdb.js:48 var series = seriesNames[0]; ^ TypeError: Cannot read property '0' of undefined at /opt/influxdb-dashboard/public/scripts/influxdb.js:48:26 at /opt/influxdb-dashboard/node_modules/influx/index.js:181:14 at /opt/influxdb-dashboard/node_modules/influx/index.js:64:14 at InfluxRequest._request (/opt/influxdb-dashboard/node_modules/influx/lib/InfluxRequest.js:97:12) at InfluxRequest._parseCallback (/opt/influxdb-dashboard/node_modules/influx/lib/InfluxRequest.js:115:19) at Request._callback (/opt/influxdb-dashboard/node_modules/influx/lib/InfluxRequest.js:107:10) at self.callback (/opt/influxdb-dashboard/node_modules/influx/node_modules/request/request.js:197:22) at Request.emit (events.js:107:17) at Request.onRequestError (/opt/influxdb-dashboard/node_modules/influx/node_modules/request/request.js:854:8) at ClientRequest.emit (events.js:107:17)

    opened by ibobak 9
  • Profilers Exit on Exceptions

    Profilers Exit on Exceptions

    Occasionally I get errors with my influxdb metrics writer like this:

    java.lang.RuntimeException: timeout at org.influxdb.impl.InfluxDBErrorHandler.handleError(InfluxDBErrorHandler.java:19) at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:242) at org.influxdb.impl.$Proxy0.writePoints(Unknown Source) at org.influxdb.impl.InfluxDBImpl.write(InfluxDBImpl.java:156) at com.etsy.statsd.profiler.reporter.InfluxDBReporter.recordGaugeValues(InfluxDBReporter.java:66)

    While this unfortunate, and probably means I need to do more batches, record less frequently, or scale up influx, it would be nice if the profilers continued running. This could be done by adding some exception handling here:

    https://github.com/etsy/statsd-jvm-profiler/blob/master/src/main/java/com/etsy/statsd/profiler/worker/ProfilerWorkerThread.java#L19

    Also, nice work guys. This is a super awesome project!

    opened by jfenc91 6
  • Changes to run with long running processes.

    Changes to run with long running processes.

    Sorry to lump all these features together on you. I can spend some time to separate them if you are only interested in certain ones. I have been running this on several Elasticsearch 1.7 clusters since I reported the issue. Feel free to review, I will try to get back to this to make improvements/write unit tests.

    • Added port incrementing logic when the configured port is already taken
    • Added exception handling and a logging endpoint for agents
    • Added a endpoint to track the number of times metrics have been sent from each agent
    opened by jfenc91 5
  • Added a new Profiler for CPU/JVM CPU monitoring using (Sun/Oracle) Java7+ JMX Bean

    Added a new Profiler for CPU/JVM CPU monitoring using (Sun/Oracle) Java7+ JMX Bean

    While the current CPU profiler focuses on breakdowns per thread, this new profiler obtains CPU load (in percentage) for the entire JVM and the system.

    Here's the description taken from the modified README file:

    JVM And System CPU Profiler: JVMCPUProfiler

    This profiler will record the JVM's and the overall system's CPU load, if the JVM is capable of providing this information.

    Assuming you use the default prefix of statsd-jvm-profiler, the JVM CPU load metrics will be under statsd-jvm-profiler.cpu.jvm, and the System CPU load wil be under statsd-jvm-profiler.cpu.system.

    The reported metrics will be percentages in the range of [0, 100] with 1 decimal precision.

    CPU load metrics are sampled and reported once every 10 seconds.

    Important notes:

    • This Profiler is not enabled by default. To enable use the argument profilers=JVMCPUProfiler
    • This Profiler relies on Sun/Oracle-specific JVM implementations that offer a JMX bean that might not be available in other JVMs. Even if you are using the right JVM, there's no guarantee this JMX bean will remain there in the future.
    • The minimum required JVM version that offers support for this is for Java 7.
    • See com.sun.management.OperatingSystemMXBean for more information.
    • If the JVM doesn't support the required operations, the metrics above won't be reported at all.
    opened by AlejandroRivera 4
  • refresh graphs every minute

    refresh graphs every minute

    Wrap graphing logic in a function that's called recursively every minute. The recursive call could be problematic. Maybe have some way to clear the setTimeout after some time?

    opened by stickperson 4
  • graphite time ranges seem broken

    graphite time ranges seem broken

    So after solving the bounds-finding issue and sorting out a few issues where empty results weren't properly handled, I went and tested gathering profiling on a specific map/reduce run. I generated carbonite-formatted timestamps for beginning and ending of the run, and enabled the profiling.

    Afterwards, I found that running graphite_dump.py generated no results when using the start and stop timestamps generated before and after the map/reduce job. I verified that all computers had synced time and same timezone. The stat prefixes used for this run were brand new, so no stats had been under these trees in graphite prior to this run.

    I was able to extract stats by expanding the time range; using a multi-day time range w/ start time of 01:00 - 23:00 got me stats, but I'm not sure how to find what exact time range these stats are tied to.

    opened by Ikariusrb 3
  • Multiple quality improvements

    Multiple quality improvements

    This pull request is focused on resolving occurrences of Sonar rules squid:S1319 - Declarations should use Java collection interfaces such as "List" rather than specific implementation classes such as "LinkedList" squid:S2325 - "private" methods that don't access instance data should be "static"

    You can find more information about the issues here: https://dev.eclipse.org/sonar/coding_rules#q=squid:S1319 https://dev.eclipse.org/sonar/coding_rules#q=squid:S2325

    Please let me know if you have any questions.

    M-Ezzat

    opened by m-ezzat 3
  • Bump httpclient from 4.5.2 to 4.5.13

    Bump httpclient from 4.5.2 to 4.5.13

    Bumps httpclient from 4.5.2 to 4.5.13.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump junit from 4.11 to 4.13.1

    Bump junit from 4.11 to 4.13.1

    Bumps junit from 4.11 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    JUnit 4.12

    Please refer to the release notes for details.

    JUnit 4.12 Beta 3

    Please refer to the release notes for details.

    JUnit 4.12 Beta 2

    No release notes provided.

    JUnit 4.12 Beta 1

    No release notes provided.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump checkstyle from 6.14.1 to 8.29

    Bump checkstyle from 6.14.1 to 8.29

    Bumps checkstyle from 6.14.1 to 8.29.

    Release notes

    Sourced from checkstyle's releases.

    checkstyle-8.29

    https://checkstyle.org/releasenotes.html#Release_8.29

    checkstyle-8.28

    https://checkstyle.org/releasenotes.html#Release_8.28

    checkstyle-8.27

    https://checkstyle.org/releasenotes.html#Release_8.27

    checkstyle-8.26

    https://checkstyle.org/releasenotes.html#Release_8.26

    checkstyle-8.25

    https://checkstyle.org/releasenotes.html#Release_8.25

    checkstyle-8.24

    https://checkstyle.org/releasenotes.html#Release_8.24

    checkstyle-8.23

    https://checkstyle.org/releasenotes.html#Release_8.23

    checkstyle-8.22

    https://checkstyle.org/releasenotes.html#Release_8.22

    checkstyle-8.21

    https://checkstyle.org/releasenotes.html#Release_8.21

    checkstyle-8.20

    https://checkstyle.org/releasenotes.html#Release_8.20

    checkstyle-8.19

    https://checkstyle.org/releasenotes.html#Release_8.19

    checkstyle-8.18

    https://checkstyle.org/releasenotes.html#Release_8.18

    checkstyle-8.17

    https://checkstyle.org/releasenotes.html#Release_8.17

    checkstyle-8.16

    https://checkstyle.org/releasenotes.html#Release_8.16

    checkstyle-8.15

    https://checkstyle.org/releasenotes.html#Release_8.15

    checkstyle-8.14

    http://checkstyle.sourceforge.net/releasenotes.html#Release_8.14

    checkstyle-8.13

    http://checkstyle.sourceforge.net/releasenotes.html#Release_8.13

    ... (truncated)
    Commits
    • 8933d03 [maven-release-plugin] prepare release checkstyle-8.29
    • bd45909 Issue #7487: refactor code to use DetailAST.hasChildren()
    • 317e51f Issue #7487: add method hasChildren() to DetailAST
    • 89b4dcd Issue #3238: Java 8 Grammar: annotations on arrays and varargs
    • 252cd89 dependency: bump junit-pioneer from 0.5.1 to 0.5.2
    • 2ee2615 dependency: bump junit.version from 5.5.2 to 5.6.0
    • 4ed7cb8 minor: add space before xml comment end '-->' to ease reading and make links ...
    • c46a16d Issue #7468: disable 'external-parameter-entities' feature by default
    • dfed794 minor: add missing test case to SuperCloneCheckTest
    • 24e7bdf dependency: bump antlr4.version from 4.7.2 to 4.8-1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Problems with injecting the profiler to Spark Application

    Problems with injecting the profiler to Spark Application

    Hello,

    I am running spark-submit as follows

    spark-submit --packages com.etsy:statsd-jvm-profiler:2.1.0 --deploy-mode cluster --master spark://14.16.47.27:7077 --class par.met.TS --conf spark.executor.extraJavaOptions=-Xss100m --conf "spark.executor.extraJavaOptions=-javaagent:statsd-jvm-profiler-2.1.0-jar-with-dependencies.jar=server=myInfluxServer,port=8086,reporter=InfluxDBReporter,database=profiler,username=profiler,password=profiler" --num-executors 3 myAppJar

    but executors keep failing with the following messages:

    stderr: Error opening zip file or JAR manifest missing : statsd-jvm-profiler-2.1.0-jar-with-dependencies.jar

    stdout: Error occurred during initialization of VM agent library failed to init: instrument

    Any help appreciated. Thank you, Giannis

    opened by gevago01 1
  • Upgrade influx npm module to be compatible with InfluxDB 1.x

    Upgrade influx npm module to be compatible with InfluxDB 1.x

    As I tried to use the influxdb dashboard, seems that the influx npm module it installed is too old. This patch upgrades the influx npm module to at least 5.0.0 which is compatible with InfluxDB 1.x.

    opened by viirya 0
Releases(2.1.0)
Owner
Etsy, Inc.
Etsy, Inc.
An application metrics facade for the most popular monitoring tools. Think SLF4J, but for metrics.

Micrometer Application Metrics An application metrics facade for the most popular monitoring tools. Instrument your code with dimensional metrics with

Micrometer Metrics 3.7k Dec 30, 2022
A sidecar to run alongside Trino to gather metrics using the JMX connector and expose them in different formats using Apache velocity

Overview A sidecar to run alongside Trino to gather metrics using the JMX connector and expose them in different formats using Apache Velocity. Click

BlueCat Engineering 4 Nov 18, 2021
Sampling CPU and HEAP profiler for Java featuring AsyncGetCallTrace + perf_events

async-profiler This project is a low overhead sampling profiler for Java that does not suffer from Safepoint bias problem. It features HotSpot-specifi

null 5.8k Jan 3, 2023
Java memory allocation profiler

Aprof - Java Memory Allocation Profiler What is it? The Aprof project is a Java Memory Allocation Profiler with very low performance impact on profile

Devexperts 211 Dec 15, 2022
Java monitoring for the command-line, profiler included

jvmtop is a lightweight console application to monitor all accessible, running jvms on a machine. In a top-like manner, it displays JVM internal metri

null 1.2k Jan 6, 2023
面向开发人员、声明式的 Metrics 采集与监控系统,可以对结构化与非结构化、有界数据与无界数据进行采集,通过对采集数据进行提取、过滤、逻辑运算等处理后将结果存储流行的监控系统或存储引擎中(如 Prometheus、Nightingale、Open-Falcon)从而搭建起完整的监控体系,同时也可以结合 grafana 完成数据的可视化

介绍 AnyMetrics - 面向开发人员、声明式的 Metrics 采集与监控系统,可以对结构化与非结构化、有界数据与无界数据进行采集,通过对采集数据进行提取、过滤、逻辑运算、聚合等处理后将结果存储流行的监控系统或存储引擎中(如 Prometheus、Nightingale、Open-Falco

lichao 6 Aug 16, 2021
Small set of tools for JVM troublshooting, monitoring and profiling.

Swiss Java Knife (SJK) SJK is a command line tool for JVM diagnostic, troubleshooting and profiling. SJK exploits standard diagnostic interfaces of JV

Alexey Ragozin 3.2k Jan 3, 2023
Kotlin-decompiled - (Almost) every single language construct of the Kotlin programming language compiled to JVM bytecode and then decompiled to Java again for better readability

Kotlin: Decompiled (Almost) every single language construct of the Kotlin programming language compiled to JVM bytecode and then decompiled to Java ag

The Self-Taught Software Engineer 27 Dec 14, 2022
Dynamic loading and compiling project based on JVM

camphor 基于jvm的弹性加载及编译中间件(Elastic loading and compiling middleware based on JVM) camphor_0.0.1 项目简介 该项目定位为弹性中间件,能够使系统在不重启的情况下完成增量代码文件的动态编译和加载 模块介绍 camp

palading 1 Jan 22, 2022
JavaOTTF - Official OTTF parser and composer for JVM languages

JavaOTTF Official OTTF parser and composer for JVM languages. Documentation Please refer to the Wiki Section. Installation Maven Add repository into p

Open Timetable 2 Nov 21, 2022
Tools for tracking down memory / JVM problems & generating predictable-as-possible VM behaviour

Hawkshaw Tools for tracking down memory / JVM problems & generating predictable-as-possible VM behaviour You can Use Hawkshaw to mimic application obj

Martijn Verburg 40 Jan 9, 2021
production heap profiling for the JVM. compatible with google-perftools.

Heapster Heapster provides an agent library to do heap profiling for JVM processes with output compatible with Google perftools. The goal of Heapster

marius a. eriksen 392 Dec 27, 2022
Sends stacktrace-level performance data from a JVM process to Riemann.

Riemann JVM Profiler riemann-jvm-profiler is a JVM agent that you can inject into any JVM process--one written in Clojure, Java, Scala, Groovy, etc.--

Riemann 288 Sep 21, 2022
A driver to allow deep interaction with the JVM without any restrictions

ToolFactory JVM Driver A driver to allow deep interaction with the JVM without any restrictions. To include ToolFactory JVM Driver in your projects si

ToolFactory 34 Oct 8, 2022
Jazzer is a coverage-guided, in-process fuzzer for the JVM platform developed by Code Intelligence

Jazzer is a coverage-guided, in-process fuzzer for the JVM platform developed by Code Intelligence. It is based on libFuzzer and brings many of its instrumentation-powered mutation features to the JVM.

Code Intelligence 696 Jan 5, 2023
chardetng for the JVM

chardetng_j This is chardetng compiled for the JVM using asmble. Licensing Please see the file named COPYRIGHT. TL;DR: Apache-2.0 OR MIT Disclaimer Th

Henri Sivonen 1 Oct 18, 2021
JVM Explorer is a Java desktop application for browsing loaded class files inside locally running Java Virtual Machines.

JVM Explorer JVM Explorer is a Java desktop application for browsing loaded class files inside locally running Java Virtual Machines. Features Browse

null 109 Nov 30, 2022
Simple Anti-Dump to slow down and annoy attackers.

Anti-Dump A simple Anti-Dump to slow down and annoy attackers. Usage Copy the class into your mod or loader. Rename any instances of dummy/class/path

null 47 Dec 25, 2022
A simple command-line argument parser for Java applications that relies on records.

RecordArgs A simple command-line argument parser for Java applications that relies on records. Specifically, it uses their component names to parse co

Nicolai Parlog 8 Apr 4, 2022