commit bac62e8f16044b7e626aa5a0f56d6547c8dc330b Author: allard Date: Sun Feb 25 11:03:14 2024 +0100 eerste push diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3b409ad --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM icr.io/appcafe/open-liberty:kernel-slim-java17-openj9-ubi + +ARG VERSION=1.0 +ARG REVISION=SNAPSHOT + +LABEL \ + org.opencontainers.image.authors="Your Name" \ + org.opencontainers.image.vendor="IBM" \ + org.opencontainers.image.url="local" \ + org.opencontainers.image.source="https://github.com/OpenLiberty/guide-getting-started" \ + org.opencontainers.image.version="$VERSION" \ + org.opencontainers.image.revision="$REVISION" \ + vendor="Open Liberty" \ + name="system" \ + version="$VERSION-$REVISION" \ + summary="The system microservice from the Getting Started guide" \ + description="This image contains the system microservice running with the Open Liberty runtime." + +COPY --chown=1001:0 src/main/liberty/config/ /config/ +RUN features.sh +COPY --chown=1001:0 target/*.war /config/apps/ +RUN configure.sh diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..c9e5f25 --- /dev/null +++ b/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + io.openliberty.guides + guide-getting-started + 1.0-SNAPSHOT + war + + + 11 + 11 + UTF-8 + UTF-8 + + 9080 + 9443 + + + + + + jakarta.platform + jakarta.jakartaee-api + 10.0.0 + provided + + + org.eclipse.microprofile + microprofile + 6.0 + pom + provided + + + + org.junit.jupiter + junit-jupiter + 5.9.2 + test + + + org.jboss.resteasy + resteasy-client + 6.2.3.Final + test + + + org.jboss.resteasy + resteasy-json-binding-provider + 6.2.3.Final + test + + + org.glassfish + jakarta.json + 2.0.1 + test + + + + + ${project.artifactId} + + + + io.openliberty.tools + liberty-maven-plugin + 3.8.2 + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + + org.apache.maven.plugins + maven-failsafe-plugin + 3.0.0 + + + ${liberty.var.default.http.port} + /dev + + + + + + diff --git a/src/main/java/io/openliberty/sample/system/SystemApplication.java b/src/main/java/io/openliberty/sample/system/SystemApplication.java new file mode 100755 index 0000000..f14d149 --- /dev/null +++ b/src/main/java/io/openliberty/sample/system/SystemApplication.java @@ -0,0 +1,20 @@ +// tag::copyright[] +/******************************************************************************* + * Copyright (c) 2017, 2022 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +// end::copyright[] +package io.openliberty.sample.system; + +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; + +@ApplicationPath("/system") +public class SystemApplication extends Application { + +} diff --git a/src/main/java/io/openliberty/sample/system/SystemLivenessCheck.java b/src/main/java/io/openliberty/sample/system/SystemLivenessCheck.java new file mode 100644 index 0000000..72f3514 --- /dev/null +++ b/src/main/java/io/openliberty/sample/system/SystemLivenessCheck.java @@ -0,0 +1,27 @@ +package io.openliberty.sample.system; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.lang.management.MemoryMXBean; +import java.lang.management.ManagementFactory; + +import org.eclipse.microprofile.health.Liveness; +import org.eclipse.microprofile.health.HealthCheck; +import org.eclipse.microprofile.health.HealthCheckResponse; + +@Liveness +@ApplicationScoped +public class SystemLivenessCheck implements HealthCheck { + + @Override + public HealthCheckResponse call() { + MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); + long memUsed = memBean.getHeapMemoryUsage().getUsed(); + long memMax = memBean.getHeapMemoryUsage().getMax(); + + return HealthCheckResponse.named( + SystemResource.class.getSimpleName() + " Liveness Check") + .status(memUsed < memMax * 0.9).build(); + } + +} diff --git a/src/main/java/io/openliberty/sample/system/SystemReadinessCheck.java b/src/main/java/io/openliberty/sample/system/SystemReadinessCheck.java new file mode 100644 index 0000000..d7d4983 --- /dev/null +++ b/src/main/java/io/openliberty/sample/system/SystemReadinessCheck.java @@ -0,0 +1,32 @@ +package io.openliberty.sample.system; + +import jakarta.enterprise.context.ApplicationScoped; + +import jakarta.inject.Inject; +import jakarta.inject.Provider; + +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.health.Readiness; +import org.eclipse.microprofile.health.HealthCheck; +import org.eclipse.microprofile.health.HealthCheckResponse; + +@Readiness +@ApplicationScoped +public class SystemReadinessCheck implements HealthCheck { + + private static final String READINESS_CHECK = SystemResource.class.getSimpleName() + + " Readiness Check"; + + @Inject + @ConfigProperty(name = "io_openliberty_guides_system_inMaintenance") + Provider inMaintenance; + + @Override + public HealthCheckResponse call() { + if (inMaintenance != null && inMaintenance.get().equalsIgnoreCase("true")) { + return HealthCheckResponse.down(READINESS_CHECK); + } + return HealthCheckResponse.up(READINESS_CHECK); + } + +} diff --git a/src/main/java/io/openliberty/sample/system/SystemResource.java b/src/main/java/io/openliberty/sample/system/SystemResource.java new file mode 100755 index 0000000..0a12425 --- /dev/null +++ b/src/main/java/io/openliberty/sample/system/SystemResource.java @@ -0,0 +1,39 @@ +// tag::copyright[] +/******************************************************************************* + * Copyright (c) 2017, 2022 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +// end::copyright[] +package io.openliberty.sample.system; + +import jakarta.ws.rs.core.Response; + +import jakarta.enterprise.context.RequestScoped; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +import org.eclipse.microprofile.metrics.annotation.Counted; +import org.eclipse.microprofile.metrics.annotation.Timed; + +@RequestScoped +@Path("/properties") +public class SystemResource { + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Timed(name = "getPropertiesTime", + description = "Time needed to get the JVM system properties") + @Counted(absolute = true, description + = "Number of times the JVM system properties are requested") + public Response getProperties() { + return Response.ok(System.getProperties()).build(); + } + +} diff --git a/src/main/liberty/config/server.xml b/src/main/liberty/config/server.xml new file mode 100755 index 0000000..19c8554 --- /dev/null +++ b/src/main/liberty/config/server.xml @@ -0,0 +1,24 @@ + + + restfulWS-3.1 + jsonp-2.1 + jsonb-3.0 + cdi-4.0 + mpMetrics-5.0 + mpHealth-4.0 + mpConfig-3.0 + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 0000000..a3823f1 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,10 @@ + + + Liberty Project + + + index.html + + \ No newline at end of file diff --git a/src/main/webapp/css/main.css b/src/main/webapp/css/main.css new file mode 100644 index 0000000..7f4ea6a --- /dev/null +++ b/src/main/webapp/css/main.css @@ -0,0 +1,426 @@ +/******************************************************************************* +* Copyright (c) 2018 IBM Corporation and others. +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +* +* Contributors: +* IBM Corporation - initial API and implementation +*******************************************************************************/ +@import url("https://fonts.googleapis.com/css?family=Asap:300,400,500"); + +@font-face { + font-family: BunueloLight; + src: url("/fonts/BunueloCleanPro-Light.woff"); +} + +@font-face { + font-family: BunueloSemiBold; + src: url("/fonts/BunueloCleanPro-SemiBold.woff"); +} + +body{ + font-family:Asap; + font-size: 16px; + color:#24243b; + background-color: white; + margin: 0px; +} + +section { + padding-top: 55px; + padding-left: 8%; + padding-right: 8%; + /* font-weight: 400; */ + letter-spacing:0; + text-align:left; +} + +.line { + margin-right: 200px; + height: 1px; + background-color: #C8D3D3; +} + +.headerImage { + background-image: url(/img/header_ufo.png); + background-repeat: no-repeat; + background-position: top 20px right 15px; + height: 103px; + margin-top: -94px; +} + +#whereTo { + padding-bottom: 80px; + width: 50%; +} + +p { + line-height: 22px; + margin-top: 0px; +} +h1 { + font-family:BunueloSemiBold; + font-size: 40px; + font-weight: 400; + letter-spacing:0; + text-align:left; +} +h2 { + font-size: 24px; + font-weight: 400; +} +h4 { + margin-top: 52px; +} +a { + text-decoration: none; +} + +#appIntro { + background-image:linear-gradient(#141427 0%, #2c2e50 100%); + background-size: 100% calc(100% - 70px); + background-repeat: no-repeat; +} + +#titleSection { + color: white; + margin-bottom: 80px; +} + +#appTitle { + font-family:BunueloLight; + font-size:55px; +} + +.headerRow { + height: 100px; + position:relative; + z-index:2; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.50); +} +.headerRow > div { + display: inline-block; +} + +.collapsibleRow { + transition: border 400ms ease-out, box-shadow 200ms linear; + cursor: pointer; +} +.collapsibleRow:hover .headerTitle { + background-color: #f4f4f4; + transition: background-color 0.1s; +} +.collapsed .collapsibleRow { + box-shadow: none; + border-bottom: 4px solid; +} +.collapsed#healthSection > .headerRow { + border-bottom-color: #D6D9E4; +} +.collapsed#configSection > .headerRow { + border-bottom-color: #F8D7C1; +} +.collapsed#metricsSection > .headerRow { + border-bottom-color: #EEF3C3; +} + +.collapsed .collapsibleContent { /* collapsing animation */ + transition: all 400ms ease-out, opacity 300ms ease-in; +} +.expanded .collapsibleContent { /* expanding animation */ + transition: all 400ms ease-out, opacity 450ms ease-out; +} +.collapsed .collapsibleContent { + opacity: 0; + max-height: 0; + visibility: hidden; +} +.expanded .collapsibleContent { + opacity: 1; + max-height: 1000px; + visibility: visible; +} + +.headerIcon { + width: 160px; + height: 100%; + float: left; + background-color: #E8EAEF; +} +.headerIcon img { + display:block; + margin:auto; + margin-top: 20px; +} + +#healthSection .headerIcon { + background-color: #E8EAEF; +} +#configSection .headerIcon { + background-color: #FDE4D1; +} +#metricsSection .headerIcon { + background-color: #F5F8DA; +} + +.headerTitle { + background-color: white; + color:#5d6a8e; + letter-spacing:0; + text-align:left; + padding-left: 40px; + padding-top: 10px; + width: calc(100% - 200px); /* 160 from icon, 40 from padding */ +} +#healthSection h2 { + color: #5D6A8E; +} +#configSection h2 { + color: #E57000; +} +#metricsSection h2 { + color: #4F6700; +} + +#sysPropTitle { + padding-top: 28px; +} + +.headerTitle > h2 { + font-family: BunueloLight; + font-size:40px; + margin: 0; +} + +.caret { + position: absolute; + right: 45px; + top: 45px; +} + +.collapsed#configSection .caret { + background-image: url("../img/carets/caret_down_orange.svg") +} +.expanded#configSection .caret { + background-image: url("../img/carets/caret_up_orange.svg") +} + +.msSection { + background: white; + box-shadow: 0 2px 4px 0 rgba(63,70,89,0.31); +} + +.sectionContent { + margin-left: 160px; +} + +#systemPropertiesTable { + padding-left: 160px; + background: white; +} + +button { + border-radius:100px; + height:44px; + color:#24253a; + text-align:center; + font-family: Asap; + margin-top: 25px; + margin-bottom: 70px; + cursor: pointer; + border: none; +} + +button a { + text-decoration: none; + color:#F4914D; +} + +#guidesButton { + background-color:#abd155; + width:269px; + font-weight: 500; + font-size:16px; + transition: background-color .2s; +} +#guidesButton:hover { + background-color: #C7EE63; +} +#mpGuidesButton { + border:2px solid #f4914d8c; + border-radius:100px; + font-size:20px; + letter-spacing:0; + padding-left: 40px; + padding-right: 40px; + background-color: white; + transition: background-color .2s, color .2s; +} +#mpGuidesButton:hover { + background-color: #f4914d; + color: white; +} + +section#openLibertyAndMp { + background:#f4f4f5; + background-size: 100% calc(100% - 70px); + background-repeat: no-repeat; +} + +#healthBox { + text-align: left; + display: table-cell; + vertical-align: middle; + width: 47%; +} + +#healthBox > div { + display: table-cell; + vertical-align: middle; +} + +#healthIcon { + padding-left: 73px; + padding-top: 56px; + padding-bottom: 56px; +} +#healthStatusIcon { + width: 104px; + height: 104px; +} + +#healthText { + padding: 50px; +} + +#serviceStatus { + font-size: 50px; + font-family:BunueloLight; + margin-top: 30px; +} + +#healthNote { + text-align: left; + display: table-cell; + vertical-align: middle; + padding-left: 43px; + line-height: 26px; + width: 53%; +} + +table { + width: 100%; + font-size: 14px; + text-align: left; + border-collapse: collapse; +} + +th { + height: 63px; + padding-left: 41px; + font-size: 16px; +} +tr { + height: 45px; +} +td { + padding-left: 41px; +} +#systemPropertiesTable tr:first-child { + background: #D6D9E4; +} +#configTable tr:first-child { + background: #F8D7C1;; +} +#metricsTable tr:first-child { + background: #EEF3C3; +} + +#systemPropertiesTable tr:nth-child(2n+3) { + background: #EEEFF3; +} +#configTable tr:nth-child(2n+2) { + background: #FEF8F4; +} +#metricsTable tr:nth-child(2n+2) { + background: #FBFCEE; +} + +#systemPropertiesTable .sourceRow, +#healthTable .sourceRow { + border-top: 4px solid #D6D9E4; +} +#systemPropertiesTable .sourceRow a, +#healthTable .sourceRow a { + color: #5D6A8E; +} +#configTable .sourceRow { + border-top: 4px solid #F8D7C1; +} +#configTable .sourceRow a { + color: #E57000; +} +#metricsTable .sourceRow { + border-top: 4px solid #EEF3C3; +} +#metricsTable .sourceRow a { + color: #4F6700; +} +.sourceRow a { + font-weight: 500; +} + +#learnMore { + margin-top: 120px; + padding: 0px 200px 100px; +} + +#learnMore > h2 { + color:#5e6b8d; +} + +.bodyFooter { + padding: 5px 8%; + background-image: url(/img/footer_main.png); + background-repeat: no-repeat; + background-position: top 20px right 110px; + margin-bottom: 40px; + margin-top: 50px; + color: #3F4659; +} + +.bodyFooterLink { + font-family: Asap; + font-weight: 300; + font-size: 14px; + letter-spacing: 0; + border-bottom: solid 1px #C8D3D3; + margin-top: 30px; + margin-right: 130px; + padding-bottom: 5px; + padding-right: 50px; + text-align: right; +} + +.bodyFooterLink > a { + text-decoration: none; + padding: 10px; + color: #96bc32; +} + +#licenseLink { + color: #5E6B8D; + text-align: left; +} + +#footer_text { + margin-top: 4px; + margin-bottom: 4px; + font-size: 16px; +} + +#footer_copyright { + font-size: 11px; +} diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000..c8652f3 Binary files /dev/null and b/src/main/webapp/favicon.ico differ diff --git a/src/main/webapp/fonts/BunueloCleanPro-Light.otf b/src/main/webapp/fonts/BunueloCleanPro-Light.otf new file mode 100644 index 0000000..bcb8cfb Binary files /dev/null and b/src/main/webapp/fonts/BunueloCleanPro-Light.otf differ diff --git a/src/main/webapp/fonts/BunueloCleanPro-SemiBold.otf b/src/main/webapp/fonts/BunueloCleanPro-SemiBold.otf new file mode 100644 index 0000000..6d85daf Binary files /dev/null and b/src/main/webapp/fonts/BunueloCleanPro-SemiBold.otf differ diff --git a/src/main/webapp/img/carets/caret_down_blue.svg b/src/main/webapp/img/carets/caret_down_blue.svg new file mode 100644 index 0000000..ba417e0 --- /dev/null +++ b/src/main/webapp/img/carets/caret_down_blue.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/carets/caret_down_green.svg b/src/main/webapp/img/carets/caret_down_green.svg new file mode 100644 index 0000000..22dd446 --- /dev/null +++ b/src/main/webapp/img/carets/caret_down_green.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/carets/caret_down_orange.svg b/src/main/webapp/img/carets/caret_down_orange.svg new file mode 100644 index 0000000..33d588a --- /dev/null +++ b/src/main/webapp/img/carets/caret_down_orange.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/carets/caret_up_blue.svg b/src/main/webapp/img/carets/caret_up_blue.svg new file mode 100644 index 0000000..b1346d6 --- /dev/null +++ b/src/main/webapp/img/carets/caret_up_blue.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/carets/caret_up_green.svg b/src/main/webapp/img/carets/caret_up_green.svg new file mode 100644 index 0000000..425fd6a --- /dev/null +++ b/src/main/webapp/img/carets/caret_up_green.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/carets/caret_up_orange.svg b/src/main/webapp/img/carets/caret_up_orange.svg new file mode 100644 index 0000000..fe353cb --- /dev/null +++ b/src/main/webapp/img/carets/caret_up_orange.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/main/webapp/img/config.svg b/src/main/webapp/img/config.svg new file mode 100644 index 0000000..4eaf794 --- /dev/null +++ b/src/main/webapp/img/config.svg @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/src/main/webapp/img/footer_main.png b/src/main/webapp/img/footer_main.png new file mode 100644 index 0000000..1194702 Binary files /dev/null and b/src/main/webapp/img/footer_main.png differ diff --git a/src/main/webapp/img/header_ufo.png b/src/main/webapp/img/header_ufo.png new file mode 100644 index 0000000..b7fce7d Binary files /dev/null and b/src/main/webapp/img/header_ufo.png differ diff --git a/src/main/webapp/img/health.svg b/src/main/webapp/img/health.svg new file mode 100644 index 0000000..b740823 --- /dev/null +++ b/src/main/webapp/img/health.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/src/main/webapp/img/metrics.svg b/src/main/webapp/img/metrics.svg new file mode 100644 index 0000000..f7287fd --- /dev/null +++ b/src/main/webapp/img/metrics.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/img/sysProps.svg b/src/main/webapp/img/sysProps.svg new file mode 100644 index 0000000..3ba129f --- /dev/null +++ b/src/main/webapp/img/sysProps.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/src/main/webapp/img/systemDown.svg b/src/main/webapp/img/systemDown.svg new file mode 100644 index 0000000..9f9929b --- /dev/null +++ b/src/main/webapp/img/systemDown.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/main/webapp/img/systemUp.svg b/src/main/webapp/img/systemUp.svg new file mode 100644 index 0000000..b0c1e91 --- /dev/null +++ b/src/main/webapp/img/systemUp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html new file mode 100755 index 0000000..8a26924 --- /dev/null +++ b/src/main/webapp/index.html @@ -0,0 +1,130 @@ + + + + + + + + +
+
+

System Properties voorbeeld

+
+
+

Open Liberty Java17 applicatie op Container Hosting Platform!

+

Dit voorbeeld gebruikt de System Properties microservice om de eigenschappen van de Liberty server te tonen.

+
+ +
+
+
+

System Properties

+
+
+ + + + +
PropertiesValue
+
+
+ +
+ +
+

Dit voorbeeld toont de eigenschappen van de hostevenals health en metrics.

+
+ +
+

System properties sample Insights

+

Built with Microprofile on Open Liberty

+ + + + + +
+
+

Where to next, captain?

+

Set course for the Open Liberty guides!

+

All of the info you need to continue your journey is here, laid out in easy to follow steps and examples. Searching our current selection makes it easy to find the guide that will help make your next project a reality.

+ +
+ + + + + + diff --git a/src/main/webapp/js/mpData.js b/src/main/webapp/js/mpData.js new file mode 100644 index 0000000..584f3ee --- /dev/null +++ b/src/main/webapp/js/mpData.js @@ -0,0 +1,243 @@ +/******************************************************************************* +* Copyright (c) 2018, 2019 IBM Corporation and others. +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +* +* Contributors: +* IBM Corporation - initial API and implementation +*******************************************************************************/ +function displayMetrics() { + getSystemMetrics(); +} + +function getSystemMetrics() { + var url = "https://olproperties.alldcs.nl/metrics"; + var req = new XMLHttpRequest(); + + var metricToDisplay = {}; + var SRgetPropertiesTime = "io_openliberty_sample_system_SystemResource_getPropertiesTime"; + metricToDisplay["getProperties_total{mp_scope=\"application\",}"] = "Request Count"; + metricToDisplay[SRgetPropertiesTime + "_seconds{mp_scope=\"application\",quantile=\"0.999\",}"] = "Request Time (ms) at Quantile 0.999"; + metricToDisplay[SRgetPropertiesTime + "_seconds{mp_scope=\"application\",quantile=\"0.5\",}"] = "Request Time (ms) at Quantile 0.5"; + metricToDisplay[SRgetPropertiesTime + "_seconds_max{mp_scope=\"application\",}"] = "Max Request Time (ms)"; + metricToDisplay["cpu_processCpuLoad_percent{mp_scope=\"base\",}"] = "System CPU Usage (%)"; + metricToDisplay["memory_usedHeap_bytes{mp_scope=\"base\",}"] = "System Heap Usage (MB)"; + + var metricToMatch = "^("; + for (var metricKey in metricToDisplay) { + metricToMatch += metricKey + "|" + } + // remove the last | + metricToMatch = metricToMatch.substring(0, metricToMatch.length-1); + metricToMatch += ")\\s*(\\S*)$" + + req.onreadystatechange = function() { + if (req.readyState != 4) return; // Not there yet + if (req.status != 200) { + document.getElementById("metricsText").innerHTML = req.statusText; + return; + } + + var resp = req.responseText; + var regexpToMatch = new RegExp(metricToMatch, "gm"); + var matchMetrics = resp.match(regexpToMatch); + + var keyValPairs = {}; + for (var metricKey in metricToDisplay) { + matchMetrics.forEach(function(line) { + var keyToMatch = metricKey + " (.*)"; + var keyVal = line.match(new RegExp(keyToMatch)); + if (keyVal) { + var val = keyVal[1]; + if (metricKey.indexOf("application_io_openliberty_sample_system_SystemResource_getPropertiesTime") === 0) { + val = val * 1000; + } else if (metricKey.indexOf("base_memory_usedHeap_bytes") === 0) { + val = val / 1000000; + } + keyValPairs[metricToDisplay[metricKey]] = val; + } + }) + } + + var table = document.getElementById("metricsTableBody"); + for (key in keyValPairs) { + var row = document.createElement("tr"); + var keyData = document.createElement("td"); + keyData.innerText = key; + var valueData = document.createElement("td"); + valueData.innerText = keyValPairs[key]; + row.appendChild(keyData); + row.appendChild(valueData); + table.appendChild(row); + } + + addSourceRow(table, url); + }; + + req.open("GET", url, true); + req.send(); +} + +function displaySystemProperties() { + getSystemPropertiesRequest(); +} + +function getSystemPropertiesRequest() { + var propToDisplay = ["java.vendor", "java.version", "user.name", "os.name", "wlp.install.dir", "wlp.server.name" ]; + var url = "https://olproperties.alldcs.nl/system/properties"; + var req = new XMLHttpRequest(); + var table = document.getElementById("systemPropertiesTable"); + // Create the callback: + req.onreadystatechange = function () { + if (req.readyState != 4) return; // Not there yet + displayMetrics(); + if (req.status != 200) { + table.innerHTML = ""; + var row = document.createElement("tr"); + var th = document.createElement("th"); + th.innerText = req.statusText; + row.appendChild(th); + table.appendChild(row); + + addSourceRow(table, url); + return; + } + // Request successful, read the response + var resp = JSON.parse(req.responseText); + for (var i = 0; i < propToDisplay.length; i++) { + var key = propToDisplay[i]; + if (resp.hasOwnProperty(key)) { + var row = document.createElement("tr"); + var keyData = document.createElement("td"); + keyData.innerText = key; + var valueData = document.createElement("td"); + valueData.innerText = resp[key]; + row.appendChild(keyData); + row.appendChild(valueData); + table.appendChild(row); + } + } + + addSourceRow(table, url); + }; + req.open("GET", url, true); + req.send(); +} + +function displayHealth() { + getHealth(); +} + +function getHealth() { + var url = "https://olproperties.alldcs.nl/health"; + var req = new XMLHttpRequest(); + + var healthBox = document.getElementById("healthBox"); + var serviceName = document.getElementById("serviceName"); + var healthStatus = document.getElementById("serviceStatus"); + var healthIcon = document.getElementById("healthStatusIconImage"); + + req.onreadystatechange = function () { + if (req.readyState != 4) return; // Not there yet + + // Request successful, read the response + if (req.responseText) { + var resp = JSON.parse(req.responseText); + var service = resp.checks[0]; //TODO: use for loop for multiple services + + resp.checks.forEach(function (service) { + serviceName.innerText = service.name; + healthStatus.innerText = service.status; + + if (service.status === "UP") { + healthBox.style.backgroundColor = "#f0f7e1"; + healthIcon.setAttribute("src", "img/systemUp.svg"); + } else { + healthBox.style.backgroundColor = "#fef7f2"; + healthIcon.setAttribute("src", "img/systemDown.svg"); + } + }); + } + var table = document.getElementById("healthTable"); + + addSourceRow(table, url); + }; + req.open("GET", url, true); + req.send(); +} + +function displayConfigProperties() { + getConfigPropertiesRequest(); +} + +function getConfigPropertiesRequest() { + var url = "https://olproperties.alldcs.nl/config"; + var req = new XMLHttpRequest(); + + var configToDisplay = {}; + configToDisplay["io_openliberty_sample_system_inMaintenance"] = "System In Maintenance"; + configToDisplay["io_openliberty_sample_testConfigOverwrite"] = "Test Config Overwrite"; + configToDisplay["io_openliberty_sample_port_number"] = "Port Number"; + // Create the callback: + req.onreadystatechange = function () { + if (req.readyState != 4) return; // Not there yet + if (req.status != 200) { + return; + } + + // Request successful, read the response + var resp = JSON.parse(req.responseText); + var configProps = resp["ConfigProperties"]; + var table = document.getElementById("configTableBody"); + for (key in configProps) { + var row = document.createElement("tr"); + var keyData = document.createElement("td"); + keyData.innerText = configToDisplay[key]; + var valueData = document.createElement("td"); + valueData.innerText = configProps[key]; + row.appendChild(keyData); + row.appendChild(valueData); + table.appendChild(row); + } + + addSourceRow(table, url); + } + req.open("GET", url, true); + req.send(); +} + +function toggle(e) { + var callerElement; + if (!e) { + if (window.event) { + e = window.event; + callerElement = e.currentTarget; + } else { + callerElement = window.toggle.caller.arguments[0].currentTarget; // for firefox + } + } + + var classes = callerElement.parentElement.classList; + var collapsed = classes.contains("collapsed"); + var caretImg = callerElement.getElementsByClassName("caret")[0]; + var caretImgSrc = caretImg.getAttribute("src"); + if (collapsed) { // expand the section + classes.replace("collapsed", "expanded"); + caretImg.setAttribute("src", caretImgSrc.replace("down", "up")); + } else { // collapse the section + classes.replace("expanded", "collapsed"); + caretImg.setAttribute("src", caretImgSrc.replace("up", "down")); + } +} + +function addSourceRow(table, url) { + var sourceRow = document.createElement("tr"); + sourceRow.classList.add("sourceRow"); + var sourceText = document.createElement("td"); + sourceText.setAttribute("colspan", "100%"); + sourceText.innerHTML = "API Source\: "+url+""; + sourceRow.appendChild(sourceText); + table.appendChild(sourceRow); +} diff --git a/src/test/java/it/io/openliberty/sample/PropertiesEndpointIT.java b/src/test/java/it/io/openliberty/sample/PropertiesEndpointIT.java new file mode 100644 index 0000000..5fa0f15 --- /dev/null +++ b/src/test/java/it/io/openliberty/sample/PropertiesEndpointIT.java @@ -0,0 +1,50 @@ +// tag::copyright[] +/******************************************************************************* + * Copyright (c) 2018, 2022 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +// end::copyright[] +package it.io.openliberty.sample; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import jakarta.json.JsonObject; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; + +import org.junit.jupiter.api.Test; + +public class PropertiesEndpointIT { + + @Test + public void testGetProperties() { + + // system properties + String port = System.getProperty("http.port"); + String contextRoot = System.getProperty("context.root", "/"); + String url = "http://localhost:" + port + contextRoot; + + // client setup + Client client = ClientBuilder.newClient(); + + // request + WebTarget target = client.target(url + "/system/properties"); + Response response = target.request().get(); + + // response + assertEquals(200, response.getStatus(), "Incorrect response code from " + url); + + JsonObject obj = response.readEntity(JsonObject.class); + + response.close(); + client.close(); + } + +} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +test