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. Better monitoring with
    Spring boot Actuator

    View Slide

  2. What is Spring boot
    Actuator?
    ● Spring boot library
    ● Adds production-ready features
    ● Provides useful endpoints
    ● Both over HTTP and JMX

    View Slide

  3. 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

    View Slide

  4. How do I get started?

    View Slide

  5. Add a dependency...

    org.springframework.boot
    spring-boot-starter-actuator

    View Slide

  6. … and configure what you need
    management:
    endpoints:
    web:
    exposure:
    include: env, info, health, metrics

    View Slide

  7. And… what now?

    View Slide

  8. 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
    }
    }

    View Slide

  9. Exploring the conditions endpoint

    View Slide

  10. What does it do? ● Which autoconfigurations are in use
    ● Why are they (not) applied?
    ● What can I do to make it work?

    View Slide

  11. Visit /actuator/conditions
    {
    "positiveMatches": {/* ... */},
    "negativeMatches": {
    "RabbitHealthContributorAutoConfiguration": {
    "notMatched": [
    {
    "condition": "OnClassCondition",
    "message": "@ConditionalOnClass did not find required class
    'org.springframework.amqp.rabbit.core.RabbitTemplate'"
    }
    ]

    View Slide

  12. Exploring the env endpoint

    View Slide

  13. What does it do? ● Which application properties are
    loaded?
    ● Where do these properties come
    from?

    View Slide

  14. 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"

    View Slide

  15. Exploring the health endpoint

    View Slide

  16. What does it do? ● Is the database available?
    ● Is there enough disk space?
    ● Is Eureka available?
    ● Is Solr available?
    ● Useful for monitoring software
    ● ...

    View Slide

  17. Visit /actuator/health
    {
    "status": "UP"
    }

    View Slide

  18. Showing detailed health info
    management:
    endpoint:
    health:
    show-details: always

    View Slide

  19. 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
    }
    }

    View Slide

  20. Creating a custom health indicator
    @Component
    @RequiredArgsConstructor
    public class GitHubAPIHealthIndicator implements HealthIndicator {
    private final RestTemplate restTemplate;
    @Override
    public Health health() {
    // TODO: implement
    }
    }

    View Slide

  21. 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();
    }

    View Slide

  22. Creating a custom health indicator
    {
    "status": "UP",
    "components": {
    "gitHubAPI": {
    "status": "UP"
    }
    }
    }

    View Slide

  23. Useful for monitoring

    View Slide

  24. Useful for Eureka

    View Slide

  25. Exploring the heapdump endpoint

    View Slide

  26. What does it do? ● Returns *.HPROF file
    ● Can be imported in JVisualVM, …
    ● Find memory leaks and other
    peformance issues

    View Slide

  27. Open the *.HPROF file

    View Slide

  28. Exploring the info endpoint

    View Slide

  29. What does it do? ● Returns additional information
    ● By default empty
    ● Useful in combination with Maven
    resource filtering

    View Slide

  30. Configuring info
    info:
    contributors: Dimitri Mestdagh
    project-version: @project-version@
    build-timestamp: @maven.build.timestamp@

    View Slide

  31. Visit /actuator/info
    {
    "contributors": "Dimitri Mestdagh",
    "project-version": "0.0.1-SNAPSHOT",
    "build-timestamp": "2020-06-27 11:52:30"
    }

    View Slide

  32. Exploring the loggers endpoint

    View Slide

  33. What does it do? ● What logging levels are in use?
    ● Change runtime logging levels
    ● Useful for debugging

    View Slide

  34. Visit /actuator/loggers
    {
    "loggers": {
    "ROOT": {
    "configuredLevel": "INFO",
    "effectiveLevel": "INFO"
    },
    "be.g00glen00b": {
    "configuredLevel": null,
    "effectiveLevel": "INFO"
    }
    }
    }

    View Slide

  35. Changing the runtime logger levels
    curl \
    --header "Content-Type: application/json" \
    --request POST \
    --data '{"configuredLevel": "DEBUG"}' \
    http://localhost:8080/actuator/loggers/be.g00glen00b

    View Slide

  36. Exploring the metrics endpoint

    View Slide

  37. What does it do? ● Application metrics
    ● Uses micrometer
    ● Counters
    ● Gauges
    ● Distribution summaries
    ● Percentiles
    ● Timers

    View Slide

  38. Visit /actuator/metrics
    {
    "names": [
    "cache.evictions",
    "http.server.requests",
    "jvm.threads.states",
    "hystrix.execution",
    "spring.batch.chunk.write",
    "spring.batch.item.process",
    "hystrix.latency.total",
    "jvm.memory.used"
    ]
    }

    View Slide

  39. 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"]
    }]

    View Slide

  40. 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": []
    }

    View Slide

  41. Creating custom counter metrics
    @Bean
    public Counter invoicesCounter(MeterRegistry registry) {
    return Counter
    .builder("invoices.created")
    .description("Amount of invoices created")
    .register(registry);
    }

    View Slide

  42. Creating custom counter metrics
    @PostMapping
    public CreatedInvoiceDTO create(@RequestBody InvoiceParametersDTO parameters) {
    counter.increment(); // Add this
    return facade.create(parameters);
    }

    View Slide

  43. 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);
    }

    View Slide

  44. Cool stuff… but why?

    View Slide

  45. Cool stuff… but why? ● Production-readiness
    ● Better monitoring
    ● Better logging
    ● Better debugging
    = More happy
    people

    View Slide

  46. Resources
    ● https://docs.spring.io/spring-boot/docs/current/reference/html/p
    roduction-ready-features.html
    ● https://dimitr.im/mastering-spring-boot-actuator
    Shameless
    self-promotion

    View Slide

  47. Thank you for listening!

    View Slide