Dynamic and adaptive monitoring

By default, instrumentation is static. This means, at runtime, once a method or resource is instrumented, the instrumentation cannot be removed, and if a method/resource is not instrumented, it cannot be instrumented.

Kieker includes functionality to change the instrumentation at runtime, which is denoted as dynamic instrumentation. Currently, the dynamic instrumentation can be configured via JMX and periodically polled configuration files. In this way, the monitoring can be enabled/disabled in parts or completely at runtime.

Dynamic instrumentation is a prerequisite for adaptive monitoring, which aims to plan and to execute the monitoring at runtime. This allows, for instance, to make the instrumentation more detailed when a performance problem should be analyzed.

Different monitoring outputs

The monitoring output can be persistently saved into logs, e.g.,

  • file system (async/sync)
  • database (async/sync)

or directly processed via streams using a custom or standard message protocol, e.g.,

  • TCP (sync)
  • JMS and JMX queues (async), with current support for
    • ActiveMQ
    • HornetQ
    • OpenJMS
  • AMQP writer and reader, with current support for
    • RabbitMQ

Predefined and customizable probes

Kieker provides several predefined and customizable probes to instrument and monitor your target application.
For example, there are probes which collect

  • the execution times of method invocations including their fully qualified name
  • the behavior of different threads
  • resource information, such as the CPU utilization and the memory footprint

Furthermore, it is easily possible to define custom probes, especially based on predefined probes.
For this purpose, Kieker offers a user-friendly domain specific language called the Record Instrumentation Language (see the tab “Tool Integration”).

Multiple ways of instrumentation

Kieker offers multiple ways of instrumentation for control flow tracing, e.g.,

  • Manual source code insertion
  • Automatic source code insertion via Aspect-Oriented Programming (AOP), e.g.
  • AspectJ. The insertion points can be defined
    • by annotations in the source code or via
    • pointcuts in an external configuration file (aop.xml) for better seperation of concerns.
  • Middleware interception, e.g., Spring
  • Servlet

and resource monitoring, e.g.,

  • Sigar or Servlet to monitor
    • CPU utilization
    • Memory usage