Starting in 2012, Zorka was the first open source Java application monitoring agent featuring full transaction tracing via bytecode instrumentation. Both agent and collector source codes are publicly available on GPLv3 license, so there is no vendor lock-in and no license fees.
Agent-collector protocol is well documented - old ZICO/TCP protocol via source code, upcoming ZICO/HTTP uses CBOR encoding and has full specification documented. Trace data stored in collector are accessible via simple REST API, so can be integrated with external tools with relatively simple means.
Zorka integrates natively with many popular monitoring systems. Zabbix is supported out of the box in all major modes (agent, active agent, trapper). Support for Nagios NRPE mode also goes out of the box. Metrics can be pushed direclty to Prometheus, InfluxDB, Graphite and OpenTSDB. Zorka can also send syslog messages and has simple support for SNMP traps.
With source code publicly available and fairly simple APIs it is possible to implement direct integration with other monitoring systems and extending capabilities of existing ones, in some cases just with agent, scripts, without modifying and recompiling agent itself.
Versatile instrumentation engine coupled with metrics aggregates and monitoring systems integration gives almost unlimited access to any information about application behavior. All JMX data is instantly available and because JMX communication does not cross JVM boundaries, there is access to data that is normally not available due to JMX protocol limitations. Due to built in instrumentation it is possible to create new metrics on arbitrarily chosen classes and methods, transform them and send to external monitoring systems.
Tracer data is also very valuable source of information, yet it requires ZICO collector to be stored and presented.
It was conceived and implemented several years ago, yet till this day Zorka is the only monitoring agent that is fully programmable. Agent can load and execute BeanShell scripts that can either add user commands that will be available to monitoring system (eg. Zabbix) or instrument arbitrary application methods: add metrics measuring their execution, intercept method arguments, results and add them to tracer data or even define new entry points for collected traces.
Zorka programmable engine is so powerful that even standard metrics and traces, eg. HTTP, SQL, EJB or LDAP are entirely implemented as agent scripts. But be warned that with great powers also comes great responsibility.
Transaction traces are profiler-like method execution trees that depict exact exact application behavior at the moment tracer was recording execution. Only problematic executions are recorded and stored (too long ones or resulting in error), in most cases this is enough to spot problem. Nanosecond-precision method execution times accompanying method call tree make it easy to see where application spends most of its time. Lots of additional data can be attached to method call tree, for example HTTP headers, SQL queries, call arguments etc.
All metrics are internally measured with nanosecond precision and can be presented as such.
Properly configured tracer has low overhead, typically under 2%. So it can be used in production systems and profiler-quality production data will be stored in trace collector for long time (until rotation removes it). Both above features make after-the-fact problem analysis way easier - with precise information from tracer reproducing problem in lab conditions is often not needed.
Metrics data can also be stored for a long time, depending on external monitoring system used. Systems like Zabbix or InfluxDB make it possible to store aggregated trend data for a year or even longer.