updated lab

This commit is contained in:
Alexander Karpov 2025-09-04 12:13:07 +03:00
parent 2fe592c8f6
commit e12c11a041
166 changed files with 3282 additions and 269 deletions

View File

@ -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
View 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

View File

@ -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

Binary file not shown.

View 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
View 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
View 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

Binary file not shown.

View 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
View 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
View File

92
backend/logs/gc.log.3 Normal file
View 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
View 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

View 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:

View 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
}
}

View 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

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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 {
}

View 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;
}
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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;

View 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>

View File

@ -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>

View File

@ -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");
}
}

145
backend/standalone.conf Normal file
View 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

View File

@ -0,0 +1,3 @@
artifactId=web-lab4
groupId=ru.akarpov.web4
version=1.0-SNAPSHOT

View File

@ -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

View File

@ -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

View 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>

View File

@ -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>

Some files were not shown because too many files have changed in this diff Show More