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(( +