Giter Club home page Giter Club logo

newrelic-java-httpservlet-transaction-namer's Introduction

New Relic Open Source experimental project banner.

New Relic Java Agent - HTTPServlet Transaction Namer

A New Relic Java Agent extension that provides the ability to add custom instrumentation around the J2EE javax.servlet.http.HttpServlet#service() method.

Historical Note: Historically this extension only provide the naming functionality, which is why the extension is named 'HTTPServlet-transaction-namer'.

Installation

To install:

  1. Download the latest release jar files.
  2. In the New Relic Java directory (the one containing newrelic.jar), create a directory named extensions if it does not already exist.
  3. Copy the downloaded jars into the extensions directory.
  4. Restart the application.
  5. Add the appropriate settings to newrelic.yml as described in the Configuration section.
  6. Restart your JVM
  7. After the app has reloaded, generate traffic against your app that will trigger transactions that you expect to see renamed.
  8. To debug issues, set log_level to finer in newrelic.yml.

Getting Started

By default, the built-in TransactionNamer instrumentation is registered. This instrumentation can be used to alter the way in which the Transaction name is set for a Servlet request.

Usage

Configuration

All configuration of this extension is done in newrelic.yml or alternatively, via java properties.

  1. You must disable auto transaction naming. Find the parameter called enable_auto_transaction_naming and set it to false.
  2. Enable the extension you copy the YAML snippet from the configuration template below and paste it within the common: section of the newrelic.yml. Note: It can be anywhere within the common section (for example, below the app_name parameter).
  3. See the renaming options to determine which to use.
  4. Ensure that the indentation levels of the httpservlet_transaction_namer section match exactly to the way they appear in the template below. Every indentation in YAML is 2 spaces (NOT tabs). The httpservlet_transaction_namer: line should have exactly 2 spaces in front of it, the next line should have 4, and so on.

Configuration Template

  httpservlet_transaction_namer:
    instrumentations:
      - com.newrelic.fit.javax.servlet.http.TransactionNamer
    append_parameters:
      enabled: true
      parameters:
        - name: categoryId
          type: parameter
        - name: host
          type: header
    name_grouper:
      enabled: true
      patterns:
        - '(\/wps\/myportal\/[^!]*)!ut.*'
        - '(\/jpetstore_web\/[^.]*)\..*'
        - '(\/jpetstore_web\/accounts\/)[^\/]+\/(.*)'
    name_obfuscator:
      enabled: true
      patterns:
        - '/AncillaryApplication/<recLoc>/<lastName>'
        - 'AncillaryApplication/<recLoc,\w{3}>/<lastName,\w+>'
        - '/Ancillary\w+/<recLoc,\w{3}>/<lastName>'
        - '(?<obfuscatedVin>[A-Za-z\d]{11}\d{6})'

Renaming options

By default, the built-in TransactionNamer instrumentation is registered with the extension. This instrumentation can be used to alter the way in which the transaction name is set for a Servlet request. The TransactionNamer provides 3 mechanisms for altering the transaction name:

  1. append_parameters - Renaming based on HTTP parameters/cookies/headers
  2. name_grouper - Grouping transaction names
  3. name_obfuscator - Obfuscating transaction names
  4. Custom instrumentation

Append parameters

Use append_parameters to rename Transactions using HTTP parameters, cookies & headers. You can append any HTTP request parameter, cookie or header to the transaction name.

    append_parameters:
      enabled: true
      parameters:
        - name: [parameter_name]
          type: [cookie|header|parameter]
        - name: [parameter_name]
          type: [cookie|header|parameter]
  • Valid values for transaction_parameter_type are cookie, header and parameter.
  • You can append as many parameters as you want. Each one gets its own list member (signified by a -), name and type.
  • The parameters will be appended in the order in which they are listed.

Name grouper

Use name_grouper to group your transactions into names from URL segments. Using regular expression patterns, choose which URLs to analyise and the segments by which you want to group transations.

    name_grouper:
      enabled: true
      patterns:
        - 'pattern 1'
        - 'pattern 2'
        - 'pattern 3'
  • The patterns are regex patterns that are matched against the URI.
  • Each pattern must be on it's own line, surrounded by single-quotes.
  • Use normal Java regular expressions as the pattern.
  • For any segment you wish to preserve, use a regex grouping (like this).
  • For any segment you wish to group by, do NOT put it in a regex grouping. It will simply not appear in the resultant transaction name.
  • Each URI will be successfully matched only once - subsequent patterns that would match that URI will not be tested.

