Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Better monitoring with Spring boot Actuator
Dimitri
July 27, 2020
Programming
0
95
Better monitoring with Spring boot Actuator
An overview of the features Spring boot actuator has to offer.
Dimitri
July 27, 2020
Tweet
Share
More Decks by Dimitri
See All by Dimitri
Moduliths
g00glen00b
0
26
Tech talk: Micronaut
g00glen00b
0
64
From WordPress to Gatsby
g00glen00b
3
140
GraphQL
g00glen00b
1
99
Reactive programming with Spring boot 2
g00glen00b
1
120
Introduction to Meteor
g00glen00b
0
110
JavaScript essentials
g00glen00b
3
270
Fronteers - JavaScript at your enterprise (Dutch)
g00glen00b
0
60
Other Decks in Programming
See All in Programming
監視せなあかんし、五大紙だけにオオカミってな🐺🐺🐺🐺🐺
sadnessojisan
2
1.5k
なぜRubyコミュニティにコミットするのか?
luccafort
0
310
量子コンピュータ時代のプログラミングセミナー / 20230119_Amplify_seminar _shift_optimization
fixstars
0
190
SHOWROOMの分析目的を意識した伝え方・コミュニケーション
hatapu
0
240
23年のJavaトレンドは?Quarkusで理解するコンテナネイティブJava
tatsuya1bm
1
120
Remix + Cloudflare Pages + D1 で ポケモン SV のレンタルチームを検索できるアプリを作ってみた
kuroppe1819
4
1.3k
tidy_rpart
bk_18
0
590
Findy - エンジニア向け会社紹介 / Findy Letter for Engineers
findyinc
2
42k
Hasura の Relationship と権限管理
karszawa
0
170
(新米)エンジニアリングマネージャーのしごと #RSGT2023
murabayashi
9
5.8k
OSSから学んだPR Descriptionの書き方
fugakkbn
4
130
社会人 20 年目エンジニア、発信で技術学びなおしてる話
e99h2121
1
140
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
419
60k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
101
6.2k
The Art of Programming - Codeland 2020
erikaheidi
35
11k
How to Ace a Technical Interview
jacobian
270
21k
In The Pink: A Labor of Love
frogandcode
132
21k
The Mythical Team-Month
searls
210
40k
Documentation Writing (for coders)
carmenintech
51
2.9k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.8k
5 minutes of I Can Smell Your CMS
philhawksworth
198
18k
Imperfection Machines: The Place of Print at Facebook
scottboms
254
12k
Bash Introduction
62gerente
601
210k
Transcript
Better monitoring with Spring boot Actuator
What is Spring boot Actuator? • Spring boot library •
Adds production-ready features • Provides useful endpoints • Both over HTTP and JMX
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
How do I get started?
Add a dependency... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
… and configure what you need management: endpoints: web: exposure:
include: env, info, health, metrics
And… what now?
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 } }
Exploring the conditions endpoint
What does it do? • Which autoconfigurations are in use
• Why are they (not) applied? • What can I do to make it work?
Visit /actuator/conditions { "positiveMatches": {/* ... */}, "negativeMatches": { "RabbitHealthContributorAutoConfiguration":
{ "notMatched": [ { "condition": "OnClassCondition", "message": "@ConditionalOnClass did not find required class 'org.springframework.amqp.rabbit.core.RabbitTemplate'" } ]
Exploring the env endpoint
What does it do? • Which application properties are loaded?
• Where do these properties come from?
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"
Exploring the health endpoint
What does it do? • Is the database available? •
Is there enough disk space? • Is Eureka available? • Is Solr available? • Useful for monitoring software • ...
Visit /actuator/health { "status": "UP" }
Showing detailed health info management: endpoint: health: show-details: always
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 } }
Creating a custom health indicator @Component @RequiredArgsConstructor public class GitHubAPIHealthIndicator
implements HealthIndicator { private final RestTemplate restTemplate; @Override public Health health() { // TODO: implement } }
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(); }
Creating a custom health indicator { "status": "UP", "components": {
"gitHubAPI": { "status": "UP" } } }
Useful for monitoring
Useful for Eureka
Exploring the heapdump endpoint
What does it do? • Returns *.HPROF file • Can
be imported in JVisualVM, … • Find memory leaks and other peformance issues
Open the *.HPROF file
Exploring the info endpoint
What does it do? • Returns additional information • By
default empty • Useful in combination with Maven resource filtering
Configuring info info: contributors: Dimitri Mestdagh project-version: @
[email protected]
build-timestamp: @
[email protected]
Visit /actuator/info { "contributors": "Dimitri Mestdagh", "project-version": "0.0.1-SNAPSHOT", "build-timestamp": "2020-06-27
11:52:30" }
Exploring the loggers endpoint
What does it do? • What logging levels are in
use? • Change runtime logging levels • Useful for debugging
Visit /actuator/loggers { "loggers": { "ROOT": { "configuredLevel": "INFO", "effectiveLevel":
"INFO" }, "be.g00glen00b": { "configuredLevel": null, "effectiveLevel": "INFO" } } }
Changing the runtime logger levels curl \ --header "Content-Type: application/json"
\ --request POST \ --data '{"configuredLevel": "DEBUG"}' \ http://localhost:8080/actuator/loggers/be.g00glen00b
Exploring the metrics endpoint
What does it do? • Application metrics • Uses micrometer
• Counters • Gauges • Distribution summaries • Percentiles • Timers
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" ] }
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"] }]
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": [] }
Creating custom counter metrics @Bean public Counter invoicesCounter(MeterRegistry registry) {
return Counter .builder("invoices.created") .description("Amount of invoices created") .register(registry); }
Creating custom counter metrics @PostMapping public CreatedInvoiceDTO create(@RequestBody InvoiceParametersDTO parameters)
{ counter.increment(); // Add this return facade.create(parameters); }
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); }
Cool stuff… but why?
Cool stuff… but why? • Production-readiness • Better monitoring •
Better logging • Better debugging = More happy people
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
Thank you for listening!