diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
index a3d7b7f48b1fe458066e5a4a4d1dbef958abaaf7..e81247931d562290a34bad3591988f79de3b61d0 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
@@ -14,6 +14,7 @@ import at.tuwien.service.UserService;
 import at.tuwien.service.impl.ContainerServiceImpl;
 import at.tuwien.utils.PrincipalUtil;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -54,6 +55,7 @@ public class ContainerEndpoint {
 
     @GetMapping
     @Transactional(readOnly = true)
+    @Observed(name = "dbr_container_findall")
     @Operation(summary = "Find all containers")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -76,6 +78,7 @@ public class ContainerEndpoint {
 
     @PostMapping
     @Transactional
+    @Observed(name = "dbr_container_create")
     @PreAuthorize("hasAuthority('create-container')")
     @Operation(summary = "Create container", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
@@ -118,6 +121,7 @@ public class ContainerEndpoint {
 
     @GetMapping("/{id}")
     @Transactional(readOnly = true)
+    @Observed(name = "dbr_container_find")
     @Operation(summary = "Find some container")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -153,7 +157,7 @@ public class ContainerEndpoint {
 
     @DeleteMapping("/{id}")
     @Transactional
-    @Timed(value = "container.delete", description = "Time needed to delete the container")
+    @Observed(name = "dbr_container_delete")
     @PreAuthorize("hasAuthority('delete-container')")
     @Operation(summary = "Delete some container", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index 925a60168bf8fbea1c0ca933f0efb69129a64abb..bcd669c573f37062f918a69d66e166b16141a220 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -14,6 +14,7 @@ import at.tuwien.service.*;
 import at.tuwien.utils.PrincipalUtil;
 import at.tuwien.utils.UserUtil;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -68,7 +69,7 @@ public class DatabaseEndpoint {
 
     @GetMapping
     @Transactional(readOnly = true)
-    @Timed(value = "database.list", description = "Time needed to list the databases")
+    @Observed(name = "dbr_database_findall")
     @Operation(summary = "List databases")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -100,7 +101,7 @@ public class DatabaseEndpoint {
 
     @RequestMapping(method = RequestMethod.HEAD)
     @Transactional(readOnly = true)
-    @Timed(value = "database.list", description = "Time needed to count the databases")
+    @Observed(name = "dbr_database_count")
     @Operation(summary = "Count databases")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -135,7 +136,7 @@ public class DatabaseEndpoint {
     @PostMapping
     @Transactional(rollbackFor = Exception.class)
     @PreAuthorize("hasAuthority('create-database')")
-    @Timed(value = "database.create", description = "Time needed to create a database")
+    @Observed(name = "dbr_database_create")
     @Operation(summary = "Create database", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
@@ -205,7 +206,7 @@ public class DatabaseEndpoint {
     @PutMapping("/{id}/visibility")
     @Transactional
     @PreAuthorize("hasAuthority('modify-database-visibility')")
-    @Timed(value = "database.visibility", description = "Time needed to modify a database visibility")
+    @Observed(name = "dbr_database_visibility")
     @Operation(summary = "Update database", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -244,7 +245,7 @@ public class DatabaseEndpoint {
     @PutMapping("/{id}/transfer")
     @Transactional
     @PreAuthorize("hasAuthority('modify-database-owner')")
-    @Timed(value = "database.transfer", description = "Time needed to transfer a database ownership")
+    @Observed(name = "dbr_database_transfer")
     @Operation(summary = "Transfer database", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -282,7 +283,7 @@ public class DatabaseEndpoint {
 
     @GetMapping("/{id}")
     @Transactional(readOnly = true)
-    @Timed(value = "database.find", description = "Time needed to find a database")
+    @Observed(name = "dbr_database_find")
     @Operation(summary = "Find some database", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -322,7 +323,7 @@ public class DatabaseEndpoint {
     @DeleteMapping("/{id}")
     @Transactional(rollbackFor = Exception.class)
     @PreAuthorize("hasAuthority('delete-database')")
-    @Timed(value = "database.delete", description = "Time needed to delete a database")
+    @Observed(name = "dbr_database_delete")
     @Operation(summary = "Delete some database", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ExportEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ExportEndpoint.java
index 844667233a8ebe738e0313edacdd1978049c5b93..6c58d8509cfc45bd470addd602a291126110848e 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ExportEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ExportEndpoint.java
@@ -10,6 +10,7 @@ import at.tuwien.service.QueryService;
 import at.tuwien.utils.PrincipalUtil;
 import at.tuwien.utils.UserUtil;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -45,7 +46,7 @@ public class ExportEndpoint {
 
     @GetMapping
     @Transactional(readOnly = true)
-    @Timed(value = "table.export", description = "Time needed to export table data")
+    @Observed(name = "dbr_table_export")
     @Operation(summary = "Export table", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
index 8687928087ee52c5bbc4513ed46999286eeacf0e..ef1006ed70994850ee6f8d32fd18b1c54336a09d 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
@@ -15,6 +15,7 @@ import at.tuwien.service.UserService;
 import at.tuwien.utils.PrincipalUtil;
 import at.tuwien.utils.UserUtil;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -58,7 +59,7 @@ public class IdentifierEndpoint {
 
     @GetMapping
     @Transactional(readOnly = true)
-    @Timed(value = "identifier.list", description = "Time needed to list the identifiers")
+    @Observed(name = "dbr_identifier_findall")
     @Operation(summary = "Find identifiers")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -82,7 +83,7 @@ public class IdentifierEndpoint {
 
     @PostMapping
     @Transactional
-    @Timed(value = "identifier.create", description = "Time needed to create an identifier")
+    @Observed(name = "dbr_identifier_create")
     @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')")
     @Operation(summary = "Create identifier", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
@@ -153,7 +154,7 @@ public class IdentifierEndpoint {
     }
 
     @GetMapping("/retrieve")
-    @Timed(value = "identifier.retrieve", description = "Retrieve person or organization metadata from identifier")
+    @Observed(name = "dbr_identifier_retrieve")
     @Operation(summary = "Retrieve metadata from identifier")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -162,7 +163,7 @@ public class IdentifierEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = IdentifierDto.class))}),
     })
-    public ResponseEntity<ExternalMetadataDto> create(@NotNull @Valid @RequestParam String url)
+    public ResponseEntity<ExternalMetadataDto> retrieve(@NotNull @Valid @RequestParam String url)
             throws OrcidNotFoundException, RorNotFoundException, RemoteUnavailableException, DoiNotFoundException {
         return ResponseEntity.ok(metadataService.findByUrl(url));
     }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
index dc5305dd92ab6a36349e22f565138045f94979d2..6b98c6fb38b28f103d9c96495783d437a8c94182 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
@@ -14,6 +14,7 @@ import at.tuwien.mapper.ImageMapper;
 import at.tuwien.service.impl.ImageServiceImpl;
 import at.tuwien.utils.PrincipalUtil;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -53,7 +54,7 @@ public class ImageEndpoint {
 
     @GetMapping
     @Transactional(readOnly = true)
-    @Timed(value = "image.list", description = "Time needed to list the container images")
+    @Observed(name = "dbr_image_findall")
     @Operation(summary = "Find all images")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -73,7 +74,7 @@ public class ImageEndpoint {
 
     @PostMapping
     @Transactional
-    @Timed(value = "image.create", description = "Time needed to create a container image")
+    @Observed(name = "dbr_image_create")
     @PreAuthorize("hasAuthority('create-image')")
     @Operation(summary = "Create image", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
@@ -120,7 +121,7 @@ public class ImageEndpoint {
 
     @GetMapping("/{id}")
     @Transactional(readOnly = true)
-    @Timed(value = "image.find", description = "Time needed to find a container image")
+    @Observed(name = "dbr_image_find")
     @Operation(summary = "Find some image")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -145,7 +146,7 @@ public class ImageEndpoint {
 
     @PutMapping("/{id}")
     @Transactional
-    @Timed(value = "image.update", description = "Time needed to update a container image")
+    @Observed(name = "dbr_image_update")
     @PreAuthorize("hasAuthority('modify-image')")
     @Operation(summary = "Update some image", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
@@ -174,7 +175,7 @@ public class ImageEndpoint {
 
     @DeleteMapping("/{id}")
     @Transactional
-    @Timed(value = "image.delete", description = "Time needed to delete a container image")
+    @Observed(name = "dbr_image_delete")
     @PreAuthorize("hasAuthority('delete-image')")
     @Operation(summary = "Delete some image", security = @SecurityRequirement(name = "bearerAuth"))
     @ApiResponses(value = {
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
index 6663d1e89f8f850f99e881159c857d9a8603e65a..c7ad83c5f19ac25bec2cd86bdcbe5a311c0f06c4 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
@@ -4,6 +4,7 @@ import at.tuwien.api.database.LicenseDto;
 import at.tuwien.mapper.LicenseMapper;
 import at.tuwien.service.LicenseService;
 import io.micrometer.core.annotation.Timed;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -40,7 +41,7 @@ public class LicenseEndpoint {
 
     @GetMapping("/license")
     @Transactional(readOnly = true)
-    @Timed(value = "license.list", description = "Time needed to list the licenses")
+    @Observed(name = "dbr_license_findall")
     @Operation(summary = "Get all licenses")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MaintenanceEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MaintenanceEndpoint.java
index 3dd488acc8277bdcfa5d60b1011f200f435815c2..b71109d62ba5cd75e113a9f3f6d89677f5bd3ae8 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MaintenanceEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MaintenanceEndpoint.java
@@ -7,6 +7,7 @@ import at.tuwien.api.maintenance.BannerMessageUpdateDto;
 import at.tuwien.exception.BannerMessageNotFoundException;
 import at.tuwien.mapper.BannerMessageMapper;
 import at.tuwien.service.BannerMessageService;
+import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -40,6 +41,7 @@ public class MaintenanceEndpoint {
     }
 
     @GetMapping("/message")
+    @Observed(name = "dbr_maintenance_findall")
     @Operation(summary = "Find maintenance messages")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -59,6 +61,7 @@ public class MaintenanceEndpoint {
     }
 
     @GetMapping("/message/{id}")
+    @Observed(name = "dbr_maintenance_find")
     @Operation(summary = "Find one maintenance message")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -76,6 +79,7 @@ public class MaintenanceEndpoint {
     }
 
     @GetMapping("/message/active")
+    @Observed(name = "dbr_maintenance_findactive")
     @Operation(summary = "Find active maintenance messages")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
@@ -95,6 +99,7 @@ public class MaintenanceEndpoint {
     }
 
     @PostMapping("/message")
+    @Observed(name = "dbr_maintenance_create")
     @Operation(summary = "Create maintenance message")
     @PreAuthorize("hasAuthority('create-maintenance-message')")
     @ApiResponses(value = {
@@ -113,6 +118,7 @@ public class MaintenanceEndpoint {
     }
 
     @PutMapping("/message/{id}")
+    @Observed(name = "dbr_maintenance_update")
     @Operation(summary = "Update maintenance message")
     @PreAuthorize("hasAuthority('update-maintenance-message')")
     @ApiResponses(value = {
@@ -138,6 +144,7 @@ public class MaintenanceEndpoint {
     }
 
     @DeleteMapping("/message/{id}")
+    @Observed(name = "dbr_maintenance_delete")
     @Operation(summary = "Delete maintenance message")
     @PreAuthorize("hasAuthority('delete-maintenance-message')")
     @ApiResponses(value = {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
index efbe24aa944480ea5e7b2e715ff3da1c6255e1e8..c468faabb5b1407daf481f01062442baa7f2c340 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
@@ -3,13 +3,11 @@ package at.tuwien.mvc;
 import at.tuwien.BaseUnitTest;
 import at.tuwien.annotations.MockAmqp;
 import at.tuwien.annotations.MockOpensearch;
-import at.tuwien.api.database.AccessTypeDto;
-import at.tuwien.api.database.DatabaseGiveAccessDto;
-import at.tuwien.api.database.DatabaseModifyAccessDto;
+import at.tuwien.api.container.ContainerCreateRequestDto;
+import at.tuwien.api.database.*;
 import at.tuwien.config.MetricsConfig;
-import at.tuwien.endpoints.AccessEndpoint;
+import at.tuwien.endpoints.*;
 import io.micrometer.observation.tck.TestObservationRegistry;
-import lombok.SneakyThrows;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -50,6 +48,27 @@ public class PrometheusEndpointMvcTest extends BaseUnitTest {
     @Autowired
     private AccessEndpoint accessEndpoint;
 
+    @Autowired
+    private ContainerEndpoint containerEndpoint;
+
+    @Autowired
+    private DatabaseEndpoint databaseEndpoint;
+
+    @Autowired
+    private ExportEndpoint exportEndpoint;
+
+    @Autowired
+    private IdentifierEndpoint identifierEndpoint;
+
+    @Autowired
+    private ImageEndpoint imageEndpoint;
+
+    @Autowired
+    private LicenseEndpoint licenseEndpoint;
+
+    @Autowired
+    private MaintenanceEndpoint maintenanceEndpoint;
+
     @TestConfiguration
     static class ObservationTestConfiguration {
 
@@ -70,7 +89,7 @@ public class PrometheusEndpointMvcTest extends BaseUnitTest {
 
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database-access", "update-database-access", "check-database-access", "delete-database-access"})
-    public void prometheusAccessEndpoint_succeeds() throws Exception {
+    public void prometheusAccessEndpoint_succeeds() {
 
         /* mock */
         try {
@@ -94,10 +113,6 @@ public class PrometheusEndpointMvcTest extends BaseUnitTest {
             /* ignore */
         }
 
-
-        this.mockMvc.perform(get("/actuator/prometheus"))
-                .andDo(print())
-                .andExpect(status().isOk());
         /* test */
         for (String metric : List.of("dbr_access_give", "dbr_access_modify", "dbr_access_check", "dbr_access_delete")) {
             assertThat(registry)
@@ -105,4 +120,228 @@ public class PrometheusEndpointMvcTest extends BaseUnitTest {
         }
     }
 
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-container", "delete-container"})
+    public void prometheusContainerEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            containerEndpoint.findAll(USER_1_PRINCIPAL, null);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            containerEndpoint.create(ContainerCreateRequestDto.builder().name(CONTAINER_1_NAME).imageId(IMAGE_1_ID).build(), USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            containerEndpoint.findById(CONTAINER_1_ID);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            containerEndpoint.delete(CONTAINER_1_ID, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_container_findall", "dbr_container_create", "dbr_container_find", "dbr_container_delete")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database", "modify-database-visibility", "modify-database-owner", "delete-database"})
+    public void prometheusDatabaseEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            databaseEndpoint.list(USER_1_PRINCIPAL, null);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.count(USER_1_PRINCIPAL, null);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.create(DATABASE_1_CREATE, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.visibility(DATABASE_1_ID, DatabaseModifyVisibilityDto.builder().isPublic(true).build(), USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.transfer(DATABASE_1_ID, DatabaseTransferDto.builder().username(USER_2_USERNAME).build(), USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.findById(DATABASE_1_ID, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            databaseEndpoint.delete(DATABASE_1_ID, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_database_findall", "dbr_database_count", "dbr_database_create", "dbr_database_visibility", "dbr_database_transfer", "dbr_database_find", "dbr_database_delete")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void prometheusExportEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            exportEndpoint.export(DATABASE_1_ID, TABLE_1_ID, null, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_table_export")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier", "create-foreign-identifier"})
+    public void prometheusIdentifierEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            identifierEndpoint.list(DATABASE_1_ID, null, null, IDENTIFIER_1_TYPE_DTO);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            identifierEndpoint.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            identifierEndpoint.retrieve(USER_1_ORCID_URL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_identifier_findall", "dbr_identifier_create", "dbr_identifier_retrieve")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-image", "modify-image", "delete-image"})
+    public void prometheusImageEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            imageEndpoint.findAll(USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            imageEndpoint.create(IMAGE_1_CREATE_DTO, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            imageEndpoint.findById(IMAGE_1_ID);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            imageEndpoint.update(IMAGE_1_ID, IMAGE_1_CHANGE_DTO, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            imageEndpoint.delete(IMAGE_1_ID, USER_1_PRINCIPAL);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_image_findall", "dbr_image_create", "dbr_image_find", "dbr_image_update", "dbr_image_delete")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void prometheusLicenseEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            licenseEndpoint.list();
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        assertThat(registry)
+                .hasObservationWithNameEqualTo("dbr_license_findall");
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-maintenance-message", "update-maintenance-message", "delete-maintenance-message"})
+    public void prometheusMaintenanceEndpoint_succeeds() {
+
+        /* mock */
+        try {
+            maintenanceEndpoint.list();
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            maintenanceEndpoint.find(BANNER_MESSAGE_1_ID);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            maintenanceEndpoint.active();
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            maintenanceEndpoint.create(BANNER_MESSAGE_1_CREATE_DTO);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            maintenanceEndpoint.update(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1_UPDATE_DTO);
+        } catch (Exception e) {
+            /* ignore */
+        }
+        try {
+            maintenanceEndpoint.delete(BANNER_MESSAGE_1_ID);
+        } catch (Exception e) {
+            /* ignore */
+        }
+
+        /* test */
+        for (String metric : List.of("dbr_maintenance_findall", "dbr_maintenance_find", "dbr_maintenance_findactive", "dbr_maintenance_create", "dbr_maintenance_update", "dbr_maintenance_delete")) {
+            assertThat(registry)
+                    .hasObservationWithNameEqualTo(metric);
+        }
+    }
+
 }
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index ae3ae81be32720f67f7303a1920ecb153b2265ea..6fa29160b3969cb28934c3bd33e3ac1522dfd200 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -4,10 +4,7 @@ import at.tuwien.api.amqp.*;
 import at.tuwien.api.auth.SignupRequestDto;
 import at.tuwien.api.container.ContainerBriefDto;
 import at.tuwien.api.container.ContainerDto;
-import at.tuwien.api.container.image.ImageBriefDto;
-import at.tuwien.api.container.image.ImageCreateDto;
-import at.tuwien.api.container.image.ImageDateDto;
-import at.tuwien.api.container.image.ImageDto;
+import at.tuwien.api.container.image.*;
 import at.tuwien.api.database.*;
 import at.tuwien.api.database.query.QueryBriefDto;
 import at.tuwien.api.database.query.QueryDto;
@@ -698,6 +695,14 @@ public abstract class BaseTest {
             .defaultPort(IMAGE_1_PORT)
             .build();
 
+    public final static ImageChangeDto IMAGE_1_CHANGE_DTO = ImageChangeDto.builder()
+            .registry(IMAGE_1_REGISTRY)
+            .dialect(IMAGE_1_DIALECT)
+            .jdbcMethod(IMAGE_1_JDBC)
+            .driverClass(IMAGE_1_DRIVER)
+            .defaultPort(IMAGE_1_PORT)
+            .build();
+
     public final static Long IMAGE_DATE_2_ID = 2L;
     public final static Long IMAGE_DATE_2_IMAGE_ID = IMAGE_1_ID;
     public final static String IMAGE_DATE_2_UNIX_FORMAT = "dd.MM.yy";