Code Monkey home page Code Monkey logo

app-introspector's Introduction

App Introspector

A small plugable library for Spring based web apps that provides programatic access to the application at runtime. This can be used for investigating or fixing problems during application runtime. It provides a simple REST like JSON interface, as well as a rich web console for inspecting and executing scripts (JavaScript) in the JVM running the application.

JSON Interface endpoints:

  • Spring beans list: GET /spring/beanNames This returns an array with the names of the Spring beans configured in the application. e.g
['messageProcessor', 'messageListener', ...]
  • Details of a specific bean: GET /spring/bean?im=true&id=<beanId> This returns the properties and methods of the specified bean. e.g.
{class:"au.com...GenericMessageListener"
, properties:{messageLogger: <dbMessageLogger>, maxRetry:5, processBatchSize:2}
, methods:[
	{name:'receive', returnType:void, paramTypes:[Message]},
	{name:'start', returnType:void, paramTypes:[]},
	{name:'stop', returnType:void, paramTypes:[]}
	...
	]
}
  • Execute script: POST /spring/run This executes the script sent as a text/plain payload in the request. Only javascript is supported at the moment. The script can contain references to spring beans using ${} and the bean id, e.g.
${messageListener}.stop();

Additionally, the script can invoke the following built-in functions:

  • toJava(<a javascript object>): Converts javascript literals to Java .e.g
//return some data to client
toJava({status:${messageLister}.getStatus, mailbox: ${messageListener}.getMailboxSize()});
  • exec(<some OS command>): Executes the given command as separate process in the operating system. e.g.
//get memory usage
exec("free -m");
  • getField(<object instance>, <field name>) : Uses reflexion to access the given field in the given object instance. e.g
//check a private field
getField(${messageListener}, 'retryCount')
  • dbquery(<dataSource>, <sql>) : Executes a database query.

  • dbupdate(<dataSource>, <sql>) : Executes a database update.

Adding App Introspector to your Spring application

  1. Prerequisites:
    • Spring 3.2 (for older versions checkout branch spring-3.0)
    • PropertyPlaceholder configuration (or declare the controller and components explicitly in 3) e.g.
<context:property-placeholder location="classpath:/application.properties" />
  1. Add the following dependency to your maven pom.xml (if not using maven, include the jar file directly in your project classpath)
<dependency>
  <groupId>com.github.julior</groupId>
  <artifactId>app-introspector</artifactId>
  <version>1.3.1</version>
</dependency>	

The snapshot repository is at https://oss.sonatype.org/content/repositories/snapshots

  1. Enable component scan in your Spring application context (or declare the controller explicitly)
<context:component-scan base-package="com.github.julior.appintrospector" />

if no PropertyPlaceholderConfiguration is defined in your Spring context, the above will fail, if so declare the components explicitly instead.

<bean id="appruntime" class="com.github.julior.appintrospector.AppRuntime">
	<property name="beanWhitelist" value="<empty or comma separated list of bean names to include>"/>
	<property name="beanBlacklist" value="<empty or comma separated list of bean names to exclude>"/>
</bean>
<bean id="appIntrospector" class="com.github.julior.appintrospector.AppIntrospector">
	<property name="fireBaseRef" value="<empty or your Firebase URL>"/>
	<property name="fireBaseSecret" value="<empty or your Firebase auth secret>"/>
	<property name="appName" value="<your app name>"/>
</bean>
  1. Secure the /spring/* endpoints. This is a powerfull tool hence security restrictions have to be put accordingly. For instance with Spring Security module you can restrict the endpoints easily like this:
<security:http auto-config="true">
    <security:intercept-url pattern="/spring/run" access="ROLE_MASTER" />
    <security:intercept-url pattern="/spring/*" access="ROLE_SUPER" />
</security:http>

Configuration Properties

The following properties can be specified as part of the PropertyPlaceholderConfiguration

  • app.introspector.beanblacklist list of beans to exclude from introspection (comma separated regular expressions)
  • app.introspector.beanwhitelist list of beans to include in introspection (comma separated regular expressions)
  • app-introspector-console.firebase-path (Optional) Firebase URL for storing scripts in the App Console, if not provided it will store scripts in the browser Local Storage.
  • app-introspector-console.firebase-secret The authentication secret for the Firebase URL.
  • app-introspector-console.appname The application name for displaying in the App Console.

e.g.

# Application properties
# exclude beans from introspection
app.introspector.beanblacklist=org\\.springframework\\..*
# console properties
# firebase path for storing scripts
#app-introspector-console.firebase-path=https://<your-own-firebase>.firebaseio.com/
# firebase secret
#app-introspector-console.firebase-secret=<your firebase secret key>
# application name
app-introspector-console.appname=Test App

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.