Exception Sensor

Overview

The Exception Sensor is used to gather information about caused exceptions in an application. The Exception Sensor is able to trace created, thrown, and handled exceptions within a target application. It is possible to gather information about methods and constructors that can cause an exception. You have to specify in the configuration file which classes should be instrumented. There can be as many exception-sensor configurations defined as you like.

From version 1.3 it is possible to instrument Java core exception classes also.

Configuration

Exception Type Definition

from version 1.3

An exception-sensor-type has to be specified explicitly from the version 1.3. Furthermore, only one exception-sensor-type is available and allowed to be specified. Thus, the exception-sensor-type definition does not include the name of the sensor:

General configuration schema for exception sensor type
exception-sensor-type [fqn] [options]
Exception sensor type definition example
exception-sensor-type info.novatec.inspectit.agent.sensor.exception.ExceptionSensor
Simple or enhanced exception sensor

from version 1.3

When in doubt use the simple exception sensor! The exception sensor mode can be defined as simple and enhanced, by using the option "mode" in the sensor definition:

Exception sensor mode example
exception-sensor-type info.novatec.inspectit.agent.sensor.exception.ExceptionSensor mode=simple|enhanced
  1. Simple mode will only provide the information where have the exceptions been created. All other informations like passed and handled will not be available. But, there will be no performance overhead for using the exception sensor (overhead is described below)
  2. Enhanced mode will provide all Exception event types, but will also bring the performance overhead for the monitored application.

Note that simple mode is default mode and will be used if "mode" option specification is omitted.

Unknown macro: {show-to}
jira: com.atlassian.confluence.extra.jira.exception.JiraIssueMacroException: com.atlassian.confluence.macro.MacroExecutionException: Unable to locate Jira server for this macro. It may be due to Application Link configuration.
String length

from version 1.3

This sensor enables the limitations of the string values collected. The exception sensor concretely can limit the maximum size of the strings collected as exception messages and stack traces. The following definition will, for example, limit all the strings collected by the sensor to 500 characters:

String length option configuration
exception-sensor-type info.novatec.inspectit.agent.sensor.exception.ExceptionSensor stringLength=500

You can read more about string length limitations on Sensor type definition page.

Sensor assigment

To assign the Exception Sensor, the name together with the fully-qualified-name of the class to instrument must be defined. As an optional parameter it is possible to enable superclass or interface matching support. The Exception Sensor name must always be defined as exception-sensor in the configuration file. There is no limit in the number of exception-sensor configurations to be defined. The example below shown how the Exception Sensor can be used in the configuration file.

exception-sensor [Exception Class] [options]

In contrast to method sensor types where the definition will provide the name of the class/method on which the sensor is to be applied, the Exception Sensor needs only the name of the Exception class that should be traced.

The Exception Sensor is able to use Wildcards (see Agent configuration) for the definition of the class name. The options can be used to define that the provided Exception Class should be treated as interface or superclass (see the superclasses and interfaces chapter in Agent configuration).

Examples

The next table provides samples of how the Exception Sensor can be used. Bear in mind, that you can define multiple exception-sensor configurations.

Configuration

Description

exception-sensor java.lang.Throwable superclass=true

Classes are instrumented that directly or indirectly extend java.lang.Throwable. The class java.lang.Throwable itself is not instrumented

exception-sensor my.package.exception.MyException

Only the class my.package.exception.MyException is instrumented

exception-sensor my.package.ex*.*Exception

All classes are instrumented that match the pattern (like my.package.exception.ParserException and my.package.extension.ExtensionException)

exception-sensor my.package.exception.IException interface=true

All classes are instrumented that are implementing the interface my.package.exception.IException

exception-sensor my.package.exception.My*Exception

Classes like my.package.exception.MyException and my.package.exception.MyTestException are instrumented

exception-sensor *

Every class of type Throwable is instrumented

exception-sensor my.pack*.ex*.* superclass=true

Classes are instrumented which are extending the class that matches the pattern my.pack*.ex*.*

Event Types of Exceptions

The JVM traverses different points in the lifecycle of an exception, therefore you will see different event types within the UI. Each event type gives you information about what exactly happened at which point in the JVM.

Event Type

Description

Example

CREATED

Describes the creation of the exception object.

new Exception();

PASSED

Describes the implicit passing of the exception object by the JVM (the JVM passes the exception object when it searches for an appropriate handler). This event type also describes the first explicit throw of an exception.

 

