diff --git a/Dockerfile b/Dockerfile
index d87063f4..517fb0cb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,10 +10,23 @@ RUN pwd
RUN mkdir tmp
ENV TMP=/home/${USER}/tmp
ENV TEMP=/home/${USER}/tmp
+ENV SENTRY_TRACES_SAMPLE_RATE_FRONTEND=__SENTRY_TRACES_SAMPLE_RATE_FRONTEND_HERE__
+ENV SENTRY_DSN_FRONTEND=__SENTRY_DSN_FRONTEND_HERE__
+ENV SENTRY_ENVIRONMENT=__SENTRY_ENVIRONMENT_HERE__
+
+# Replace env var placeholders before running
+ADD entrypoint.sh ./
+ENTRYPOINT ["/home/ljprojectbuilder/entrypoint.sh"]
+
RUN cd /home/${USER}
RUN ls -al
# copy application JAR (with libraries inside)
COPY application/target/application-*.jar /home/ljprojectbuilder/application.jar
#COPY /home/ljprojectbuilder/application/target/application-*.jar /home/ljprojectbuilder/application.jar
+
+ENV SENTRY_TRACES_SAMPLE_RATE_FRONTEND=.75
+ENV SENTRY_DSN_FRONTEND=
+ENV SENTRY_ENVIRONMENT=local-development
+
# specify default command
CMD ["/usr/local/openjdk-17/bin/java", "-jar", "/home/ljprojectbuilder/application.jar", "-Dlog4j2.formatMsgNoLookups=true"]
diff --git a/application/src/main/resources/application.properties b/application/src/main/resources/application.properties
index ed59637a..0eb85541 100644
--- a/application/src/main/resources/application.properties
+++ b/application/src/main/resources/application.properties
@@ -41,15 +41,14 @@ springdoc.swagger-ui.csrf.enabled=true
#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=/home/anett/create.sql
-
#logging.level.org.springframework.security=DEBUG
-
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=projectbuilder
keycloak.resource=projectbuilder
keycloak.principal-attribute=preferred_username
keycloak.public-client=true
keycloak.enabled=true
+sentry.dsn=
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 00000000..ce78ef9c
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env sh
+
+# Replace config env vars
+printf "Replacing config env vars ..."
+find .next/static -type f -exec sed -i -e "s|__SENTRY_DSN_FRONTEND_HERE__|$SENTRY_DSN_FRONTEND|g" -e "s|__SENTRY_ENVIRONMENT_HERE__|$SENTRY_ENVIRONMENT|g" -e "s|__SENTRY_TRACES_SAMPLE_RATE_FRONTEND_HERE__|$SENTRY_TRACES_SAMPLE_RATE_FRONTEND|g" {} \;
+printf " done.\n"
+
+# Run CMD
+exec "$@"
diff --git a/pom.xml b/pom.xml
index a07807f7..c0d8a1c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -189,6 +189,16 @@
commons-io
2.11.0
+
+ io.sentry
+ sentry-spring-boot-starter
+ 6.1.0
+
+
+ io.sentry
+ sentry-log4j2
+ 6.1.0
+
${project.groupId}
diff --git a/webclient/app/package.json b/webclient/app/package.json
index 5215e4dc..a68cb8a1 100755
--- a/webclient/app/package.json
+++ b/webclient/app/package.json
@@ -9,6 +9,8 @@
"@mui/lab": "^5.0.0-alpha.63",
"@mui/material": "^5.0.0",
"@mui/styles": "^5.0.0",
+ "@sentry/react": "^7.1.1",
+ "@sentry/tracing": "^7.1.1",
"@starwit/react-starwit": "0.0.6-6",
"axios": "^0.24.0",
"i18next": "^21.0.1",
diff --git a/webclient/app/src/app/AppConfig.js b/webclient/app/src/app/AppConfig.js
index cbce77e5..38fc5df2 100644
--- a/webclient/app/src/app/AppConfig.js
+++ b/webclient/app/src/app/AppConfig.js
@@ -3,4 +3,10 @@ const appMenuItems = [
{title: "apptemplates.title", link: "/apptemplates/all"}
];
-export {appMenuItems};
+const sentryConfiguration = {
+ dsn: process.env.SENTRY_DSN_FRONTEND,
+ tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE_FRONTEND || .75),
+ environment: process.env.SENTRY_ENVIRONMENT
+};
+
+export {appMenuItems, sentryConfiguration};
diff --git a/webclient/app/src/app/commons/sentryInit/SentryInit.jsx b/webclient/app/src/app/commons/sentryInit/SentryInit.jsx
new file mode 100644
index 00000000..4e4f94c2
--- /dev/null
+++ b/webclient/app/src/app/commons/sentryInit/SentryInit.jsx
@@ -0,0 +1,23 @@
+import React from "react";
+import * as Sentry from "@sentry/react";
+import {BrowserTracing} from "@sentry/tracing";
+import {sentryConfiguration} from "../../AppConfig";
+
+function SentryInit(props) {
+ Sentry.init({
+ dsn: sentryConfiguration.dsn,
+ integrations: [new BrowserTracing()],
+
+ // We recommend adjusting this value in production, or using tracesSampler
+ // for finer control
+ tracesSampleRate: sentryConfiguration.tracesSampleRate,
+ enabled: process.env.NODE_ENV !== "development",
+ environment: sentryConfiguration.environment
+ });
+
+ return (
+ <>>
+ );
+}
+
+export default SentryInit;
diff --git a/webclient/app/src/index.js b/webclient/app/src/index.js
index f530ac1e..ef902298 100755
--- a/webclient/app/src/index.js
+++ b/webclient/app/src/index.js
@@ -7,9 +7,11 @@ import {HashRouter as Router} from "react-router-dom";
import "./localization/i18n";
import {SnackbarProvider} from "notistack";
import MainTheme from "./app/commons/mainTheme/MainTheme";
+import SentryInit from "./app/commons/sentryInit/SentryInit";
ReactDOM.render((
+