Example name_grouper patterns

Pattern 1: Group WebSphere Portal transactions without Stateful URL string

  • Pattern: (\/wps\/myportal\/[^!]*)!ut.*
  • Matches the following URLs:
    • /wps/myportal/Search/Search%20Center/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOKd3R0
    • /wps/myportal/tagging/!ut/p/a1/04_Sj9CPy328dh23ch249fho2ij1jKJ8x9T
  • Groups these URLs as:
    • /wps/myportal/Search/Search%20Center/
    • /wps/myportal/tagging
  • Does NOT match the following URLs:
    • /wps/portal/Search/Search%20Center/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOKd3R0
    • /wps/myportal/tagging/some/other/stuff

Pattern 2: Strip extensions from URI (.jsp, .html, etc.)

  • Pattern: (\/jpetstore_web\/[^.]*)\..*
  • Matches the following URLs:
    • /jpetstore_web/catalog/Item.jsp
    • /jpetstore_web/help.html
  • Groups these URLs as:
  • /jpetstore_web/catalog/Item
  • /jpetstore_web/help
  • Does NOT match the following URLs:
    • /jpetstore_web/catalog/Checkout
    • /jpetstore_notweb/catalog/Item.jsp

Pattern 3: Combine transactions from different subdirectories (i.e. per-account settings)

  • Pattern: (\/jpetstore_web\/accounts\/)[^\/]+\/(.*)
  • Matches the following URLs:
    • /jpetstore_web/accounts/account1/editAccount
    • /jpetstore_web/accounts/another_account/doEdit
  • Groups these URLs as:
    • /jpetstore_web/accounts/editAccount
    • /jpetstore_web/accounts/doEdit
  • Does NOT match the following URLs:
    • /jpetstore_web/accounts/noaccount
    • /jpetstore_notweb/accounts/account1/editAccount

Name obfuscator

Use name_obfuscator to obfuscate URL segments in Transaction Names. Using regular expression patterns, choose which URLs to analyise and which segments will be masked AND grouped together.

    name_obfuscator:
      enabled: true
      patterns:
        - 'pattern 1'
        - 'pattern 2'
        - 'pattern 3'
  • For any segment you wish to obfuscate, use <replacement_name>, in which replacement_name is the name you want to group that segment as, for example <lastName>.
  • For any segment you wish to obfuscate AND it requires a regex statement to collect, use the following notation: <replacement_name,regex>.
  • Each pattern must be on it's own line, surrounded by single-quotes.
  • You can use normal Java regular expressions anywhere in the pattern, even outside of obfuscated fields.

Example name_obfuscator patterns

Pattern 1: Basic pattern match using <replacement_name> notation in URL pattern

  • Pattern: '/AncillaryApplication/<recLoc>/<lastName>'
  • Matches the following URLs:
    • /AncillaryApplication/92Jets/Selanne
    • /AncillaryApplication/Helsinki/Kurri17
  • Groups these URLs as: /AncillaryApplication/<recLoc>/<lastName>
  • Does NOT match the following URLs:
    • /AncillaryApplication/92Jets/Selanne/Teemu
    • /NotAncillaryApplication/Turku/Koivu

Pattern 2: Using <replacement_name,regex> notation in URL pattern

  • Pattern: 'AncillaryApplication/<recLoc,\w{3}>/<lastName,\w+>'
  • Matches the following URLs:
    • /AncillaryApplication/HEL/Kapanen
    • /AncillaryApplication/KUO/Timonen
  • Groups these URLs as: /AncillaryApplication/<recLoc>/<lastName>
  • Does NOT match the following URLs:
    • /AncillaryApplication/Helsinki/Tikkanen
    • /AncillaryApplication/OUL/Pitkanen25

