Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Better monitoring with Spring boot Actuator

Better monitoring with Spring boot Actuator

An overview of the features Spring boot actuator has to offer.

Dimitri

July 27, 2020
Tweet

More Decks by Dimitri

Other Decks in Programming

Transcript

  1. What is Spring boot Actuator? • Spring boot library •

    Adds production-ready features • Provides useful endpoints • Both over HTTP and JMX
  2. Which endpoints are there? • Auditevents • Beans • Caches

    • Conditions • Configprops • Env • Flyway • Health • Heapdump • Httptrace • Info • Integrationgraph • Jolokia • Logfile • Loggers • Liquibase • Metrics • Mappings • Prometheus • Scheduledtasks • Sessions • Shutdown • Threaddump
  3. Visit /actuator { "_links": { "self": { "href": "http://192.168.0.220:8080/actuator", "templated":

    false }, "health": { "href": "http://192.168.0.220:8080/actuator/health", "templated": false } }
  4. What does it do? • Which autoconfigurations are in use

    • Why are they (not) applied? • What can I do to make it work?
  5. Visit /actuator/conditions { "positiveMatches": {/* ... */}, "negativeMatches": { "RabbitHealthContributorAutoConfiguration":

    { "notMatched": [ { "condition": "OnClassCondition", "message": "@ConditionalOnClass did not find required class 'org.springframework.amqp.rabbit.core.RabbitTemplate'" } ]
  6. What does it do? • Which application properties are loaded?

    • Where do these properties come from?
  7. Visit /actuator/env { "activeProfiles": [ "dev" ], "propertySources": [ {

    "name": "applicationConfig: [classpath:/application-dev.yml]", "properties": { "server.port": { "value": 8080, "origin": "class path resource [application-dev.yml]:2:9"
  8. What does it do? • Is the database available? •

    Is there enough disk space? • Is Eureka available? • Is Solr available? • Useful for monitoring software • ...
  9. Showing detailed health info { "status": "UP", "components": { "db":

    { "status": "UP", "details": { "database": "DB2 UDB for AS/400", "validationQuery": "SELECT 1 FROM SYSIBM.SYSDUMMY1", "result": 1 } }
  10. Creating a custom health indicator @Component @RequiredArgsConstructor public class GitHubAPIHealthIndicator

    implements HealthIndicator { private final RestTemplate restTemplate; @Override public Health health() { // TODO: implement } }
  11. Creating a custom health indicator try { var result =

    restTemplate.getForEntity("https://api.github.com/", ObjectNode.class); if (result.getStatusCode().is2xxSuccessful() && result.getBody() != null) { return Health.up().build(); } else { return Health.down().withDetail("status", result.getStatusCode()).build(); } } catch (RestClientException ex) { return Health.down().withException(ex).build(); }
  12. What does it do? • Returns *.HPROF file • Can

    be imported in JVisualVM, … • Find memory leaks and other peformance issues
  13. What does it do? • Returns additional information • By

    default empty • Useful in combination with Maven resource filtering
  14. What does it do? • What logging levels are in

    use? • Change runtime logging levels • Useful for debugging
  15. Visit /actuator/loggers { "loggers": { "ROOT": { "configuredLevel": "INFO", "effectiveLevel":

    "INFO" }, "be.g00glen00b": { "configuredLevel": null, "effectiveLevel": "INFO" } } }
  16. Changing the runtime logger levels curl \ --header "Content-Type: application/json"

    \ --request POST \ --data '{"configuredLevel": "DEBUG"}' \ http://localhost:8080/actuator/loggers/be.g00glen00b
  17. What does it do? • Application metrics • Uses micrometer

    • Counters • Gauges • Distribution summaries • Percentiles • Timers
  18. Visit /actuator/metrics/{metric} { "name": "jvm.memory.used", "description": "The amount of used

    memory", "baseUnit": "bytes", "measurements": [{ "statistic": "VALUE", "value": 196616376 }], "availableTags": [{ "tag": "area", "values": ["heap", "nonheap"] }]
  19. Visit /actuator/metrics/{metric}?tag=area:heap { "name": "jvm.memory.used", "description": "The amount of used

    memory", "baseUnit": "bytes", "measurements": [{ "statistic": "VALUE", "value": 196616376 }], "availableTags": [] }
  20. Creating custom counter metrics @Bean public Counter invoicesCounter(MeterRegistry registry) {

    return Counter .builder("invoices.created") .description("Amount of invoices created") .register(registry); }
  21. Creating custom gauge metrics @Bean public Gauge countOrdersGauge(MeterRegistry registry, OrderRepository

    repository) { return Gauge .builder("order.count", repository::count) .description("Amount of registered orders”) .register(registry); }
  22. Cool stuff… but why? • Production-readiness • Better monitoring •

    Better logging • Better debugging = More happy people