UNREGISTERED-PASSED

Describes the passing of an exception object which was not registered before and has no parent.

 

RETHROWN

Describes an explicit rethrowing of an exception by reusing the object.

catch(Exception e){ // gets a HANDLED
   throw e; // gets a RETHROWN
}

HANDLED

Describes the handling of an exception object. An object is always handled by a catch-block (no matter what is really done with the object).

See above example

See the below example to get a better understanding of how the event types are assigned to the actions done by the JVM. The number in each method is an ID that represents that method. In this example an exception is created and thrown in the method read(), afterwards handled and explicitly rethrown (by reusing the object) in action(). The JVM traverses the call tree back to the root and passes the method create(), where no exception handler is found, so the exception is going further up. Eventually the exception is handled in method do().

The corresponding event types are shown in the picture below. The ID 37 is not important in this context (it stands only for the constructor that created the exception object).

Performance impact on the target application

For testing the performance impact of the Exception Sensor on the target application an instrumented method hierarchy was created. This can be seen in the picture below.

The method start() is the entry point. From here the calls are done of the methods first() to fifth(). The whole method tree is called 1000 times having different sensor type combinations. The methods first() to fourth() contain a try-catch statement. Method fifth() can throw an exception. The different colors represent different testcases. In order to show the impact on other sensor types, the Exception Sensor is tested with different sensor types that work on a method-basis. The following sensor type combinations are tested:

  • Timer: only a Timer sensor is defined
  • Timer + Exception Sensor: additionally to the Timer the Exception sensor is activated
  • Timer + InvocationSequence: The Timer together with the InvocationSequence is defined
  • Timer + InvocationSequence + Exception Sensor: additionally the Exception sensor is defined

Testcase 1 - blue-colored

The method hierarchy is called 1000 times without causing any exceptions. This is done in order to test the runtime behavior with an activated Exception Sensor where no exceptions are recorded during runtime. If no exceptions are caused during runtime within the target application, the runtime behavior of the different sensor type combinations must be the same. The result of this testcase can be seen in the below picture.

There is no significant difference in the runtimes of the different sensor types. The difference between Timer and Timer + ExSensor is -3%. Also the case having Timer + InvocSeq and Timer + InvocSeq + ExSensor leads to a difference of 2%. 

Testcase 2 - orange-colored

The method hierarchy is called 1000 times, where only one exception is created, thrown and then reused. In this testcase an exception is created and thrown in the method fifth(). The methods first() to fourth() all contain a try-catch statement, where the exception object is catched and rethrown by reusing the object. The result can be seen in the following picture.

In an exceptional case there is a runtime difference of 233% between Timer and Timer + ExSensor. Also the case having Timer + InvocSeq and Timer + InvocSeq + ExSensor leads to a difference of 117%. This is due to the fact that the stack trace is always saved with the exception object (gathering and saving the stack trace takes some time). The test was repeated with a deactivated stack trace. The outcome is that the deactivation lead to a reduced overhead. Now the difference in the runtime between Timer and Timer + ExSensor is only 19%. Also the difference between Timer + InvocSeq and Timer + InvocSeq + ExSensor is now only 26%.

If the stack trace is not important for analysis, the deactivation of it can improve the performance of the Exception Sensor. Please notice that this functionality is currently not yet implemented.

Testcase 3 - red-colored

The method hierarchy is called 1000 times, where in each method a new exception object is created and thrown. In this testcase an exception is created and thrown in the method fifth(). The methods first() to fourth() all contain a try-catch statement, where the thrown exception object is catched. After that a new exception object is created and thrown. The stack trace is retrieved from each exception object, which of course has an impact on the runtime behavior. The result of this testcase is shown in the below picture.


The runtime difference between Timer and Timer + ExSensor amounts to 617%, which is huge. If the stack trace gathering is deactivated, the runtime difference amounts to 76%. Also the combination having Timer + InvocSeq and Timer + InvocSeq + ExSensor leads to a runtime difference of 315%. A deactivation of the stack trace reduces this overhead to 43%.

If the stack trace is not important for analysis, the deactivation of it can improve the performance of the Exception Sensor. Please notice that this functionality is currently not yet implemented.

Open Issues

Ticket number

Description

inspectit-171

Testcase for try-finally statements

inspectit-50

Documentation video on how the Exception Sensor can be used