Pattern 3: Using regex elsewhere in URL pattern

  • Pattern: '/Ancillary\w+/<recLoc,\w{3}>/<lastName>'
  • Matches the following URLs:
    • /AncillaryApplication/TMP/Numminen grouped as /AncillaryApplication/<recLoc>/<lastName>
    • /AncillaryApp/TKU/Salo grouped as /AncillaryApp/<recLoc>/<lastName>

Pattern 4: Replace regex pattern everywhere in URL path

  • Pattern: '(?<obfuscatedVin>[A-Za-z\d]{11}\d{6})'
  • Matches the following URLs:
    • /VehicleApplication/AB1CDE2EFGH567890 grouped as /VehicleApplication/<obfuscatedVin>
    • /VehicleApplication/AB1CDE2EFGH567890/AnotherSegment/IJ1KLM2NOPQ567890/TheEnd grouped as /VehicleApplication/<obfuscatedVin>/AnotherSegment/<obfuscatedVin>/TheEnd

Excluding request.uri attribute

The most recent Java agent versions have introduced constraints on altering agent attributes. This makes it necessary to exclude the "request.uri" attribute and utilize the obfuscated "custom.request.uri" instead. To apply this change, navigate to the newrelic.yml file, locate the "attributes" section, and modify the "exclude" parameter as described below:

 # Provides the ability to configure the attributes sent to New Relic. These
 # attributes can be found in transaction traces, traced errors,
 # transaction events, and page views.
 attributes:

  # When true, attributes will be sent to New Relic. The default is true.
  enabled: true 
  #A comma separated list of attribute keys whose values should
  # be sent to New Relic.
  #include: 

  # A comma separated list of attribute keys whose values should
  # not be sent to New Relic.
  exclude: request.uri

Custom instrumentation

Additional custom instrumentations can be created as follows.

  1. Create a class that implements the ServletInstrumentation interface. The Javadoc for this interface is included with the distribution package.
    1. Implement the init(Config config) method. This method is called only once throughout the lifetime of the parent class loader. Use this time to initialize any private variables based on the Agent configuration in config.
    2. Implement the instrumentRequest(request, response, agent, config) method. This method is called once for every servlet request. Logic contained in this method should consume as few compute resources as possible since it is called frequently.
  2. Ensure that the compiled class file for you class is present on the application server CLASSPATH. Mechanisms for this vary and are outside the scope of this documentation.
  3. Register the custom instrumentation by updating the New Relic Java agent configuration (newrelic.yml) as follows.
    1. Locate the custom.httpservlet_transaction_namer.instrumentations property in the YML.
    2. Add a new line with proper indentation that contains the - prefix and the fully-qualified class name of the custom class. E.g.
      httpservlet_transaction_namer:
        instrumentations:
         - com.newrelic.fit.javax.servlet.http.TransactionNamer
         - path.to.my.package.CustomInstrumentation
    3. Add any other configuration necessary for the custom instrumentation within the httpservlet_transaction_namer container in the YAML. E.g.
      httpservlet_transaction_namer:
      ...
        my_custom_stuff:
          foo: bar
          list:
           - 1
           - 2
    The custom instrumentation can access this data through the config parameter in the init(config) method.
  4. Restart your JVM and your extension should be available.

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 httpservlet-transaction-namer:clean httpservlet-transaction-namer:install
    b. To build all jars, run the command: gradlew clean install
  3. Restart the application

Testing

There is a test gradle target defined for this project that runs JUnit tests.

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 HTTPServlet Transaction Namer! 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

HTTPServlet Transaction Namer is licensed under the Apache 2.0 License.

newrelic-java-httpservlet-transaction-namer's People

Contributors

actions-user avatar crshanks avatar gsidhwani-nr avatar melissaklein24 avatar sschwartzman avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

newrelic-java-httpservlet-transaction-namer's Issues

[Repolinter] Open Source Policy Issues

Repolinter Report

๐Ÿค–This issue was automatically generated by repolinter-action, developed by the Open Source and Developer Advocacy team at New Relic. This issue will be automatically updated or closed when changes are pushed. If you have any problems with this tool, please feel free to open a GitHub issue or give us a ping in #help-opensource.

This Repolinter run generated the following results:

โ— Error โŒ Fail โš ๏ธ Warn โœ… Pass Ignored Total
0 0 1 5 0 6

