From 1a79a5e4d8feb2b12d648c0442ffb71c8db6e65b Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Tue, 22 Apr 2025 14:19:56 +0200 Subject: [PATCH] WIP Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at> --- .docs/api/analyse-service.md | 2 +- .docs/api/data-service.md | 2 +- .docs/api/metadata-service.md | 2 +- .docs/api/search-service.md | 2 +- .docs/api/ui.md | 2 +- .docs/concepts/logging.md | 23 + .../dashboards/System/dbrepo.json | 2566 +++++++++++------ .../dashboards/System/logging.json | 808 ++++-- dbrepo-data-service/Dockerfile | 7 +- .../dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar | Bin 1118870 -> 1118871 bytes .../1.8.1/dbrepo-core-1.8.1.jar.md5 | 2 +- .../1.8.1/dbrepo-core-1.8.1.jar.sha1 | 2 +- .../ifs/dbrepo/dbrepo-core/maven-metadata.xml | 2 +- .../dbrepo/dbrepo-core/maven-metadata.xml.md5 | 2 +- .../dbrepo-core/maven-metadata.xml.sha1 | 2 +- dbrepo-data-service/pom.xml | 2 +- .../src/main/resources/application.yml | 6 +- dbrepo-logging-service/dbrepo_parser.conf | 4 +- dbrepo-metadata-service/Dockerfile | 9 +- .../dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar | Bin 1118870 -> 1118871 bytes .../1.8.1/dbrepo-core-1.8.1.jar.md5 | 2 +- .../1.8.1/dbrepo-core-1.8.1.jar.sha1 | 2 +- .../ifs/dbrepo/dbrepo-core/maven-metadata.xml | 2 +- .../dbrepo/dbrepo-core/maven-metadata.xml.md5 | 2 +- .../dbrepo-core/maven-metadata.xml.sha1 | 2 +- dbrepo-metadata-service/oai/pom.xml | 2 +- dbrepo-metadata-service/pom.xml | 9 +- dbrepo-metadata-service/report/pom.xml | 9 +- dbrepo-metadata-service/repositories/pom.xml | 8 +- dbrepo-metadata-service/rest-service/pom.xml | 7 +- .../src/main/resources/application.yml | 8 +- dbrepo-metadata-service/services/pom.xml | 9 +- docker-compose.yml | 101 - helm/dbrepo/files/create-event-listener.jar | Bin 10139 -> 10139 bytes lib/java/dbrepo-core/pom.xml | 4 +- make/build.mk | 6 +- make/dev.mk | 2 +- mkdocs.yml | 1 + 38 files changed, 2430 insertions(+), 1191 deletions(-) create mode 100644 .docs/concepts/logging.md diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md index 6a6bb5f506..0b8bf886f3 100644 --- a/.docs/api/analyse-service.md +++ b/.docs/api/analyse-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.7`](https://hub.docker.com/r/dbrepo/analyse-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1`](https://hub.docker.com/r/dbrepo/analyse-service) * Ports: 5000/tcp * Prometheus: `http://<hostname>:5000/metrics` diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md index 66089a1cd6..50193a54e6 100644 --- a/.docs/api/data-service.md +++ b/.docs/api/data-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.7`](https://hub.docker.com/r/dbrepo/data-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1`](https://hub.docker.com/r/dbrepo/data-service) * Ports: 9093/tcp * Info: `http://<hostname>:9093/actuator/info` diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md index a9218b4733..435ef9cdd1 100644 --- a/.docs/api/metadata-service.md +++ b/.docs/api/metadata-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.7`](https://hub.docker.com/r/dbrepo/metadata-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1`](https://hub.docker.com/r/dbrepo/metadata-service) * Ports: 9099/tcp * Info: `http://<hostname>:9099/actuator/info` diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md index ede6eefd65..22cf6e71b5 100644 --- a/.docs/api/search-service.md +++ b/.docs/api/search-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.7`](https://hub.docker.com/r/dbrepo/search-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1`](https://hub.docker.com/r/dbrepo/search-service) * Ports: 4000/tcp * Health: `http://<hostname>:4000/api/search/health` diff --git a/.docs/api/ui.md b/.docs/api/ui.md index 5393c9ff79..ddc8b9d883 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.7`](https://hub.docker.com/r/dbrepo/ui) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp diff --git a/.docs/concepts/logging.md b/.docs/concepts/logging.md new file mode 100644 index 0000000000..c6dae7f787 --- /dev/null +++ b/.docs/concepts/logging.md @@ -0,0 +1,23 @@ +--- +author: Martin Weise +--- + +This is a short conceptional overview on the logging mechanisms provided by [fluentbit](https://fluentbit.io/). + +## Collection + +fluentd, [Structured Logging in Spring Boot](https://spring.io/blog/2024/08/23/structured-logging-in-spring-boot-3-4) + +The [Docker Compose](../../installation) test setup uses the `fluentd` logging driver to forward logs from the console +for every service, except for the [Metadata Service](../../api/metadata-service) and +the [Data Service](../../api/data-service). In this case fluentbit scrapes the logs from a logging file in +`/app/logs.json` (in [ECS](https://www.elastic.co/docs/reference/ecs) format). + +## Storage + +opensearch + +## Insights + +opensearch dashboards, grafana + diff --git a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json index e9d03fd40d..7b59f98778 100644 --- a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json +++ b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json @@ -35,6 +35,7 @@ ], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -42,6 +43,7 @@ "y": 0 }, "id": 34, + "panels": [], "title": "tl;dr", "type": "row" }, @@ -110,7 +112,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -180,7 +182,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -248,7 +250,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -298,7 +300,7 @@ "x": 12, "y": 1 }, - "id": 5, + "id": 39, "options": { "colorMode": "background", "graphMode": "none", @@ -316,7 +318,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -432,7 +434,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -477,8 +479,8 @@ "overrides": [] }, "gridPos": { - "h": 7, - "w": 8, + "h": 8, + "w": 12, "x": 0, "y": 4 }, @@ -503,10 +505,12 @@ "values": false }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -524,80 +528,79 @@ "title": "Popular Data Sources", "type": "piechart" }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 22, - "panels": [], - "title": "UI", - "type": "row" - }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", "fieldConfig": { "defaults": { - "mappings": [], - "max": 100, - "min": 0, + "color": { + "mode": "thresholds" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1 + }, + "mappings": [ + { + "options": { + "0": { + "index": 0, + "text": "DOWN" + }, + "1": { + "index": 1, + "text": "UP" + } + }, + "type": "value" + } + ], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "red", "value": null }, { - "color": "#EAB839", - "value": 300 - }, - { - "color": "orange", - "value": 600 - }, - { - "color": "red", - "value": 900 + "color": "green", + "value": 1 } ] - }, - "unit": "ms" + } }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 12 + "h": 8, + "w": 12, + "x": 12, + "y": 4 }, - "id": 17, + "id": 16, "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "colWidth": 0.9, + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "rowHeight": 0.9, + "showValue": "auto", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -605,171 +608,1258 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "code", - "expr": "avg(page_render_time)", + "editorMode": "builder", + "expr": "up", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{instance}}", "range": true, "refId": "A", "useBackend": false } ], - "title": "UI Response Time (avg)", - "type": "stat" + "title": "Service QoS", + "type": "status-history" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 6, + "panels": [], + "title": "Application", + "type": "row" }, { "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, - "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null - }, + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "warn" + }, + "properties": [ { - "color": "#EAB839", - "value": 0.02 - }, + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "error" + }, + "properties": [ { - "color": "orange", - "value": 0.05 - }, + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "info" + }, + "properties": [ { - "color": "red", - "value": 0.1 + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } ] }, - "unit": "s" - }, - "overrides": [] + { + "matcher": { + "id": "byFrameRefID", + "options": "debug" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 4, - "x": 4, - "y": 12 + "h": 8, + "w": 24, + "x": 0, + "y": 13 }, - "id": 24, + "id": 42, "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "showValue": "auto", + "stacking": "percent", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { + "alias": "WARN", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "nodejs_eventloop_lag_mean_seconds", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "level: WARN", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + }, + { + "alias": "ERROR", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: ERROR", + "queryType": "lucene", + "refId": "error", + "timeField": "@timestamp" + }, + { + "alias": "INFO", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: INFO", + "queryType": "lucene", + "refId": "info", + "timeField": "@timestamp" + }, + { + "alias": "DEBUG", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: DEBUG", + "queryType": "lucene", + "refId": "debug", + "timeField": "@timestamp" + } + ], + "title": "Errors and Warnings over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 21 + }, + "id": 43, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: ERROR", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 21 + }, + "id": 44, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: WARN", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Warnings", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 45, + "panels": [], + "title": "Application Debugging", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 46, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: INFO", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Info", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 47, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: DEBUG", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Debug", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "auth-service:9000" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "data-service:8080" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "metadata-service:8080" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "metadata-service:80" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 38 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "process_cpu_usage", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "process_cpu_usage", "useBackend": false } ], - "title": "UI Event Lag (avg)", - "type": "stat" + "title": "CPU Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 45 + }, + "id": 5, + "panels": [], + "title": "HTTP Gateway", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "request.method" + }, + "properties": [ + { + "id": "custom.width" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "container_name: \"/dbrepo-gateway-service\" AND code: >=400", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "HTTP Gateway Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "code", + "method", + "path", + "size" + ] + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "code": 2, + "method": 0, + "path": 1, + "size": 3 + }, + "renameByName": { + "@timestamp": "", + "code": "response.status", + "method": "request.method", + "path": "request.url", + "size": "body.size" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "Count", + "mode": "reduceRow", + "reduce": { + "include": [ + "request.url", + "response.status" + ], + "reducer": "distinctCount" + }, + "replaceFields": false + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "Count" + } + ] + } + } + ], + "type": "table" }, { "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, - "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Count", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null } ] - }, - "unit": "none" + } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "200" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "200s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "300s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "400s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "500" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "500s" + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 4, - "x": 8, - "y": 12 + "h": 9, + "w": 24, + "x": 0, + "y": 54 }, - "id": 25, + "id": 3, "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "nodejs_active_handles{type=\"Server\"}", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=200 AND <300)", + "queryType": "lucene", + "refId": "200", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=300 AND <400)", + "queryType": "lucene", + "refId": "300", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "container_name: \"/dbrepo-gateway-service\" AND code: (>=400 AND <500)", + "queryType": "lucene", + "refId": "400", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "container_name: \"/dbrepo-gateway-service\" AND code: >=500", + "queryType": "lucene", + "refId": "500", + "timeField": "@timestamp" } ], - "title": "UI Servers", - "type": "stat" + "title": "HTTP Status Codes over Time", + "type": "barchart" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 63 + }, + "id": 22, + "panels": [], + "title": "UI", + "type": "row" }, { "datasource": { @@ -786,22 +1876,34 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null + }, + { + "color": "#EAB839", + "value": 300 + }, + { + "color": "orange", + "value": 600 + }, + { + "color": "red", + "value": 900 } ] }, - "unit": "none" + "unit": "ms" }, "overrides": [] }, "gridPos": { "h": 3, "w": 4, - "x": 12, - "y": 12 + "x": 0, + "y": 64 }, - "id": 26, + "id": 17, "options": { "colorMode": "background", "graphMode": "none", @@ -819,7 +1921,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -828,7 +1930,7 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "nodejs_active_handles{type=\"Socket\"}", + "expr": "avg(page_render_time)", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -838,7 +1940,7 @@ "useBackend": false } ], - "title": "UI Sockets", + "title": "UI Response Time (avg)", "type": "stat" }, { @@ -849,36 +1951,47 @@ "description": "", "fieldConfig": { "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "blue", - "value": null + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 0.02 + }, + { + "color": "orange", + "value": 0.05 + }, + { + "color": "red", + "value": 0.1 } ] }, - "unit": "none" + "unit": "s" }, "overrides": [] }, "gridPos": { "h": 3, "w": 4, - "x": 16, - "y": 12 + "x": 4, + "y": 64 }, - "id": 27, + "id": 24, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -890,7 +2003,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -899,7 +2012,7 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "nodejs_active_requests_total", + "expr": "nodejs_eventloop_lag_mean_seconds", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -909,7 +2022,7 @@ "useBackend": false } ], - "title": "Active Requests", + "title": "UI Event Lag (avg)", "type": "stat" }, { @@ -917,51 +2030,38 @@ "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "blue", "value": null - }, - { - "color": "yellow", - "value": 300 - }, - { - "color": "orange", - "value": 600 - }, - { - "color": "red", - "value": 900 } ] }, - "unit": "ms" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 15 + "h": 3, + "w": 4, + "x": 8, + "y": 64 }, - "id": 20, + "id": 25, "options": { - "displayMode": "basic", - "maxVizHeight": 300, - "minVizHeight": 16, - "minVizWidth": 8, - "namePlacement": "auto", - "orientation": "horizontal", + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -969,11 +2069,11 @@ "fields": "", "values": false }, - "showUnfilled": true, - "sizing": "auto", - "valueMode": "color" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -981,99 +2081,69 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "page_render_time", + "editorMode": "code", + "expr": "nodejs_active_handles{type=\"Server\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{path}}", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "UI Response Time per Path (avg)", - "type": "bargauge" + "title": "UI Servers", + "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "dashed" - } - }, "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "blue", "value": null - }, - { - "color": "red", - "value": 256000000 } ] }, - "unit": "decbytes" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 12, + "h": 3, + "w": 4, "x": 12, - "y": 15 + "y": 64 }, - "id": 21, + "id": 26, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1081,79 +2151,53 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "nodejs_heap_space_size_total_bytes", + "editorMode": "code", + "expr": "nodejs_active_handles{type=\"Socket\"}", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{space}}", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "NodeJS Heap Bytes", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 22 - }, - "id": 31, - "panels": [], - "title": "AMPQ / MQTT API", - "type": "row" + "title": "UI Sockets", + "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Quality of Service", + "description": "", "fieldConfig": { "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "purple" - }, - { - "color": "red", - "value": 0 - }, - { - "color": "orange", - "value": 60 - }, - { - "color": "#EAB839", - "value": 80 - }, - { - "color": "green", - "value": 100 + "color": "blue", + "value": null } ] }, - "unit": "percent" + "unit": "none" }, "overrides": [] }, "gridPos": { "h": 3, "w": 4, - "x": 0, - "y": 23 + "x": 16, + "y": 64 }, - "id": 32, + "id": 27, "options": { "colorMode": "background", "graphMode": "none", @@ -1171,7 +2215,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1180,17 +2224,17 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", + "expr": "nodejs_active_requests_total", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "Services Running", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "Broker Service QoS", + "title": "Active Requests", "type": "stat" }, { @@ -1198,37 +2242,57 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "blue" + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 300 + }, + { + "color": "orange", + "value": 600 + }, + { + "color": "red", + "value": 900 } ] }, - "unit": "none" + "unit": "ms" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 4, - "y": 23 + "h": 7, + "w": 12, + "x": 0, + "y": 67 }, - "id": 29, + "id": 20, "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" @@ -1236,11 +2300,11 @@ "fields": "", "values": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1248,68 +2312,102 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_connection_channels", + "editorMode": "builder", + "expr": "page_render_time", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{path}}", "range": true, "refId": "A", "useBackend": false } ], - "title": "Channels", - "type": "stat" + "title": "UI Response Time per Path (avg)", + "type": "bargauge" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "dashed" + } + }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "blue" + "color": "green", + "value": null + }, + { + "color": "red", + "value": 256000000 } ] }, - "unit": "none" + "unit": "decbytes" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 8, - "y": 23 + "h": 7, + "w": 12, + "x": 12, + "y": 67 }, - "id": 30, + "id": 21, "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1317,26 +2415,39 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_channel_consumers", + "editorMode": "builder", + "expr": "nodejs_heap_space_size_total_bytes", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{space}}", "range": true, "refId": "A", "useBackend": false } ], - "title": "Consumers", - "type": "stat" + "title": "NodeJS Heap Bytes", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 74 + }, + "id": 31, + "panels": [], + "title": "AMPQ / MQTT API", + "type": "row" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", + "description": "Quality of Service", "fieldConfig": { "defaults": { "mappings": [], @@ -1346,33 +2457,38 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "purple", + "value": null }, { - "color": "#EAB839", - "value": 10 + "color": "red", + "value": 0 }, { "color": "orange", - "value": 100 + "value": 60 }, { - "color": "red", - "value": 1000 + "color": "#EAB839", + "value": 80 + }, + { + "color": "green", + "value": 100 } ] }, - "unit": "none" + "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 3, "w": 4, - "x": 12, - "y": 23 + "x": 0, + "y": 75 }, - "id": 35, + "id": 32, "options": { "colorMode": "background", "graphMode": "none", @@ -1390,7 +2506,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1399,17 +2515,17 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_persistent", + "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "Services Running", "range": true, "refId": "A", "useBackend": false } ], - "title": "Persistent Messages", + "title": "Broker Service QoS", "type": "stat" }, { @@ -1417,7 +2533,7 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Ready and unacknowledged messages stored in memory", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1427,19 +2543,8 @@ "mode": "absolute", "steps": [ { - "color": "green" - }, - { - "color": "#EAB839", - "value": 10 - }, - { - "color": "orange", - "value": 100 - }, - { - "color": "red", - "value": 1000 + "color": "blue", + "value": null } ] }, @@ -1450,10 +2555,10 @@ "gridPos": { "h": 3, "w": 4, - "x": 16, - "y": 23 + "x": 4, + "y": 75 }, - "id": 36, + "id": 29, "options": { "colorMode": "background", "graphMode": "none", @@ -1471,7 +2576,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1480,7 +2585,7 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_ram", + "expr": "rabbitmq_connection_channels", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1490,7 +2595,7 @@ "useBackend": false } ], - "title": "Ready Messages", + "title": "Channels", "type": "stat" }, { @@ -1498,7 +2603,7 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Messages delivered to consumers but not yet acknowledged", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1508,19 +2613,8 @@ "mode": "absolute", "steps": [ { - "color": "green" - }, - { - "color": "#EAB839", - "value": 10 - }, - { - "color": "orange", - "value": 100 - }, - { - "color": "red", - "value": 1000 + "color": "blue", + "value": null } ] }, @@ -1531,10 +2625,10 @@ "gridPos": { "h": 3, "w": 4, - "x": 20, - "y": 23 + "x": 8, + "y": 75 }, - "id": 37, + "id": 30, "options": { "colorMode": "background", "graphMode": "none", @@ -1551,136 +2645,90 @@ "showPercentChange": false, "textMode": "auto", "wideLayout": true - }, - "pluginVersion": "10.4.9", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_queue_messages_unacked", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Unacked Messages", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "description": "Messages for received protocol messages", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rabbitmq_channel_consumers", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Consumers", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "description": "", + "fieldConfig": { + "defaults": { "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" - } - ] - }, - "unit": "mps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/amqp.*/" - }, - "properties": [ + "color": "green", + "value": null + }, { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "shades" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/mqtt.*/" - }, - "properties": [ + "color": "#EAB839", + "value": 10 + }, { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "shades" - } + "color": "orange", + "value": 100 + }, + { + "color": "red", + "value": 1000 } ] - } - ] + }, + "unit": "none" + }, + "overrides": [] }, "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 26 + "h": 3, + "w": 4, + "x": 12, + "y": 75 }, - "id": 33, + "id": 35, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1689,111 +2737,80 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "rate(rabbitmq_global_messages_received_total[$__range])", + "expr": "rabbitmq_queue_messages_persistent", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{protocol}}", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "Throughput", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 33 - }, - "id": 2, - "panels": [], - "title": "REST API", - "type": "row" + "title": "Persistent Messages", + "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", + "description": "Ready and unacknowledged messages stored in memory", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 10 + }, + { + "color": "orange", + "value": 100 }, { "color": "red", - "value": 80 + "value": 1000 } ] - } + }, + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 34 + "h": 3, + "w": 4, + "x": 16, + "y": 75 }, - "id": 23, + "id": 36, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1802,89 +2819,80 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "process_open_fds\n", + "expr": "rabbitmq_queue_messages_ram", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{instance}}", + "legendFormat": "__auto", "range": true, - "refId": "process_open_fds", + "refId": "A", "useBackend": false } ], - "title": "File Descriptors", - "type": "timeseries" + "title": "Ready Messages", + "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "fillOpacity": 70, - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "0": { - "index": 0, - "text": "DOWN" - }, - "1": { - "index": 1, - "text": "UP" - } - }, - "type": "value" - } - ], + "description": "Messages delivered to consumers but not yet acknowledged", + "fieldConfig": { + "defaults": { + "mappings": [], + "max": 100, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "red" + "color": "green", + "value": null }, { - "color": "green", - "value": 1 + "color": "#EAB839", + "value": 10 + }, + { + "color": "orange", + "value": 100 + }, + { + "color": "red", + "value": 1000 } ] - } + }, + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 34 + "h": 3, + "w": 4, + "x": 20, + "y": 75 }, - "id": 16, + "id": 37, "options": { - "colWidth": 0.9, - "legend": { - "displayMode": "list", - "placement": "bottom", - "showLegend": false + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "rowHeight": 0.9, - "showValue": "auto", - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -1892,25 +2900,26 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", + "editorMode": "code", + "expr": "rabbitmq_queue_messages_unacked", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{instance}}", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "Service QoS", - "type": "status-history" + "title": "Unacked Messages", + "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "Messages for received protocol messages", "fieldConfig": { "defaults": { "color": { @@ -1923,8 +2932,9 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, @@ -1942,7 +2952,7 @@ "spanNulls": false, "stacking": { "group": "A", - "mode": "normal" + "mode": "none" }, "thresholdsStyle": { "mode": "off" @@ -1953,69 +2963,40 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, - "unit": "none" + "unit": "mps" }, "overrides": [ { "matcher": { - "id": "byName", - "options": "auth-service:9000" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "data-service:8080" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "metadata-service:8080" + "id": "byRegexp", + "options": "/amqp.*/" }, "properties": [ { "id": "color", "value": { - "fixedColor": "purple", - "mode": "fixed" + "fixedColor": "red", + "mode": "shades" } } ] }, { "matcher": { - "id": "byName", - "options": "metadata-service:80" + "id": "byRegexp", + "options": "/mqtt.*/" }, "properties": [ { "id": "color", "value": { - "fixedColor": "blue", - "mode": "fixed" + "fixedColor": "yellow", + "mode": "shades" } } ] @@ -2026,9 +3007,9 @@ "h": 7, "w": 12, "x": 0, - "y": 41 + "y": 78 }, - "id": 6, + "id": 33, "options": { "legend": { "calcs": [], @@ -2037,11 +3018,12 @@ "showLegend": true }, "tooltip": { - "mode": "multi", + "hideZeros": false, + "mode": "single", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -2049,19 +3031,18 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "process_cpu_usage", + "editorMode": "code", + "expr": "rate(rabbitmq_global_messages_received_total[$__range])", "fullMetaSearch": false, - "hide": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{instance}}", + "legendFormat": "{{protocol}}", "range": true, - "refId": "process_cpu_usage", + "refId": "A", "useBackend": false } ], - "title": "CPU Usage", + "title": "Throughput", "type": "timeseries" }, { @@ -2083,6 +3064,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2113,7 +3095,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -2186,9 +3169,9 @@ "h": 7, "w": 12, "x": 12, - "y": 41 + "y": 78 }, - "id": 7, + "id": 41, "options": { "legend": { "calcs": [], @@ -2197,11 +3180,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.5.3", "targets": [ { "datasource": { @@ -2225,81 +3209,24 @@ "type": "timeseries" }, { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "description": "Top 10 by frequency of access", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } - }, - "mappings": [], - "unit": "reqps" - }, - "overrides": [] - }, + "collapsed": false, "gridPos": { - "h": 7, - "w": 12, + "h": 1, + "w": 24, "x": 0, - "y": 48 - }, - "id": 18, - "options": { - "displayLabels": [ - "percent" - ], - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right", - "showLegend": false, - "values": [] - }, - "pieType": "pie", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "y": 85 }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "editorMode": "code", - "expr": "topk(10, rate(dbrepo_table_data_get_total[$__range]))", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Popular Datasources", - "type": "piechart" + "id": 2, + "panels": [], + "title": "REST API", + "type": "row" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -2312,8 +3239,9 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, @@ -2342,52 +3270,25 @@ "mode": "absolute", "steps": [ { - "color": "green" - } - ] - }, - "unit": "reqps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*search-service.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*analyse-service.*/" - }, - "properties": [ + "color": "green", + "value": null + }, { - "id": "color", - "value": { - "fixedColor": "super-light-orange", - "mode": "fixed" - } + "color": "red", + "value": 80 } ] } - ] + }, + "overrides": [] }, "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 48 + "x": 0, + "y": 86 }, - "id": 19, + "id": 23, "options": { "legend": { "calcs": [], @@ -2396,30 +3297,37 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.5.3", "targets": [ { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "disableTextWrap": false, "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", + "expr": "process_open_fds\n", + "fullMetaSearch": false, + "includeNullMetadata": true, "instant": false, - "legendFormat": "{{method}} {{instance}} ({{status}})", + "legendFormat": "{{instance}}", "range": true, - "refId": "A" + "refId": "process_open_fds", + "useBackend": false } ], - "title": "Failed API Requests", + "title": "File Descriptors", "type": "timeseries" } ], + "preload": false, "refresh": "1m", - "schemaVersion": 39, + "schemaVersion": 40, "tags": [ "ui", "dashboard", @@ -2441,7 +3349,7 @@ "timepicker": {}, "timezone": "browser", "title": "DBRepo", - "uid": "bdz20owu8zn5se", - "version": 8, + "uid": "bdz20owu8zn5se2", + "version": 45, "weekStart": "" } \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/logging.json b/dbrepo-dashboard-ui/dashboards/System/logging.json index 3a561f64b1..f737dfaf57 100644 --- a/dbrepo-dashboard-ui/dashboards/System/logging.json +++ b/dbrepo-dashboard-ui/dashboards/System/logging.json @@ -29,6 +29,614 @@ "x": 0, "y": 0 }, + "id": 6, + "panels": [], + "title": "Application", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "warn" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "error" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "info" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "debug" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "percent", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "WARN", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "level: WARN", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + }, + { + "alias": "ERROR", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: ERROR", + "queryType": "lucene", + "refId": "error", + "timeField": "@timestamp" + }, + { + "alias": "INFO", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: INFO", + "queryType": "lucene", + "refId": "info", + "timeField": "@timestamp" + }, + { + "alias": "DEBUG", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "level: DEBUG", + "queryType": "lucene", + "refId": "debug", + "timeField": "@timestamp" + } + ], + "title": "Errors and Warnings over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 8, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: ERROR", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 9, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: WARN", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Warnings", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 17, + "panels": [], + "title": "Application Debugging", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 17 + }, + "id": 15, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: INFO", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Info", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 16, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.5.3", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "level: DEBUG", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Debug", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "message", + "container_id", + "container_name", + "logger", + "@timestamp" + ] + } + } + } + ], + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, "id": 5, "panels": [], "title": "HTTP Gateway", @@ -84,7 +692,7 @@ "h": 8, "w": 12, "x": 0, - "y": 1 + "y": 26 }, "id": 7, "options": { @@ -234,8 +842,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -323,9 +930,9 @@ "h": 9, "w": 24, "x": 0, - "y": 9 + "y": 34 }, - "id": 3, + "id": 14, "options": { "barRadius": 0, "barWidth": 0.97, @@ -477,195 +1084,10 @@ ], "title": "HTTP Status Codes over Time", "type": "barchart" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 - }, - "id": 6, - "panels": [], - "title": "Application", - "type": "row" - }, - { - "datasource": { - "type": "grafana-opensearch-datasource", - "uid": "dbrepoopensearch0" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "fixed" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byFrameRefID", - "options": "warn" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 1, - "options": { - "barRadius": 0, - "barWidth": 0.97, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "right", - "showLegend": false - }, - "orientation": "auto", - "showValue": "auto", - "stacking": "none", - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 100 - }, - "pluginVersion": "11.5.3", - "targets": [ - { - "alias": "", - "bucketAggs": [ - { - "id": "2", - "settings": { - "interval": "auto", - "min_doc_count": "0", - "trimEdges": "0" - }, - "type": "date_histogram" - } - ], - "datasource": { - "type": "grafana-opensearch-datasource", - "uid": "dbrepoopensearch0" - }, - "format": "table", - "hide": false, - "luceneQueryType": "Metric", - "metrics": [ - { - "hide": false, - "id": "1", - "type": "count" - } - ], - "query": "level: WARN", - "queryType": "lucene", - "refId": "warn", - "timeField": "@timestamp" - }, - { - "alias": "", - "bucketAggs": [ - { - "field": "@timestamp", - "id": "2", - "settings": { - "interval": "auto" - }, - "type": "date_histogram" - } - ], - "datasource": { - "type": "grafana-opensearch-datasource", - "uid": "dbrepoopensearch0" - }, - "format": "table", - "hide": false, - "luceneQueryType": "Metric", - "metrics": [ - { - "id": "1", - "type": "count" - } - ], - "query": "level: ERROR", - "queryType": "lucene", - "refId": "error", - "timeField": "@timestamp" - } - ], - "title": "Errors and Warnings over Time", - "type": "barchart" } ], "preload": false, - "refresh": "", + "refresh": "1m", "schemaVersion": 40, "tags": [ "ui", @@ -682,13 +1104,13 @@ "list": [] }, "time": { - "from": "now-30m", + "from": "now-1h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Logging", "uid": "aejhojr0mrpj4c", - "version": 23, + "version": 33, "weekStart": "" } \ No newline at end of file diff --git a/dbrepo-data-service/Dockerfile b/dbrepo-data-service/Dockerfile index 8c4f6ab6c5..ab91fc8054 100644 --- a/dbrepo-data-service/Dockerfile +++ b/dbrepo-data-service/Dockerfile @@ -15,7 +15,7 @@ COPY ./services ./services RUN mvn -fn clean package -DskipTests ###### SECOND STAGE ###### -FROM amazoncorretto:17-alpine3.19 AS runtime +FROM amazoncorretto:17-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk --no-cache add \ @@ -25,11 +25,12 @@ RUN apk --no-cache add \ WORKDIR /app -RUN adduser -D dbrepo --uid 1001 +RUN adduser -D dbrepo --uid 1001 && \ + chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/rest-service-*.jar ./data-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*rest-service-*.jar ./data-service.jar # non-root port EXPOSE 8080 diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar index 7b9014efc7563a26c2dcff518c59595087ed4b72..9ad489e8e468bc0b5e7e6c160408d7674a9ec639 100644 GIT binary patch delta 15963 zcmbQX)Mffo7v2DGW)?061`Y;>^rC4Kc~zJ}l*v}+)S_t<-^hWe$-In;VA_yT15C#- z>VWBPMq`lb$p;xNnA3`;P5#4Z52o#yJizom4!y|=ePWXXIJv<5TTD@4dOmZ&^mXs} zdAVUWgEY@)P6bP{vm}D)Y?d%Ey@Azqdcp^O9u&m_to~q0eono~6If-z><z4*VA@|) zZ~6mKCZWkTY!GWb*<8R96WE-<&i%uvH$7o3Gy7yNc8CITb{nvQg}g@77u;guL<$p- z%jU5=!le^@SUD%lazOM6@Ec8kFp-rPP5nY%qsbpQ&`sIL;RiN_pVJ#m$8v^)X-O{M z=>l)qI41LOK}?n8iU&(nbH#z_J6yqhX+_hb7~o*~{FU75)4bUg&@7(F9Rk+D&uKl~ z;RgpBnzVzk(RBZxXdzk8;{(=njt3HF^Vp51+kfR`ogBaman3w;qsjfe{9r{3d0oLY zKc~_311ennlePFDiu^^5rXTptFMtwBo@{#4Ke%)8PTtSQ3D!1&O>cU^A2bID@I#_) zABWNO4eeY)lNazq%v{Uw3)c0QKN3vOX9nx$nw%h{jOMe00@+|C`hvyiK_z&SQ+@h_ zLjo?7rG+5oY6$g#74H;s0H<P*k011Mv!a>lAnXQKHi1oVvH%Cm^z-)w&;#_Gusc|Z zzo^k95pIE;6n#Wyf+QTH=?8uauuh&M0<qd()O_*-5n-^VY!<!g1zUOL(5&?r^#Ui- zIij{;dLFypG=4tT$^2q`V7`KwGnh^j(*o0z#UP3Lh8Q?`ZPpa`0|)lzDusO<Ad5Cz zYjU%K8J>Dy*}x1((@)G`hM8qNgfYWrfizgeI^qCC&A+%-h*VpW93NO}c>yyEn6b8G zE<2dvTjK^1nbuGYVeqs*<^ab)^z~%JE*1ucB*E$R57?A9EA%~vs9>A?iwmq``gfNQ z2^I#16MWM@R<SEjR_IfjzJQONdvn}8YlzZ0i@rb%yZ@Sh+8t&Fh7O+T1{|yqrSaeS z*{8qfWM|v_Vf8PFOW&^F1M%^i9gDcZ4h%fv0rC2rlQs~>?Q`ECZohKvEyQrPpw}Hy z%nS_QIHwEl<5Zp;@L7HO9bp0S%?1xrAm&bgyb)rY_xmf%V7D(xyIR-F&cM(qJpE%W zxANwI&qpApivMnu0@=KMwkV?^SZMos8AdfRu-FeHMoq8-x2sq)I)MGSJ>8!1h$L86 zFOo4v2+ZouW)y?SF3V?JAOIHgY+z*L1l#>eZAzJf00Tq5;q-$koXXo9IvM>1z%oXK z|7^-x85q1pr}L|`DsP*`xDD*-?K|f)-Ur9(_SwrAnIO(uu$Iw95N!1GeT-EQ>rxIg zvO-un#~IIolk9feON@;Wv4htb??a-lVoBG@Ol}4SXIZfKr#C1G$ZUW6kg<gu><;eG zMLTaZGccs_f<ttAgNA_Y^ab()irXK&Wqb+_)9oidGG2y+#k^lIv9^DV517DC%4B5n zfmphOl_?d%Qs83hhnT;ZQ*O>zW(J1O?9&TtnM|jPzZT%%&M3wNbvvgNlP<*Hmhw!C zA)4<iGyMP;VcTyRGu1$3BQ2TuAdbnhVfq5`ZK6BVTzRk)7}J?-AhHfwOwth9xDqB= zh*(`Y(^ZI5!>X8gA!2E@Obfy3WII<UQw=!JZ10@T6c4fO^&F-^h&uZPOx_Sy?_#E8 zh$)|!G8sd}G*>cNLJ}F%v>iE5m>3wovw|afx&j|F*Y>$<m^dK{SFUGrhOpjmVsd8Y z1XU3aJ#>7YPcOXAWVAhZ8<PM;x?v|%EX0-vyP4b|Vw(GzoFJ^cLrfkJ*3P3$=}h1V zyfEWe3_BA8!xQG|4%?V?r(gKN#JWA<1d}$zn7&g?X%N=;GfdtP$1do0j%8(HV0g$3 ziW8OT4KJCvw%1*NX<2iLDHEba;wn=Bgq3}r$sM9u{$CB>Qziz6|EzG$Jlj9qg8B5% zU0BcsJY))mXkPIc7Ib{im>eJ;2z<#Dz|0E@hu;jdTbY;`7_LrdG-KA=e&-F78pLNN zi)&7CFflN^WuCq<pAqa#>iz1=y#bGZT>79`~L}2%=DQ>4G=E85tPPGa~{Y5)K<a zGD$<+aPBkAQ&!)YqM0~AHk*mRnm>KrdM2~!(<}rer~h5g#JT<J52j}j9ru1S<v>`z z|Ck&huAa!q90&=9^m}J(AEQUOEGshyM4<);b0mb-!p)q`1di}r2|?`#(_<Z(jkas? zF|$CV4F#E@(Of0M><bY)CC;1%(V|k!d;7)o1`%eX>37~RaZmTq5|G^9FU9-`;_*Bt z4Xbxd3=G0-kPu2R6yVyvSC&}<V$KZ(W<Q7zG?ke>A!4O!%n=aQ1x;o<2uo0x85%1g z2F!NMT%fRtUy}ZefoZzqHzq@HP)^r%6p)y{AexzL`4?kmh^gOAnG+zaC<|t2Hd$fK z>;f_My&ZEZL^j-!*#Z)3n?GHg{fCi(;TH3B#%?a<?FU?#^&o0Kx-n-!STUZ=c@WlF zZ<zb#{9rCj41|T(su1Qdh^f0mqgR2FBrh}=3Y-MEw%bH7^Ftis7tI_8F>rk>Gc+fC zNnp125lk<d7WFPDep1;71_r5qW(J$dg7Xx%C#+?j|A7xAC-l?DX^R;H!@>UP2AUko z+YRQi+&2>h1<#y0b%89b3=GY@3=CFaT@F`Sv>~NO-Yu315EkPD7EMT*ru&5D8id96 zlI1Xjb>=OL9)$JxBg<ZhTlaotSqmxibN{mRg2lG}WmSa;sdBKsf%y3D)&lb+RtAQz z{Gf1D2RDSb`}452L+rgN$hr|?a<3Sx0ED$biggdzyzTLFtU3^}J|$L2TVOkjI;$l_ zuY(S2F@&|vko7r4-2yXKUWnKRYt}?&zSN>=QQy~{y{*8^z!1eTeL^Ld`t(=90tVa5 z>{+!SmMnH+Wr1i}<<1JNl=OUHj&TfNm4z6c7{a;`qK-8RX5ITZRtt!%Rx&Fq3pl{v zZ}C1Y#KyqzNP>YOZu&+iR^90iQLH@E9rmztPOpg&kl(&AomB=>aURHJeFt&H#zL4q z7fV@>L&RoRvc^D6|5eKx0?`rJ!m7XmE{(jcKdY}{W?)dBKEaJs1Jq-XnBK66RbaY9 z9xK=Mx)=er?e{uZw?T}W-oq*aas0Z8tY#2HpHF3lGzhlMV(o?~>zm8E6e4N1h!t8x z&RfQ601>;miuD{b*pDB~9;+F#Ffe5DFfatb{m8%l%{ta#7I0y||ImS|Ko$lD9iHiq z8`-p{CnU3qZ1363ng)@+>~}a|5i<kBN_He^`yH&?A@2COn^h6q-rO#GlyxCQ?BEGj zNQ-RyzB8;z5M$UUU7f$3oq<727~FZ8zQKr1YJ2`g*5i<5XnB+M9>nQV_gFVT#Lhlt zO=bl<QT6n?N@ivThCX&sW71&yhGaI5>2)n^Y};#IvqFo}1MgU$LIQrpS5_v7S!;i? z&Vx9~?=LJ=Q<>N_<-j%kL<Kfxh)vVg*-{{^e|l`S5FK?!Yz+`o7|q$9@ql%_a%S5L zVXX>aONOWu2w`(#2fK2qQ~fIy76t}=uIYj=S=2#Y!0i*F*&HDOFmqMHI$dT4hU@Ip z8Ru}Tg93nmI^Q!^&h2suY#|V{N|V{RIKk0Y&$uX9i<N;vOaK&Zh8J0Nr+>&2;MsmM zhs_U?I;4u&CPUo3p^_~S5>69WEor{S!ocu=YkFc8lk(&QZeB=OefY`By*;R&?HR;J z)-7yy5LQhGn=wSM_Ow;y8`v2bmJ5Sj4{@JVp#bl;KDJ#Di}p@sa}oo4b(Q8T|2-@W z4DI}r1t%+SH(0~Q3~`m&Mz*hz<e;~kO&uZ@ae!?;BxZgcV{?Fr*`8rL5Aieq1-3kh z@eSA66d|r!a+~cegjMo@Z4pF=<TJMA5SJS9p8lG^%D}K#0Mr{$pH?oQJKeuRKxn(k z8@4Qn;)NgC!XXCy{>o+r5wrNsRs?Bru4QI_4H28o$-Wh$E|`y97vjif5q7A<*GjUN zLma6t%dP{F4O3>{#R|^Vw=3%EH!(9X$V_h#;ntW|E1)!;yG}rHdxs`Fv`}={WuE}i zb<3Fj3dE$1=InlK;3!s2|JPN<%)p?{$-q!Qy>J4%_4I^h0q*Jh8wJF+=h(3?gJ=+S zV&4XF_Bk*1hmfLr<+HXqjjRj|y}Xm}UsK-xz>obb#6KHC*j*w1`4Pcx3ejee$esmp z#oToE4G`IY9QGFw<E;zWVM(EcJsqO%Srz*>h`Rap?7JYQ#B{K;K>ABvJu~-xVP#<O z=LOdj)4bWmr>|`n;N8A+0{cIRGj>g5UjfmUI-k7>(sq8elHF4RoQup3u^T`v$~?iI z2uUqxFS2{`f@LM|vmb$2{@^kDWQZwcZ`k=DCbxfNzW{M~)K~Te5Osflvd@R4p!tj( z(h#w|tQ^@89opO+M<AiLIZb}01TzCe4jZWEHJiSmMu20xH9v<2#K1Hm4snQ<25}B{ zh%sH#9Iqg<<?<Y>Ax>4*<k$#NcT<l8T2y~9=C}?~cgmb&FSrx1yvvybVo0w$2ejsN z^x+VJxHKY|!wF)@+z5{M5LSO2hccv#$MNy&!KWe&3?JPmGm5HDZ}`h9I9+DC0Oxkb z4376A;2d~-Z}43<76yi9?&<vMtdQblyGbpF5yZ~SMh;#`@2+wZ$0dl<{HAe0)71Bw z94jGWi|2A=Lv#o(;;4a$O<2ky2r1F*qNZ3|vN14B;sb@40eDPly1^U)j_C=r1=zNK zUc=!GiAc-M9FCCgRqY`TE{K6$$2epl9$R^uV;&?Ty{>R*LDZE$=7@#JUVp*C3z2>P zfkPT%@vT>z^qiR)7|yYQDjkFE4nH{3A&y)1o5K^VZ|gVCMu<=q3uitgYTod2o`Hz% z7UWEYRK6$X<tt8QWnj2AeceJH4M<q(y0CF<&lBU^3pQ!Ho(yL(q>wH=xAf^seg=l= z2H-*vRD@5T5Y5Ii{r@{w&h2j$ICnx^zruiXCnQm|^L$=w#m>NRS_GUMrt=4LicWvG zLV$Do786b{NMtkGa6&Udn;T~mBy?VTalVJh-VNf+fVjgWf-?^yyEBIK7esbj3THTE z1VEsavlSBBGpac~A@23jdAxBt3j>2KAE>9T4!2!(dq4x{LWmko&(zu@tPBiOq3t@b z3;QEDIj1+Q6kyx#)yjDeV!d=X=NSm=)dbGnkZ@cvh4VMWA<O1)CPQR-7IA)pIFoTX z=Y1Y<ay+1RZSrAG1_l)=P<P32yZjc;Cy+Q{+s8Q>qHoS&&U6Ti?IbK1vd?n<gm^0b z3g=NsNuhtA^F73N#mAhftQ?@WabolYkLd+xIo+lQY!Kj_{%(T++xEvVIOns0ZGWCr z?WDxYz!1y_>a!?=hU+Hr@=W*NC?LK4-g{0Rh^@R|Ib&EsBYxX+esMyZk01VVPG$y+ zwJ~wM<p8tFxVhROI{piAl|WoqCeHN$;-*MxF33>Q_8AIXpCMv>DqNQ!$)Reis_R`= z1_ld0P|sO;y1)_v*6ACJxHz`Y)8Jx;xORWfe!pC11_ox%=?%$j>Y#yC&h7X0xMo8P zt2N@1gjhP$f@=rFSf%%S?CMz=7;f=Qceu^1KK;ONe!l7cI|O95Z?NI&ggDm5iK`h> zK`!DHpLmv;f#E*;^mqei<?SEbxuET_x87Xx5VQG%xS%c8yf7|ku^=ABB?d`r23cIt z&claXuCtH?aG;dy5X6P8m0T?lQ+OJ<pc(FVGuHx$Y+XB7DTMW{i)$f7-K>dRHjpH9 zb1K&Z2y4$QE)IyxkI(1&24Njo%EbneJ-L!=EreCMjw>5t-t&!I(1t|k4z5aw$*lXi z+92xs4s)G^xHRfC*E@)q_XREu2&?Q0*CdD?+_$)tAuPlDFx#via~VU#3SMyWL3A{} z;aUc<L+dk_0}D85<bLP60g?6i!v)DATiLi}*ucG)t~s>^qFf9NF0#`DwYYVr%hqvo zZ%=3AR^<Zg?HAyF0!eCRBHVHi^QKF1pI{dRb$zbHrCv&9W?<0bWMC)&wbNCmgT|z% z|2ik&wf(UIcRr+tG~HW%?krXYhUq-hCo*wqOi#EVz&U;Hc>%ud^HsQ)KvK7x7PllP z*wBS}?Jm<f7#N(y85m5E4E6WrX5Bu|n0pl@!F$_q&tU_*@s$(z6bP%)lY0upwGzJE zoe;|>D{wJ?WMg1x6$F=#(+^w|;NJc)fSZRMtocJY_gx6<LOk~(7I2un;Ch$8hJ%5D zMFOscZTkEh0s`Cjrf~0pSYMONT?q+}ABEhz*unakymx!;WoBS7;R3amb*DRA70}-< zQ^kE8;-+V{-1!jCMl^GugNSLib2mZUzOI*>4`Sf{iQKUemi#pCD-a#uW^+SR*0KfM zdmv@x8};^c+n5;`UV_Jf)u$`m=N6j2@1}sp_KQoo4?t4il$G4xkm`BP_5&3bEDQ|g zJkuw-aY9sYSKG{;0ZAGYw{x>X64T5*+z%mQwFkM^Lrb?a+*=?e<Fl*WJ`i=Lx4EIc zzjybz|3IvJ`-uAtMDL#G+_xbKan?KTzYy73pSTZ0OiB2|%?^>xV&aj5$ab^x?1b3n zF2EB2ZjNl9CC#%PVqS;>j{(Hqc2yn=NLN^<bIV;-76t|jUIvD&>59fYmeb!pWaOUy zL7InUyMz``2t;eX9uKruF}rp_ZX-Jb!(@f&jEtP>(?2-#h;ENE=6MLof_BzCwUA1E zpED1%mvzL8M+D;1+W|bLkbn;mj+?ZXg@J*A7u+qJB*MKtAe840#5VmXo<wMy^SuSf zW*!EH&4$w#p5rmvej$nH8l)q(GM^_DGUCqI#lr`w@~4YxMQmedV7NSep#-<abc2@y zVxZw?mg)C5@^EfX@8dZDairEX9_SFM?M$ANkf7t7%QFLF`;vt`<&a>KTh5aQ3C{kF zJog}C1>1R`t$h96JjxIqq5FAQA)bys&SM6#W7;{M=Ma+{F7ZH{$Bj35u0a~RQO|fT zLCn*C!?PM<$K7u{br8LA|9Gk)Cf{M=eGL&i#l@Qi5i{rKT?)~AUxarOBslY)1-y91 z&cLur1T-)YiIwT#h)j4dz`6arB<}}E1Iu@l5*sTI14Eu3xTm=NgCegfBtSLvcoiVV zdK>fdL#&E5=e-LNv$f@Y3rTmn?!2=gv3bguw;AHafI!|f2y15uZwW+)K@{%<NF{dg zmu##sHv_{Ox#<_r@+(hosN?0`{x6nS4U$0BGkF^zp|`4#_c=t1%-tW-f0-B<jMzc_ zOpp%F?Waq5ts$0hR`R+*YP@+Xy$yabF)%Q&Lt4WJehP3-uV)qH-aey_R}rFmPb04* z*h$;kd6gj+srB>zh8VDO<?W=GEDQ{y+@J=hI%w98e|qg-0g>&MQ+Yo_LLq+^?_aP1 z+w&Ljo`o1{zl66F!aBX2R}B&gEj9Bthp{j)Y~-0<FrOW47Uy>THM~ub)X6(lVh%40 z1H<X*AF9|jKsK>Xbr7`OuCb9<9FiFg+9XXt^BaZS3=E~yFUIm}PJST5IlY!qP-*HP zL6z+%w(|amSbAzF?`253Sa6URS`+6V<?RDU%(gSU%OT2Eo#%zj^KIw3%nMC$4{z}9 zfXL3d!wVg|JN<z7FT}5>pYjSp{QBS(FLX9V-~+EMB-{di@P330v@<LAFHL1-VDOvX zz|95r4CnUxKfJXNz5f~cs#!p@l-q0B_^Oz|tX~{_(ad001P@<16DMd))ZF*2ro=Q( zKC|t7{Ct`aSt}tvU5Jh>5x(6JF%1bmP8RSes{h9)De)W(47tLS8AX*r6QtASRr%Pq z=gRQaaDYvJqr$fyqHCT8UpmAj4sE_-2&+z)uM*5^|E15j{g*y})HJY5s<b);)TbY~ z#BaWR$}xTmu#)ZPPw>}3SbnGZOCe6K{Qmo{+H^i`KJ)2w`2^XwbDiTifT*#(zz_B6 zu1ow?5Y+{Dc;2gmjh%jgUyyx!^;Ld-i0ZZ1`AZ;b{&V>8>Q9g3;WOKwaEsr83GC17 zpVCi%V`5;4W1X&li{Ehj{X6{Z5MRB#&tC{JBK8q~F%zeh*R-fbyu1eT({DcE_oy#^ zWF}H~etkh^ysG1gNhZ#Fe7C>!Nt=|nZ1&r4p*NUBa!yW7;duLHf4KPljgf~{ZhvU$ zKR0n-@zskn_tp0)=lixSnG?(FR$%dggS*1x=A*0+KR<>S7*@QW?<0J0zQ+QavuB@N zO;{OH)EUroy~T0Pg9J|naqcf4KFZBKxbWW7BlV~2!=8MKyyTR#`R0MMH@N2TwJU#l z{`ao>UgsXh)SyJM39EK2nSN>Ay^jpq+@Dt;ua1>DZ&c!v@N>aGxgXy)WS(&r`ukAl z;q9xMt1kM<#5b`fp3)ca6K`66GWW&nzYBd@w%v(&Fe7J2#6ijDSzSeaL2TTv&n*IG zy>MxG$P!h(u)c%gU61Cf4O2JG-2TVV##rLBe>>mP4|kRyYmxkW`_|e`te1cMIez}0 zxYrGlo9l}VMJMLJQ8x}>S>oI)%G_b9vU!$l=>0!S(s<VNIH-9&7iu$h6uP&;^(tQ< zBTLML*rT$Kq`W(KZ8*UZcOdYnQl6=bk$}lY4f~8h{YA!&N3YGUFMjy<)93eMVN*3H zXWu%Q5xA9gk&kth)<iZfQ5Pk4{!Eb-S<5G^@jN2TyDI5PQ^X}N+xNY{&ir;-q2l{J zLT@gw$*1JgZ02omm+zV`;~cx<*}6kNWd)n07_?a;Q<@CscTHNAr1z9bPTfR_$!lI$ z!;i(EHM8PhPPwvjgTg9bqv(1~)y=P1(lvVz<vgCfrt9anj+c9G91qSD{aA4<d_&KQ zi>xyK%T_q*vxcQeyU0xUUM?JKeQsGs`odM2j}9#>I>*x2yXb6dkj84^s`Dl~)6PFw z+4<wz)}Sw(?Aj+KIW`{3nms{CTV}7Z>5|C{D{D?LFPM9-z)5>{%z<*tHnX-pM)jeG zRL}FAm3;O4*o9N;-@X>RZrYcT@p$jja|^;ma*rfG{MxufadY3J|7IUNg_bm}di%Or z$Nv?#$#jOU6MfoOSW6ZhzF6+_?*D3ygyK#1Rj1=_+?0qFXPNWnqVoAo^8YedGyOM{ zYB3ja$=ccL>GI)^Z~HFI&Ig(Y^QD%=d2W34s9s^heZ~iOAFEv4UCAKRWw-xcmBP8m z(#K-Qb3?ZaXeIBgtln25BhM_~ZkTGdHzPg&U++|nTdi_YB6}R}A7-4mNjpl)>dh9F zT(1bpyxr+CKWD{mUwicV|K+bvYwl2QT_;@S@+;--ifrxb7gLPC1+2KYs%+QkyOoi_ zcfWI)aNRekcl8x7UvTZ0ipBNws!H=7bEL_tpRqnCr<P&1@_}d9$BY}N)na+yd8a)& zt-WK3v64hs%BQtcO#b~{@$%l+!*2xxWA`vt-A|tS-D&IZ-s_APmN4I%H?946W0n1@ zun!j&<n28EJO1Ha-dB33xR!ou*wlaXm9vGH_>_~!PWDBqzss0d&wKJtu=VZb&Qq6J z<t><If4))pUD;ewev8?cUA3f&+ok-?6b%~p9ur+|rp|7<Fvntp@)a4WD^nADw7H)u z?w66@5Ou1oEInlJy}db+d~3h&-tg=Cf7zSP@0({C+*&`^ce<!z=kjSGRWU6t6+c(_ zq!(^@^sA@xh<RE@^FOcB1+VLwRjsV&&+$JtS^l&m`vDymKE(@m3~J3ec?ECRstVpu zRx`I+q4vIQ`Qq-+p1Sts1+p)utTz?4K6LzBu(h=8#rUgFzFT-Kej$4{c#As!SH<2# z6N6LYCU5%nc%PD#fLiw913g#F9`D)qm2J+fkHM!~jOF*GZN7er!``0l?%lc_KaJmB z?!C#R7b+8)w(h8z;?-kIH($wm&UV2x$aSmKwMUny+)Ao=@t+;ETt|d~frA6I_HDZ7 zEB*zbx?}pASNtYmhVpBEdr;qIdg^O_JuqY1Ykos8<J4<@3owKA4ZjVT;qrzbyfkNe z*BgHDTB_;uKJiOW|L}(21T?ZaUHvV81ekG=RX}?B+_(JBVBX`m{8?Z|z&rj@7(;sc z<9Gbv#d6af-t!lNh3lCGq^F;M&ktTcHeL1uWLebo$`AbD^<vXE{@|CM{_O+516Z}} z2Y%`4As_kez`Q~x0qN-*KJtUt=S{!+n_qf5?<amsuv`tuIVqp`&B0!t_lY08v~K!` zPyFDOVbkqD^M`^Jo&y=O=`+6>m}mc)UwS&*7k(=+4{TlB7pQgfzd*Hsy(;t->Q%4{ zi@!o$xa}){I#{p5H~xGWLwfq!Z~Wj@Y|~l3^XGwuOTY6cgBiEK^XGsWUO)I#z>JMQ z_@luL{-6Bd<$}{Qe)7kFMUMZ31~=H*w!fgx2J<GucwkRF{RQ;|*nPIYq3#2R+3eql zFoQS?99;f?_|3t#fc?GX57gfv?@s#*^{v}q{#dY@Wq<iI!Hj@+{L<5P|3M?R>mPqL zSeWBKe>0fT_n&_Ph%r@BU>=x0BoF{jT3|;TFbY6Ip8qGm^z;@+0c((&>0tNVWfXw8 zN1RCjysU6~A(H?k{hVVG2m~tx`^T190FnmknFZ1i!ptlJ_TcDuWfAZNGr(4EU=c6_ z^IozD1cMp&tO8bGMh&Y#5SVe1RRFwBak>$k03>!6vI&%djh12;r~)&lvkO3?l7mAa z11wU^Ay5Klyy6gmB>!+u0q_FQ>H9eaAj!dy3#xbym%wzeVl!@mRxo29x4=p;Ba26% z1I+l!BLH63H@%G)s#t*!s(1w-RLYWHpcbrnC%-^9nBguU0EvU6Fov_Bzznd|Jwbs< zU`DYJ)H`p41iHW?mBIpTU<Q+jKpmLTECO`~pQr#N6Ss*9l!K(Ei9v0s6BB@>f>&Zt z^OD5{nm|gXzYvGUMWBR05?ExL1k|Nwk^;qGku{P6xnPEj6qL~;1y#c%Ezk*;njtMv z31*1MKtrxxMgWquSY-u@z*1GR(5QGV3vuA|R5<}iK0Gf6b-TMf)PEP`p;2nD0CoIo z1!%k}DMABdy&^Q6T$BU~z*cNmf<~aGGGtxm^y$jb;89Y6+SQ{14FpzIfqJm6c2xmL zIrm!?nj$jPpmyC?6Q}{JiBlJ-05fi?Lp|uC0rk#S4XCB+n$Yyvp$RqTt0q)effh6{ zpJ_pLg=@nSoi@~|x;oI{ovQ;?!>0@NSEDY}g<o}{QfYcn1MlcTMSS(4;e1FR8oV|J zP+c1gpyntWLPe$<Lfy=11l3h%1a-z6BdD4LW2l--#!v%&OrRqBOrVzPn?l_@-&CLg zJYEi305#pfT|jKQt{F7@H=04+`rQnwI^A3V65_Ybp(grTKuz3dAy5QfV6=3XQo-Zt z3)}@nr~6q71cL*Ai6t~V<*lG5^;<y`Ij=QTA7o*Yyt9Dl^tskh7kspa+Lvkrjr@By zP>~>8sK{wss4E@qph<6o9W+Sf>;=lfZaU_?TKCa(u-TjKp=Pr?KqI@v0jm6w1JqL? zj!=^hJ3^gn>;#R8WiW=MGgM87GgRugGc-yHT%f7&xeL_fP*<oqM_r+cE!?05-BvfK z^R?Xta=<YW@^;Ic=@0b;#HMd`hlU@whd?s8=q&UQNCz`+dqA_7yC*a~uJ?o*r0NCD z+#9_Fdcnc(=nYN#YrLTafQ}E;tqXkwAT=esFVsI}zEH&veW68Oz8}=lkNlvK9qbP^ z=d!=RM6ea<0no6!82~Lq69b`Y9tJ{94hVvpyc@<)3l?YuS68coq4`xa1e)C^hd>jE zU?|j_iJ?%b-=R>ua>Jm3_$o}G9qf#faDnAuhFk<R5LQJ9Yy^wMMGDLZF{VX9br(fJ z%aJcp&@`11EwB)zWI9ibKns{LIR+XAim}izm=X)MN-hrSu6c1#x68&0%mwS(8xKtY zCJ9hi97urr#x4<R`vw?8DG6%w)FfzvWJ-oAZb*g(*z06y5Jsgyoq8?>Dq@=o)wL=W zT8p`)K^=A^4XRx~9qNqT>Cp1pI0LF{K?XD%NoGP#?#&eF2m3-k3mTKlv!DSlm<>(O z_1VyB<99YR^(E&(?K+nu&<NHZlnYgJE*I(@pFF7TNAjT6YiK?+K^@B%m<iUEQ~<5m zP8UE8G%JLr^hJeG_h=PC!*EU!H1!!2Lu-rO#R7}L<|LLtqms20T4i>XLL*M34B8Sn zPzDXLsB);ukIJFZT~Gm);;Mvd@2`Z`a1vF};GIzg^@V0N)Pu{bp{Xyh1{ymDYM?2> zycX)_m9@~|wXTDTtgVBlL;ZTF$ijMoRbXHEH9*7gRD%Gxoi{zU5n749YJ|2rTAQE& z&e<%`0M^yh3=IwO7J+GCkqs@-8rQWI>iDCrP{)V0K~wM5HfYNvtR0#lPqst-<=z3U zNDg*Diw(0*XnbAjgf<r<x}YZC=n|L;wzQxdnzUYaL(8Gc9;lk1Jy3J<dZBhb?1e@_ zW*^kR_kB>mXZJ%B!1aD;_;^l$D!w=Y8oVA8p$6`q2vw{(2^y8#CqWh4PlhJ84U?f! z;4}rAB+g8M)=%zJp}}%vD%52EX;5dJo(4^sCexw5*fJg3_L7_d6`45$TF!IMgfc2; zLc{R;OlTf#o(1(F=WM7`OJR(Mv!Qmy&VlN>JqMakJ?26kzjH1$pX$zoO3j)F)g?9` z8a^HKp`rSFKGcJ)3!sWWEr6Pnybx-|!-Y`yq%VR7)cZxytQWNy8t+#YLk)Ca0ySsL z5@-o&y%g%x)k_5+O?QoD(44Yy8Pq+>%b{u}FNY>ku@z9p%oR|@N-LpOOkD|0kRq#~ zaoV{G>gHdopb5KmHB=Yh8mLn%*Fdd!xdtj#v=*A?+1Ck709UN~ZGZfxPuu{iSl0=F zcL+@vTn{z6X+6}k@9Ux3dNx2)0P{v@#ag*hAQfC&J=_Ql@z_lQ)nJj^n*>t845!V| z`gFx+Xrq#I3)E$mTcE|?$1TvLP`edcehF@aMr!LesL71mp{XrvyTBB1c4FKC%}!N2 zpiX_i16mx%?u0t^%1)@~V|PJ|?Bg(o;clqn`MaTI6W<=FPZ#fjhPcvRXnC=FFEmX! z?t>b5Y9BOuZ1+PW{>Xl)n=KANJ-Ffk)ExDL(2DT*L4j*v$1gY}a2U);J1nph%uqT4 zE#uA~5jX}GnQ;_aq8T3(SPvF?dQ4z9n6db{z$`Gs;e^0sFyq<@fz4n>&q-(jEqDrQ z>Bdt631BIa(*gzHNNGO}jf)qjp~*M&j6e)nYRegcBrrqrtiV(-W8+zYelWxNoIpO9 zvGtt5Y%nAEJT#Vformg@zaS6~mTJ5pPzq-JydY2nX5?KIs01@!!5C?m1Tw%P7cW5* zlI3Nnu8o(WQZiSdmiAo{$OJ3?bp_f+s=EqR{OzhhJ6NjWnm{&~@$Q;HGni3w9hx9N zU57d~@&>eexO+pO2OKOpH=%L*^(HhWq}+nW>FZn2Je+YG8mBjILlctI9cTjBdIu_{ zdKa1?=iP-GsD2OH8tA_V%>`fYLDl5lhuU@bJ~V|#K7f|FR~|s?zp#f;HAf#pqcZgo zG`fF3f~N4I$I#k^>j^aP%zFYY<20T^^Vfo>(EO$I3|h*phcS$vL#<c{V+g!}`m6Z` zG;Mr%0WA{}UqZ{T%P*lW41EQ4#+g@8DZAIuoO0wf)Ex6S(Bfk48)(@i@fKRpx4ebc zNkZ?S=5)S;>iY8z8Y~s>p#lErJ=CXFAE0)<`2Y>xkdIKQHy@#SFyRxliv92j8VDJm zp@Hz_GgKt!3)EkCzd)Ul{S_+p_$#z<2>b?(xb5GdzR>*+tt|I{hgNd-KcH%s{(x2w z@;{;ZtKp{rWR&gsPiXt8@fWmG;rtENmH!)R&imicgcSb=>aXK}pxX8RLcP4;FEqaR z|3U5Q{09vv*8fmO<A12s@Bfg>duos10&qଭ#Gqx}aLdG&QnFJw&BlDRAAtNB# z%!1%im+4EH1tH@wvMhp-VVq4Yf{>=H8LMC#*qr&Sf{>vn9yX{*DVrc<c<KS0AY>rM zm0b|hqgu@_SPky0X>th0f*GAK#!DE(lM^bnl2b4atcHtAun^3s;}T2&GahmYrhyq= z+=7r^;0A7}VnH6kIPfeakHG>Do$2}<f}+!Vc?7}xJEvdb5sU`wGvI|PpU4Zf?ITPi zhz}~Y8O9Ldhl-TK7}xlrmO$nk!IlIGKrNXr05$SEj1ev<7>6{sxKB_p9_$JQAwg+o e+gJS4-?IvsOz(Zg&o{k6NKk<7-Yb3v1_l77{ja<L delta 15979 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 D5nA`B diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 index d4c0f7e67a..f0f519729b 100644 --- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 +++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 @@ -1 +1 @@ -dfe2abb9c96c05cbdc6467bf60537695 \ No newline at end of file +082f84bc96626ba0af33b55e6371e900 \ No newline at end of file diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 index 9f526fb4b3..c459a8e4c3 100644 --- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 +++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 @@ -1 +1 @@ -1d27fdc406b24d5e19e7325cc1c475e54dabdbd8 \ No newline at end of file +73352b727fd328a6f6c87ebb55c5685101ef26a2 \ No newline at end of file diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml index 25773a1df8..d008830f7c 100644 --- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml +++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml @@ -7,6 +7,6 @@ <versions> <version>1.8.1</version> </versions> - <lastUpdated>20250421083956</lastUpdated> + <lastUpdated>20250422121915</lastUpdated> </versioning> </metadata> diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 index 995497dd53..b0067ff28f 100644 --- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 +++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 @@ -1 +1 @@ -746a0f0ea34d057de25fcd3c55b6e0ac \ No newline at end of file +9c8ded18aad1ff29f91e6ea5b11e33d4 \ No newline at end of file diff --git a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 index 26a8079ba8..fac33bc3ef 100644 --- a/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 +++ b/dbrepo-data-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 @@ -1 +1 @@ -f460c93edbab2a5eb6e49a6e124ca6a03d1b60cc \ No newline at end of file +8784dd005d25156e9599b598deabb8aa15b7a8c1 \ No newline at end of file diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 6f67e74b70..2277a8d5cf 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 41d23f4c7f..e0b0a55366 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -29,6 +29,9 @@ spring: port: ${BROKER_PORT:5672} main: banner-mode: off + output: + ansi: + enabled: never management: endpoints: web: @@ -48,7 +51,8 @@ server: tomcat: max-swallow-size: -1 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + pattern: + console: "%d [%thread] %-5level %logger{36} - %msg%n" level: root: warn at.ac.tuwien.ac.at.ifs.dbrepo.: "${LOG_LEVEL:info}" diff --git a/dbrepo-logging-service/dbrepo_parser.conf b/dbrepo-logging-service/dbrepo_parser.conf index f407dbc1ea..4c778adc52 100644 --- a/dbrepo-logging-service/dbrepo_parser.conf +++ b/dbrepo-logging-service/dbrepo_parser.conf @@ -1,8 +1,8 @@ [PARSER] - # https://rubular.com/r/u029eqdrtxeOT9 + # https://rubular.com/r/78ieBhDKvlzPnW Name java Format regex - Regex (?<time>[^ ]* {1,2}[^ ]*) (?<level>[^ ]*) *(?<message>.*)$ + Regex (?<time>[^ ]* {1,2}[^ ]*) \[(?<thread>.*)\] *(?<level>[^ ]*) (?<logger>.*) - (?<message>.*)$ Time_Key time Time_Format %Y-%m-%d %H:%M:%S,%L Time_Keep On diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index d705bdf235..d53d1f7e00 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -16,7 +16,7 @@ COPY ./services ./services RUN mvn -fn clean package -DskipTests ###### SECOND STAGE ###### -FROM amazoncorretto:17-alpine3.19 AS runtime +FROM amazoncorretto:17-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk --no-cache add \ @@ -26,15 +26,16 @@ RUN apk --no-cache add \ WORKDIR /app -RUN adduser -D dbrepo --uid 1001 +RUN adduser -D dbrepo --uid 1001 && \ + chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/dbrepo-metadata-service-rest-service-*.jar ./metadata-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*rest-service-*.jar ./metadata-service.jar # non-root port EXPOSE 8080 -ENV JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" +ENV JAVA_OPTS="" ENTRYPOINT exec java $JAVA_OPTS -jar ./metadata-service.jar \ No newline at end of file diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar index 7b9014efc7563a26c2dcff518c59595087ed4b72..9ad489e8e468bc0b5e7e6c160408d7674a9ec639 100644 GIT binary patch delta 15963 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ଭ#Gqx}aLdG&QnFJw&BlDRAAtNB# z%!1%im+4EH1tH@wvMhp-VVq4Yf{>=H8LMC#*qr&Sf{>vn9yX{*DVrc<c<KS0AY>rM zm0b|hqgu@_SPky0X>th0f*GAK#!DE(lM^bnl2b4atcHtAun^3s;}T2&GahmYrhyq= z+=7r^;0A7}VnH6kIPfeakHG>Do$2}<f}+!Vc?7}xJEvdb5sU`wGvI|PpU4Zf?ITPi zhz}~Y8O9Ldhl-TK7}xlrmO$nk!IlIGKrNXr05$SEj1ev<7>6{sxKB_p9_$JQAwg+o e+gJS4-?IvsOz(Zg&o{k6NKk<7-Yb3v1_l77{ja<L delta 15979 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 D5nA`B diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 index d4c0f7e67a..f0f519729b 100644 --- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 +++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.md5 @@ -1 +1 @@ -dfe2abb9c96c05cbdc6467bf60537695 \ No newline at end of file +082f84bc96626ba0af33b55e6371e900 \ No newline at end of file diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 index 9f526fb4b3..c459a8e4c3 100644 --- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 +++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/1.8.1/dbrepo-core-1.8.1.jar.sha1 @@ -1 +1 @@ -1d27fdc406b24d5e19e7325cc1c475e54dabdbd8 \ No newline at end of file +73352b727fd328a6f6c87ebb55c5685101ef26a2 \ No newline at end of file diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml index b6f7fd380d..b7ee7dbe99 100644 --- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml +++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml @@ -7,6 +7,6 @@ <versions> <version>1.8.1</version> </versions> - <lastUpdated>20250421083957</lastUpdated> + <lastUpdated>20250422121933</lastUpdated> </versioning> </metadata> diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 index e0626a5c47..3d856af716 100644 --- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 +++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.md5 @@ -1 +1 @@ -8a5f8a644242230dab9041ce299fd77f \ No newline at end of file +f7d3706978b0e0277aa64ce2b5538405 \ No newline at end of file diff --git a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 index 76b83b9802..5e5ee45feb 100644 --- a/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 +++ b/dbrepo-metadata-service/lib/at/ac/tuwien/ifs/dbrepo/dbrepo-core/maven-metadata.xml.sha1 @@ -1 +1 @@ -102e640934487420a19e7e092eb8af3dcac9950f \ No newline at end of file +7de1d14129a4071daefae0475eea792e1a8f406c \ No newline at end of file diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index d14d0bcf61..49abf35216 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-metadata-service</artifactId> <version>1.8.1</version> </parent> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 313d6d0db5..cdecf72b4a 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -13,7 +13,7 @@ <url>https://www.tuwien.ac.at</url> </organization> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> <version>1.8.1</version> @@ -178,11 +178,6 @@ <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 847272f66f..dbdc6f9a80 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -5,7 +5,7 @@ <modelVersion>4.0.0</modelVersion> <parent> <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <version>1.8.1</version> </parent> @@ -15,12 +15,7 @@ <dependencies> <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-metadata-service-services</artifactId> <version>${project.version}</version> </dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 4f9850d3d3..b37ea9075a 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -5,7 +5,7 @@ <modelVersion>4.0.0</modelVersion> <parent> <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <version>1.8.1</version> </parent> @@ -16,15 +16,9 @@ <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-oai</artifactId> <version>${project.version}</version> </dependency> - </dependencies> </project> diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 0f1abad18e..19815840d4 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -5,7 +5,7 @@ <modelVersion>4.0.0</modelVersion> <parent> <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <version>1.8.1</version> </parent> @@ -16,11 +16,6 @@ <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-services</artifactId> <version>${project.version}</version> </dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index 492aafb6c5..29b6c27348 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -25,6 +25,9 @@ spring: port: ${BROKER_PORT:5672} main: banner-mode: off + output: + ansi: + enabled: never management: endpoints: web: @@ -42,10 +45,11 @@ management: server: port: 8080 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + pattern: + console: "%d [%thread] %-5level %logger{36} - %msg%n" level: root: warn - at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}" + at.ac.tuwien.ac.at.ifs.dbrepo.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug dbrepo: datacite: diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index db32fbe9cc..dfac0b7ea6 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -5,7 +5,7 @@ <modelVersion>4.0.0</modelVersion> <parent> <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <version>1.8.1</version> </parent> @@ -16,16 +16,11 @@ <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-oai</artifactId> <version>${project.version}</version> </dependency> <dependency> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-metadata-service-repositories</artifactId> <version>${project.version}</version> </dependency> diff --git a/docker-compose.yml b/docker-compose.yml index 6accc2bc09..287d7e5791 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,57 +1,3 @@ -x-resources-nano: &resources-nano - resources: - reservations: - cpus: '0.1' - memory: 128M - limits: - cpus: '0.15' - memory: 192M - -x-resources-micro: &resources-micro - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 384M - -x-resources-nano-hm: &resources-micro-hm - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 4096M - -x-resources-small: &resources-small - resources: - reservations: - cpus: '0.5' - memory: 512M - limits: - cpus: '0.75' - memory: 768M - -x-resources-medium: &resources-medium - resources: - reservations: - cpus: '0.5' - memory: 1024M - limits: - cpus: '0.75' - memory: 1536M - -x-resources-large: &resources-large - resources: - reservations: - cpus: '1' - memory: 2048M - limits: - cpus: '1.5' - memory: 3072M - x-healthcheck-params: &healthcheck-params interval: 30s timeout: 10s @@ -89,8 +35,6 @@ services: healthcheck: test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm logging: driver: fluentd options: @@ -118,8 +62,6 @@ services: healthcheck: test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm logging: driver: fluentd options: @@ -146,8 +88,6 @@ services: healthcheck: test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'" <<: *healthcheck-params - deploy: - <<: *resources-micro logging: driver: fluentd options: @@ -185,8 +125,6 @@ services: healthcheck: test: curl -fsS localhost:8080/realms/master <<: *healthcheck-params - deploy: - <<: *resources-medium depends_on: dbrepo-identity-service: condition: service_healthy @@ -216,8 +154,6 @@ services: READONLY_USERNAME: "${READONLY_USERNAME:-readonly}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin} - deploy: - <<: *resources-nano depends_on: dbrepo-auth-service: condition: service_healthy @@ -284,8 +220,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-small depends_on: dbrepo-auth-service: condition: service_healthy @@ -336,8 +270,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro logging: driver: fluentd options: @@ -369,8 +301,6 @@ services: healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' <<: *healthcheck-params - deploy: - <<: *resources-micro logging: driver: fluentd options: @@ -389,8 +319,6 @@ services: healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params - deploy: - <<: *resources-medium logging: driver: json-file @@ -421,8 +349,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro logging: driver: fluentd options: @@ -456,8 +382,6 @@ services: healthcheck: test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health <<: *healthcheck-params - deploy: - <<: *resources-micro depends_on: dbrepo-search-service: condition: service_healthy @@ -483,9 +407,6 @@ services: healthcheck: test: wget -O- http://127.0.0.1:8080 <<: *healthcheck-params - deploy: - # TODO may need less but takes forever to stop - <<: *resources-micro depends_on: dbrepo-analyse-service: condition: service_healthy @@ -533,8 +454,6 @@ services: healthcheck: test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1" <<: *healthcheck-params - deploy: - <<: *resources-nano logging: driver: fluentd options: @@ -558,8 +477,6 @@ services: OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano depends_on: dbrepo-search-db: condition: service_healthy @@ -589,8 +506,6 @@ services: METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -621,8 +536,6 @@ services: healthcheck: test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-nano logging: driver: fluentd options: @@ -643,8 +556,6 @@ services: healthcheck: test: promtool check healthy <<: *healthcheck-params - deploy: - <<: *resources-nano logging: driver: fluentd options: @@ -665,8 +576,6 @@ services: S3_BUCKET: "${S3_BUCKET:-dbrepo}" S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - deploy: - <<: *resources-nano depends_on: dbrepo-storage-service: condition: service_healthy @@ -722,8 +631,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-large depends_on: dbrepo-data-db: condition: service_healthy @@ -762,8 +669,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:3000 <<: *healthcheck-params - deploy: - <<: *resources-nano extra_hosts: - "localhost:host-gateway" logging: @@ -791,8 +696,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:8080/health <<: *healthcheck-params - deploy: - <<: *resources-micro depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -814,8 +717,6 @@ services: volumes: - ./dbrepo-logging-service/default.conf:/opt/bitnami/fluent-bit/conf/fluent-bit.conf - ./dbrepo-logging-service/dbrepo_parser.conf:/opt/bitnami/fluent-bit/conf/dbrepo_parser.conf - deploy: - <<: *resources-micro healthcheck: test: ps -p 1 | grep "fluent-bit" <<: *healthcheck-params @@ -835,8 +736,6 @@ services: environment: OPENSEARCH_DASHBOARDS_OPENSEARCH_URL: "${OPENSEARCH_HOST:-search-db}" OPENSEARCH_DASHBOARDS_OPENSEARCH_PORT_NUMBER: "${OPENSEARCH_PORT:-9200}" - deploy: - <<: *resources-micro depends_on: dbrepo-logging-service: condition: service_healthy diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index 3c984d8705a677ec2d7b2e424c5683a3aa2edffd..dd348c636f84e0ec4e345bc53cdcda60c1d2b6c9 100644 GIT binary patch delta 645 zcmbR3Kigj@z?+#xgn@yBgW*Wpw5b20=7|%9l<Iwh4=V`lO;`KhXwR_4SNiy!HF8@n zzw-IJLx00YAK^=lzFGhGnq0LglljV^^CtQJV_ofnZATpbu-0zq)xHtYbLq(~WdSKW zdyyPgS*x<AUyqf&h*VqVeq_(qsSmj~Kkc`^^6{4IEE(nKC|(imkLuo{VrMk^cegov zOUqp-4|{A`U-V$!m!;<?pEKE)&|N9a6wJQO?QmY>r6=p|g+?r1y#MF91@}3QzG?qs zZ#n<^>89L{vV{|h_TT4@W^;UdZ;|i<)(KnIeGxdZeO6Sz<Gd#)O*-A47e+d;GvDXc z;?A@9^TuP#H^mRh>|AVHPcHxaPwv%^J4;L7M(>yZu(QMV$;}z{^$GH&XV*(V4+x&m zze_Jp_p9?Mi~K0nlHk+2awS&}lySKDc-{Ta+8298M*f_(G>7c3;D@GV-(0LuFH>vh z3CUAiEaUdnr*})><d~U4pA1)cF4H%jJolaL?^maH-Z%01)Ul~gZqffsm$*Bd?6$Zl zUw$GBiUuwQ1`Y;rG)&&esLXsgZQA7PjJnK6(xy#jXOaWc8ceESI)F(FOxH4*faxtv zUSRc%%xA&$Mdogh_~v+)IZR;2KQ?YoFoQ>+Mi9i9+^skZOlv4j=72^0<iko<Ai+t> zCSYUCm2E-X$>qv=V0wkJDVTns3|2N-R>cL(Pf>{it3Rj`45r0ZbHU>6s<B}DxvC?W R)>hjEreCOKfazd$4***yAU^;A delta 645 zcmbR3Kigj@z?+#xgn@yBgMlS<YLvL1qr^lZrTWu(hZO|&M1QjXz}zrdApGmvO#a*} z?NjXDWk;B6nDr&RHK~t(v}K)CXfFSOLwweUb;=*)v^M_W{*@3NzM=EPr6-q^1*G=f z5P!p0Rr2Q0>#c7uZk`#yeq_<+tq;97KkSdb^6^&WEE%QfNL~@`kLup0VrQnvZP#t@ zyJoZC{n}%}^-oUN%6iRLo10mCa9Xz+OW3=cT)ey4ye7|1i%xFt`}fScu})d!v;3$3 zPio@siskrj;ccC=`>x*&Esj@ZVsjaE8<vz#ZFksr`AQ|vCk_8)o+eiPr-iB{ey-cF z<-xJT=lfi;<(ceD79?Dl5yShtI^$7s{@T~~+WvN&cYUKc-}gs7`?o;zKbuPVOnHAU znEmMLC4(hBpLc1u=1K27xOZLjjh@C1&z0@_4{Yq8_4sgQF7ra?dYwIo?#X4YuAF(^ zDEC|l-_lbCr?(hM&N<9-b<3qJyY(T<mi?-DfAf0$xxdRCC%I4Y{UY#p`ZPxmkuM8X zrDm$V2So!H0|N&GI2tBzWK?Em4xKvrI-@R_W@nNE(;7^w%q*c(CkHTTf$3T%6EMAn z$qOvc$b1$|Uu5nE(VOF0<}iU7|Jb-W!3-XO8bPp@ZpB$(T0?0v2Q2C*A6Bvg2~JWr z0V$qru51gY%a!%O^a^EDko4pS%3x)aWmR0j{1lZau>3)lU@$GNnhU1eRb#>Qb5%z$ St*y2Ttp0^s2AB?3_W%GA7z|th diff --git a/lib/java/dbrepo-core/pom.xml b/lib/java/dbrepo-core/pom.xml index d86419d19d..ca435617a6 100644 --- a/lib/java/dbrepo-core/pom.xml +++ b/lib/java/dbrepo-core/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -38,7 +38,7 @@ <lombok.version>1.18.36</lombok.version> <keycloak.version>26.0.4</keycloak.version> <mapstruct.version>1.6.3</mapstruct.version> - <spring-cloud.version>4.1.4</spring-cloud.version> + <spring-cloud.version>4.2.1</spring-cloud.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> <springdoc-openapi.version>2.8.5</springdoc-openapi.version> </properties> diff --git a/make/build.mk b/make/build.mk index f767915fb1..288ad7d0ca 100644 --- a/make/build.mk +++ b/make/build.mk @@ -1,14 +1,16 @@ ##@ Build .PHONY: build-images -build-images: build-java-lib ## Build Docker images. - docker compose build --parallel +build-images: build-java-lib build-auth-event-listener ## Build Docker images. + docker compose build .PHONY: build-java-lib build-java-lib: ## Build the Java Library. mvn -f ./lib/java/dbrepo-core/pom.xml clean package -DskipTests mvn deploy:deploy-file -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-data-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true + mvn -f ./dbrepo-data-service/pom.xml clean package -DskipTests mvn deploy:deploy-file -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-metadata-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true + mvn -f ./dbrepo-metadata-service/pom.xml clean package -DskipTests .PHONY: build-auth-event-listener build-auth-event-listener: ## Build the Auth Service Event Listener. diff --git a/make/dev.mk b/make/dev.mk index dbad9eff6f..c19e505e9e 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -1,7 +1,7 @@ ##@ Development .PHONY: start-dev -start-dev: build-images build-auth-event-listener ## Start the development deployment. +start-dev: build-images ## Start the development deployment. docker container stop dbrepo-gateway-service || true docker container rm dbrepo-gateway-service || true docker compose up -d diff --git a/mkdocs.yml b/mkdocs.yml index 7060289640..5051d9a328 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -20,6 +20,7 @@ nav: - Data Versioning: concepts/data-versioning.md - Dashboards: concepts/dashboards.md - Data Visibility: concepts/data-visibility.md + - Logging: concepts/logging.md - Messaging: concepts/messaging.md - Monitoring: concepts/monitoring.md - Persistent Identifier: concepts/pid.md -- GitLab