Remove duplicate documentation
Remove README files that have been since been migrated to the reference documentation. Also updated remaining markdown files to asciidoctor to save having a mix of different formats. Fixed gh-503
This commit is contained in:
@@ -1,376 +0,0 @@
|
||||
# Spring Boot - Actuator
|
||||
|
||||
> **Note:** Some of this documentation covers concepts from other modules, it will be
|
||||
> cleaned up before the final release.
|
||||
|
||||
The aim of this project is minimum fuss for getting applications up
|
||||
and running in production, and in other environments. There is a
|
||||
strong emphasis on implementing RESTful web services but many features
|
||||
are more generic than that.
|
||||
|
||||
|Feature |Implementation |Notes |
|
||||
|---|---|---|
|
||||
|Server |Tomcat or Jetty | Whatever is on the classpath |
|
||||
|REST |Spring MVC | |
|
||||
|Security |Spring Security | If on the classpath |
|
||||
|Logging |Logback, Log4j or JDK | Whatever is on the classpath. Sensible defaults. |
|
||||
|Database |HSQLDB or H2 | Per classpath, or define a DataSource to override |
|
||||
|Externalized configuration | Properties or YAML | Support for Spring profiles. Bind automatically to @Bean. |
|
||||
|Audit | Spring Security and Spring ApplicationEvent |Flexible abstraction with sensible defaults for security events |
|
||||
|Validation | JSR-303 |If on the classpath |
|
||||
|Management endpoints | Spring MVC | Health, basic metrics, request tracing, shutdown, thread dumps |
|
||||
|Error pages | Spring MVC | Sensible defaults based on exception and status code |
|
||||
|JSON |Jackson 2 | |
|
||||
|ORM |Spring Data JPA | If on the classpath |
|
||||
|Batch |Spring Batch | If enabled and on the classpath |
|
||||
|Integration Patterns |Spring Integration | If on the classpath |
|
||||
|
||||
For a quick introduction and to get started quickly with a new
|
||||
project, carry on reading. For more in depth coverage of the features
|
||||
of Spring Boot Actuator, go to the
|
||||
[Feature Guide](docs/Features.md).
|
||||
|
||||
# Getting Started
|
||||
|
||||
You will need Java (6 at least) and a build tool (Maven is what we use
|
||||
below, but you are more than welcome to use gradle). These can be
|
||||
downloaded or installed easily in most operating systems. For Ubuntu:
|
||||
|
||||
$ sudo apt-get install openjdk-6-jdk maven
|
||||
|
||||
<!--FIXME: short instructions for Mac.-->
|
||||
|
||||
## A basic project
|
||||
|
||||
If you are using Maven create a really simple `pom.xml` with 2 dependencies:
|
||||
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.mycompany</groupId>
|
||||
<artifactId>myproject</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>{{project.version}}</version>
|
||||
</parent>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
If you like Gradle, that's fine, and you will know what to do with
|
||||
those dependencies. The first dependency adds Spring Boot auto
|
||||
configuration and the Tomcat container to your application, and the
|
||||
second one adds some more opinionated stuff like the default
|
||||
management endpoints. If you prefer Jetty you can just add the
|
||||
embedded Jetty jars to your classpath instead of Tomcat (once you
|
||||
exclude the `spring-starter-tomcat` dependency).
|
||||
|
||||
## Adding a business endpoint
|
||||
|
||||
To do something useful to your business you need to add at least one
|
||||
endpoint. An endpoint can be implemented as a Spring MVC
|
||||
`@Controller`, e.g.
|
||||
|
||||
@Controller
|
||||
@EnableAutoConfiguration
|
||||
public class SampleController {
|
||||
|
||||
@RequestMapping("/")
|
||||
@ResponseBody
|
||||
public Map<String, String> helloWorld() {
|
||||
return Collections.singletonMap("message", "Hello World");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SpringApplication.run(SampleController.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
You can use the main method to launch it from your project jar. You
|
||||
can also launch that straight using the Spring Boot CLI (without
|
||||
the `@EnableAutoConfiguration` and even without the import statements
|
||||
that your IDE will add if you are using one), if you just add
|
||||
|
||||
```
|
||||
@Grab("org.springframework.boot:spring-boot-starter-actuator:{{project.version}}")
|
||||
```
|
||||
|
||||
and package and run:
|
||||
|
||||
$ mvn package
|
||||
$ java -jar target/myproject-1.0.0-SNAPSHOT.jar
|
||||
$ curl localhost:8080/
|
||||
{"message": "Hello World"}
|
||||
|
||||
There are also some endpoins that you didn't implement by came free
|
||||
with the Actuator:
|
||||
|
||||
$ curl localhost:8080/health
|
||||
ok
|
||||
$ curl localhost:8080/metrics
|
||||
{"counter.status.200.health":1.0,"gauge.response.health":10.0,"mem":120768.0,"mem.free":105012.0,"processors":4.0}
|
||||
|
||||
`/health` is the default location for the health endpoint - it tells
|
||||
you if the application is running and healthy. `/metrics` is the default
|
||||
location for the metrics endpoint - it gives you basic counts and
|
||||
response timing data by default but there are plenty of ways to
|
||||
customize it. You can also try `/trace` and `/dump` to get some
|
||||
interesting information about how and what your app is doing.
|
||||
|
||||
## Running the application
|
||||
|
||||
You can package the app and run it as a jar (as above) and that's very
|
||||
convenient for production usage. Or there are other options, many of
|
||||
which are more convenient at development time. Here are a few:
|
||||
|
||||
1. Use the Maven exec plugin, e.g.
|
||||
|
||||
$ mvn exec:java
|
||||
|
||||
2. Run directly in your IDE, e.g. Eclipse or IDEA let you right click
|
||||
on a class and run it.
|
||||
|
||||
3. Use a different Maven plugin.
|
||||
|
||||
4. Find feature in Gradle that does the same thing.
|
||||
|
||||
5. Use the Spring executable. <!--FIXME: document this maybe.-->
|
||||
|
||||
## Externalizing configuration
|
||||
|
||||
Spring Boot likes you to externalize your configuration so you
|
||||
can work with the same application code in different environments. To
|
||||
get started with this you create a file in the root of your classpath
|
||||
(`src/main/resources` if using Maven) - if you like YAML, you can include
|
||||
`org.yaml:snakeyaml` on your runtime class path, and call the file `application.yml`,
|
||||
e.g.:
|
||||
|
||||
server:
|
||||
port: 9000
|
||||
management:
|
||||
port: 9001
|
||||
logging:
|
||||
file: target/log.out
|
||||
|
||||
or if you like Java `Properties` files, you can call it
|
||||
`application.properties`, e.g.:
|
||||
|
||||
server.port: 9000
|
||||
management.port: 9001
|
||||
logging.file: target/log.out
|
||||
|
||||
Those examples are properties that Spring Boot itself binds to
|
||||
out of the box, so if you make that change and run the app again, you
|
||||
will find the home page on port 9000 instead of 8080:
|
||||
|
||||
$ curl localhost:9000/
|
||||
{"message": "Hello World"}
|
||||
|
||||
and the management endpoints on port 9001 instead of 8080:
|
||||
|
||||
$ curl localhost:9001/health
|
||||
ok
|
||||
|
||||
To externalize business configuration you can simply add a default
|
||||
value to your configuration file, e.g.
|
||||
|
||||
server:
|
||||
port: 9000
|
||||
management:
|
||||
port: 9001
|
||||
logging:
|
||||
file: target/log.out
|
||||
service:
|
||||
message: Awesome Message
|
||||
|
||||
and then bind to it in the application code. The simplest way to do
|
||||
that is to simply refer to it in an `@Value` annotation, e.g.
|
||||
|
||||
@Controller
|
||||
@EnableAutoConfiguration
|
||||
public class SampleController {
|
||||
|
||||
@Value("${service.message:Hello World}")
|
||||
private String value = "Goodbye Everyone"
|
||||
|
||||
@RequestMapping("/")
|
||||
@ResponseBody
|
||||
public Map<String, String> helloWorld() {
|
||||
return Collections.singletonMap("message", message);
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
That's a little bit confusing because we have provided a message value
|
||||
in three different places - in the external configuration ("Awesome
|
||||
Message"), in the `@Value` annotation after the colon ("Hello World"),
|
||||
and in the filed initializer ("Goodbye Everyone"). That was only to
|
||||
show you how and you only need it once, so it's your choice (it's
|
||||
useful for unit testing to have the Java initializer as well as the
|
||||
external value). Note that the YAML object is flattened using period
|
||||
separators.
|
||||
|
||||
For simple Strings where you have sensible defaults `@Value` is
|
||||
perfect, but if you want more and you like everything strongly typed
|
||||
then you can have Spring bind the properties and validate them
|
||||
automatically in a separate value object. For instance:
|
||||
|
||||
// ServiceProperties.java
|
||||
@ConfigurationProperties(name="service")
|
||||
public class ServiceProperties {
|
||||
private String message;
|
||||
private int value = 0;
|
||||
... getters and setters
|
||||
}
|
||||
|
||||
// SampleController.java
|
||||
@Controller
|
||||
@EnableAutoConfiguration
|
||||
@EnableConfigurationProperties(ServiceProperties.class)
|
||||
public class SampleController {
|
||||
|
||||
@Autowired
|
||||
private ServiceProperties properties;
|
||||
|
||||
@RequestMapping("/")
|
||||
@ResponseBody
|
||||
public Map<String, String> helloWorld() {
|
||||
return Collections.singletonMap("message", properties.getMessage());
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
When you ask to
|
||||
`@EnableConfigurationProperties(ServiceProperties.class)` you are
|
||||
saying you want a bean of type `ServiceProperties` and that you want
|
||||
to bind it to the Spring Environment. The Spring Environment is a
|
||||
collection of name-value pairs taken from (in order of decreasing
|
||||
precedence) 1) the command line, 2) the external configuration file,
|
||||
3) System properties, 4) the OS environment. Validation is done based
|
||||
on JSR-303 annotations by default provided that library (and an
|
||||
implementation) is on the classpath.
|
||||
|
||||
## Adding security
|
||||
|
||||
If you add Spring Security java config to your runtime classpath you
|
||||
will enable HTTP basic authentication by default on all the endpoints.
|
||||
In the `pom.xml` it would look like this:
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
Try it out:
|
||||
|
||||
$ curl localhost:8080/
|
||||
{"status": 403, "error": "Forbidden", "message": "Access Denied"}
|
||||
$ curl user:<password>@localhost:8080/
|
||||
{"message": "Hello World"}
|
||||
|
||||
The default auto configuration has an in-memory user database with one
|
||||
entry, and the `<password>` value has to be read from the logs (at
|
||||
INFO level) by default. If you want to extend or expand that, or
|
||||
point to a database or directory server, you can add the `@EnableGlobalAuthentication`
|
||||
annotation and configure the global `AuthenticationManagerBuilder` as shown below:
|
||||
|
||||
@Controller
|
||||
@EnableAutoConfiguration
|
||||
@EnableGlobalAuthentication
|
||||
public class SampleController {
|
||||
|
||||
@Autowired
|
||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||
auth.inMemoryAuthentication()
|
||||
.withUser("client").password("secret").roles("USER");
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
Try it out:
|
||||
|
||||
$ curl user:password@localhost:8080/
|
||||
{"status": 403, "error": "Forbidden", "message": "Access Denied"}
|
||||
$ curl client:secret@localhost:8080/
|
||||
{"message": "Hello World"}
|
||||
|
||||
## Adding a database
|
||||
|
||||
Just add `spring-jdbc` and an embedded database to your dependencies:
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hsqldb</groupId>
|
||||
<artifactId>hsqldb</artifactId>
|
||||
</dependency>
|
||||
|
||||
Then you will be able to inject a `DataSource` into your controller:
|
||||
|
||||
@Controller
|
||||
@EnableAutoConfiguration
|
||||
@EnableConfigurationProperties(ServiceProperties.class)
|
||||
public class SampleController {
|
||||
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
@Autowired
|
||||
public SampleController(DataSource dataSource) {
|
||||
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||
}
|
||||
|
||||
@RequestMapping("/")
|
||||
@ResponseBody
|
||||
public Map<String, String> helloWorld() {
|
||||
return jdbcTemplate.queryForMap("SELECT * FROM MESSAGES WHERE ID=?", 0);
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
The app will run (with the new security configuration):
|
||||
|
||||
$ curl client:secret@localhost:8080/
|
||||
{"error":"Internal Server Error", "status":500, "exception":...}
|
||||
|
||||
but there's no data in the database yet and the `MESSAGES` table
|
||||
doesn't even exist, so there's an error. One easy way to fix it is
|
||||
to provide a `schema.sql` script in the root of the classpath, e.g.
|
||||
|
||||
create table MESSAGES (
|
||||
ID BIGINT NOT NULL PRIMARY KEY,
|
||||
MESSAGE VARCHAR(255)
|
||||
);
|
||||
INSERT INTO MESSAGES (ID, MESSAGE) VALUES (0, 'Hello Phil');
|
||||
|
||||
Now when you run the app you get a sensible response:
|
||||
|
||||
$ curl client:secret@localhost:8080/
|
||||
{"ID":0, "MESSAGE":"Hello Phil"}
|
||||
|
||||
Obviously, this is only the start, but hopefully you have a good grasp
|
||||
of the basics and are ready to try it out yourself.
|
||||
@@ -1,156 +0,0 @@
|
||||
# Spring Actuator Feature Guide
|
||||
|
||||
Here are some (most, hopefully all) the features of Spring Actuator
|
||||
with some commentary to help you start using them. We
|
||||
recommend you first build a project with the Actuator (e.g. the
|
||||
getting started project from the main README), and then try each
|
||||
feature in turn there.
|
||||
|
||||
Many useful features of
|
||||
[Spring Boot](../../spring-boot/README.md) are all available
|
||||
in an Actuator application.
|
||||
|
||||
TODO: group things together and break them out into separate files.
|
||||
|
||||
## Customizing Management Endpoints
|
||||
|
||||
The `ManagementProperties` are bound to application properties, and
|
||||
can be used to specify
|
||||
|
||||
* The port that the application listens on for the management
|
||||
endpoints (defaults to 8080)
|
||||
|
||||
* The address that the management endpoints are available on (if the
|
||||
port is different to the main server port). Use this to listen only
|
||||
on an internal or ops-facing network, for instance, or to only
|
||||
listen for connections from localhost (by specifying "127.0.0.1")
|
||||
|
||||
* The context root of the management endpoints
|
||||
|
||||
## Error Handling
|
||||
|
||||
The Actuator provides an `/error` mapping by default that handles all
|
||||
errors in a sensible way. If you want more specific error pages for
|
||||
some conditions, the embedded servlet containers support a uniform
|
||||
Java DSL for customizing the error handling. To do this you have to
|
||||
have picked a container implementation (by including either Tomcat or
|
||||
Jetty on the classpath), but then the API is the same. TODO: finish
|
||||
this.
|
||||
|
||||
## Info Endpoint
|
||||
|
||||
By default the Actuator adds an `/info` endpoint to the main server.
|
||||
It contains the commit and timestamp information from `git.properties`
|
||||
(if that file exists) and also any properties it finds in the
|
||||
environment with prefix "info".
|
||||
|
||||
To populate `git.properties` in a
|
||||
Maven build you can use the excellent
|
||||
[git-commit-id-plugin](https://github.com/ktoso/maven-git-commit-id-plugin).
|
||||
|
||||
To populate the "info" map all you need to do is add some stuff to
|
||||
`application.properties`, e.g.
|
||||
|
||||
info.app.name: MyService
|
||||
info.app.description: My awesome service
|
||||
info.app.version: 1.0.0
|
||||
|
||||
If you are using Maven you can automcatically populate info properties
|
||||
from the project using resource filtering. In your `pom.xml` you
|
||||
have (inside the `<build/>` element):
|
||||
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
and then in the `application.properties` you can refer to project
|
||||
properties via placeholders, e.g.
|
||||
|
||||
project.artifactId: myproject
|
||||
project.name: Demo
|
||||
project.version: X.X.X.X
|
||||
project.description: Demo project for info endpoint
|
||||
info.build.artifact: ${project.artifactId}
|
||||
info.build.name: ${project.name}
|
||||
info.build.description: ${project.description}
|
||||
info.build.version: ${project.version}
|
||||
|
||||
(notice that in the example we used `project.*` to set some values to
|
||||
be used as fallbacks if the Maven resource filtering has for some
|
||||
reason not been switched on).
|
||||
|
||||
## Security - Basic Authentication
|
||||
|
||||
To secure your endpoints just add Spring Security Javaconfig to the
|
||||
classpath. By default HTTP Basic authentication will be applied to
|
||||
every request in the main server (and the management server if it is
|
||||
running on the same port). There is a single account by default, and
|
||||
you can test it like this:
|
||||
|
||||
$ curl user:password@localhost:8080/metrics
|
||||
... stuff comes out
|
||||
|
||||
If the management server is running on a different port it is
|
||||
unsecured by default. If you want to secure it you can add a security
|
||||
auto configuration explicitly
|
||||
|
||||
## Security - HTTPS
|
||||
|
||||
Ensuring that all your main endpoints are only available over HTTPS is
|
||||
an important chore for any application. If you are using Tomcat as a
|
||||
servlet container, then the Actuator will add Tomcat's own
|
||||
`RemoteIpValve` automatically if it detects some environment settings,
|
||||
and you should be able to rely on the `HttpServletRequest` to report
|
||||
whether or not it is secure (even downstream of the real SSL
|
||||
termination endpoint). The standard behaviour is determined by the
|
||||
presence or absence of certain request headers ("x-forwarded-for" and
|
||||
"x-forwarded-proto"), whose names are conventional, so it should work
|
||||
with most front end proxies. You switch on the valve by adding some
|
||||
entries to `application.properties`, e.g.
|
||||
|
||||
server.tomcat.remote_ip_header: x-forwarded-for
|
||||
server.tomcat.protocol_header: x-forwarded-proto
|
||||
|
||||
(The presence of either of those properties will switch on the
|
||||
valve. Or you can add the `RemoteIpValve` yourself by adding a
|
||||
`TomcatEmbeddedServletContainerFactory` bean.)
|
||||
|
||||
Spring Security can also be configured to require a secure channel for
|
||||
all (or some requests). To switch that on in an Actuator application
|
||||
you just need to set `security.require_https: true` in
|
||||
`application.properties`.
|
||||
|
||||
## Audit Events
|
||||
|
||||
The Actuator has a flexible audit framework that will publish events
|
||||
once Spring Security is in play (authentication success and failure
|
||||
and access denied exceptions by default). This can be very useful for
|
||||
reporting, and also to implement a lock-out policy based on
|
||||
authentication failures.
|
||||
|
||||
You can also choose to use the audit services for your own business
|
||||
events. To do that you can either inject the existing
|
||||
`AuditEventRepository` into your own components and use that directly,
|
||||
or you can simply publish `AuditApplicationEvent` via the Spring
|
||||
`ApplicationContext` (using `ApplicationEventPublisherAware`).
|
||||
|
||||
## Metrics Customization
|
||||
|
||||
Metrics come out on the `/metrics` endpoint. You can add additional
|
||||
metrics by injecting a `MetricsRepository` into your application
|
||||
components and adding metrics whenever you need to. To customize the
|
||||
`MetricsRepository` itself, just add a bean definition of that type to
|
||||
the application context (only in memory is supported out of the box
|
||||
for now).
|
||||
|
||||
## Customizing the Health Indicator
|
||||
|
||||
The application always tells you if it's healthy via the `/health`
|
||||
endpoint. By default it just responds to a GET witha 200 status and a
|
||||
plain text body containing "ok". If you want to add more detailed
|
||||
information (e.g. a description of the current state of the
|
||||
application), just add a bean of type `HealthIndicator` to your
|
||||
application context, and it will take the place of the default one.
|
||||
Reference in New Issue
Block a user