Java Simon with Spring Boot 2
Tags: springboot, javasimon, monitoring
Published: 2019-08-23 14:53:58

---
title: Java Simon with Spring Boot 2
published: true
description: How to configure Java Simon in Spring Boot 2
tags: spring-boot, javasimon, monitoring 
---


[Java Simon](https://github.com/virgo47/javasimon) is a simple monitoring API that allows you to follow and better understand your application.

Here I'll show some tips about how to use it with Spring Boot 2.


# Add Java Simon dependencies in pom.xml
```xml
        <dependency>
            <groupId>org.javasimon</groupId>
            <artifactId>javasimon-spring</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.javasimon</groupId>
            <artifactId>javasimon-jdbc41</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.javasimon</groupId>
            <artifactId>javasimon-console-embed</artifactId>
            <version>4.2.0</version>
        </dependency>
```


# Spring configuration

You can add configuration for Java Simon monitoring of JDBC and Spring Beans, publish the web console and export simons by JMX.


### JDBC monitoring

```java
import org.javasimon.jdbcx4.WrappingSimonDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
@ConditionalOnProperty("javasimon.jdbc.enabled")
public class SimonJdbcConfiguration {

    private final Environment env;

    @Autowired
    public SimonJdbcConfiguration(Environment env) {
        this.env = env;
    }

    @Primary
    @Bean
    public WrappingSimonDataSource primaryDataSource(DataSourceProperties properties) {
        DataSource dataSource = properties.initializeDataSourceBuilder().build();
        Binder binder = Binder.get(env);
        binder.bind("spring.datasource.hikari", Bindable.ofInstance(dataSource).withExistingValue(dataSource));

        WrappingSimonDataSource wrapper = new WrappingSimonDataSource();
        wrapper.setDataSource(dataSource);
        wrapper.setPrefix(env.getProperty("javasimon.jdbc.prefix", "jdbc"));
        return wrapper;
    }

}
```
(If you know a better way to decorate the data source in Spring Boot without depending on Hikari, let me know!)


### Spring monitoring

```java
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ConditionalOnProperty("javasimon.spring.enabled")
@ImportResource("classpath:javasimon-spring.xml")
public class SimonSpringConfiguration {
}
```

Add `javasimon-spring.xml` to your classpath:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="javasimonInterceptor" class="org.javasimon.spring.MonitoringInterceptor"/>

    <aop:config>
        <aop:pointcut id="monitoringPointcut" expression="execution(* *ServiceImpl(..))"/>
        <aop:advisor pointcut-ref="monitoringPointcut" advice-ref="javasimonInterceptor"/>
    </aop:config>

</beans>

```

More about Spring AOP and Java Simon: 
https://github.com/virgo47/javasimon/blob/master/spring/doc/monitoring.xml



### Web console


```java
import org.javasimon.console.SimonConsoleFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
@ConditionalOnProperty("javasimon.console.enabled")
public class SimonConsoleConfiguration {

    private final Environment env;

    @Autowired
    public SimonConsoleConfiguration(Environment env) {
        this.env = env;
    }

    @Bean
    public FilterRegistrationBean<SimonConsoleFilter> simonFilter() {
        FilterRegistrationBean<SimonConsoleFilter> registrationBean = new FilterRegistrationBean<>();

        String urlPrefix = env.getProperty("javasimon.console.prefix", "simon");

        registrationBean.setFilter(new SimonConsoleFilter());
        registrationBean.setName("simon-console-filter");
        registrationBean.addUrlPatterns("/" + urlPrefix + "/*");
        registrationBean.addInitParameter("url-prefix", "/" + urlPrefix);

        return registrationBean;
    }

}
```



### JMX reporting

You can see simon information in any JMX tool like `jconsole`.


```java
import org.javasimon.jmx.JmxReporter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Configuration
@ConditionalOnProperty("javasimon.jmx.enabled")
public class SimonJmxConfigurer {

    private JmxReporter reporter;

    @PostConstruct
    public void start() {
        reporter = JmxReporter.forDefaultManager().registerSimons().registerExistingSimons().start();
    }

    @PreDestroy
    public void stop() {
        reporter.stop();
    }

}
```


# The application.properties

All this stuff can be enabled/disabled in the `application.properties` file. If the property is absent, the feature will be disabled by default.

```
javasimon.jdbc.enabled=true
javasimon.spring.enabled=true
javasimon.console.enabled=true
javasimon.jmx.enabled=true
```

The url of the web console defaults to "simon" and the name prefix of the jdbc simons is "jdbc". This can be changed by the properties below:


```
javasimon.jdbc.prefix=jdbc
javasimon.console.prefix=simon

```