Skip to content

Latest commit

 

History

History
98 lines (59 loc) · 6.84 KB

README.md

File metadata and controls

98 lines (59 loc) · 6.84 KB

New Relic Experimental header

GitHub forks GitHub stars GitHub watchers

GitHub all releases GitHub release (latest by date) GitHub last commit GitHub Release Date

GitHub issues GitHub issues closed GitHub pull requests GitHub pull requests closed

New Relic Java Instrumentation for Kotlin Coroutines

Provides instrumentation for Kotlin Coroutines. In particular it will trace the coroutine from its start, suspend and resume. It does this across multilple threads.

Installation

This use this instrumentation.
Download the latest release.
In the New Relic Java Agent directory (directory containing newrelic.jar), create a directory named extensions if it doe not already exist.
Copy the jars into the extensions directory.
Restart the application.

Getting Started

After deployment of the instrumentation jars, you should be able to see the invocation of a coroutine from start to finish across any threads that it executes on.

Usage

Instrumentation of methods with high invocation rates can lead to CPU overhead especially if its average response time is very small (i.e. less than a few milliseconds). Therefore it is possible to configure the agent to ignore certain suspend methods, dispatched tasks and continuation resumeWiths. This configuation is done in the newrelic.yml file.

Finding Possible Methods to Ignore

Run each of the following three NRQL queries where appName is the name of the application using Kotlin Coroutines.

SELECT rate(count(newrelic.timeslice.value), 1 MINUTE) FROM Metric WHERE metricTimesliceName Like 'Custom/DispatchedTask/%' AND appName='appName”' SINCE 24 HOURS AGO FACET metricTimesliceName

SELECT rate(count(newrelic.timeslice.value), 1 MINUTE) FROM Metric WHERE metricTimesliceName Like 'Custom/WrappedSuspend/%' AND appName='appName”' SINCE 24 HOURS AGO FACET metricTimesliceName

SELECT rate(count(newrelic.timeslice.value), 1 MINUTE) FROM Metric WHERE metricTimesliceName Like 'Custom/ContinuationWrapper%' AND appName='appName”' SINCE 24 HOURS AGO FACET metricTimesliceName

The following is a screenshot of DispatchedTasks

image

At minumum consider ignoring anything over 50K.

Below each rate is the name of the metric, it has the form Custom/DispatchedTask/..., or Custom/WrappedSuspend/... or Custom/ContinuationWrapper/... depending on the query that was run. Collect a list of the remaining metric name (i.e. the ...).

Configuring Methods to Ignore

To configure methods to ignore, edit the newrelic.yml file in the New Relic Java Agent directory.

  1. Find the following lines in newrelic.yml

image

  1. Insert the following lines BEFORE the above lines being mindful of spaces at the beginning of each line (2 on first, 4 on second, 6 on third). Each list is comma separated listed from ones found in the previous section. If none are none for the particular line it can be omitted.

image

  1. Save newrelic.yml

Note that these setting are dynamic, so typically the agent should pick up changes within a minute or so and implement the changes without having to restart.

Building

If you make changes to the instrumentation code and need to build the instrumentation jars, follow these steps

  1. Set environment variable NEW_RELIC_EXTENSIONS_DIR. Its value should be the directory where you want to build the jars (i.e. the extensions directory of the Java Agent).
  2. Build one or all of the jars.
    a. To build one jar, run the command: gradlew moduleName:clean moduleName:install
    b. To build all jars, run the command: gradlew clean install
  3. Restart the application

Support

New Relic has open-sourced this project. This project is provided AS-IS WITHOUT WARRANTY OR DEDICATED SUPPORT. Issues and contributions should be reported to the project here on GitHub.

We encourage you to bring your experiences and questions to the Explorers Hub where our community members collaborate on solutions and new ideas.

Contributing

We encourage your contributions to improve Salesforce Commerce Cloud for New Relic Browser! Keep in mind when you submit your pull request, you'll need to sign the CLA via the click-through using CLA-Assistant. You only have to sign the CLA one time per project. If you have any questions, or to execute our corporate CLA, required if your contribution is on behalf of a company, please drop us an email at [email protected].

A note about vulnerabilities

As noted in our security policy, New Relic is committed to the privacy and security of our customers and their data. We believe that providing coordinated disclosure by security researchers and engaging with the security community are important means to achieve our security goals.

If you believe you have found a security vulnerability in this project or any of New Relic's products or websites, we welcome and greatly appreciate you reporting it to New Relic through HackerOne.

License

[Project Name] is licensed under the Apache 2.0 License.

[If applicable: [Project Name] also uses source code from third-party libraries. You can find full details on which libraries are used and the terms under which they are licensed in the third-party notices document.]