summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/.gitignore1
-rwxr-xr-xapi/main.py19
-rw-r--r--api/requirements.txt49
-rw-r--r--docker-compose.override.yml6
-rw-r--r--docker-compose.prod.yml6
-rw-r--r--docker-compose.yml5
-rw-r--r--frontend/Dockerfile2
-rw-r--r--frontend/package.json2
-rw-r--r--frontend/src/components/modals/Modal.js10
-rw-r--r--frontend/src/components/modals/custom-components/NewPortfolioModalComponent.js19
-rw-r--r--frontend/src/components/modals/custom-components/NewScenarioModalComponent.js6
-rw-r--r--frontend/src/components/modals/custom-components/NewTopologyModalComponent.js8
-rw-r--r--frontend/src/index.js12
-rw-r--r--frontend/yarn.lock80
-rw-r--r--simulator/opendc-runner-web/build.gradle.kts4
-rw-r--r--simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/Main.kt2
-rw-r--r--simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/TopologyParser.kt8
-rw-r--r--simulator/opendc-runner-web/src/main/resources/log4j2.xml11
-rw-r--r--traces/bitbrains-small/meta.parquetbin2163 -> 2140 bytes
-rw-r--r--traces/bitbrains-small/trace.parquetbin1672605 -> 1610917 bytes
20 files changed, 220 insertions, 30 deletions
diff --git a/api/.gitignore b/api/.gitignore
index fef0da65..0e4f0a70 100644
--- a/api/.gitignore
+++ b/api/.gitignore
@@ -13,3 +13,4 @@ _mailinglist
.idea/
config.json
test.json
+.env*
diff --git a/api/main.py b/api/main.py
index 387b516a..ba79d9ce 100755
--- a/api/main.py
+++ b/api/main.py
@@ -21,6 +21,16 @@ load_dotenv()
TEST_MODE = "OPENDC_FLASK_TESTING" in os.environ
+# Setup Sentry if DSN is specified
+if 'SENTRY_DSN' in os.environ:
+ import sentry_sdk
+ from sentry_sdk.integrations.flask import FlaskIntegration
+
+ sentry_sdk.init(
+ integrations=[FlaskIntegration()],
+ traces_sample_rate=0.5
+ )
+
# Set up database if not testing
if not TEST_MODE:
database.DB.initialize_database(
@@ -31,6 +41,7 @@ if not TEST_MODE:
# Set up the core app
FLASK_CORE_APP = Flask(__name__)
+FLASK_CORE_APP.testing = TEST_MODE
FLASK_CORE_APP.config['SECRET_KEY'] = os.environ['OPENDC_FLASK_SECRET']
FLASK_CORE_APP.json_encoder = JSONEncoder
@@ -42,6 +53,8 @@ compress.init_app(FLASK_CORE_APP)
SOCKET_IO_CORE = flask_socketio.SocketIO(FLASK_CORE_APP, cors_allowed_origins="*")
+API_VERSIONS = {'v2'}
+
@FLASK_CORE_APP.route('/tokensignin', methods=['POST'])
def sign_in():
@@ -83,6 +96,10 @@ def sign_in():
def api_call(version, endpoint_path):
"""Call an API endpoint directly over HTTP."""
+ # Check whether given version is valid
+ if version not in API_VERSIONS:
+ return jsonify(error='API version not found'), 404
+
# Get path and parameters
(path, path_parameters) = path_parser.parse(version, endpoint_path)
@@ -168,4 +185,4 @@ def _process_message(message):
if __name__ == '__main__':
print("Web server started on 8081")
- SOCKET_IO_CORE.run(FLASK_CORE_APP, host='0.0.0.0', port=8081)
+ SOCKET_IO_CORE.run(FLASK_CORE_APP, host='0.0.0.0', port=8081, use_reloader=False)
diff --git a/api/requirements.txt b/api/requirements.txt
index 0f8c3fcf..e6b4a7aa 100644
--- a/api/requirements.txt
+++ b/api/requirements.txt
@@ -1,15 +1,46 @@
-flask==1.1.2
-flask-socketio==4.3.1
-oauth2client==4.1.3
+astroid==2.4.2
+attrs==20.3.0
+blinker==1.4
+Brotli==1.0.9
+certifi==2020.11.8
+click==7.1.2
+dnspython==2.0.0
eventlet==0.25.2
-flask-compress==1.5.0
-flask-cors==3.0.8
+Flask==1.1.2
+Flask-Compress==1.5.0
+Flask-Cors==3.0.8
+Flask-SocketIO==4.3.1
+greenlet==0.4.17
+httplib2==0.18.1
+isort==4.3.21
+itsdangerous==1.1.0
+Jinja2==2.11.2
+lazy-object-proxy==1.4.3
+MarkupSafe==1.1.1
+mccabe==0.6.1
+monotonic==1.5
+more-itertools==8.6.0
+oauth2client==4.1.3
+packaging==20.4
+pluggy==0.13.1
+py==1.9.0
+pyasn1==0.4.8
pyasn1-modules==0.2.8
-six==1.15.0
+pylint==2.5.3
pymongo==3.10.1
-yapf==0.30.0
+pyparsing==2.4.7
pytest==5.4.3
-pytest-mock==3.2.0
pytest-env==0.6.2
-pylint==2.5.3
+pytest-mock==3.2.0
python-dotenv==0.14.0
+python-engineio==3.13.2
+python-socketio==4.6.0
+rsa==4.6
+sentry-sdk==0.19.2
+six==1.15.0
+toml==0.10.2
+urllib3==1.26.0
+wcwidth==0.2.5
+Werkzeug==1.0.1
+wrapt==1.12.1
+yapf==0.30.0
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
index 8c822c98..e48f4dff 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -12,6 +12,12 @@ services:
api:
ports:
- "8081:8081"
+ environment:
+ SENTRY_ENVIRONMENT: "development"
+
+ simulator:
+ environment:
+ SENTRY_ENVIRONMENT: "development"
mongo:
ports:
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index 63166967..3cefdcdd 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -12,3 +12,9 @@ services:
api:
ports:
- "8081:8081"
+ environment:
+ SENTRY_ENVIRONMENT: "production"
+
+ simulator:
+ environment:
+ SENTRY_ENVIRONMENT: "production"
diff --git a/docker-compose.yml b/docker-compose.yml
index d49ac5dc..45a961fe 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,6 +5,7 @@ services:
context: ./frontend
args:
OPENDC_OAUTH_CLIENT_ID: ${OPENDC_OAUTH_CLIENT_ID}
+ OPENDC_FRONTEND_SENTRY_DSN: ${OPENDC_FRONTEND_SENTRY_DSN}
image: frontend
restart: on-failure
networks:
@@ -28,6 +29,8 @@ services:
- OPENDC_DB_HOST=mongo
- OPENDC_FLASK_SECRET
- OPENDC_OAUTH_CLIENT_ID
+ - SENTRY_DSN=${OPENDC_API_SENTRY_DSN}
+ - SENTRY_ENVIRONMENT
simulator:
build: ./simulator
@@ -46,6 +49,8 @@ services:
- OPENDC_DB_USERNAME
- OPENDC_DB_PASSWORD
- OPENDC_DB_HOST=mongo
+ - SENTRY_DSN=${OPENDC_SIMULATOR_SENTRY_DSN}
+ - SENTRY_ENVIRONMENT
mongo:
build:
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index d20f0232..20e16b08 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -10,12 +10,14 @@ FROM node:14 AS build
ARG OPENDC_OAUTH_CLIENT_ID
ARG OPENDC_API_BASE_URL
+ARG OPENDC_FRONTEND_SENTRY_DSN
COPY ./ /opendc
COPY --from=staging /opendc/node_modules /opendc/node_modules
RUN cd /opendc/ \
&& export REACT_APP_OAUTH_CLIENT_ID=$OPENDC_OAUTH_CLIENT_ID \
&& export REACT_APP_API_BASE_URL=$OPENDC_API_BASE_URL \
+ && export REACT_APP_SENTRY_DSN=$OPENDC_FRONTEND_SENTRY_DSN \
&& yarn build
# Setup nginx to serve the frontend
diff --git a/frontend/package.json b/frontend/package.json
index 16732995..0cdce949 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -18,6 +18,8 @@
"private": true,
"proxy": "http://localhost:8081",
"dependencies": {
+ "@sentry/react": "^5.27.3",
+ "@sentry/tracing": "^5.27.3",
"approximate-number": "~2.0.0",
"bootstrap": "4.5.3",
"classnames": "~2.2.5",
diff --git a/frontend/src/components/modals/Modal.js b/frontend/src/components/modals/Modal.js
index b494d970..21b7f119 100644
--- a/frontend/src/components/modals/Modal.js
+++ b/frontend/src/components/modals/Modal.js
@@ -9,12 +9,14 @@ function Modal({ children, title, show, onSubmit, onCancel, submitButtonType, su
const toggle = () => setModal(!modal)
const cancel = () => {
- toggle()
- onCancel()
+ if (onCancel() !== false) {
+ toggle()
+ }
}
const submit = () => {
- toggle()
- onSubmit()
+ if (onSubmit() !== false) {
+ toggle()
+ }
}
return (
diff --git a/frontend/src/components/modals/custom-components/NewPortfolioModalComponent.js b/frontend/src/components/modals/custom-components/NewPortfolioModalComponent.js
index 67646e2c..3c6b8724 100644
--- a/frontend/src/components/modals/custom-components/NewPortfolioModalComponent.js
+++ b/frontend/src/components/modals/custom-components/NewPortfolioModalComponent.js
@@ -5,15 +5,23 @@ import Modal from '../Modal'
import { AVAILABLE_METRICS, METRIC_NAMES } from '../../../util/available-metrics'
const NewPortfolioModalComponent = ({ show, callback }) => {
+ const form = useRef(null)
const textInput = useRef(null)
const repeatsInput = useRef(null)
const metricCheckboxes = useRef({})
- const onSubmit = () =>
- callback(textInput.current.value, {
- enabledMetrics: AVAILABLE_METRICS.filter((metric) => metricCheckboxes.current[metric].checked),
- repeatsPerScenario: parseInt(repeatsInput.current.value),
- })
+ const onSubmit = () => {
+ if (form.current.reportValidity()) {
+ callback(textInput.current.value, {
+ enabledMetrics: AVAILABLE_METRICS.filter((metric) => metricCheckboxes.current[metric].checked),
+ repeatsPerScenario: parseInt(repeatsInput.current.value),
+ })
+
+ return true
+ } else {
+ return false
+ }
+ }
const onCancel = () => callback(undefined)
return (
@@ -23,6 +31,7 @@ const NewPortfolioModalComponent = ({ show, callback }) => {
e.preventDefault()
this.onSubmit()
}}
+ innerRef={form}
>
<FormGroup>
<Label for="name">Name</Label>
diff --git a/frontend/src/components/modals/custom-components/NewScenarioModalComponent.js b/frontend/src/components/modals/custom-components/NewScenarioModalComponent.js
index 631082a2..01a5719c 100644
--- a/frontend/src/components/modals/custom-components/NewScenarioModalComponent.js
+++ b/frontend/src/components/modals/custom-components/NewScenarioModalComponent.js
@@ -13,6 +13,7 @@ const NewScenarioModalComponent = ({
topologies,
schedulers,
}) => {
+ const form = useRef(null)
const textInput = useRef(null)
const traceSelect = useRef(null)
const traceLoadInput = useRef(null)
@@ -22,6 +23,9 @@ const NewScenarioModalComponent = ({
const schedulerSelect = useRef(null)
const onSubmit = () => {
+ if (!form.current.reportValidity()) {
+ return false
+ }
callback(
textInput.current.value,
currentPortfolioId,
@@ -38,6 +42,7 @@ const NewScenarioModalComponent = ({
schedulerName: schedulerSelect.current.value,
}
)
+ return true
}
const onCancel = () => {
callback(undefined)
@@ -50,6 +55,7 @@ const NewScenarioModalComponent = ({
e.preventDefault()
onSubmit()
}}
+ innerRef={form}
>
<FormGroup>
<Label for="name">Name</Label>
diff --git a/frontend/src/components/modals/custom-components/NewTopologyModalComponent.js b/frontend/src/components/modals/custom-components/NewTopologyModalComponent.js
index b20ec13b..9fee8831 100644
--- a/frontend/src/components/modals/custom-components/NewTopologyModalComponent.js
+++ b/frontend/src/components/modals/custom-components/NewTopologyModalComponent.js
@@ -5,6 +5,7 @@ import Shapes from '../../../shapes'
import Modal from '../Modal'
const NewTopologyModalComponent = ({ show, onCreateTopology, onDuplicateTopology, onCancel, topologies }) => {
+ const form = useRef(null)
const textInput = useRef(null)
const originTopology = useRef(null)
@@ -17,11 +18,15 @@ const NewTopologyModalComponent = ({ show, onCreateTopology, onDuplicateTopology
}
const onSubmit = () => {
- if (originTopology.current.selectedIndex === 0) {
+ if (!form.current.reportValidity()) {
+ return false
+ } else if (originTopology.current.selectedIndex === 0) {
onCreate()
} else {
onDuplicate()
}
+
+ return true
}
return (
@@ -31,6 +36,7 @@ const NewTopologyModalComponent = ({ show, onCreateTopology, onDuplicateTopology
e.preventDefault()
onSubmit()
}}
+ innerRef={form}
>
<FormGroup>
<Label for="name">Name</Label>
diff --git a/frontend/src/index.js b/frontend/src/index.js
index 0971b1e6..fe119dfb 100644
--- a/frontend/src/index.js
+++ b/frontend/src/index.js
@@ -1,5 +1,7 @@
import React from 'react'
import ReactDOM from 'react-dom'
+import * as Sentry from '@sentry/react'
+import { Integrations } from '@sentry/tracing'
import { Provider } from 'react-redux'
import { setupSocketConnection } from './api/socket'
import './index.sass'
@@ -9,6 +11,16 @@ import configureStore from './store/configure-store'
setupSocketConnection(() => {
const store = configureStore()
+ // Initialize Sentry if the user has configured a DSN
+ if (process.env.REACT_APP_SENTRY_DSN) {
+ Sentry.init({
+ environment: process.env.NODE_ENV,
+ dsn: process.env.REACT_APP_SENTRY_DSN,
+ integrations: [new Integrations.BrowserTracing()],
+ tracesSampleRate: 0.5,
+ })
+ }
+
ReactDOM.render(
<Provider store={store}>
<Routes />
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 7398bf38..9c522e42 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -1371,6 +1371,81 @@
resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204"
integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==
+"@sentry/browser@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.27.3.tgz#02e78a4502ee99988d3cbb0075a11ec44b503871"
+ integrity sha512-vczS+XTW4Nk2A7TIpAw8IVFHpp+NK6mV9euBG2I61Bs2QbQY9yKLfbjiln/yH2Q8X4THX6MKa0GuiPoCEeq3uw==
+ dependencies:
+ "@sentry/core" "5.27.3"
+ "@sentry/types" "5.27.3"
+ "@sentry/utils" "5.27.3"
+ tslib "^1.9.3"
+
+"@sentry/core@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.3.tgz#d7a175b71596b7eb4b2e8b4cd1858a60d95813bb"
+ integrity sha512-yqepQO88jSt5hy0awpk61AxI4oHB09LjVbUEk4nJDg+1YXuND23cuZvH+Sp2jCZX2vrsw2tefwflToYfA8/U2w==
+ dependencies:
+ "@sentry/hub" "5.27.3"
+ "@sentry/minimal" "5.27.3"
+ "@sentry/types" "5.27.3"
+ "@sentry/utils" "5.27.3"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.3.tgz#f509c2fd38f500afef6030504e82510dbd0649d6"
+ integrity sha512-icEH3hr6NVQkpowXZcPOs9IgJZP5lMKtvud4mVioSpkd+NxtRdKrGEX4eF2TCviOJc9Md0mV4K+aL5Au7hxggQ==
+ dependencies:
+ "@sentry/types" "5.27.3"
+ "@sentry/utils" "5.27.3"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.3.tgz#c9263bdd6270bfeae64137177448911dff568e53"
+ integrity sha512-ng01cM0rsE1RMjqVTpPLN0ZVkTo0I675usM1krkpQe8ddW6tfQ6EJWpt02/BrpQZRQzTtfWp6/RyB1KFXg6icg==
+ dependencies:
+ "@sentry/hub" "5.27.3"
+ "@sentry/types" "5.27.3"
+ tslib "^1.9.3"
+
+"@sentry/react@^5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.27.3.tgz#aefff1cb2249a4e7f123c7467d1da205d5c02e92"
+ integrity sha512-p7E+djSUVKz02HoRVDX+zamjV8+RL4bqoPnS9JQESweB0sRTYlpvi+CqWLYWNWnamWQWOl97hOw/lLDpo4kUSA==
+ dependencies:
+ "@sentry/browser" "5.27.3"
+ "@sentry/minimal" "5.27.3"
+ "@sentry/types" "5.27.3"
+ "@sentry/utils" "5.27.3"
+ hoist-non-react-statics "^3.3.2"
+ tslib "^1.9.3"
+
+"@sentry/tracing@^5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.3.tgz#787e57a2f7071e375f4fad0f3c3a5ff3381928e7"
+ integrity sha512-UWrHMdGxPfx1u558CWm1tptc2z0BuqCHVe2+BNN7POahq5BkpbGqaotyPQTBHbfmcs6QGfsMG57ou8HQFrBxyA==
+ dependencies:
+ "@sentry/hub" "5.27.3"
+ "@sentry/minimal" "5.27.3"
+ "@sentry/types" "5.27.3"
+ "@sentry/utils" "5.27.3"
+ tslib "^1.9.3"
+
+"@sentry/types@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.3.tgz#d377508769bc658d672c287166c7f6c5db45660c"
+ integrity sha512-PkWhMArFMxBb1g3HtMEL8Ea9PYae2MU0z9CMIWiqzerFy2ZpKG98IU3pt8ic4JkmKQdwB8hDiZpRPMHhW0WYwQ==
+
+"@sentry/utils@5.27.3":
+ version "5.27.3"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.3.tgz#1fc45dfad1f1e4398bee58684d8947666d8d3003"
+ integrity sha512-R9WvFrRBALZvCzu/9BsuXBCfkNxz4MwdBNSXaBsJo4afQw1ljkjIc9DpHzlL9S9goIwXo81Buwmr5gGDO6aH+Q==
+ dependencies:
+ "@sentry/types" "5.27.3"
+ tslib "^1.9.3"
+
"@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
version "4.2.0"
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
@@ -11366,6 +11441,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
diff --git a/simulator/opendc-runner-web/build.gradle.kts b/simulator/opendc-runner-web/build.gradle.kts
index a46e430f..7ae3c641 100644
--- a/simulator/opendc-runner-web/build.gradle.kts
+++ b/simulator/opendc-runner-web/build.gradle.kts
@@ -29,7 +29,7 @@ plugins {
}
application {
- mainClassName = "org.opendc.runner.web.MainKt"
+ mainClass.set("org.opendc.runner.web.MainKt")
}
dependencies {
@@ -45,7 +45,7 @@ dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8") {
exclude("org.jetbrains.kotlin", module = "kotlin-reflect")
}
-
+ implementation("io.sentry:sentry-log4j2:3.1.1")
implementation("org.mongodb:mongodb-driver-sync:4.0.5")
runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:2.13.1")
diff --git a/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/Main.kt b/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/Main.kt
index 80b3bb20..6369fdd8 100644
--- a/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/Main.kt
+++ b/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/Main.kt
@@ -325,7 +325,7 @@ public class RunnerCli : CliktCommand(name = "runner") {
logger.info { "Successfully finished scenario $id" }
} catch (e: Exception) {
- logger.warn(e) { "Scenario failed to finish" }
+ logger.error(e) { "Scenario failed to finish" }
manager.fail(id)
} finally {
heartbeat.cancel()
diff --git a/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/TopologyParser.kt b/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/TopologyParser.kt
index 80bd20f7..8bd1eefb 100644
--- a/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/TopologyParser.kt
+++ b/simulator/opendc-runner-web/src/main/kotlin/org/opendc/runner/web/TopologyParser.kt
@@ -81,6 +81,9 @@ public class TopologyParser(private val collection: MongoCollection<Document>, p
memory.get("sizeMb", Number::class.java).toLong()
)
}
+
+ val energyConsumptionW = machine.getList("cpus", Document::class.java).sumBy { it.getInteger("energyConsumptionW") }.toDouble()
+
nodes.add(
SimBareMetalDriver(
coroutineScope,
@@ -89,10 +92,7 @@ public class TopologyParser(private val collection: MongoCollection<Document>, p
"node-$clusterId-$position",
mapOf(NODE_CLUSTER to clusterId),
SimMachineModel(processors, memoryUnits),
- // For now we assume a simple linear load model with an idle draw of ~200W and a maximum
- // power draw of 350W.
- // Source: https://stackoverflow.com/questions/6128960
- LinearLoadPowerModel(200.0, 350.0)
+ LinearLoadPowerModel(energyConsumptionW, 2 * energyConsumptionW)
)
)
}
diff --git a/simulator/opendc-runner-web/src/main/resources/log4j2.xml b/simulator/opendc-runner-web/src/main/resources/log4j2.xml
index 87179332..503bc5dc 100644
--- a/simulator/opendc-runner-web/src/main/resources/log4j2.xml
+++ b/simulator/opendc-runner-web/src/main/resources/log4j2.xml
@@ -23,21 +23,26 @@
~ SOFTWARE.
-->
-<Configuration status="WARN">
+<Configuration status="WARN" packages="org.apache.logging.log4j.core,io.sentry.log4j2">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%highlight{%-5level}] %logger{36} - %msg%n" disableAnsi="false"/>
</Console>
+
+ <Sentry name="Sentry" />
</Appenders>
<Loggers>
<Logger name="org.opendc" level="warn" additivity="false">
<AppenderRef ref="Console"/>
+ <AppenderRef ref="Sentry"/>
</Logger>
<Logger name="org.opendc.runner" level="info" additivity="false">
<AppenderRef ref="Console"/>
+ <AppenderRef ref="Sentry"/>
</Logger>
- <Root level="error">
- <AppenderRef ref="Console"/>
+ <Root level="info">
+ <AppenderRef level="error" ref="Console"/>
+ <AppenderRef ref="Sentry"/>
</Root>
</Loggers>
</Configuration>
diff --git a/traces/bitbrains-small/meta.parquet b/traces/bitbrains-small/meta.parquet
index 54a5ecf4..43f51cb8 100644
--- a/traces/bitbrains-small/meta.parquet
+++ b/traces/bitbrains-small/meta.parquet
Binary files differ
diff --git a/traces/bitbrains-small/trace.parquet b/traces/bitbrains-small/trace.parquet
index 65c2c5ec..f4dd5a50 100644
--- a/traces/bitbrains-small/trace.parquet
+++ b/traces/bitbrains-small/trace.parquet
Binary files differ