Нередка ситуация, когда приложение стало запускаться заметно дольше, а в логах все ок. Может быть такое, что время уходит на создание бинов, загрузку данных или подключение к внешним сервисам.
Чтобы найти узкое место, Spring предоставляет интерфейс
ApplicationStartup.Есть три
–
DefaultApplicationStartup. Используется по умолчанию и фактически ничего не записывает.–
BufferingApplicationStartup. Хранит события запуска в памяти. Удобен для локальной диагностики, тестов и просмотра через Actuator.–
FlightRecorderApplicationStartup. Передаёт данные в Java Flight Recorder для более глубокого профилирования.Для быстрого анализа можно подключить буферизацию:
SpringApplication app = new SpringApplication(Application.class);
app.setApplicationStartup(
new BufferingApplicationStartup(2048)
);
app.run(args);
И открыть эндпоинт в настройках:
management.endpoints.web.exposure.include=startup
После запуска временная шкала будет доступна по адресу:
GET /actuator/startup
В ответе можно увидеть продолжительность отдельных этапов, их иерархию и имена создаваемых бинов:
{
"duration": "PT0.000754S",
"startupStep": {
"name": "spring.beans.instantiate",
"tags": [
{
"key": "beanName",
"value": "specialService"
}
]
}
}
У эндпоинта есть важная особенность:
–
GET возвращает текущий снимок временной шкалы; –
POST возвращает снимок и очищает буфер.Можно добавлять и собственные этапы. Например, отдельно измерять подключение к базе данных:
StartupStep step =
applicationStartup.start("app.database.connect");
try {
step.tag("database", "main");
connectToDatabase();
} finally {
step.end();
}
Такие этапы появятся рядом со стандартными событиями Spring. Это особенно полезно, когда во время инициализации выполняются миграции, прогреваются кэши, загружаются модели или создаются подключения к внешним системам.
Для продолжительного и более детального профилирования лучше использовать
FlightRecorderApplicationStartup вместе с JFR и Java Mission Control.Короче:
– нужен быстрый снапшот запуска - юзаем
BufferingApplicationStartup; – нужен глубокий анализ JVM - юзаем
FlightRecorderApplicationStartup; – нужна диагностика бизнес-инициализации, тогда добавляем собственные
StartupStep.Как-то так 🤓
🔗 Фул статья: https://habr.com/ru/companies/spring_aio/articles/1066976/