Warning #

Click to see rules

โš ๏ธ third-party-notices-file-exists #

A THIRD_PARTY_NOTICES.md file can be present in your repository to grant attribution to all dependencies being used by this project. This document is necessary if you are using third-party source code in your project, with the exception of code referenced outside the project's compiled/bundled binary (ex. some Java projects require modules to be pre-installed in the classpath, outside the project binary and therefore outside the scope of the THIRD_PARTY_NOTICES). Please review your project's dependencies and create a THIRD_PARTY_NOTICES.md file if necessary. For JavaScript projects, you can generate this file using the oss-cli. For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. Below is a list of files or patterns that failed:

  • THIRD_PARTY_NOTICES*
  • THIRD-PARTY-NOTICES*
  • THIRDPARTYNOTICES*

Passed #

Click to see rules

โœ… license-file-exists #

Found file (LICENSE). New Relic requires that all open source projects have an associated license contained within the project. This license must be permissive (e.g. non-viral or copyleft), and we recommend Apache 2.0 for most use cases. For more information please visit https://docs.google.com/document/d/1vML4aY_czsY0URu2yiP3xLAKYufNrKsc7o4kjuegpDw/edit.

โœ… readme-file-exists #

Found file (README.md). New Relic requires a README file in all projects. This README should give a general overview of the project, and should point to additional resources (security, contributing, etc.) where developers and users can learn further. For more information please visit https://github.com/newrelic/open-source-tools/tree/master/nerdpacks/oss-template.

โœ… readme-starts-with-experimental-header #

The first 5 lines contain all of the requested patterns. (README.md). The README of an experimental project should have an experimental header at the start of the README. If you already have an experimental header and this rule is failing, your header may be out of date, and you should update your header with the suggested one below. For more information please visit https://opensource.newrelic.com/oss-category/.

โœ… readme-contains-link-to-security-policy #

Contains a link to the security policy for this repository (README.md). New Relic recommends putting a link to the open source security policy for your project (https://github.com/newrelic-experimental/<repo-name>/security/policy or ../../security/policy) in the README. For an example of this, please see the "a note about vulnerabilities" section of the Open By Default repository. For more information please visit https://nerdlife.datanerd.us/new-relic/security-guidelines-for-publishing-source-code.

โœ… code-of-conduct-should-not-exist-here #

New Relic has moved the CODE_OF_CONDUCT file to a centralized location where it is referenced automatically by every repository in the New Relic organization. Because of this change, any other CODE_OF_CONDUCT file in a repository is now redundant and should be removed. Note that you will need to adjust any links to the local CODE_OF_CONDUCT file in your documentation to point to the central file (README and CONTRIBUTING will probably have links that need updating). For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. All files passed this test.

append_parameters functionality is no longer working

Description

When configuring the extension to rename based on append_parameters a ClassCastException is thrown, preventing the renaming. This can be resolved by casting to Map rather than LinkedHashMap in the code. A PR to resolve this issue will be submitted shortly.

Steps to Reproduce

Set the following configuration in the newrelic.yml file.

  httpservlet_transaction_namer:
    instrumentations:
      - com.newrelic.fit.javax.servlet.http.TransactionNamer
    append_parameters:
      enabled: true
      parameters:
        - name: x-anyheader
          type: header

Expected Behavior

The append_parameter configuration rename Transactions using HTTP parameters, cookies & headers.

Relevant Logs / Console output

2022-10-07T18:01:50,363+0100 [72952 47] com.newrelic.agent.instrumentation.ClassTransformerServiceImpl FINEST: An error was thrown from instrumentation library com.newrelic.instrumentation.newrelic-java-httpservlet-transaction-namer
java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.util.LinkedHashMap (java.util.HashMap and java.util.LinkedHashMap are in module java.base of loader 'bootstrap')
	at com.newrelic.fit.javax.servlet.http.TransactionNamer.initAppendParameters(TransactionNamer.java:242) ~[newrelic.jar:?]

Your Environment

The functionality works for agent versions < 6.0.0, but fails thereafter. Run using Java 8, 11 and 17.

Additional context

This appears to be caused by a difference in the type being returned by the Config object.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.