{"id":230548,"date":"2024-02-19T06:51:30","date_gmt":"2024-02-19T14:51:30","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/java\/?p=230548"},"modified":"2024-02-19T06:51:30","modified_gmt":"2024-02-19T14:51:30","slug":"monitor-your-spring-boot-native-image-application-on-azure","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/java\/monitor-your-spring-boot-native-image-application-on-azure\/","title":{"rendered":"Monitor your Spring Boot native image application on Azure"},"content":{"rendered":"<p>You have just developed your Spring Boot native image application. You want to deploy it on Azure. How can you determine if your application is running well, detect errors in HTTP requests, or identify slow SQL queries? We are going to show you how to monitor a Spring Boot native image application on Azure.<\/p>\n<h2>Monitoring set-up<\/h2>\n<h3>Add the Azure starter monitoring<\/h3>\n<p>Let&#8217;s take the classic Petclinic application for our example.<\/p>\n<p>Clone the Petclinic project:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">git clone https:\/\/github.com\/spring-projects\/spring-petclinic<\/code><\/pre>\n<p><span data-contrast=\"auto\">We will use the <\/span><i><span data-contrast=\"auto\">Azure Monitor OpenTelemetry Distro \/ Application Insights in Spring Boot native image Java application <\/span><\/i>project which is a Microsoft distribution of the <a href=\"https:\/\/opentelemetry.io\/docs\/languages\/java\/automatic\/spring-boot\/\">OpenTelemetry Spring Boot starter<\/a>.<\/p>\n<p><span data-contrast=\"auto\">First, add the Azure starter dependency:<\/span><\/p>\n<pre class=\"prettyprint language-xml\"><code class=\"language-xml\">&lt;dependency&gt; \u00a0 \u00a0 \u00a0 \r\n    &lt;groupId&gt;com.azure.spring&lt;\/groupId&gt; \u00a0 \u00a0 \u00a0 \u00a0 \r\n    &lt;artifactId&gt;spring-cloud-azure-starter-monitor&lt;\/artifactId&gt; \u00a0 \u00a0 \u00a0 \u00a0 \r\n    &lt;version&gt;1.0.0-beta.4&lt;\/version&gt; \u00a0 \r\n&lt;\/dependency&gt;<\/code><\/pre>\n<p>Then, add the OpenTelemetry BOM:<\/p>\n<pre class=\"prettyprint language-xml\"><code class=\"language-xml\">&lt;dependencyManagement&gt;\r\n<code class=\"language-default\">\u00a0 \u00a0 <\/code>&lt;dependencies&gt;<code class=\"language-default\">\r\n<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code>&lt;dependency&gt;<code class=\"language-default\">\r\n<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code>&lt;groupId&gt;io.opentelemetry&lt;\/groupId&gt; <code class=\"language-default\">\u00a0 \u00a0 \u00a0  \u00a0 \u00a0\r\n<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code>&lt;artifactId&gt;opentelemetry-bom&lt;\/artifactId&gt; <code class=\"language-default\">  \u00a0 \u00a0  \u00a0  \u00a0  \u00a0 \u00a0\u00a0 \r\n<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code>&lt;version&gt;1.<span class=\"x x-first x-last\">35.0<\/span>&lt;\/version&gt; <code class=\"language-default\">\u00a0 \u00a0 \u00a0  \u00a0 \u00a0\r\n<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code><code class=\"language-default\">\u00a0 \u00a0<\/code>&lt;type&gt;pom&lt;\/type&gt;<code class=\"language-default\">\r\n<\/code><code class=\"language-default\">\u00a0 \u00a0\u00a0 \u00a0&lt;<\/code>\/dependency&gt; <code class=\"language-default\">\u00a0 \u00a0 \r\n<\/code><code class=\"language-default\">\u00a0 \u00a0 <\/code>&lt;\/dependencies&gt; <code class=\"language-default\">\u00a0 \r\n<\/code>&lt;\/dependencyManagement&gt;<\/code><\/pre>\n<p>Now, please follow <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/spring\/README.md#spring-aot-and-spring-native-images\">these instructions<\/a> related to Azure SDK libraries used with a Spring Boot native application.<\/p>\n<p>To identify more easily a little later your Spring Boot native image application in the Azure Monitor application map, you can set the <em>spring.application.name<\/em> property in the <em>application.properties<\/em> file:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">spring.application.name=Petclinic<\/code><\/pre>\n<h3>Enable the SQL requests monitoring<\/h3>\n<p><span data-contrast=\"auto\">Just add the two following lines to your <em>application.properties<\/em> file:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">spring.datasource.url=jdbc:otel:h2:mem:db\u00a0\r\nspring.datasource.driver-class-name=io.opentelemetry.instrumentation.jdbc.OpenTelemetryDriver <\/code><\/pre>\n<h2>Build and play with your native image application<\/h2>\n<p>You can now build your Spring Boot native application:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">mvn -Pnative spring-boot:build-image -Dspring-boot.build-image.imageName=spring-petclinic-native<\/code><\/pre>\n<p><span data-contrast=\"auto\">You have to retrieve the connection string of your Application Insights resource receiving the telemetry data. Go to the Azure portal, search for your Application Insights resource or create a new one. On the overview page of your resource, <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-monitor\/app\/sdk-connection-string\">you will find the connection string in the top right corner<\/a><\/span><span data-contrast=\"auto\">.<\/span><\/p>\n<p>Start your Spring boot native image application with your connection string:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">docker run -e APPLICATIONINSIGHTS_CONNECTION_STRING=\"{connection-string}\" -p 8080:8080 spring-petclinic-native<\/code><\/pre>\n<p>You<span style=\"font-size: 1rem; text-align: var(--bs-body-text-align);\" data-contrast=\"auto\"> can now visit\u00a0<a href=\"http:\/\/localhost:8080\/\" rel=\"nofollow\">http:\/\/localhost:8080<\/a> in your browser and play with your native image application! Don\u2019t forget to click on the Veterinarians and <\/span>Error<span style=\"font-size: 1rem; text-align: var(--bs-body-text-align);\" data-contrast=\"auto\"> menu entries on the top:<\/span><span style=\"font-size: 1rem; text-align: var(--bs-body-text-align);\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/veterinarians-menu.png\"><img decoding=\"async\" class=\"alignnone wp-image-230579\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/veterinarians-menu-300x57.png\" alt=\"Image veterinarians menu\" width=\"447\" height=\"85\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/veterinarians-menu-300x57.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/veterinarians-menu.png 716w\" sizes=\"(max-width: 447px) 100vw, 447px\" \/><\/a><\/p>\n<h2>Look at the monitoring data in Application Insights<\/h2>\n<p><span data-contrast=\"auto\">Now, we are going to look at the monitoring data in the Application Insights resource.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">On the left menu, click on <\/span><i><span data-contrast=\"auto\">Application map<\/span><\/i><span data-contrast=\"auto\">:<\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\"><img decoding=\"async\" class=\"alignnone wp-image-230532\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Application-map-269x300.png\" alt=\"Image Application map\" width=\"241\" height=\"269\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Application-map-269x300.png 269w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Application-map.png 542w\" sizes=\"(max-width: 241px) 100vw, 241px\" \/><\/span><\/p>\n<p><span class=\"TextRun SCXW166303742 BCX8\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW166303742 BCX8\">You can see that our <\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW166303742 BCX8\">Petclinic<\/span><span class=\"NormalTextRun SCXW166303742 BCX8\"> application is calling an H2 database:<\/span><\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\"><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2.png\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-230551\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-300x297.png\" alt=\"Image application map 2\" width=\"300\" height=\"297\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-300x297.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-150x150.png 150w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-24x24.png 24w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-48x48.png 48w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2-96x96.png 96w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/application-map-2.png 683w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/span><\/p>\n<p><span data-contrast=\"auto\">Select now <em>Transaction search<\/em>:<\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Transaction-search-1.png\"><img decoding=\"async\" class=\"alignnone wp-image-230555\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Transaction-search-1-195x300.png\" alt=\"Image Transaction search\" width=\"239\" height=\"368\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Transaction-search-1-195x300.png 195w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/Transaction-search-1.png 341w\" sizes=\"(max-width: 239px) 100vw, 239px\" \/><\/a><\/p>\n<p>You can see the logs. Your Spring Boot native image application has started up fast:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/log-startup.png\"><img decoding=\"async\" class=\"alignnone wp-image-230585\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/log-startup-300x32.png\" alt=\"Image log startup\" width=\"412\" height=\"44\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/log-startup-300x32.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/log-startup-768x82.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/log-startup.png 868w\" sizes=\"(max-width: 412px) 100vw, 412px\" \/><\/a><\/p>\n<p>You can also see the <span class=\"TextRun SCXW163405249 BCX8\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW163405249 BCX8\">HTTP requests and exceptions:<\/span><\/span><\/p>\n<p><span class=\"EOP SCXW163405249 BCX8\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\"> <a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception.png\"><img decoding=\"async\" class=\"alignnone wp-image-230586\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception-300x42.png\" alt=\"Image request exception\" width=\"614\" height=\"86\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception-300x42.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception-1024x144.png 1024w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception-768x108.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/request-exception.png 1411w\" sizes=\"(max-width: 614px) 100vw, 614px\" \/><\/a><\/span><\/p>\n<p>The SQL request are represented as dependencies:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/dependencies.png\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-230589\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/dependencies-300x42.png\" alt=\"Image dependencies\" width=\"300\" height=\"42\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/dependencies-300x42.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/dependencies.png 685w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><span class=\"TextRun SCXW95748511 BCX8\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW95748511 BCX8\">Double click on the \/vets request:<\/span><\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/vets-requ.png\"><img decoding=\"async\" class=\"alignnone wp-image-230594\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/vets-requ-300x33.png\" alt=\"Image vets requ\" width=\"363\" height=\"40\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/vets-requ-300x33.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/vets-requ-768x84.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/vets-requ.png 877w\" sizes=\"(max-width: 363px) 100vw, 363px\" \/><\/a><\/p>\n<p><span class=\"TextRun SCXW17749312 BCX8\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW17749312 BCX8\">You can now see all the SQL requests executed from the \/vets URL:<\/span><\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search.png\"><img decoding=\"async\" class=\"alignnone wp-image-230596\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-300x66.png\" alt=\"Image transaction search\" width=\"931\" height=\"205\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-300x66.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-1024x226.png 1024w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-768x169.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-1536x339.png 1536w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2024\/02\/transaction-search-2048x452.png 2048w\" sizes=\"(max-width: 931px) 100vw, 931px\" \/><\/a><\/p>\n<h2>What&#8217;s next?<\/h2>\n<p>We are going to add <a href=\"https:\/\/learn.microsoft.com\/azure\/azure-monitor\/app\/live-stream\">Live Metrics<\/a> to the <a href=\"http:\/\/aka.ms\/AzMonSpringNative\">OpenTelemetry Distro \/ Application Insights in Spring Boot native image Java application<\/a> project. Microsoft will continue to contribute to OpenTelemetry to make the <em>OpenTelemetry starter<\/em> GA. We look forward to hearing more of your feedback! Please drop us a mail at <a href=\"mailto:JavaO11y@microsoft.com\">JavaO11y@microsoft.com<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>You have just developed your Spring Boot native image application. You want to deploy it on Azure. How can you determine if your application is running well, detect errors in HTTP requests, or identify slow SQL queries? We are going to show you how to monitor a Spring Boot native image application on Azure. Monitoring [&hellip;]<\/p>\n","protected":false},"author":138806,"featured_media":227205,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[760,757,761],"class_list":["post-230548","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-application-insights","tag-monitoring","tag-spring-boot"],"acf":[],"blog_post_summary":"<p>You have just developed your Spring Boot native image application. You want to deploy it on Azure. How can you determine if your application is running well, detect errors in HTTP requests, or identify slow SQL queries? We are going to show you how to monitor a Spring Boot native image application on Azure. Monitoring [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/230548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/users\/138806"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/comments?post=230548"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/230548\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media\/227205"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media?parent=230548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/categories?post=230548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/tags?post=230548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}