Live Platform
  • Introduction
  • Release Notes
    • Live 3
      • 3.59.0
      • 3.58.0
      • 3.57.0
      • 3.56.0
      • 3.55.0
      • 3.54.0
      • 3.53.0
      • 3.52.0
      • 3.51.0
      • 3.50.0
      • 3.49.0
      • 3.48.0
      • 3.47.0
      • 3.46.0
      • 3.45.0
      • 3.44.0
      • 3.43.0
      • 3.42.0
      • 3.41.0
      • 3.40.0
      • 3.39.0
      • 3.38.0
      • 3.37.0
      • 3.36.0
      • 3.35.0
      • 3.34.0
      • 3.33.0
      • 3.32.0
      • 3.31.0
      • 3.30.0
      • 3.29.0
      • 3.28.0
      • 3.27.0
      • 3.26.0
      • 3.25.0
      • 3.24.0
      • 3.23.0
      • 3.22.0
      • 3.21.0
      • 3.20.0
      • 3.19.0
      • 3.18.0
      • 3.17.0
      • 3.16.0
      • 3.15.0
      • 3.14.0
      • 3.13.0
      • 3.12.0
      • 3.11.0
      • 3.10.0
      • 3.9.0
      • 3.8.0
      • 3.7.0
      • 3.6.0
      • 3.5.0
      • 3.4.0
      • 3.3.0
      • 3.2.0
      • 3.1.0
      • 3.0.0
    • Live 2
  • Articles
    • Creating an aggregation
    • Creating a pipe
  • Theoretical Background
    • Fundamentals
    • Key Advantages
  • Platform Architecture
    • Introduction
    • Queries
    • Glossary
  • Featured plugins
    • Annotations
    • Groovy support
    • Messenger
    • Microsoft Teams
    • MongoDB
    • MongoDB Timeseries
    • MongoDB Kit
    • Purge plugin
    • SQL
    • TCP Input
    • TimescaleDB
  • Data visualization
    • Pipes widgets
      • Temporal
      • Cartesian
      • Multi-value snapshot
      • Single-value snapshot
      • Tables
      • Heatmap
      • JSX Widgets
      • Lollipop
      • Histogram
      • State Timeline
      • Boxplot
    • Pipes modifiers on Pipes charts
  • Alerts and notifications
    • Pipes modifiers on rules
  • Pipes Queries
    • Introduction
    • Dynamic filters
    • Meta parameters
    • Reducer
      • Uniform compress
      • PIP
    • Storage Hints
    • Execution Context
    • Event flow modifiers
  • Developers
    • Plugins
    • Packages
    • Backend API
      • Lookup Tables
      • Extensions
      • Settings
      • Storage Providers
      • Web Services
      • Web Setup
      • Entity Audit
    • Web application
      • Services
        • Point service
        • Menu service
      • Browser Compatibility
      • Runtime modules
        • Core Javascript modules
        • Library modules
        • Adding modules to runtime
      • Localization (i18n)
      • Date formatting
      • Dashboard and Widgets
        • Widget API
        • Custom widget editors
        • Live Event Types
        • Live Widget Configuration
        • Live Widget Packaging
        • Widget Request Interceptors
      • React Contexts
        • Dashboard
        • Dashboard widget
      • Registering Home Page options
    • Python application
    • Subscribing to Live Events
  • Administration
    • Configuration
      • Home Page Customization
      • live.properties
    • Infrastructure Monitoring
    • Storage Monitoring
    • Queries Monitoring
    • Logs Monitoring
    • Data Purging
  • Features
    • Access Permission
    • Datasources
    • Export Dashboard
    • Partial Indexes
    • WebApp Metrics
    • Entity Audit
Powered by GitBook
On this page

Was this helpful?

  1. Featured plugins

Groovy support

Enhance the developer experience by scripting the Live API and make proof of concepts even faster

PreviousAnnotationsNextMessenger

Last updated 2 years ago

Was this helpful?

The groovy plugin is available for download on .

It provides the capability to register and run Groovy snippets, using the same API that is available to Java.

A Groovy snippet is limited to be a standalone piece of code, which means it is unable to declare and use other plugin dependencies. If you need to write a more advanced Groovy code, you must upload that code as a .

For example, the snippet below adds a resource to get a thread dump.

import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MonitorInfo;
import java.lang.management.ThreadInfo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

live.web().addService("threaddump", new ThreadDumpService());

@Path("/")
@Produces("text/plain")
public class ThreadDumpService {

    @GET
    public String threadDump() {
        return formatStackTraces() + 
          "\n---------------------------------------------------\n" +
          memoryInformation() +
           "\n---------------------------------------------------\n" +
          garbageCollectorInformation()
    }
  
    String formatStackTraces() {
        ThreadInfo[] allThreads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

        StringBuilder dump = new StringBuilder();

        for (ThreadInfo threadInfo : allThreads) {
            dump.append("Thread: [").append(threadInfo.getThreadName())
                    .append("] state=").append(threadInfo.getThreadState()).append("\n");

            if (threadInfo.getLockInfo() != null) {
                dump.append("Waiting ").append(threadInfo.getLockInfo()).append("\n");
            }

            if (threadInfo.getLockedMonitors() != null && threadInfo.getLockedMonitors().length > 0) {
                dump.append("Currently locking monitors:\n");
                for(MonitorInfo monitor : threadInfo.getLockedMonitors()) {
                    dump.append(" - ").append(monitor).append("\n");
                }
            }

            if (threadInfo.getLockedSynchronizers() != null && threadInfo.getLockedSynchronizers().length > 0) {
                dump.append("Currently locking Synchronizers:\n");
                for(LockInfo synchronizer : threadInfo.getLockedSynchronizers()) {
                    dump.append(" - ").append(synchronizer).append("\n");
                }
            }

            for (StackTraceElement traceElement : threadInfo.getStackTrace()) {
                dump.append("    at ").append(traceElement).append("\n");
            }

            dump.append("\n");
        }

        return dump.toString();
    }
 
  String memoryInformation() {
    StringBuilder memInfo = new StringBuilder();
    
    def memMxBean = ManagementFactory.memoryMXBean
    
    memInfo.append("Head Memory Usage: ").append(memMxBean.heapMemoryUsage)
    	.append("\nNonHead Memory Usage: ").append(memMxBean.nonHeapMemoryUsage)
    
    return memInfo.toString();
  }
  
  String garbageCollectorInformation() {
    
    StringBuilder gcInfo = new StringBuilder();
    
    ManagementFactory.garbageCollectorMXBeans.each {gc ->
      gcInfo.append("MemoryManager: ").append(gc.name).append(" valid: ").append(gc.valid)
      	.append(" collectionCount: ").append(gc.collectionCount).append(" collectionTime: ").append(gc.collectionTime).append("\n")
    }
    
    return gcInfo.toString()
  }
}
INTELIE Live Marketplace
Snippets Groovy is available under Platform Customization menu in Administration page
Groovy script in Plugins administration page