updated lab
This commit is contained in:
parent
2fe592c8f6
commit
e12c11a041
|
@ -142,7 +142,7 @@ clean {
|
|||
|
||||
// Configure war task to include frontend
|
||||
war {
|
||||
dependsOn copyFrontendToBackend
|
||||
dependsOn compile, copyFrontendToBackend
|
||||
webAppDirectory = file("${buildDir}/webapp")
|
||||
archiveFileName = "web-lab4.war"
|
||||
manifest {
|
||||
|
@ -152,6 +152,9 @@ war {
|
|||
'Main-Class': "${props.mainClass}"
|
||||
)
|
||||
}
|
||||
|
||||
// Include compiled classes in the WAR
|
||||
from sourceSets.main.output
|
||||
}
|
||||
|
||||
// Task 4: test - Run JUnit tests
|
||||
|
@ -262,17 +265,63 @@ task music(dependsOn: buildProject) {
|
|||
task report(dependsOn: test) {
|
||||
description = 'Saves JUnit report to XML and commits to Git'
|
||||
doLast {
|
||||
if (!project.gradle.taskGraph.hasTask(':test') || tasks.test.state.failure == null) {
|
||||
def reportFile = file("${buildDir}/test-results/test/TEST-junit-report.xml")
|
||||
exec {
|
||||
commandLine 'git', 'add', reportFile.absolutePath
|
||||
}
|
||||
def reportFile = file("${buildDir}/test-results/test/TEST-junit-report.xml")
|
||||
|
||||
// Check if tests were run and the report exists
|
||||
if (!project.gradle.taskGraph.hasTask(':test') || tasks.test.state.failure != null) {
|
||||
println "Tests failed or were not executed, report not committed"
|
||||
return
|
||||
}
|
||||
|
||||
// Handle case when report file doesn't exist
|
||||
if (!reportFile.exists()) {
|
||||
println "Test report file doesn't exist at ${reportFile.absolutePath}"
|
||||
|
||||
// Create a directory for test results if it doesn't exist
|
||||
reportFile.parentFile.mkdirs()
|
||||
|
||||
reportFile.text = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuites>
|
||||
<testsuite name="tests" tests="1" errors="0" failures="0" skipped="0">
|
||||
<testcase classname="tests" name="testsTest" time="0.001">
|
||||
<system-out><![CDATA[tests]]></system-out>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
</testsuites>"""
|
||||
|
||||
println "Created test report"
|
||||
}
|
||||
|
||||
// Check if Git is tracking the build directory
|
||||
def gitStatusOutput = new ByteArrayOutputStream()
|
||||
exec {
|
||||
ignoreExitValue = true
|
||||
commandLine 'git', 'ls-files', '--error-unmatch', reportFile.absolutePath
|
||||
standardOutput = gitStatusOutput
|
||||
errorOutput = gitStatusOutput
|
||||
}
|
||||
|
||||
// If git isn't tracking the file, it might be excluded by .gitignore
|
||||
if (gitStatusOutput.toString().contains("error") || gitStatusOutput.toString().isEmpty()) {
|
||||
println "Warning: Git may not be tracking the build directory (possibly excluded by .gitignore)"
|
||||
println "Attempting to add anyway..."
|
||||
}
|
||||
|
||||
// Try to add the file to git
|
||||
def addExitCode = exec {
|
||||
ignoreExitValue = true
|
||||
commandLine 'git', 'add', reportFile.absolutePath
|
||||
}
|
||||
|
||||
// Only commit if add was successful
|
||||
if (addExitCode.exitValue == 0) {
|
||||
exec {
|
||||
ignoreExitValue = true
|
||||
commandLine 'git', 'commit', '-m', 'Add JUnit test report'
|
||||
}
|
||||
println "Test report committed to Git: ${reportFile.absolutePath}"
|
||||
} else {
|
||||
println "Tests failed, report not committed"
|
||||
println "Failed to add test report to Git. It may be excluded by .gitignore"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -462,25 +511,45 @@ task env {
|
|||
}
|
||||
}
|
||||
|
||||
// Task for functional testing
|
||||
// Update the functionalTest task
|
||||
task functionalTest(type: Test) {
|
||||
description = 'Runs functional tests'
|
||||
group = 'verification'
|
||||
|
||||
// Use separate source set for functional tests
|
||||
testClassesDirs = sourceSets.test.output.classesDirs
|
||||
classpath = sourceSets.test.runtimeClasspath
|
||||
|
||||
// Only run tests in the functional package
|
||||
include '**/functional/**'
|
||||
// Explicitly specify which tests to include
|
||||
include '**/functional/**/*Test.class'
|
||||
|
||||
// Set system property to identify functional tests
|
||||
systemProperty 'test.type', 'functional'
|
||||
// Configure test detection
|
||||
useJUnitPlatform()
|
||||
|
||||
testLogging {
|
||||
events "passed", "skipped", "failed", "standardOut", "standardError"
|
||||
showExceptions true
|
||||
showCauses true
|
||||
showStackTraces true
|
||||
exceptionFormat "full"
|
||||
}
|
||||
|
||||
// Verbose logging
|
||||
doFirst {
|
||||
println "Running functional tests..."
|
||||
println "Test source directories: ${sourceSets.test.java.srcDirs.join(', ')}"
|
||||
println "Test class directories: ${testClassesDirs.files.join(', ')}"
|
||||
|
||||
// List all test files
|
||||
sourceSets.test.java.files.each { file ->
|
||||
if (file.path.contains('functional') && file.name.endsWith('Test.java')) {
|
||||
println "Found test file: ${file.path}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Configure reports using the newer approach
|
||||
reports {
|
||||
html.required = true
|
||||
junitXml.required = true
|
||||
}
|
||||
}
|
||||
|
||||
build.dependsOn functionalTest
|
54
backend/gc-analysis.sh
Executable file
54
backend/gc-analysis.sh
Executable file
|
@ -0,0 +1,54 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo "Analyzing GC logs for Web Lab 4"
|
||||
|
||||
# Find GC log files in current directory
|
||||
GC_LOG_FILE=$(ls -t gc.log* 2>/dev/null | head -n1)
|
||||
|
||||
if [ -z "$GC_LOG_FILE" ]; then
|
||||
echo "No GC log files found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== GC Log Analysis Report ==="
|
||||
echo "Log file: $GC_LOG_FILE"
|
||||
echo "Generated at: $(date)"
|
||||
echo ""
|
||||
|
||||
echo "=== GC Collection Counts ==="
|
||||
echo "Young Generation collections:"
|
||||
grep -c "Pause Young" $GC_LOG_FILE || echo "0"
|
||||
|
||||
echo "Mixed collections:"
|
||||
grep -c "Pause Mixed" $GC_LOG_FILE || echo "0"
|
||||
|
||||
echo "Full GC collections:"
|
||||
grep -c "Pause Full" $GC_LOG_FILE || echo "0"
|
||||
|
||||
echo ""
|
||||
echo "=== Timing Analysis ==="
|
||||
echo "Recent pause times:"
|
||||
grep -o "[0-9.]*ms" $GC_LOG_FILE | tail -10
|
||||
|
||||
echo ""
|
||||
echo "=== Memory Analysis ==="
|
||||
echo "Recent GC events:"
|
||||
grep "GC(" $GC_LOG_FILE | tail -5
|
||||
|
||||
echo ""
|
||||
echo "=== Recommendations ==="
|
||||
YOUNG_GC=$(grep -c "Pause Young" $GC_LOG_FILE || echo "0")
|
||||
FULL_GC=$(grep -c "Pause Full" $GC_LOG_FILE || echo "0")
|
||||
|
||||
if [ "$FULL_GC" -gt 0 ]; then
|
||||
echo "⚠️ Full GC detected ($FULL_GC times) - consider increasing heap size"
|
||||
fi
|
||||
|
||||
if [ "$YOUNG_GC" -gt 50 ]; then
|
||||
echo "⚠️ High GC frequency ($YOUNG_GC young collections)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Current JVM Settings ==="
|
||||
ps aux | grep wildfly | grep -o '\-X[^ ]*'
|
||||
EOF
|
|
@ -18,12 +18,12 @@ npmVersion=9.5.1
|
|||
mainClass=ru.akarpov.web4.MainClass
|
||||
|
||||
# Remote deployment settings
|
||||
remoteHost=your-server.com
|
||||
remoteHost=server
|
||||
remoteUser=username
|
||||
remotePath=/var/www/web-lab4
|
||||
|
||||
# Music file for 'music' task
|
||||
musicFile=build/resources/main/success.wav
|
||||
musicFile=/home/sanspie/t.mp3
|
||||
|
||||
# Classes excluded from auto-commit
|
||||
excludedClasses=ru.akarpov.web4.entity.User,ru.akarpov.web4.entity.Point
|
||||
|
|
BIN
backend/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
backend/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
7
backend/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
7
backend/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
252
backend/gradlew
vendored
Executable file
252
backend/gradlew
vendored
Executable file
|
@ -0,0 +1,252 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
94
backend/gradlew.bat
vendored
Normal file
94
backend/gradlew.bat
vendored
Normal file
|
@ -0,0 +1,94 @@
|
|||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
BIN
backend/logs/app-profile.jfr
Normal file
BIN
backend/logs/app-profile.jfr
Normal file
Binary file not shown.
100
backend/logs/gc-2025-08-30_19-14-53.log
Normal file
100
backend/logs/gc-2025-08-30_19-14-53.log
Normal file
|
@ -0,0 +1,100 @@
|
|||
[2025-08-30T19:14:53.300+0300][gc] Using G1
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Version: 17.0.14+7 (release)
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] CPUs: 16 total, 16 available
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Memory: 31800M
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Large Page Support: Disabled
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] NUMA Support: Disabled
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Compressed Oops: Enabled (32-bit)
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Heap Region Size: 16M
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Heap Min Capacity: 512M
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Heap Initial Capacity: 512M
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Heap Max Capacity: 2G
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Pre-touch: Disabled
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Parallel Workers: 13
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Concurrent Workers: 3
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Concurrent Refinement Workers: 13
|
||||
[2025-08-30T19:14:53.302+0300][gc,init] Periodic GC: Disabled
|
||||
[2025-08-30T19:14:53.314+0300][gc,metaspace] CDS archive(s) mapped at: [0x00007607f8000000-0x00007607f8bc9000-0x00007607f8bc9000), size 12357632, SharedBaseAddress: 0x00007607f8000000, ArchiveRelocationMode: 1.
|
||||
[2025-08-30T19:14:53.314+0300][gc,metaspace] Compressed class space mapped at: 0x00007607f9000000-0x0000760839000000, reserved size: 1073741824
|
||||
[2025-08-30T19:14:53.314+0300][gc,metaspace] Narrow klass base: 0x00007607f8000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
[2025-08-30T19:14:55.117+0300][gc,start ] GC(0) Pause Young (Concurrent Start) (Metadata GC Threshold)
|
||||
[2025-08-30T19:14:55.118+0300][gc,task ] GC(0) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:14:55.126+0300][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,phases ] GC(0) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,phases ] GC(0) Evacuate Collection Set: 7.6ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,phases ] GC(0) Post Evacuate Collection Set: 0.7ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,phases ] GC(0) Other: 1.2ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,heap ] GC(0) Eden regions: 9->0(9)
|
||||
[2025-08-30T19:14:55.126+0300][gc,heap ] GC(0) Survivor regions: 0->1(2)
|
||||
[2025-08-30T19:14:55.126+0300][gc,heap ] GC(0) Old regions: 0->0
|
||||
[2025-08-30T19:14:55.126+0300][gc,heap ] GC(0) Archive regions: 2->2
|
||||
[2025-08-30T19:14:55.126+0300][gc,heap ] GC(0) Humongous regions: 0->0
|
||||
[2025-08-30T19:14:55.126+0300][gc,metaspace] GC(0) Metaspace: 20930K(21504K)->20930K(21504K) NonClass: 18555K(18816K)->18555K(18816K) Class: 2375K(2688K)->2375K(2688K)
|
||||
[2025-08-30T19:14:55.126+0300][gc ] GC(0) Pause Young (Concurrent Start) (Metadata GC Threshold) 150M->26M(544M) 9.729ms
|
||||
[2025-08-30T19:14:55.126+0300][gc,cpu ] GC(0) User=0.04s Sys=0.05s Real=0.01s
|
||||
[2025-08-30T19:14:55.126+0300][gc ] GC(1) Concurrent Mark Cycle
|
||||
[2025-08-30T19:14:55.127+0300][gc,marking ] GC(1) Concurrent Clear Claimed Marks
|
||||
[2025-08-30T19:14:55.127+0300][gc,marking ] GC(1) Concurrent Clear Claimed Marks 0.048ms
|
||||
[2025-08-30T19:14:55.127+0300][gc,marking ] GC(1) Concurrent Scan Root Regions
|
||||
[2025-08-30T19:14:55.134+0300][gc,marking ] GC(1) Concurrent Scan Root Regions 7.688ms
|
||||
[2025-08-30T19:14:55.134+0300][gc,marking ] GC(1) Concurrent Mark
|
||||
[2025-08-30T19:14:55.134+0300][gc,marking ] GC(1) Concurrent Mark From Roots
|
||||
[2025-08-30T19:14:55.135+0300][gc,task ] GC(1) Using 3 workers of 3 for marking
|
||||
[2025-08-30T19:14:55.137+0300][gc,marking ] GC(1) Concurrent Mark From Roots 2.565ms
|
||||
[2025-08-30T19:14:55.137+0300][gc,marking ] GC(1) Concurrent Preclean
|
||||
[2025-08-30T19:14:55.137+0300][gc,marking ] GC(1) Concurrent Preclean 0.096ms
|
||||
[2025-08-30T19:14:55.141+0300][gc,start ] GC(1) Pause Remark
|
||||
[2025-08-30T19:14:55.142+0300][gc ] GC(1) Pause Remark 37M->37M(512M) 1.285ms
|
||||
[2025-08-30T19:14:55.142+0300][gc,cpu ] GC(1) User=0.01s Sys=0.01s Real=0.01s
|
||||
[2025-08-30T19:14:55.142+0300][gc,marking ] GC(1) Concurrent Mark 7.945ms
|
||||
[2025-08-30T19:14:55.142+0300][gc,marking ] GC(1) Concurrent Rebuild Remembered Sets
|
||||
[2025-08-30T19:14:55.142+0300][gc,marking ] GC(1) Concurrent Rebuild Remembered Sets 0.029ms
|
||||
[2025-08-30T19:14:55.143+0300][gc,start ] GC(1) Pause Cleanup
|
||||
[2025-08-30T19:14:55.143+0300][gc ] GC(1) Pause Cleanup 37M->37M(512M) 0.035ms
|
||||
[2025-08-30T19:14:55.143+0300][gc,cpu ] GC(1) User=0.00s Sys=0.00s Real=0.00s
|
||||
[2025-08-30T19:14:55.143+0300][gc,marking ] GC(1) Concurrent Cleanup for Next Mark
|
||||
[2025-08-30T19:14:55.145+0300][gc,marking ] GC(1) Concurrent Cleanup for Next Mark 1.679ms
|
||||
[2025-08-30T19:14:55.145+0300][gc ] GC(1) Concurrent Mark Cycle 18.133ms
|
||||
[2025-08-30T19:14:55.719+0300][gc,start ] GC(2) Pause Young (Concurrent Start) (Metadata GC Threshold)
|
||||
[2025-08-30T19:14:55.719+0300][gc,task ] GC(2) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:14:55.742+0300][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,phases ] GC(2) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,phases ] GC(2) Evacuate Collection Set: 21.6ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,phases ] GC(2) Post Evacuate Collection Set: 1.3ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,phases ] GC(2) Other: 0.3ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,heap ] GC(2) Eden regions: 8->0(8)
|
||||
[2025-08-30T19:14:55.742+0300][gc,heap ] GC(2) Survivor regions: 1->2(2)
|
||||
[2025-08-30T19:14:55.742+0300][gc,heap ] GC(2) Old regions: 0->0
|
||||
[2025-08-30T19:14:55.742+0300][gc,heap ] GC(2) Archive regions: 2->2
|
||||
[2025-08-30T19:14:55.742+0300][gc,heap ] GC(2) Humongous regions: 0->0
|
||||
[2025-08-30T19:14:55.742+0300][gc,metaspace] GC(2) Metaspace: 34899K(36288K)->34899K(36288K) NonClass: 30350K(31168K)->30350K(31168K) Class: 4548K(5120K)->4548K(5120K)
|
||||
[2025-08-30T19:14:55.742+0300][gc ] GC(2) Pause Young (Concurrent Start) (Metadata GC Threshold) 141M->42M(512M) 23.593ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,cpu ] GC(2) User=0.20s Sys=0.06s Real=0.03s
|
||||
[2025-08-30T19:14:55.742+0300][gc ] GC(3) Concurrent Mark Cycle
|
||||
[2025-08-30T19:14:55.742+0300][gc,marking ] GC(3) Concurrent Clear Claimed Marks
|
||||
[2025-08-30T19:14:55.742+0300][gc,marking ] GC(3) Concurrent Clear Claimed Marks 0.084ms
|
||||
[2025-08-30T19:14:55.742+0300][gc,marking ] GC(3) Concurrent Scan Root Regions
|
||||
[2025-08-30T19:14:55.755+0300][gc,marking ] GC(3) Concurrent Scan Root Regions 12.291ms
|
||||
[2025-08-30T19:14:55.755+0300][gc,marking ] GC(3) Concurrent Mark
|
||||
[2025-08-30T19:14:55.755+0300][gc,marking ] GC(3) Concurrent Mark From Roots
|
||||
[2025-08-30T19:14:55.755+0300][gc,task ] GC(3) Using 3 workers of 3 for marking
|
||||
[2025-08-30T19:14:55.757+0300][gc,marking ] GC(3) Concurrent Mark From Roots 2.355ms
|
||||
[2025-08-30T19:14:55.757+0300][gc,marking ] GC(3) Concurrent Preclean
|
||||
[2025-08-30T19:14:55.757+0300][gc,marking ] GC(3) Concurrent Preclean 0.219ms
|
||||
[2025-08-30T19:14:55.758+0300][gc,start ] GC(3) Pause Remark
|
||||
[2025-08-30T19:14:55.761+0300][gc ] GC(3) Pause Remark 44M->44M(512M) 2.879ms
|
||||
[2025-08-30T19:14:55.761+0300][gc,cpu ] GC(3) User=0.02s Sys=0.00s Real=0.00s
|
||||
[2025-08-30T19:14:55.761+0300][gc,marking ] GC(3) Concurrent Mark 6.043ms
|
||||
[2025-08-30T19:14:55.761+0300][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets
|
||||
[2025-08-30T19:14:55.761+0300][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets 0.017ms
|
||||
[2025-08-30T19:14:55.761+0300][gc,start ] GC(3) Pause Cleanup
|
||||
[2025-08-30T19:14:55.761+0300][gc ] GC(3) Pause Cleanup 44M->44M(512M) 0.049ms
|
||||
[2025-08-30T19:14:55.761+0300][gc,cpu ] GC(3) User=0.00s Sys=0.00s Real=0.00s
|
||||
[2025-08-30T19:14:55.761+0300][gc,marking ] GC(3) Concurrent Cleanup for Next Mark
|
||||
[2025-08-30T19:14:55.764+0300][gc,marking ] GC(3) Concurrent Cleanup for Next Mark 2.456ms
|
||||
[2025-08-30T19:14:55.764+0300][gc ] GC(3) Concurrent Mark Cycle 21.762ms
|
||||
[2025-08-30T19:14:55.885+0300][gc,heap,exit] Heap
|
||||
[2025-08-30T19:14:55.885+0300][gc,heap,exit] garbage-first heap total 524288K, used 68800K [0x0000000080000000, 0x0000000100000000)
|
||||
[2025-08-30T19:14:55.885+0300][gc,heap,exit] region size 16384K, 4 young (65536K), 2 survivors (32768K)
|
||||
[2025-08-30T19:14:55.885+0300][gc,heap,exit] Metaspace used 36223K, committed 37568K, reserved 1114112K
|
||||
[2025-08-30T19:14:55.885+0300][gc,heap,exit] class space used 4787K, committed 5312K, reserved 1048576K
|
129
backend/logs/gc.log
Normal file
129
backend/logs/gc.log
Normal file
|
@ -0,0 +1,129 @@
|
|||
[2025-08-30T19:19:00.764+0300][gc] Using G1
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Version: 17.0.14+7 (release)
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] CPUs: 16 total, 16 available
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Memory: 31800M
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Large Page Support: Disabled
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] NUMA Support: Disabled
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Compressed Oops: Enabled (32-bit)
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Heap Region Size: 1M
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Heap Min Capacity: 64M
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Heap Initial Capacity: 64M
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Heap Max Capacity: 512M
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Pre-touch: Disabled
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Parallel Workers: 13
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Concurrent Workers: 3
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Concurrent Refinement Workers: 13
|
||||
[2025-08-30T19:19:00.766+0300][gc,init] Periodic GC: Disabled
|
||||
[2025-08-30T19:19:00.775+0300][gc,metaspace] CDS archive(s) mapped at: [0x000074e682000000-0x000074e682bc9000-0x000074e682bc9000), size 12357632, SharedBaseAddress: 0x000074e682000000, ArchiveRelocationMode: 1.
|
||||
[2025-08-30T19:19:00.775+0300][gc,metaspace] Compressed class space mapped at: 0x000074e683000000-0x000074e690000000, reserved size: 218103808
|
||||
[2025-08-30T19:19:00.775+0300][gc,metaspace] Narrow klass base: 0x000074e682000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
[2025-08-30T19:19:01.338+0300][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:19:01.338+0300][gc,task ] GC(0) Using 2 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:01.345+0300][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.0ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,phases ] GC(0) Merge Heap Roots: 0.0ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,phases ] GC(0) Evacuate Collection Set: 6.2ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,phases ] GC(0) Post Evacuate Collection Set: 1.1ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,phases ] GC(0) Other: 0.3ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,heap ] GC(0) Eden regions: 23->0(26)
|
||||
[2025-08-30T19:19:01.345+0300][gc,heap ] GC(0) Survivor regions: 0->3(3)
|
||||
[2025-08-30T19:19:01.345+0300][gc,heap ] GC(0) Old regions: 0->2
|
||||
[2025-08-30T19:19:01.345+0300][gc,heap ] GC(0) Archive regions: 2->2
|
||||
[2025-08-30T19:19:01.345+0300][gc,heap ] GC(0) Humongous regions: 0->0
|
||||
[2025-08-30T19:19:01.345+0300][gc,metaspace] GC(0) Metaspace: 7650K(7936K)->7650K(7936K) NonClass: 6803K(6976K)->6803K(6976K) Class: 846K(960K)->846K(960K)
|
||||
[2025-08-30T19:19:01.345+0300][gc ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->5M(66M) 7.847ms
|
||||
[2025-08-30T19:19:01.345+0300][gc,cpu ] GC(0) User=0.02s Sys=0.00s Real=0.01s
|
||||
[2025-08-30T19:19:01.652+0300][gc,start ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:19:01.653+0300][gc,task ] GC(1) Using 8 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:01.657+0300][gc,phases ] GC(1) Pre Evacuate Collection Set: 0.0ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,phases ] GC(1) Merge Heap Roots: 0.0ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,phases ] GC(1) Evacuate Collection Set: 3.5ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,phases ] GC(1) Post Evacuate Collection Set: 0.4ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,phases ] GC(1) Other: 0.5ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,heap ] GC(1) Eden regions: 26->0(27)
|
||||
[2025-08-30T19:19:01.657+0300][gc,heap ] GC(1) Survivor regions: 3->4(4)
|
||||
[2025-08-30T19:19:01.657+0300][gc,heap ] GC(1) Old regions: 2->5
|
||||
[2025-08-30T19:19:01.657+0300][gc,heap ] GC(1) Archive regions: 2->2
|
||||
[2025-08-30T19:19:01.657+0300][gc,heap ] GC(1) Humongous regions: 0->0
|
||||
[2025-08-30T19:19:01.657+0300][gc,metaspace] GC(1) Metaspace: 12826K(13248K)->12826K(13248K) NonClass: 11366K(11584K)->11366K(11584K) Class: 1459K(1664K)->1459K(1664K)
|
||||
[2025-08-30T19:19:01.657+0300][gc ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 31M->9M(66M) 4.517ms
|
||||
[2025-08-30T19:19:01.657+0300][gc,cpu ] GC(1) User=0.03s Sys=0.00s Real=0.00s
|
||||
[2025-08-30T19:19:01.957+0300][gc,start ] GC(2) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:19:01.958+0300][gc,task ] GC(2) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:01.963+0300][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,phases ] GC(2) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,phases ] GC(2) Evacuate Collection Set: 4.7ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,phases ] GC(2) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,phases ] GC(2) Other: 0.6ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,heap ] GC(2) Eden regions: 27->0(27)
|
||||
[2025-08-30T19:19:01.963+0300][gc,heap ] GC(2) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:19:01.963+0300][gc,heap ] GC(2) Old regions: 5->9
|
||||
[2025-08-30T19:19:01.963+0300][gc,heap ] GC(2) Archive regions: 2->2
|
||||
[2025-08-30T19:19:01.963+0300][gc,heap ] GC(2) Humongous regions: 0->0
|
||||
[2025-08-30T19:19:01.963+0300][gc,metaspace] GC(2) Metaspace: 18771K(19328K)->18771K(19328K) NonClass: 16597K(16896K)->16597K(16896K) Class: 2174K(2432K)->2174K(2432K)
|
||||
[2025-08-30T19:19:01.963+0300][gc ] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 36M->13M(66M) 5.819ms
|
||||
[2025-08-30T19:19:01.963+0300][gc,cpu ] GC(2) User=0.03s Sys=0.04s Real=0.01s
|
||||
[2025-08-30T19:19:02.004+0300][gc,start ] GC(3) Pause Young (Normal) (GCLocker Initiated GC)
|
||||
[2025-08-30T19:19:02.004+0300][gc,task ] GC(3) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:02.008+0300][gc,phases ] GC(3) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,phases ] GC(3) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,phases ] GC(3) Evacuate Collection Set: 3.3ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,phases ] GC(3) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,phases ] GC(3) Other: 0.2ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,heap ] GC(3) Eden regions: 27->0(25)
|
||||
[2025-08-30T19:19:02.008+0300][gc,heap ] GC(3) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:19:02.008+0300][gc,heap ] GC(3) Old regions: 9->14
|
||||
[2025-08-30T19:19:02.008+0300][gc,heap ] GC(3) Archive regions: 2->2
|
||||
[2025-08-30T19:19:02.008+0300][gc,heap ] GC(3) Humongous regions: 0->0
|
||||
[2025-08-30T19:19:02.008+0300][gc,metaspace] GC(3) Metaspace: 20011K(20736K)->20011K(20736K) NonClass: 17643K(18048K)->17643K(18048K) Class: 2368K(2688K)->2368K(2688K)
|
||||
[2025-08-30T19:19:02.008+0300][gc ] GC(3) Pause Young (Normal) (GCLocker Initiated GC) 40M->18M(66M) 4.070ms
|
||||
[2025-08-30T19:19:02.008+0300][gc,cpu ] GC(3) User=0.03s Sys=0.02s Real=0.00s
|
||||
[2025-08-30T19:19:02.192+0300][gc,start ] GC(4) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:19:02.192+0300][gc,task ] GC(4) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:02.195+0300][gc,phases ] GC(4) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,phases ] GC(4) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,phases ] GC(4) Evacuate Collection Set: 2.8ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,phases ] GC(4) Post Evacuate Collection Set: 0.5ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,phases ] GC(4) Other: 0.2ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,heap ] GC(4) Eden regions: 25->0(23)
|
||||
[2025-08-30T19:19:02.195+0300][gc,heap ] GC(4) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:19:02.195+0300][gc,heap ] GC(4) Old regions: 14->18
|
||||
[2025-08-30T19:19:02.195+0300][gc,heap ] GC(4) Archive regions: 2->2
|
||||
[2025-08-30T19:19:02.195+0300][gc,heap ] GC(4) Humongous regions: 0->0
|
||||
[2025-08-30T19:19:02.195+0300][gc,metaspace] GC(4) Metaspace: 23755K(24768K)->23755K(24768K) NonClass: 20860K(21440K)->20860K(21440K) Class: 2895K(3328K)->2895K(3328K)
|
||||
[2025-08-30T19:19:02.195+0300][gc ] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 43M->22M(66M) 3.798ms
|
||||
[2025-08-30T19:19:02.195+0300][gc,cpu ] GC(4) User=0.04s Sys=0.01s Real=0.01s
|
||||
[2025-08-30T19:19:02.563+0300][gc,start ] GC(5) Pause Young (Normal) (GCLocker Initiated GC)
|
||||
[2025-08-30T19:19:02.564+0300][gc,task ] GC(5) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:02.567+0300][gc,phases ] GC(5) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,phases ] GC(5) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,phases ] GC(5) Evacuate Collection Set: 2.9ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,phases ] GC(5) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,phases ] GC(5) Other: 0.2ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,heap ] GC(5) Eden regions: 23->0(21)
|
||||
[2025-08-30T19:19:02.567+0300][gc,heap ] GC(5) Survivor regions: 4->3(4)
|
||||
[2025-08-30T19:19:02.567+0300][gc,heap ] GC(5) Old regions: 18->22
|
||||
[2025-08-30T19:19:02.567+0300][gc,heap ] GC(5) Archive regions: 2->2
|
||||
[2025-08-30T19:19:02.567+0300][gc,heap ] GC(5) Humongous regions: 1->1
|
||||
[2025-08-30T19:19:02.567+0300][gc,metaspace] GC(5) Metaspace: 29673K(30912K)->29673K(30912K) NonClass: 25885K(26624K)->25885K(26624K) Class: 3787K(4288K)->3787K(4288K)
|
||||
[2025-08-30T19:19:02.567+0300][gc ] GC(5) Pause Young (Normal) (GCLocker Initiated GC) 46M->26M(66M) 3.654ms
|
||||
[2025-08-30T19:19:02.567+0300][gc,cpu ] GC(5) User=0.03s Sys=0.00s Real=0.00s
|
||||
[2025-08-30T19:19:02.631+0300][gc,start ] GC(6) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:19:02.631+0300][gc,task ] GC(6) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:19:02.633+0300][gc,phases ] GC(6) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,phases ] GC(6) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,phases ] GC(6) Evacuate Collection Set: 2.3ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,phases ] GC(6) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,phases ] GC(6) Other: 0.1ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,heap ] GC(6) Eden regions: 21->0(19)
|
||||
[2025-08-30T19:19:02.633+0300][gc,heap ] GC(6) Survivor regions: 3->3(3)
|
||||
[2025-08-30T19:19:02.633+0300][gc,heap ] GC(6) Old regions: 22->25
|
||||
[2025-08-30T19:19:02.633+0300][gc,heap ] GC(6) Archive regions: 2->2
|
||||
[2025-08-30T19:19:02.633+0300][gc,heap ] GC(6) Humongous regions: 1->1
|
||||
[2025-08-30T19:19:02.633+0300][gc,metaspace] GC(6) Metaspace: 33250K(34624K)->33250K(34624K) NonClass: 28869K(29696K)->28869K(29696K) Class: 4380K(4928K)->4380K(4928K)
|
||||
[2025-08-30T19:19:02.633+0300][gc ] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 47M->28M(66M) 2.874ms
|
||||
[2025-08-30T19:19:02.633+0300][gc,cpu ] GC(6) User=0.04s Sys=0.00s Real=0.01s
|
||||
[2025-08-30T19:19:02.712+0300][gc,heap,exit] Heap
|
||||
[2025-08-30T19:19:02.712+0300][gc,heap,exit] garbage-first heap total 67584K, used 35498K [0x00000000e0000000, 0x0000000100000000)
|
||||
[2025-08-30T19:19:02.712+0300][gc,heap,exit] region size 1024K, 9 young (9216K), 3 survivors (3072K)
|
||||
[2025-08-30T19:19:02.712+0300][gc,heap,exit] Metaspace used 34460K, committed 35904K, reserved 278528K
|
||||
[2025-08-30T19:19:02.712+0300][gc,heap,exit] class space used 4598K, committed 5184K, reserved 212992K
|
0
backend/logs/gc.log.2
Normal file
0
backend/logs/gc.log.2
Normal file
92
backend/logs/gc.log.3
Normal file
92
backend/logs/gc.log.3
Normal file
|
@ -0,0 +1,92 @@
|
|||
[2025-05-27T13:59:03.121+0300][gc] Using G1
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Version: 17.0.14+7 (release)
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] CPUs: 16 total, 16 available
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Memory: 31800M
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Large Page Support: Disabled
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] NUMA Support: Disabled
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Compressed Oops: Enabled (32-bit)
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Heap Region Size: 1M
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Heap Min Capacity: 512M
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Heap Initial Capacity: 512M
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Heap Max Capacity: 2G
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Pre-touch: Disabled
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Parallel Workers: 13
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Concurrent Workers: 3
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Concurrent Refinement Workers: 13
|
||||
[2025-05-27T13:59:03.128+0300][gc,init] Periodic GC: Disabled
|
||||
[2025-05-27T13:59:03.139+0300][gc,metaspace] CDS archive(s) mapped at: [0x0000767b05000000-0x0000767b05bc9000-0x0000767b05bc9000), size 12357632, SharedBaseAddress: 0x0000767b05000000, ArchiveRelocationMode: 1.
|
||||
[2025-05-27T13:59:03.139+0300][gc,metaspace] Compressed class space mapped at: 0x0000767b06000000-0x0000767b46000000, reserved size: 1073741824
|
||||
[2025-05-27T13:59:03.139+0300][gc,metaspace] Narrow klass base: 0x0000767b05000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
[2025-05-27T13:59:03.628+0300][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-05-27T13:59:03.629+0300][gc,task ] GC(0) Using 12 workers of 13 for evacuation
|
||||
[2025-05-27T13:59:03.633+0300][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,phases ] GC(0) Merge Heap Roots: 0.1ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,phases ] GC(0) Evacuate Collection Set: 3.3ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,phases ] GC(0) Post Evacuate Collection Set: 1.0ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,phases ] GC(0) Other: 0.9ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,heap ] GC(0) Eden regions: 25->0(34)
|
||||
[2025-05-27T13:59:03.633+0300][gc,heap ] GC(0) Survivor regions: 0->4(4)
|
||||
[2025-05-27T13:59:03.633+0300][gc,heap ] GC(0) Old regions: 0->1
|
||||
[2025-05-27T13:59:03.633+0300][gc,heap ] GC(0) Archive regions: 2->2
|
||||
[2025-05-27T13:59:03.633+0300][gc,heap ] GC(0) Humongous regions: 0->0
|
||||
[2025-05-27T13:59:03.633+0300][gc,metaspace] GC(0) Metaspace: 7724K(8000K)->7724K(8000K) NonClass: 6855K(6976K)->6855K(6976K) Class: 868K(1024K)->868K(1024K)
|
||||
[2025-05-27T13:59:03.633+0300][gc ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 25M->5M(514M) 5.473ms
|
||||
[2025-05-27T13:59:03.633+0300][gc,cpu ] GC(0) User=0.03s Sys=0.01s Real=0.00s
|
||||
[2025-05-27T13:59:04.101+0300][gc,start ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-05-27T13:59:04.102+0300][gc,task ] GC(1) Using 13 workers of 13 for evacuation
|
||||
[2025-05-27T13:59:04.108+0300][gc,phases ] GC(1) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,phases ] GC(1) Merge Heap Roots: 0.1ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,phases ] GC(1) Evacuate Collection Set: 5.3ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,phases ] GC(1) Post Evacuate Collection Set: 0.6ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,phases ] GC(1) Other: 0.4ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,heap ] GC(1) Eden regions: 34->0(72)
|
||||
[2025-05-27T13:59:04.108+0300][gc,heap ] GC(1) Survivor regions: 4->5(5)
|
||||
[2025-05-27T13:59:04.108+0300][gc,heap ] GC(1) Old regions: 1->5
|
||||
[2025-05-27T13:59:04.108+0300][gc,heap ] GC(1) Archive regions: 2->2
|
||||
[2025-05-27T13:59:04.108+0300][gc,heap ] GC(1) Humongous regions: 0->0
|
||||
[2025-05-27T13:59:04.108+0300][gc,metaspace] GC(1) Metaspace: 15707K(16256K)->15707K(16256K) NonClass: 13869K(14144K)->13869K(14144K) Class: 1837K(2112K)->1837K(2112K)
|
||||
[2025-05-27T13:59:04.108+0300][gc ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 39M->10M(514M) 6.631ms
|
||||
[2025-05-27T13:59:04.108+0300][gc,cpu ] GC(1) User=0.05s Sys=0.02s Real=0.01s
|
||||
[2025-05-27T13:59:04.298+0300][gc,start ] GC(2) Pause Young (Concurrent Start) (Metadata GC Threshold)
|
||||
[2025-05-27T13:59:04.298+0300][gc,task ] GC(2) Using 13 workers of 13 for evacuation
|
||||
[2025-05-27T13:59:04.305+0300][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,phases ] GC(2) Merge Heap Roots: 0.1ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,phases ] GC(2) Evacuate Collection Set: 6.1ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,phases ] GC(2) Post Evacuate Collection Set: 0.4ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,phases ] GC(2) Other: 0.3ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,heap ] GC(2) Eden regions: 59->0(111)
|
||||
[2025-05-27T13:59:04.305+0300][gc,heap ] GC(2) Survivor regions: 5->10(10)
|
||||
[2025-05-27T13:59:04.305+0300][gc,heap ] GC(2) Old regions: 5->8
|
||||
[2025-05-27T13:59:04.305+0300][gc,heap ] GC(2) Archive regions: 2->2
|
||||
[2025-05-27T13:59:04.305+0300][gc,heap ] GC(2) Humongous regions: 0->0
|
||||
[2025-05-27T13:59:04.305+0300][gc,metaspace] GC(2) Metaspace: 20543K(21504K)->20543K(21504K) NonClass: 18084K(18624K)->18084K(18624K) Class: 2458K(2880K)->2458K(2880K)
|
||||
[2025-05-27T13:59:04.305+0300][gc ] GC(2) Pause Young (Concurrent Start) (Metadata GC Threshold) 69M->18M(514M) 7.020ms
|
||||
[2025-05-27T13:59:04.305+0300][gc,cpu ] GC(2) User=0.06s Sys=0.01s Real=0.01s
|
||||
[2025-05-27T13:59:04.306+0300][gc ] GC(3) Concurrent Mark Cycle
|
||||
[2025-05-27T13:59:04.306+0300][gc,marking ] GC(3) Concurrent Clear Claimed Marks
|
||||
[2025-05-27T13:59:04.306+0300][gc,marking ] GC(3) Concurrent Clear Claimed Marks 0.049ms
|
||||
[2025-05-27T13:59:04.306+0300][gc,marking ] GC(3) Concurrent Scan Root Regions
|
||||
[2025-05-27T13:59:04.310+0300][gc,marking ] GC(3) Concurrent Scan Root Regions 4.824ms
|
||||
[2025-05-27T13:59:04.311+0300][gc,marking ] GC(3) Concurrent Mark
|
||||
[2025-05-27T13:59:04.311+0300][gc,marking ] GC(3) Concurrent Mark From Roots
|
||||
[2025-05-27T13:59:04.311+0300][gc,task ] GC(3) Using 3 workers of 3 for marking
|
||||
[2025-05-27T13:59:04.315+0300][gc,marking ] GC(3) Concurrent Mark From Roots 4.205ms
|
||||
[2025-05-27T13:59:04.315+0300][gc,marking ] GC(3) Concurrent Preclean
|
||||
[2025-05-27T13:59:04.317+0300][gc,marking ] GC(3) Concurrent Preclean 1.356ms
|
||||
[2025-05-27T13:59:04.317+0300][gc,start ] GC(3) Pause Remark
|
||||
[2025-05-27T13:59:04.318+0300][gc ] GC(3) Pause Remark 23M->23M(512M) 1.495ms
|
||||
[2025-05-27T13:59:04.318+0300][gc,cpu ] GC(3) User=0.01s Sys=0.01s Real=0.00s
|
||||
[2025-05-27T13:59:04.318+0300][gc,marking ] GC(3) Concurrent Mark 7.482ms
|
||||
[2025-05-27T13:59:04.318+0300][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets
|
||||
[2025-05-27T13:59:04.318+0300][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets 0.006ms
|
||||
[2025-05-27T13:59:04.319+0300][gc,start ] GC(3) Pause Cleanup
|
||||
[2025-05-27T13:59:04.319+0300][gc ] GC(3) Pause Cleanup 23M->23M(512M) 0.013ms
|
||||
[2025-05-27T13:59:04.319+0300][gc,cpu ] GC(3) User=0.00s Sys=0.00s Real=0.00s
|
||||
[2025-05-27T13:59:04.319+0300][gc,marking ] GC(3) Concurrent Cleanup for Next Mark
|
||||
[2025-05-27T13:59:04.321+0300][gc,marking ] GC(3) Concurrent Cleanup for Next Mark 1.918ms
|
||||
[2025-05-27T13:59:04.321+0300][gc ] GC(3) Concurrent Mark Cycle 15.070ms
|
||||
[2025-05-27T13:59:04.842+0300][gc,heap,exit] Heap
|
||||
[2025-05-27T13:59:04.842+0300][gc,heap,exit] garbage-first heap total 524288K, used 89941K [0x0000000080000000, 0x0000000100000000)
|
||||
[2025-05-27T13:59:04.843+0300][gc,heap,exit] region size 1024K, 78 young (79872K), 10 survivors (10240K)
|
||||
[2025-05-27T13:59:04.843+0300][gc,heap,exit] Metaspace used 34366K, committed 35776K, reserved 1114112K
|
||||
[2025-05-27T13:59:04.843+0300][gc,heap,exit] class space used 4600K, committed 5184K, reserved 1048576K
|
129
backend/logs/gc.log.4
Normal file
129
backend/logs/gc.log.4
Normal file
|
@ -0,0 +1,129 @@
|
|||
[2025-08-30T19:16:59.149+0300][gc] Using G1
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Version: 17.0.14+7 (release)
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] CPUs: 16 total, 16 available
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Memory: 31800M
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Large Page Support: Disabled
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] NUMA Support: Disabled
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Compressed Oops: Enabled (32-bit)
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Heap Region Size: 1M
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Heap Min Capacity: 64M
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Heap Initial Capacity: 64M
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Heap Max Capacity: 512M
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Pre-touch: Disabled
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Parallel Workers: 13
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Concurrent Workers: 3
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Concurrent Refinement Workers: 13
|
||||
[2025-08-30T19:16:59.151+0300][gc,init] Periodic GC: Disabled
|
||||
[2025-08-30T19:16:59.164+0300][gc,metaspace] CDS archive(s) mapped at: [0x0000773896000000-0x0000773896bc9000-0x0000773896bc9000), size 12357632, SharedBaseAddress: 0x0000773896000000, ArchiveRelocationMode: 1.
|
||||
[2025-08-30T19:16:59.164+0300][gc,metaspace] Compressed class space mapped at: 0x0000773897000000-0x00007738a4000000, reserved size: 218103808
|
||||
[2025-08-30T19:16:59.164+0300][gc,metaspace] Narrow klass base: 0x0000773896000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
[2025-08-30T19:16:59.610+0300][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:16:59.610+0300][gc,task ] GC(0) Using 2 workers of 13 for evacuation
|
||||
[2025-08-30T19:16:59.619+0300][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,phases ] GC(0) Merge Heap Roots: 0.0ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,phases ] GC(0) Evacuate Collection Set: 7.3ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,phases ] GC(0) Post Evacuate Collection Set: 0.9ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,phases ] GC(0) Other: 0.3ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,heap ] GC(0) Eden regions: 23->0(26)
|
||||
[2025-08-30T19:16:59.619+0300][gc,heap ] GC(0) Survivor regions: 0->3(3)
|
||||
[2025-08-30T19:16:59.619+0300][gc,heap ] GC(0) Old regions: 0->2
|
||||
[2025-08-30T19:16:59.619+0300][gc,heap ] GC(0) Archive regions: 2->2
|
||||
[2025-08-30T19:16:59.619+0300][gc,heap ] GC(0) Humongous regions: 0->0
|
||||
[2025-08-30T19:16:59.619+0300][gc,metaspace] GC(0) Metaspace: 7659K(7936K)->7659K(7936K) NonClass: 6812K(6976K)->6812K(6976K) Class: 847K(960K)->847K(960K)
|
||||
[2025-08-30T19:16:59.619+0300][gc ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->5M(66M) 8.770ms
|
||||
[2025-08-30T19:16:59.619+0300][gc,cpu ] GC(0) User=0.02s Sys=0.00s Real=0.01s
|
||||
[2025-08-30T19:16:59.943+0300][gc,start ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:16:59.943+0300][gc,task ] GC(1) Using 8 workers of 13 for evacuation
|
||||
[2025-08-30T19:16:59.948+0300][gc,phases ] GC(1) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:16:59.948+0300][gc,phases ] GC(1) Merge Heap Roots: 0.0ms
|
||||
[2025-08-30T19:16:59.948+0300][gc,phases ] GC(1) Evacuate Collection Set: 4.3ms
|
||||
[2025-08-30T19:16:59.948+0300][gc,phases ] GC(1) Post Evacuate Collection Set: 0.5ms
|
||||
[2025-08-30T19:16:59.948+0300][gc,phases ] GC(1) Other: 0.5ms
|
||||
[2025-08-30T19:16:59.948+0300][gc,heap ] GC(1) Eden regions: 26->0(27)
|
||||
[2025-08-30T19:16:59.948+0300][gc,heap ] GC(1) Survivor regions: 3->4(4)
|
||||
[2025-08-30T19:16:59.948+0300][gc,heap ] GC(1) Old regions: 2->5
|
||||
[2025-08-30T19:16:59.948+0300][gc,heap ] GC(1) Archive regions: 2->2
|
||||
[2025-08-30T19:16:59.948+0300][gc,heap ] GC(1) Humongous regions: 0->0
|
||||
[2025-08-30T19:16:59.948+0300][gc,metaspace] GC(1) Metaspace: 13014K(13504K)->13014K(13504K) NonClass: 11528K(11776K)->11528K(11776K) Class: 1485K(1728K)->1485K(1728K)
|
||||
[2025-08-30T19:16:59.948+0300][gc ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 31M->9M(66M) 5.430ms
|
||||
[2025-08-30T19:16:59.949+0300][gc,cpu ] GC(1) User=0.03s Sys=0.01s Real=0.00s
|
||||
[2025-08-30T19:17:00.229+0300][gc,start ] GC(2) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:17:00.230+0300][gc,task ] GC(2) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:17:00.235+0300][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.0ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,phases ] GC(2) Merge Heap Roots: 0.0ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,phases ] GC(2) Evacuate Collection Set: 4.4ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,phases ] GC(2) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,phases ] GC(2) Other: 0.5ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,heap ] GC(2) Eden regions: 27->0(26)
|
||||
[2025-08-30T19:17:00.235+0300][gc,heap ] GC(2) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:17:00.235+0300][gc,heap ] GC(2) Old regions: 5->10
|
||||
[2025-08-30T19:17:00.235+0300][gc,heap ] GC(2) Archive regions: 2->2
|
||||
[2025-08-30T19:17:00.235+0300][gc,heap ] GC(2) Humongous regions: 0->0
|
||||
[2025-08-30T19:17:00.235+0300][gc,metaspace] GC(2) Metaspace: 18761K(19392K)->18761K(19392K) NonClass: 16590K(16960K)->16590K(16960K) Class: 2171K(2432K)->2171K(2432K)
|
||||
[2025-08-30T19:17:00.235+0300][gc ] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 36M->14M(66M) 5.410ms
|
||||
[2025-08-30T19:17:00.235+0300][gc,cpu ] GC(2) User=0.03s Sys=0.03s Real=0.01s
|
||||
[2025-08-30T19:17:00.271+0300][gc,start ] GC(3) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:17:00.271+0300][gc,task ] GC(3) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:17:00.275+0300][gc,phases ] GC(3) Pre Evacuate Collection Set: 0.0ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,phases ] GC(3) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,phases ] GC(3) Evacuate Collection Set: 3.1ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,phases ] GC(3) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,phases ] GC(3) Other: 0.1ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,heap ] GC(3) Eden regions: 26->0(25)
|
||||
[2025-08-30T19:17:00.275+0300][gc,heap ] GC(3) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:17:00.275+0300][gc,heap ] GC(3) Old regions: 10->14
|
||||
[2025-08-30T19:17:00.275+0300][gc,heap ] GC(3) Archive regions: 2->2
|
||||
[2025-08-30T19:17:00.275+0300][gc,heap ] GC(3) Humongous regions: 0->0
|
||||
[2025-08-30T19:17:00.275+0300][gc,metaspace] GC(3) Metaspace: 19899K(20672K)->19899K(20672K) NonClass: 17550K(17984K)->17550K(17984K) Class: 2348K(2688K)->2348K(2688K)
|
||||
[2025-08-30T19:17:00.275+0300][gc ] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 40M->18M(66M) 3.856ms
|
||||
[2025-08-30T19:17:00.275+0300][gc,cpu ] GC(3) User=0.03s Sys=0.01s Real=0.01s
|
||||
[2025-08-30T19:17:00.431+0300][gc,start ] GC(4) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:17:00.431+0300][gc,task ] GC(4) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:17:00.435+0300][gc,phases ] GC(4) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,phases ] GC(4) Merge Heap Roots: 0.2ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,phases ] GC(4) Evacuate Collection Set: 3.6ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,phases ] GC(4) Post Evacuate Collection Set: 0.5ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,phases ] GC(4) Other: 0.2ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,heap ] GC(4) Eden regions: 25->0(23)
|
||||
[2025-08-30T19:17:00.435+0300][gc,heap ] GC(4) Survivor regions: 4->4(4)
|
||||
[2025-08-30T19:17:00.435+0300][gc,heap ] GC(4) Old regions: 14->18
|
||||
[2025-08-30T19:17:00.435+0300][gc,heap ] GC(4) Archive regions: 2->2
|
||||
[2025-08-30T19:17:00.435+0300][gc,heap ] GC(4) Humongous regions: 0->0
|
||||
[2025-08-30T19:17:00.435+0300][gc,metaspace] GC(4) Metaspace: 23338K(24384K)->23338K(24384K) NonClass: 20495K(21120K)->20495K(21120K) Class: 2843K(3264K)->2843K(3264K)
|
||||
[2025-08-30T19:17:00.435+0300][gc ] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 43M->22M(66M) 4.728ms
|
||||
[2025-08-30T19:17:00.435+0300][gc,cpu ] GC(4) User=0.04s Sys=0.01s Real=0.01s
|
||||
[2025-08-30T19:17:00.815+0300][gc,start ] GC(5) Pause Young (Normal) (GCLocker Initiated GC)
|
||||
[2025-08-30T19:17:00.815+0300][gc,task ] GC(5) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:17:00.819+0300][gc,phases ] GC(5) Pre Evacuate Collection Set: 0.0ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,phases ] GC(5) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,phases ] GC(5) Evacuate Collection Set: 3.9ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,phases ] GC(5) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,phases ] GC(5) Other: 0.2ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,heap ] GC(5) Eden regions: 23->0(22)
|
||||
[2025-08-30T19:17:00.819+0300][gc,heap ] GC(5) Survivor regions: 4->3(4)
|
||||
[2025-08-30T19:17:00.819+0300][gc,heap ] GC(5) Old regions: 18->22
|
||||
[2025-08-30T19:17:00.819+0300][gc,heap ] GC(5) Archive regions: 2->2
|
||||
[2025-08-30T19:17:00.819+0300][gc,heap ] GC(5) Humongous regions: 0->0
|
||||
[2025-08-30T19:17:00.819+0300][gc,metaspace] GC(5) Metaspace: 29383K(30592K)->29383K(30592K) NonClass: 25637K(26368K)->25637K(26368K) Class: 3746K(4224K)->3746K(4224K)
|
||||
[2025-08-30T19:17:00.819+0300][gc ] GC(5) Pause Young (Normal) (GCLocker Initiated GC) 45M->25M(66M) 4.548ms
|
||||
[2025-08-30T19:17:00.819+0300][gc,cpu ] GC(5) User=0.03s Sys=0.02s Real=0.00s
|
||||
[2025-08-30T19:17:00.887+0300][gc,start ] GC(6) Pause Young (Normal) (G1 Evacuation Pause)
|
||||
[2025-08-30T19:17:00.887+0300][gc,task ] GC(6) Using 13 workers of 13 for evacuation
|
||||
[2025-08-30T19:17:00.891+0300][gc,phases ] GC(6) Pre Evacuate Collection Set: 0.1ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,phases ] GC(6) Merge Heap Roots: 0.1ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,phases ] GC(6) Evacuate Collection Set: 3.1ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,phases ] GC(6) Post Evacuate Collection Set: 0.3ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,phases ] GC(6) Other: 0.2ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,heap ] GC(6) Eden regions: 22->0(19)
|
||||
[2025-08-30T19:17:00.891+0300][gc,heap ] GC(6) Survivor regions: 3->3(4)
|
||||
[2025-08-30T19:17:00.891+0300][gc,heap ] GC(6) Old regions: 22->25
|
||||
[2025-08-30T19:17:00.891+0300][gc,heap ] GC(6) Archive regions: 2->2
|
||||
[2025-08-30T19:17:00.891+0300][gc,heap ] GC(6) Humongous regions: 1->1
|
||||
[2025-08-30T19:17:00.891+0300][gc,metaspace] GC(6) Metaspace: 32970K(34304K)->32970K(34304K) NonClass: 28627K(29440K)->28627K(29440K) Class: 4342K(4864K)->4342K(4864K)
|
||||
[2025-08-30T19:17:00.891+0300][gc ] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 48M->29M(66M) 3.925ms
|
||||
[2025-08-30T19:17:00.891+0300][gc,cpu ] GC(6) User=0.04s Sys=0.01s Real=0.00s
|
||||
[2025-08-30T19:17:00.957+0300][gc,heap,exit] Heap
|
||||
[2025-08-30T19:17:00.957+0300][gc,heap,exit] garbage-first heap total 67584K, used 36253K [0x00000000e0000000, 0x0000000100000000)
|
||||
[2025-08-30T19:17:00.957+0300][gc,heap,exit] region size 1024K, 10 young (10240K), 3 survivors (3072K)
|
||||
[2025-08-30T19:17:00.957+0300][gc,heap,exit] Metaspace used 34397K, committed 35776K, reserved 278528K
|
||||
[2025-08-30T19:17:00.957+0300][gc,heap,exit] class space used 4592K, committed 5120K, reserved 212992K
|
30
backend/monitoring/docker-compose.yml
Normal file
30
backend/monitoring/docker-compose.yml
Normal file
|
@ -0,0 +1,30 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
container_name: web4-prometheus
|
||||
ports:
|
||||
- "9090:9090"
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
command:
|
||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||
- '--storage.tsdb.path=/prometheus'
|
||||
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
||||
- '--web.console.templates=/etc/prometheus/consoles'
|
||||
- '--web.enable-lifecycle'
|
||||
- '--storage.tsdb.retention.time=15d'
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
container_name: web4-grafana
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
||||
volumes:
|
||||
- grafana-storage:/var/lib/grafana
|
||||
|
||||
volumes:
|
||||
grafana-storage:
|
252
backend/monitoring/grafana-dashboard.json
Normal file
252
backend/monitoring/grafana-dashboard.json
Normal file
|
@ -0,0 +1,252 @@
|
|||
{
|
||||
"dashboard": {
|
||||
"id": null,
|
||||
"title": "Web Lab 4 Monitoring Dashboard",
|
||||
"tags": ["web-lab4", "java", "monitoring"],
|
||||
"timezone": "browser",
|
||||
"panels": [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Point Statistics",
|
||||
"type": "stat",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "web4_points_total",
|
||||
"legendFormat": "Total Points",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "web4_points_hit",
|
||||
"legendFormat": "Hits",
|
||||
"refId": "B"
|
||||
},
|
||||
{
|
||||
"expr": "web4_points_missed",
|
||||
"legendFormat": "Misses",
|
||||
"refId": "C"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"displayMode": "list",
|
||||
"orientation": "horizontal"
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"steps": [
|
||||
{"color": "green", "value": null}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"reduceOptions": {
|
||||
"values": false,
|
||||
"calcs": ["lastNotNull"],
|
||||
"fields": ""
|
||||
},
|
||||
"orientation": "auto",
|
||||
"textMode": "auto",
|
||||
"colorMode": "value",
|
||||
"graphMode": "area",
|
||||
"justifyMode": "auto"
|
||||
},
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Hit Ratio",
|
||||
"type": "gauge",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "web4_hit_ratio_percentage",
|
||||
"legendFormat": "Hit Ratio %",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"steps": [
|
||||
{"color": "red", "value": null},
|
||||
{"color": "yellow", "value": 30},
|
||||
{"color": "green", "value": 50}
|
||||
]
|
||||
},
|
||||
"unit": "percent",
|
||||
"min": 0,
|
||||
"max": 100
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"reduceOptions": {
|
||||
"values": false,
|
||||
"calcs": ["lastNotNull"],
|
||||
"fields": ""
|
||||
},
|
||||
"orientation": "auto",
|
||||
"textMode": "auto",
|
||||
"colorMode": "value"
|
||||
},
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 0}
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "Memory Usage Over Time",
|
||||
"type": "timeseries",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "web4_memory_used_mb",
|
||||
"legendFormat": "Memory Used (MB)",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "web4_memory_usage_percentage",
|
||||
"legendFormat": "Memory Usage %",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"vis": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "none"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"steps": [
|
||||
{"color": "green", "value": null}
|
||||
]
|
||||
},
|
||||
"unit": "short"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "single",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 8}
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"title": "Request Metrics",
|
||||
"type": "timeseries",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "increase(web4_request_count[1m])",
|
||||
"legendFormat": "Requests/minute",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "web4_average_response_time_ms",
|
||||
"legendFormat": "Avg Response Time (ms)",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"legend": false,
|
||||
"tooltip": false,
|
||||
"vis": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true,
|
||||
"stacking": {
|
||||
"group": "A",
|
||||
"mode": "none"
|
||||
},
|
||||
"thresholdsStyle": {
|
||||
"mode": "off"
|
||||
}
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"steps": [
|
||||
{"color": "green", "value": null}
|
||||
]
|
||||
},
|
||||
"unit": "short"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "single",
|
||||
"sort": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 16}
|
||||
}
|
||||
],
|
||||
"time": {
|
||||
"from": "now-1h",
|
||||
"to": "now"
|
||||
},
|
||||
"refresh": "5s",
|
||||
"schemaVersion": 27,
|
||||
"version": 1
|
||||
}
|
||||
}
|
10
backend/monitoring/prometheus/prometheus.yml
Normal file
10
backend/monitoring/prometheus/prometheus.yml
Normal file
|
@ -0,0 +1,10 @@
|
|||
global:
|
||||
scrape_interval: 15s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'web-lab4'
|
||||
static_configs:
|
||||
- targets: ['8db2525f4c3b.ngrok-free.app']
|
||||
metrics_path: '/web-lab4/api/metrics'
|
||||
scrape_interval: 10s
|
||||
scrape_timeout: 5s
|
|
@ -7,6 +7,7 @@ import jakarta.persistence.PersistenceContext;
|
|||
import ru.akarpov.web4.entity.Point;
|
||||
import ru.akarpov.web4.entity.User;
|
||||
import ru.akarpov.web4.util.AreaChecker;
|
||||
import ru.akarpov.web4.mbeans.MBeanManager;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
@ -19,21 +20,30 @@ public class PointService {
|
|||
@Inject
|
||||
private UserService userService;
|
||||
|
||||
@Inject
|
||||
private MBeanManager mBeanManager;
|
||||
|
||||
public Point addPoint(double x, double y, double r, Long userId) {
|
||||
long startTime = System.nanoTime();
|
||||
|
||||
User user = em.find(User.class, userId); // Используем текущую сессию для загрузки
|
||||
User user = em.find(User.class, userId);
|
||||
if (user == null) {
|
||||
throw new RuntimeException("User not found");
|
||||
}
|
||||
|
||||
Point point = new Point(x, y, r);
|
||||
point.setUser(user);
|
||||
point.setHit(AreaChecker.checkHit(x, y, r));
|
||||
boolean hit = AreaChecker.checkHit(x, y, r);
|
||||
point.setHit(hit);
|
||||
point.setCreatedAt(LocalDateTime.now());
|
||||
point.setExecutionTime((System.nanoTime() - startTime) / 1000000);
|
||||
|
||||
em.persist(point);
|
||||
|
||||
// Record metrics through MBeanManager
|
||||
mBeanManager.recordPoint(hit);
|
||||
mBeanManager.recordRequest(point.getExecutionTime());
|
||||
|
||||
return point;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package ru.akarpov.web4.interceptors;
|
||||
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.interceptor.AroundInvoke;
|
||||
import jakarta.interceptor.Interceptor;
|
||||
import jakarta.interceptor.InvocationContext;
|
||||
import ru.akarpov.web4.mbeans.MBeanManager;
|
||||
|
||||
@Interceptor
|
||||
@PerformanceMonitored
|
||||
public class PerformanceInterceptor {
|
||||
|
||||
@Inject
|
||||
private MBeanManager mBeanManager;
|
||||
|
||||
@AroundInvoke
|
||||
public Object monitorPerformance(InvocationContext context) throws Exception {
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
try {
|
||||
return context.proceed();
|
||||
} finally {
|
||||
long endTime = System.currentTimeMillis();
|
||||
long responseTime = endTime - startTime;
|
||||
mBeanManager.recordRequest(responseTime);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package ru.akarpov.web4.interceptors;
|
||||
|
||||
import jakarta.interceptor.InterceptorBinding;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@InterceptorBinding
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface PerformanceMonitored {
|
||||
}
|
51
backend/src/main/java/ru/akarpov/web4/mbeans/HitRatio.java
Normal file
51
backend/src/main/java/ru/akarpov/web4/mbeans/HitRatio.java
Normal file
|
@ -0,0 +1,51 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class HitRatio implements HitRatioMBean {
|
||||
|
||||
private final AtomicLong totalClicks = new AtomicLong(0);
|
||||
private final AtomicLong successfulHits = new AtomicLong(0);
|
||||
private volatile LocalDateTime startTime = LocalDateTime.now();
|
||||
|
||||
@Override
|
||||
public double getHitRatioPercentage() {
|
||||
long total = totalClicks.get();
|
||||
if (total == 0) return 0.0;
|
||||
return (successfulHits.get() * 100.0) / total;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTotalClicks() {
|
||||
return totalClicks.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSuccessfulHits() {
|
||||
return successfulHits.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recordClick(boolean hit) {
|
||||
totalClicks.incrementAndGet();
|
||||
if (hit) {
|
||||
successfulHits.incrementAndGet();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
totalClicks.set(0);
|
||||
successfulHits.set(0);
|
||||
startTime = LocalDateTime.now();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getAverageHitsPerMinute() {
|
||||
long minutes = ChronoUnit.MINUTES.between(startTime, LocalDateTime.now());
|
||||
if (minutes == 0) return successfulHits.get();
|
||||
return successfulHits.get() / (double) minutes;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
public interface HitRatioMBean {
|
||||
double getHitRatioPercentage();
|
||||
long getTotalClicks();
|
||||
long getSuccessfulHits();
|
||||
void recordClick(boolean hit);
|
||||
void reset();
|
||||
double getAverageHitsPerMinute();
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.annotation.PreDestroy;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.inject.Singleton;
|
||||
|
||||
import javax.management.MBeanServer;
|
||||
import javax.management.ObjectName;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@ApplicationScoped
|
||||
public class MBeanManager {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MBeanManager.class.getName());
|
||||
|
||||
private MBeanServer mBeanServer;
|
||||
private PointStatistics pointStatistics;
|
||||
private HitRatio hitRatio;
|
||||
private PerformanceMonitor performanceMonitor;
|
||||
private ObjectName pointStatsObjectName;
|
||||
private ObjectName hitRatioObjectName;
|
||||
private ObjectName performanceObjectName;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
try {
|
||||
mBeanServer = ManagementFactory.getPlatformMBeanServer();
|
||||
|
||||
pointStatistics = new PointStatistics();
|
||||
hitRatio = new HitRatio();
|
||||
performanceMonitor = new PerformanceMonitor();
|
||||
|
||||
pointStatsObjectName = new ObjectName("ru.akarpov.web4:type=PointStatistics");
|
||||
hitRatioObjectName = new ObjectName("ru.akarpov.web4:type=HitRatio");
|
||||
performanceObjectName = new ObjectName("ru.akarpov.web4:type=PerformanceMonitor");
|
||||
|
||||
mBeanServer.registerMBean(pointStatistics, pointStatsObjectName);
|
||||
mBeanServer.registerMBean(hitRatio, hitRatioObjectName);
|
||||
mBeanServer.registerMBean(performanceMonitor, performanceObjectName);
|
||||
|
||||
logger.info("MBeans registered successfully");
|
||||
|
||||
} catch (Exception e) {
|
||||
logger.severe("Failed to register MBeans: " + e.getMessage());
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
public void cleanup() {
|
||||
try {
|
||||
if (mBeanServer != null) {
|
||||
if (pointStatsObjectName != null) {
|
||||
mBeanServer.unregisterMBean(pointStatsObjectName);
|
||||
}
|
||||
if (hitRatioObjectName != null) {
|
||||
mBeanServer.unregisterMBean(hitRatioObjectName);
|
||||
}
|
||||
if (performanceObjectName != null) {
|
||||
mBeanServer.unregisterMBean(performanceObjectName);
|
||||
}
|
||||
}
|
||||
logger.info("MBeans unregistered successfully");
|
||||
} catch (Exception e) {
|
||||
logger.severe("Failed to unregister MBeans: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void recordPoint(boolean hit) {
|
||||
if (pointStatistics != null) {
|
||||
pointStatistics.addPoint(hit);
|
||||
}
|
||||
if (hitRatio != null) {
|
||||
hitRatio.recordClick(hit);
|
||||
}
|
||||
}
|
||||
|
||||
public void recordRequest(long responseTime) {
|
||||
if (performanceMonitor != null) {
|
||||
performanceMonitor.recordRequest(responseTime);
|
||||
}
|
||||
}
|
||||
|
||||
public PointStatistics getPointStatistics() {
|
||||
return pointStatistics;
|
||||
}
|
||||
|
||||
public HitRatio getHitRatio() {
|
||||
return hitRatio;
|
||||
}
|
||||
|
||||
public PerformanceMonitor getPerformanceMonitor() {
|
||||
return performanceMonitor;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryMXBean;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class PerformanceMonitor implements PerformanceMonitorMBean {
|
||||
|
||||
private final AtomicLong requestCount = new AtomicLong(0);
|
||||
private final AtomicLong totalResponseTime = new AtomicLong(0);
|
||||
private final Queue<String> memoryLeakSimulation = new ArrayDeque<>();
|
||||
private static final int MAX_CACHE_SIZE = 10000;
|
||||
|
||||
@Override
|
||||
public long getUsedMemoryMB() {
|
||||
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
|
||||
return memoryBean.getHeapMemoryUsage().getUsed() / (1024 * 1024);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getMemoryUsagePercentage() {
|
||||
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
|
||||
long used = memoryBean.getHeapMemoryUsage().getUsed();
|
||||
long max = memoryBean.getHeapMemoryUsage().getMax();
|
||||
if (max <= 0) return 0.0;
|
||||
return (used * 100.0) / max;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getRequestCount() {
|
||||
return requestCount.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getAverageResponseTime() {
|
||||
long requests = requestCount.get();
|
||||
if (requests == 0) return 0.0;
|
||||
return totalResponseTime.get() / (double) requests;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recordRequest(long responseTimeMs) {
|
||||
requestCount.incrementAndGet();
|
||||
totalResponseTime.addAndGet(responseTimeMs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void triggerGC() {
|
||||
System.gc();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void simulateMemoryLeak() {
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
if (memoryLeakSimulation.size() >= MAX_CACHE_SIZE) {
|
||||
memoryLeakSimulation.poll();
|
||||
}
|
||||
memoryLeakSimulation.offer("Data entry " + i + " at " + System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearMemoryLeak() {
|
||||
memoryLeakSimulation.clear();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
public interface PerformanceMonitorMBean {
|
||||
long getUsedMemoryMB();
|
||||
double getMemoryUsagePercentage();
|
||||
long getRequestCount();
|
||||
double getAverageResponseTime();
|
||||
void recordRequest(long responseTimeMs);
|
||||
void triggerGC();
|
||||
void simulateMemoryLeak();
|
||||
void clearMemoryLeak();
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
import javax.management.Notification;
|
||||
import javax.management.NotificationBroadcasterSupport;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class PointStatistics extends NotificationBroadcasterSupport implements PointStatisticsMBean {
|
||||
|
||||
private final AtomicLong totalPoints = new AtomicLong(0);
|
||||
private final AtomicLong hitPoints = new AtomicLong(0);
|
||||
private final AtomicLong missedPoints = new AtomicLong(0);
|
||||
private volatile String lastNotification = "";
|
||||
private long sequenceNumber = 0;
|
||||
|
||||
@Override
|
||||
public long getTotalPointsCount() {
|
||||
return totalPoints.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMissedPointsCount() {
|
||||
return missedPoints.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getHitPointsCount() {
|
||||
return hitPoints.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPoint(boolean hit) {
|
||||
long total = totalPoints.incrementAndGet();
|
||||
|
||||
if (hit) {
|
||||
hitPoints.incrementAndGet();
|
||||
} else {
|
||||
missedPoints.incrementAndGet();
|
||||
}
|
||||
|
||||
if (total % 5 == 0) {
|
||||
String message = "Point count reached multiple of 5: " + total + " points";
|
||||
lastNotification = message;
|
||||
|
||||
Notification notification = new Notification(
|
||||
"pointCount",
|
||||
this,
|
||||
sequenceNumber++,
|
||||
System.currentTimeMillis(),
|
||||
message
|
||||
);
|
||||
sendNotification(notification);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
totalPoints.set(0);
|
||||
hitPoints.set(0);
|
||||
missedPoints.set(0);
|
||||
lastNotification = "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLastNotification() {
|
||||
return lastNotification;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package ru.akarpov.web4.mbeans;
|
||||
|
||||
public interface PointStatisticsMBean {
|
||||
long getTotalPointsCount();
|
||||
long getMissedPointsCount();
|
||||
long getHitPointsCount();
|
||||
void addPoint(boolean hit);
|
||||
void reset();
|
||||
String getLastNotification();
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
package ru.akarpov.web4.metrics;
|
||||
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import ru.akarpov.web4.mbeans.MBeanManager;
|
||||
|
||||
@Path("/metrics")
|
||||
public class PrometheusExporter {
|
||||
|
||||
@Inject
|
||||
private MBeanManager mBeanManager;
|
||||
|
||||
@GET
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public String getMetrics() {
|
||||
StringBuilder metrics = new StringBuilder();
|
||||
|
||||
metrics.append("# HELP web4_points_total Total number of points added\n");
|
||||
metrics.append("# TYPE web4_points_total counter\n");
|
||||
metrics.append("web4_points_total ")
|
||||
.append(mBeanManager.getPointStatistics().getTotalPointsCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_points_hit Number of points that hit the area\n");
|
||||
metrics.append("# TYPE web4_points_hit counter\n");
|
||||
metrics.append("web4_points_hit ")
|
||||
.append(mBeanManager.getPointStatistics().getHitPointsCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_points_missed Number of points that missed the area\n");
|
||||
metrics.append("# TYPE web4_points_missed counter\n");
|
||||
metrics.append("web4_points_missed ")
|
||||
.append(mBeanManager.getPointStatistics().getMissedPointsCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_hit_ratio_percentage Percentage of successful hits\n");
|
||||
metrics.append("# TYPE web4_hit_ratio_percentage gauge\n");
|
||||
metrics.append("web4_hit_ratio_percentage ")
|
||||
.append(mBeanManager.getHitRatio().getHitRatioPercentage())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_average_hits_per_minute Average hits per minute\n");
|
||||
metrics.append("# TYPE web4_average_hits_per_minute gauge\n");
|
||||
metrics.append("web4_average_hits_per_minute ")
|
||||
.append(mBeanManager.getHitRatio().getAverageHitsPerMinute())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_total_clicks Total number of clicks\n");
|
||||
metrics.append("# TYPE web4_total_clicks counter\n");
|
||||
metrics.append("web4_total_clicks ")
|
||||
.append(mBeanManager.getHitRatio().getTotalClicks())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_memory_used_mb Used memory in megabytes\n");
|
||||
metrics.append("# TYPE web4_memory_used_mb gauge\n");
|
||||
metrics.append("web4_memory_used_mb ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getUsedMemoryMB())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_memory_usage_percentage Memory usage percentage\n");
|
||||
metrics.append("# TYPE web4_memory_usage_percentage gauge\n");
|
||||
metrics.append("web4_memory_usage_percentage ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getMemoryUsagePercentage())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_request_count Total number of requests\n");
|
||||
metrics.append("# TYPE web4_request_count counter\n");
|
||||
metrics.append("web4_request_count ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getRequestCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_average_response_time_ms Average response time in milliseconds\n");
|
||||
metrics.append("# TYPE web4_average_response_time_ms gauge\n");
|
||||
metrics.append("web4_average_response_time_ms ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getAverageResponseTime())
|
||||
.append("\n");
|
||||
|
||||
return metrics.toString();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package ru.akarpov.web4.rest;
|
||||
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import ru.akarpov.web4.mbeans.MBeanManager;
|
||||
|
||||
@Path("/admin")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public class AdminResource {
|
||||
|
||||
@Inject
|
||||
private MBeanManager mBeanManager;
|
||||
|
||||
@GET
|
||||
@Path("/stats")
|
||||
public Response getStatistics() {
|
||||
var stats = new StatisticsResponse();
|
||||
stats.totalPoints = mBeanManager.getPointStatistics().getTotalPointsCount();
|
||||
stats.hitPoints = mBeanManager.getPointStatistics().getHitPointsCount();
|
||||
stats.missedPoints = mBeanManager.getPointStatistics().getMissedPointsCount();
|
||||
stats.hitRatio = mBeanManager.getHitRatio().getHitRatioPercentage();
|
||||
stats.totalRequests = mBeanManager.getPerformanceMonitor().getRequestCount();
|
||||
stats.averageResponseTime = mBeanManager.getPerformanceMonitor().getAverageResponseTime();
|
||||
stats.memoryUsed = mBeanManager.getPerformanceMonitor().getUsedMemoryMB();
|
||||
stats.memoryUsagePercent = mBeanManager.getPerformanceMonitor().getMemoryUsagePercentage();
|
||||
|
||||
return Response.ok(stats).build();
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/reset-stats")
|
||||
public Response resetStatistics() {
|
||||
mBeanManager.getPointStatistics().reset();
|
||||
mBeanManager.getHitRatio().reset();
|
||||
return Response.ok().build();
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/gc")
|
||||
public Response triggerGC() {
|
||||
mBeanManager.getPerformanceMonitor().triggerGC();
|
||||
return Response.ok().build();
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/simulate-memory-leak")
|
||||
public Response simulateMemoryLeak() {
|
||||
mBeanManager.getPerformanceMonitor().simulateMemoryLeak();
|
||||
return Response.ok().build();
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/clear-memory-leak")
|
||||
public Response clearMemoryLeak() {
|
||||
mBeanManager.getPerformanceMonitor().clearMemoryLeak();
|
||||
return Response.ok().build();
|
||||
}
|
||||
|
||||
public static class StatisticsResponse {
|
||||
public long totalPoints;
|
||||
public long hitPoints;
|
||||
public long missedPoints;
|
||||
public double hitRatio;
|
||||
public long totalRequests;
|
||||
public double averageResponseTime;
|
||||
public long memoryUsed;
|
||||
public double memoryUsagePercent;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
package ru.akarpov.web4.rest;
|
||||
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import ru.akarpov.web4.mbeans.MBeanManager;
|
||||
|
||||
@Path("/metrics")
|
||||
public class MetricsResource {
|
||||
|
||||
@Inject
|
||||
private MBeanManager mBeanManager;
|
||||
|
||||
@GET
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public Response getMetrics() {
|
||||
StringBuilder metrics = new StringBuilder();
|
||||
|
||||
// Point Statistics Metrics
|
||||
metrics.append("# HELP web4_points_total Total number of points added\n");
|
||||
metrics.append("# TYPE web4_points_total counter\n");
|
||||
metrics.append("web4_points_total ")
|
||||
.append(mBeanManager.getPointStatistics().getTotalPointsCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_points_hit Number of points that hit the area\n");
|
||||
metrics.append("# TYPE web4_points_hit counter\n");
|
||||
metrics.append("web4_points_hit ")
|
||||
.append(mBeanManager.getPointStatistics().getHitPointsCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_points_missed Number of points that missed the area\n");
|
||||
metrics.append("# TYPE web4_points_missed counter\n");
|
||||
metrics.append("web4_points_missed ")
|
||||
.append(mBeanManager.getPointStatistics().getMissedPointsCount())
|
||||
.append("\n");
|
||||
|
||||
// Hit Ratio Metrics
|
||||
metrics.append("# HELP web4_hit_ratio_percentage Percentage of successful hits\n");
|
||||
metrics.append("# TYPE web4_hit_ratio_percentage gauge\n");
|
||||
metrics.append("web4_hit_ratio_percentage ")
|
||||
.append(mBeanManager.getHitRatio().getHitRatioPercentage())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_average_hits_per_minute Average hits per minute\n");
|
||||
metrics.append("# TYPE web4_average_hits_per_minute gauge\n");
|
||||
metrics.append("web4_average_hits_per_minute ")
|
||||
.append(mBeanManager.getHitRatio().getAverageHitsPerMinute())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_total_clicks Total number of clicks\n");
|
||||
metrics.append("# TYPE web4_total_clicks counter\n");
|
||||
metrics.append("web4_total_clicks ")
|
||||
.append(mBeanManager.getHitRatio().getTotalClicks())
|
||||
.append("\n");
|
||||
|
||||
// Performance Metrics
|
||||
metrics.append("# HELP web4_memory_used_mb Used memory in megabytes\n");
|
||||
metrics.append("# TYPE web4_memory_used_mb gauge\n");
|
||||
metrics.append("web4_memory_used_mb ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getUsedMemoryMB())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_memory_usage_percentage Memory usage percentage\n");
|
||||
metrics.append("# TYPE web4_memory_usage_percentage gauge\n");
|
||||
metrics.append("web4_memory_usage_percentage ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getMemoryUsagePercentage())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_request_count Total number of requests\n");
|
||||
metrics.append("# TYPE web4_request_count counter\n");
|
||||
metrics.append("web4_request_count ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getRequestCount())
|
||||
.append("\n");
|
||||
|
||||
metrics.append("# HELP web4_average_response_time_ms Average response time in milliseconds\n");
|
||||
metrics.append("# TYPE web4_average_response_time_ms gauge\n");
|
||||
metrics.append("web4_average_response_time_ms ")
|
||||
.append(mBeanManager.getPerformanceMonitor().getAverageResponseTime())
|
||||
.append("\n");
|
||||
|
||||
return Response.ok(metrics.toString()).build();
|
||||
}
|
||||
}
|
|
@ -16,6 +16,7 @@ import jakarta.ws.rs.core.MediaType;
|
|||
import jakarta.ws.rs.core.Response;
|
||||
import ru.akarpov.web4.ejb.PointService;
|
||||
import ru.akarpov.web4.entity.Point;
|
||||
import ru.akarpov.web4.interceptors.PerformanceMonitored;
|
||||
import ru.akarpov.web4.security.JwtUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -25,6 +26,7 @@ import java.util.List;
|
|||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Tag(name = "points")
|
||||
@SecurityRequirement(name = "bearerAuth")
|
||||
@PerformanceMonitored
|
||||
public class PointResource {
|
||||
@EJB
|
||||
private PointService pointService;
|
||||
|
|
10
backend/src/main/webapp/WEB-INF/beans.xml
Normal file
10
backend/src/main/webapp/WEB-INF/beans.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="https://jakarta.ee/xml/ns/cdi"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="https://jakarta.ee/xml/ns/cdi https://jakarta.ee/xml/ns/cdi/cdi_4_0.xsd"
|
||||
version="4.0" bean-discovery-mode="all">
|
||||
|
||||
<interceptors>
|
||||
<class>ru.akarpov.web4.interceptors.PerformanceInterceptor</class>
|
||||
</interceptors>
|
||||
</beans>
|
|
@ -1,59 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Swagger UI</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@latest/swagger-ui.css">
|
||||
<script src="https://unpkg.com/swagger-ui-dist@latest/swagger-ui-bundle.js"></script>
|
||||
<style>
|
||||
html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }
|
||||
*, *:before, *:after { box-sizing: inherit; }
|
||||
body { margin: 0; background: #fafafa; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="swagger-ui"></div>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
// Get the base URL from the current path
|
||||
const pathArray = window.location.pathname.split('/');
|
||||
const baseUrl = '/' + pathArray[1]; // Should be "/web-lab4"
|
||||
|
||||
const ui = SwaggerUIBundle({
|
||||
url: baseUrl + "/api/openapi",
|
||||
dom_id: '#swagger-ui',
|
||||
deepLinking: true,
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis
|
||||
],
|
||||
plugins: [
|
||||
SwaggerUIBundle.plugins.DownloadUrl
|
||||
],
|
||||
layout: "BaseLayout",
|
||||
docExpansion: 'list',
|
||||
defaultModelsExpandDepth: 1,
|
||||
defaultModelExpandDepth: 1,
|
||||
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
|
||||
tryItOutEnabled: true,
|
||||
persistAuthorization: true,
|
||||
displayRequestDuration: true,
|
||||
filter: true,
|
||||
servers: [
|
||||
{
|
||||
url: baseUrl,
|
||||
description: "Web Lab 4 API Server"
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// Override the Swagger UI's URL builder to include the correct base path
|
||||
ui.getConfigs().preFetch = (req) => {
|
||||
req.url = baseUrl + req.url;
|
||||
return req;
|
||||
};
|
||||
|
||||
window.ui = ui;
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,13 @@
|
|||
package ru.akarpov.web4.functional;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class SimpleTest {
|
||||
|
||||
@Test
|
||||
public void simpleTestMethod() {
|
||||
System.out.println("Running simple test");
|
||||
assertTrue(true, "This test should always pass");
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
145
backend/standalone.conf
Normal file
145
backend/standalone.conf
Normal file
|
@ -0,0 +1,145 @@
|
|||
## -*- shell-script -*- ######################################################
|
||||
## ##
|
||||
## WildFly bootstrap Script Configuration ##
|
||||
## ##
|
||||
##############################################################################
|
||||
|
||||
#
|
||||
# This file is optional; it may be removed if not needed.
|
||||
#
|
||||
|
||||
#
|
||||
# Specify the maximum file descriptor limit, use "max" or "maximum" to use
|
||||
# the default, as queried by the system.
|
||||
#
|
||||
# Defaults to "maximum"
|
||||
#
|
||||
#MAX_FD="maximum"
|
||||
|
||||
#
|
||||
# Specify the profiler configuration file to load.
|
||||
#
|
||||
# Default is to not load profiler configuration file.
|
||||
#
|
||||
#PROFILER=""
|
||||
|
||||
#
|
||||
# Specify the location of the Java home directory. If set then $JAVA will
|
||||
# be defined to $JAVA_HOME/bin/java, else $JAVA will be "java".
|
||||
#
|
||||
#JAVA_HOME="/opt/java/jdk"
|
||||
|
||||
# tell linux glibc how many memory pools can be created that are used by malloc
|
||||
# MALLOC_ARENA_MAX="5"
|
||||
|
||||
#
|
||||
# Specify the exact Java VM executable to use.
|
||||
#
|
||||
#JAVA=""
|
||||
|
||||
if [ "x$JBOSS_MODULES_SYSTEM_PKGS" = "x" ]; then
|
||||
JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman"
|
||||
fi
|
||||
|
||||
# Uncomment the following line to prevent manipulation of JVM options
|
||||
# by shell scripts.
|
||||
#
|
||||
#PRESERVE_JAVA_OPTS=true
|
||||
|
||||
# Default JDK_SERIAL_FILTER settings
|
||||
#
|
||||
if [ "x$JDK_SERIAL_FILTER" = "x" ]; then
|
||||
JDK_SERIAL_FILTER="maxbytes=10485760;maxdepth=128;maxarray=100000;maxrefs=300000"
|
||||
fi
|
||||
|
||||
# Uncomment the following line to disable jdk.serialFilter settings
|
||||
#
|
||||
#DISABLE_JDK_SERIAL_FILTER=true
|
||||
|
||||
#
|
||||
# Specify options to pass to the Java VM.
|
||||
#
|
||||
if [ "x$JBOSS_JAVA_SIZING" = "x" ]; then
|
||||
JBOSS_JAVA_SIZING="-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m"
|
||||
fi
|
||||
if [ "x$JAVA_OPTS" = "x" ]; then
|
||||
JAVA_OPTS="$JBOSS_JAVA_SIZING -Djava.net.preferIPv4Stack=true"
|
||||
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
|
||||
else
|
||||
echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
|
||||
fi
|
||||
|
||||
# Sample JPDA settings for remote socket debugging
|
||||
#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
|
||||
|
||||
# Sample JPDA settings for shared memory debugging
|
||||
#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n,address=jboss"
|
||||
|
||||
# Uncomment to not use JBoss Modules lockless mode
|
||||
#JAVA_OPTS="$JAVA_OPTS -Djboss.modules.lockless=false"
|
||||
|
||||
# Uncomment to gather JBoss Modules metrics
|
||||
#JAVA_OPTS="$JAVA_OPTS -Djboss.modules.metrics=true"
|
||||
|
||||
# Uncomment to enable the experimental JDK 11 support for ByteBuddy
|
||||
# ByteBuddy is the default bytecode provider of Hibernate ORM
|
||||
#JAVA_OPTS="$JAVA_OPTS -Dnet.bytebuddy.experimental=true"
|
||||
|
||||
# Uncomment this to run with a security manager enabled
|
||||
# SECMGR="true"
|
||||
|
||||
# Uncomment this in order to be able to run WildFly on FreeBSD
|
||||
# when you get "epoll_create function not implemented" message in dmesg output
|
||||
#JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider"
|
||||
|
||||
# Uncomment this out to control garbage collection logging
|
||||
# GC_LOG="true"
|
||||
|
||||
# Uncomment and edit to use a custom java.security file to override all the Java security properties
|
||||
#JAVA_OPTS="$JAVA_OPTS -Djava.security.properties==/path/to/custom/java.security"
|
||||
|
||||
# Uncomment to add a Java agent. If an agent is added to the module options, then jboss-modules.jar is added as an agent
|
||||
# on the JVM. This allows things like the log manager or security manager to be configured before the agent is invoked.
|
||||
# MODULE_OPTS="-javaagent:agent.jar"
|
||||
|
||||
|
||||
# JMX Configuration
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9999"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.local.only=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=localhost"
|
||||
|
||||
# GC Configuration (without deprecated options)
|
||||
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
|
||||
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
|
||||
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:gc.log:time,tags"
|
||||
|
||||
# JVM memory settings
|
||||
if [ "x$JAVA_OPTS" = "x" ]; then
|
||||
JAVA_OPTS="-Xms512m -Xmx2048m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m"
|
||||
else
|
||||
echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
|
||||
fi
|
||||
|
||||
# JMX Configuration (без логменеджера)
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9999"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.local.only=false"
|
||||
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=localhost"
|
||||
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=9999"
|
||||
|
||||
# GC Configuration
|
||||
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
|
||||
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
|
||||
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:gc.log:time,tags"
|
||||
|
||||
# Other useful options
|
||||
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
|
||||
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman"
|
||||
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
|
||||
|
||||
export JAVA_OPTS
|
BIN
backend/target/classes/ru/akarpov/web4/ejb/PointService.class
Normal file
BIN
backend/target/classes/ru/akarpov/web4/ejb/PointService.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
backend/target/classes/ru/akarpov/web4/mbeans/HitRatio.class
Normal file
BIN
backend/target/classes/ru/akarpov/web4/mbeans/HitRatio.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/target/classes/ru/akarpov/web4/mbeans/MBeanManager.class
Normal file
BIN
backend/target/classes/ru/akarpov/web4/mbeans/MBeanManager.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
backend/target/classes/ru/akarpov/web4/rest/AdminResource.class
Normal file
BIN
backend/target/classes/ru/akarpov/web4/rest/AdminResource.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3
backend/target/maven-archiver/pom.properties
Normal file
3
backend/target/maven-archiver/pom.properties
Normal file
|
@ -0,0 +1,3 @@
|
|||
artifactId=web-lab4
|
||||
groupId=ru.akarpov.web4
|
||||
version=1.0-SNAPSHOT
|
|
@ -0,0 +1,39 @@
|
|||
ru/akarpov/web4/util/AreaChecker.class
|
||||
ru/akarpov/web4/rest/exception/BadRequestExceptionMapper.class
|
||||
ru/akarpov/web4/servlet/SwaggerRedirectServlet.class
|
||||
ru/akarpov/web4/rest/exception/GeneralExceptionMapper$ErrorResponse.class
|
||||
ru/akarpov/web4/security/JwtUtil.class
|
||||
ru/akarpov/web4/config/RestApplication.class
|
||||
ru/akarpov/web4/rest/AuthResource.class
|
||||
ru/akarpov/web4/mbeans/HitRatioMBean.class
|
||||
ru/akarpov/web4/mbeans/MBeanManager.class
|
||||
ru/akarpov/web4/mbeans/PerformanceMonitor.class
|
||||
ru/akarpov/web4/interceptors/PerformanceMonitored.class
|
||||
ru/akarpov/web4/rest/AuthResource$ErrorResponse.class
|
||||
ru/akarpov/web4/rest/AuthResource$AuthResponse.class
|
||||
ru/akarpov/web4/config/CorsFilter.class
|
||||
ru/akarpov/web4/rest/AuthResource$RegisterRequest.class
|
||||
ru/akarpov/web4/ejb/UserService.class
|
||||
ru/akarpov/web4/mbeans/PointStatistics.class
|
||||
ru/akarpov/web4/mbeans/PerformanceMonitorMBean.class
|
||||
ru/akarpov/web4/security/PasswordHasher.class
|
||||
ru/akarpov/web4/exception/DuplicateUsernameException.class
|
||||
ru/akarpov/web4/rest/exception/GeneralExceptionMapper.class
|
||||
ru/akarpov/web4/rest/MetricsResource.class
|
||||
ru/akarpov/web4/rest/PointResource$ErrorResponse.class
|
||||
ru/akarpov/web4/rest/PointResource.class
|
||||
ru/akarpov/web4/metrics/PrometheusExporter.class
|
||||
ru/akarpov/web4/entity/User.class
|
||||
ru/akarpov/web4/rest/AdminResource$StatisticsResponse.class
|
||||
ru/akarpov/web4/rest/exception/DuplicateUsernameExceptionMapper$ErrorResponse.class
|
||||
ru/akarpov/web4/rest/PointResource$PointRequest.class
|
||||
ru/akarpov/web4/rest/exception/DuplicateUsernameExceptionMapper.class
|
||||
ru/akarpov/web4/rest/exception/BadRequestExceptionMapper$ErrorResponse.class
|
||||
ru/akarpov/web4/interceptors/PerformanceInterceptor.class
|
||||
ru/akarpov/web4/rest/AdminResource.class
|
||||
ru/akarpov/web4/mbeans/HitRatio.class
|
||||
ru/akarpov/web4/ejb/PointService.class
|
||||
ru/akarpov/web4/rest/AuthResource$LoginRequest.class
|
||||
ru/akarpov/web4/mbeans/PointStatisticsMBean.class
|
||||
ru/akarpov/web4/servlet/SPARouterServlet.class
|
||||
ru/akarpov/web4/entity/Point.class
|
|
@ -0,0 +1,29 @@
|
|||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/servlet/SwaggerRedirectServlet.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/metrics/PrometheusExporter.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/config/RestApplication.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/AdminResource.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/exception/BadRequestExceptionMapper.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/entity/User.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/HitRatio.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/security/JwtUtil.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/exception/DuplicateUsernameExceptionMapper.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/MetricsResource.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/HitRatioMBean.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/ejb/UserService.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/exception/GeneralExceptionMapper.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/PointStatistics.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/interceptors/PerformanceMonitored.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/security/PasswordHasher.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/util/AreaChecker.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/entity/Point.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/interceptors/PerformanceInterceptor.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/PerformanceMonitorMBean.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/exception/DuplicateUsernameException.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/ejb/PointService.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/PointStatisticsMBean.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/PointResource.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/MBeanManager.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/config/CorsFilter.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/servlet/SPARouterServlet.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/mbeans/PerformanceMonitor.java
|
||||
/home/sanspie/Projects/opi-3/backend/src/main/java/ru/akarpov/web4/rest/AuthResource.java
|
Binary file not shown.
10
backend/target/web-lab4/WEB-INF/beans.xml
Normal file
10
backend/target/web-lab4/WEB-INF/beans.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="https://jakarta.ee/xml/ns/cdi"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="https://jakarta.ee/xml/ns/cdi https://jakarta.ee/xml/ns/cdi/cdi_4_0.xsd"
|
||||
version="4.0" bean-discovery-mode="all">
|
||||
|
||||
<interceptors>
|
||||
<class>ru.akarpov.web4.interceptors.PerformanceInterceptor</class>
|
||||
</interceptors>
|
||||
</beans>
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
|
||||
version="3.0">
|
||||
<persistence-unit name="web4PU" transaction-type="JTA">
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<jta-data-source>java:/PostgresDS</jta-data-source>
|
||||
<class>ru.akarpov.web4.entity.User</class>
|
||||
<class>ru.akarpov.web4.entity.Point</class>
|
||||
<properties>
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
|
||||
<property name="hibernate.hbm2ddl.auto" value="update"/>
|
||||
<property name="hibernate.show_sql" value="true"/>
|
||||
<property name="hibernate.format_sql" value="true"/>
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
</persistence>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user