diff --git a/engine-rest/engine-rest-openapi/src/main/templates/paths/telemetry/data/get.ftl b/engine-rest/engine-rest-openapi/src/main/templates/paths/telemetry/data/get.ftl index a9e75b0fc1b..24d1135d66b 100644 --- a/engine-rest/engine-rest-openapi/src/main/templates/paths/telemetry/data/get.ftl +++ b/engine-rest/engine-rest-openapi/src/main/templates/paths/telemetry/data/get.ftl @@ -5,9 +5,53 @@ id = "getTelemetryData" tag = "Telemetry" summary = "Fetch Telemetry Data" - desc = "Fetches Telemetry Data." /> + desc = "Fetches metrics count based on the start and end date" /> - "parameters" : [], + "parameters" : [ + + <@lib.parameter + name = "metricsFilter" + location = "query" + type = "string" + required = false + enumValues = ["activity-instance-start", + "activity-instance-end", + "decision-instances", + "flow-node-instances", + "job-acquisition-attempt", + "job-acquired-success", + "job-acquired-failure", + "job-execution-rejected", + "job-successful", + "job-failed", + "job-locked-exclusive", + "executed-decision-elements", + "history-cleanup-removed-process-instances", + "history-cleanup-removed-case-instances", + "history-cleanup-removed-decision-instances", + "history-cleanup-removed-batch-operations", + "history-cleanup-removed-task-metrics", + "unique-task-workers", + "process-instances", + "task-users"] + desc = "The filter of metric." /> + + <@lib.parameter + name = "startDate" + location = "query" + type = "string" + format = "date-time" + desc = "The start date (inclusive)."/> + + <@lib.parameter + name = "endDate" + location = "query" + type = "string" + format = "date-time" + last = true + desc = "The end date (exclusive)."/> + + ], "responses" : { diff --git a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/TelemetryRestService.java b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/TelemetryRestService.java index 68022ac9569..cd48de48685 100644 --- a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/TelemetryRestService.java +++ b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/TelemetryRestService.java @@ -21,7 +21,9 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriInfo; import org.camunda.bpm.engine.rest.dto.TelemetryConfigurationDto; import org.camunda.bpm.engine.rest.dto.telemetry.TelemetryDataDto; @@ -44,5 +46,5 @@ public interface TelemetryRestService { @GET @Path("/data") @Produces(MediaType.APPLICATION_JSON) - TelemetryDataDto getTelemetryData(); + TelemetryDataDto getTelemetryData(@Context UriInfo uriInfo); } diff --git a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/impl/TelemetryRestServiceImpl.java b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/impl/TelemetryRestServiceImpl.java index c62589bcc6d..bd6d42ae313 100644 --- a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/impl/TelemetryRestServiceImpl.java +++ b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/impl/TelemetryRestServiceImpl.java @@ -19,11 +19,15 @@ import org.camunda.bpm.engine.ManagementService; import org.camunda.bpm.engine.rest.TelemetryRestService; import org.camunda.bpm.engine.rest.dto.TelemetryConfigurationDto; +import org.camunda.bpm.engine.rest.dto.converter.DateConverter; import org.camunda.bpm.engine.rest.dto.telemetry.TelemetryDataDto; +import org.camunda.bpm.engine.rest.util.MetricsUtil; import org.camunda.bpm.engine.telemetry.TelemetryData; import com.fasterxml.jackson.databind.ObjectMapper; +import javax.ws.rs.core.UriInfo; + public class TelemetryRestServiceImpl extends AbstractRestProcessEngineAware implements TelemetryRestService { public TelemetryRestServiceImpl(String engineName, ObjectMapper objectMapper) { @@ -48,9 +52,12 @@ public TelemetryConfigurationDto getTelemetryConfiguration() { } @Override - public TelemetryDataDto getTelemetryData() { + public TelemetryDataDto getTelemetryData(UriInfo uriInfo) { ManagementService managementService = getProcessEngine().getManagementService(); - TelemetryData data = managementService.getTelemetryData(); + DateConverter dateConverter = new DateConverter(); + dateConverter.setObjectMapper(objectMapper); + TelemetryData data = managementService.getTelemetryData(uriInfo.getQueryParameters().getFirst("metricsFilter"), MetricsUtil.extractStartDate(uriInfo.getQueryParameters(), dateConverter), + MetricsUtil.extractEndDate(uriInfo.getQueryParameters(), dateConverter)); return TelemetryDataDto.fromEngineDto(data); } diff --git a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/sub/metrics/MetricsResourceImpl.java b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/sub/metrics/MetricsResourceImpl.java index 3df745df4ca..34537ba7415 100644 --- a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/sub/metrics/MetricsResourceImpl.java +++ b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/sub/metrics/MetricsResourceImpl.java @@ -17,15 +17,12 @@ package org.camunda.bpm.engine.rest.sub.metrics; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.Date; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; - import org.camunda.bpm.engine.ProcessEngine; -import org.camunda.bpm.engine.management.Metrics; -import org.camunda.bpm.engine.management.MetricsQuery; import org.camunda.bpm.engine.rest.dto.converter.DateConverter; import org.camunda.bpm.engine.rest.dto.metrics.MetricsResultDto; +import org.camunda.bpm.engine.rest.util.MetricsUtil; /** @@ -51,46 +48,11 @@ public MetricsResultDto sum(UriInfo uriInfo) { DateConverter dateConverter = new DateConverter(); dateConverter.setObjectMapper(objectMapper); - Number result = null; - - if (Metrics.UNIQUE_TASK_WORKERS.equals(metricsName) || Metrics.TASK_USERS.equals(metricsName)) { - result = processEngine.getManagementService().getUniqueTaskWorkerCount( - extractStartDate(queryParameters, dateConverter), - extractEndDate(queryParameters, dateConverter)); - } else { - MetricsQuery query = processEngine.getManagementService() - .createMetricsQuery() - .name(metricsName); + Number result = processEngine.getManagementService().getMetricsSum(metricsName, MetricsUtil.extractStartDate(queryParameters, dateConverter), + MetricsUtil.extractEndDate(queryParameters, dateConverter)); - applyQueryParams(queryParameters, dateConverter, query); - result = query.sum(); - } return new MetricsResultDto(result); } - protected void applyQueryParams(MultivaluedMap queryParameters, DateConverter dateConverter, MetricsQuery query) { - Date startDate = extractStartDate(queryParameters, dateConverter); - Date endDate = extractEndDate(queryParameters, dateConverter); - if (startDate != null) { - query.startDate(startDate); - } - if (endDate != null) { - query.endDate(endDate); - } - } - - protected Date extractEndDate(MultivaluedMap queryParameters, DateConverter dateConverter) { - if(queryParameters.getFirst("endDate") != null) { - return dateConverter.convertQueryParameterToType(queryParameters.getFirst("endDate")); - } - return null; - } - - protected Date extractStartDate(MultivaluedMap queryParameters, DateConverter dateConverter) { - if(queryParameters.getFirst("startDate") != null) { - return dateConverter.convertQueryParameterToType(queryParameters.getFirst("startDate")); - } - return null; - } } diff --git a/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/util/MetricsUtil.java b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/util/MetricsUtil.java new file mode 100644 index 00000000000..d3dcf4e3fc3 --- /dev/null +++ b/engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/util/MetricsUtil.java @@ -0,0 +1,24 @@ +package org.camunda.bpm.engine.rest.util; + +import org.camunda.bpm.engine.rest.dto.converter.DateConverter; + +import javax.ws.rs.core.MultivaluedMap; +import java.util.Date; + +public class MetricsUtil { + + public static Date extractEndDate(MultivaluedMap queryParameters, DateConverter dateConverter) { + if(queryParameters.getFirst("endDate") != null) { + return dateConverter.convertQueryParameterToType(queryParameters.getFirst("endDate")); + } + return null; + } + + public static Date extractStartDate(MultivaluedMap queryParameters, DateConverter dateConverter) { + if(queryParameters.getFirst("startDate") != null) { + return dateConverter.convertQueryParameterToType(queryParameters.getFirst("startDate")); + } + return null; + } + +} diff --git a/engine-rest/engine-rest/src/test/java/org/camunda/bpm/engine/rest/TelemetryRestServiceTest.java b/engine-rest/engine-rest/src/test/java/org/camunda/bpm/engine/rest/TelemetryRestServiceTest.java index 4008e68c8e4..0a4a9887fde 100644 --- a/engine-rest/engine-rest/src/test/java/org/camunda/bpm/engine/rest/TelemetryRestServiceTest.java +++ b/engine-rest/engine-rest/src/test/java/org/camunda/bpm/engine/rest/TelemetryRestServiceTest.java @@ -32,6 +32,7 @@ import org.camunda.bpm.engine.AuthorizationException; import org.camunda.bpm.engine.ManagementService; +import org.camunda.bpm.engine.impl.telemetry.dto.MetricImpl; import org.camunda.bpm.engine.rest.helper.MockProvider; import org.camunda.bpm.engine.rest.util.container.TestContainerRule; import org.camunda.bpm.engine.telemetry.ApplicationServer; @@ -190,7 +191,7 @@ public void shouldThrowAuthorizationExceptionOnFetchingTelemetryConfig() { @Test public void shouldGetTelemetryData() throws JsonProcessingException { - when(managementServiceMock.getTelemetryData()).thenReturn(MockProvider.EXAMPLE_TELEMETRY_DATA); + when(managementServiceMock.getTelemetryData(null, null, null)).thenReturn(MockProvider.EXAMPLE_TELEMETRY_DATA); given() .then() @@ -225,7 +226,7 @@ public void shouldGetTelemetryData() throws JsonProcessingException { .when() .get(TELEMETRY_DATA_URL); - verify(managementServiceMock).getTelemetryData(); + verify(managementServiceMock).getTelemetryData(null, null, null); } @Test @@ -248,13 +249,16 @@ public void shouldGetMinimalTelemetryData() { when(internals.getCommands()).thenReturn(new HashMap<>()); when(internals.getDatabase()).thenReturn(mock(Database.class)); when(internals.getJdk()).thenReturn(mock(Jdk.class)); - when(internals.getMetrics()).thenReturn(new HashMap<>()); + when(internals.getMetrics()).thenReturn(new HashMap<>() {{ + put("process-instances", new MetricImpl(1)); + }}); when(internals.getWebapps()).thenReturn(new HashSet<>()); // license key may be null and is therefore not mocked - when(managementServiceMock.getTelemetryData()).thenReturn(telemetryData); + when(managementServiceMock.getTelemetryData("process-instances", null, null)).thenReturn(telemetryData); given() + .queryParam("metricsFilter", "process-instances") .then() .expect() .statusCode(Status.OK.getStatusCode()) @@ -263,10 +267,11 @@ public void shouldGetMinimalTelemetryData() { .body("product.name", equalTo(MockProvider.EXAMPLE_TELEMETRY_PRODUCT_NAME)) .body("product.version", equalTo(MockProvider.EXAMPLE_TELEMETRY_PRODUCT_VERSION)) .body("product.edition", equalTo(MockProvider.EXAMPLE_TELEMETRY_PRODUCT_EDITION)) + .body("product.internals.metrics.size()", equalTo(1)) .when() .get(TELEMETRY_DATA_URL); - verify(managementServiceMock).getTelemetryData(); + verify(managementServiceMock).getTelemetryData("process-instances", null, null); } } diff --git a/engine/src/main/java/org/camunda/bpm/engine/ManagementService.java b/engine/src/main/java/org/camunda/bpm/engine/ManagementService.java index 9929512a503..eaeb9f0a55e 100644 --- a/engine/src/main/java/org/camunda/bpm/engine/ManagementService.java +++ b/engine/src/main/java/org/camunda/bpm/engine/ManagementService.java @@ -1304,6 +1304,16 @@ Batch setJobRetriesAsync (List processInstanceIds, */ void deleteMetrics(Date timestamp); + /** + * Fetches metric count from persistence storage + * + * + * @param metricsName name of metrics + * @param startDate start date of date range + * @param endDate end date of date range + */ + Number getMetricsSum(String metricsName, Date startDate, Date endDate); + /** * Deletes all metrics events which are older than the specified timestamp * and reported by the given reporter. If a parameter is null, all metric events @@ -1450,6 +1460,6 @@ Batch setJobRetriesAsync (List processInstanceIds, * * @see Camunda Documentation: Telemetry */ - TelemetryData getTelemetryData(); + TelemetryData getTelemetryData(String metricFilter, Date startDate, Date endDate); } diff --git a/engine/src/main/java/org/camunda/bpm/engine/impl/ManagementServiceImpl.java b/engine/src/main/java/org/camunda/bpm/engine/impl/ManagementServiceImpl.java index 93a1fc33029..78bb5202183 100644 --- a/engine/src/main/java/org/camunda/bpm/engine/impl/ManagementServiceImpl.java +++ b/engine/src/main/java/org/camunda/bpm/engine/impl/ManagementServiceImpl.java @@ -17,11 +17,7 @@ package org.camunda.bpm.engine.impl; import java.sql.Connection; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import org.camunda.bpm.application.ProcessApplicationReference; import org.camunda.bpm.application.ProcessApplicationRegistration; @@ -81,22 +77,15 @@ import org.camunda.bpm.engine.impl.management.UpdateJobSuspensionStateBuilderImpl; import org.camunda.bpm.engine.impl.metrics.MetricsQueryImpl; import org.camunda.bpm.engine.impl.metrics.MetricsRegistry; +import org.camunda.bpm.engine.impl.metrics.util.MetricsUtil; import org.camunda.bpm.engine.impl.telemetry.TelemetryRegistry; import org.camunda.bpm.engine.impl.telemetry.dto.LicenseKeyDataImpl; -import org.camunda.bpm.engine.management.ActivityStatisticsQuery; -import org.camunda.bpm.engine.management.DeploymentStatisticsQuery; -import org.camunda.bpm.engine.management.JobDefinitionQuery; -import org.camunda.bpm.engine.management.MetricsQuery; -import org.camunda.bpm.engine.management.ProcessDefinitionStatisticsQuery; -import org.camunda.bpm.engine.management.SchemaLogQuery; -import org.camunda.bpm.engine.management.SetJobRetriesByJobsAsyncBuilder; -import org.camunda.bpm.engine.management.SetJobRetriesByProcessAsyncBuilder; -import org.camunda.bpm.engine.management.TableMetaData; -import org.camunda.bpm.engine.management.TablePageQuery; -import org.camunda.bpm.engine.management.UpdateJobDefinitionSuspensionStateSelectBuilder; -import org.camunda.bpm.engine.management.UpdateJobSuspensionStateSelectBuilder; +import org.camunda.bpm.engine.impl.telemetry.dto.MetricImpl; +import org.camunda.bpm.engine.impl.telemetry.dto.TelemetryDataImpl; +import org.camunda.bpm.engine.management.*; import org.camunda.bpm.engine.runtime.JobQuery; import org.camunda.bpm.engine.runtime.ProcessInstanceQuery; +import org.camunda.bpm.engine.telemetry.Metric; import org.camunda.bpm.engine.telemetry.TelemetryData; @@ -518,6 +507,21 @@ public void deleteMetrics(Date timestamp) { commandExecutor.execute(new DeleteMetricsCmd(timestamp, null)); } + public Number getMetricsSum(String metricsName, Date startDate, Date endDate) { + if (Metrics.UNIQUE_TASK_WORKERS.equals(metricsName) || Metrics.TASK_USERS.equals(metricsName)) { + return getUniqueTaskWorkerCount(startDate, endDate); + } else { + MetricsQuery query = createMetricsQuery().name(metricsName); + if (startDate != null) { + query.startDate(startDate); + } + if (endDate != null) { + query.endDate(endDate); + } + return query.sum(); + } + } + public void deleteMetrics(Date timestamp, String reporter) { commandExecutor.execute(new DeleteMetricsCmd(timestamp, reporter)); @@ -582,8 +586,21 @@ public Boolean isTelemetryEnabled() { } @Override - public TelemetryData getTelemetryData() { - return commandExecutor.execute(new GetTelemetryDataCmd()); + public TelemetryData getTelemetryData(String metricFilter, Date startDate, Date endDate) { + TelemetryDataImpl telemetryData = commandExecutor.execute(new GetTelemetryDataCmd(metricFilter)); + if (startDate != null || endDate != null) { + Map metrics = new HashMap<>(); + Set metricsNeedToReturn = MetricsUtil.METRICS_TO_REPORT; + if (metricFilter != null) + metricsNeedToReturn = Collections.singleton(metricFilter); + + for (String metric : metricsNeedToReturn) { + String metricPublicName = MetricsUtil.resolvePublicName(metric); + metrics.put(metricPublicName, new MetricImpl((long) getMetricsSum(metricPublicName, startDate, endDate))); + } + telemetryData.getProduct().getInternals().setMetrics(metrics); + } + return telemetryData; } /** diff --git a/engine/src/main/java/org/camunda/bpm/engine/impl/cmd/GetTelemetryDataCmd.java b/engine/src/main/java/org/camunda/bpm/engine/impl/cmd/GetTelemetryDataCmd.java index f5bdeddd0f1..ca8dfc30892 100644 --- a/engine/src/main/java/org/camunda/bpm/engine/impl/cmd/GetTelemetryDataCmd.java +++ b/engine/src/main/java/org/camunda/bpm/engine/impl/cmd/GetTelemetryDataCmd.java @@ -26,6 +26,12 @@ public class GetTelemetryDataCmd implements Command { + String metricFilter; + + public GetTelemetryDataCmd(String metricFilter){ + this.metricFilter = metricFilter; + } + ProcessEngineConfigurationImpl configuration; @Override @@ -36,7 +42,7 @@ public TelemetryDataImpl execute(CommandContext commandContext) { TelemetryReporter telemetryReporter = configuration.getTelemetryReporter(); if (telemetryReporter != null) { - return telemetryReporter.getTelemetrySendingTask().updateAndSendData(false, false); + return telemetryReporter.getTelemetrySendingTask().updateAndSendData(false, false, metricFilter); } else { throw ProcessEngineLogger.TELEMETRY_LOGGER.exceptionWhileRetrievingTelemetryDataRegistryNull(); } diff --git a/engine/src/main/java/org/camunda/bpm/engine/impl/metrics/util/MetricsUtil.java b/engine/src/main/java/org/camunda/bpm/engine/impl/metrics/util/MetricsUtil.java index 5880328f5e7..45eef93010b 100644 --- a/engine/src/main/java/org/camunda/bpm/engine/impl/metrics/util/MetricsUtil.java +++ b/engine/src/main/java/org/camunda/bpm/engine/impl/metrics/util/MetricsUtil.java @@ -18,8 +18,20 @@ import org.camunda.bpm.engine.management.Metrics; -public class MetricsUtil { +import java.util.HashSet; +import java.util.Set; + +import static org.camunda.bpm.engine.management.Metrics.*; +import static org.camunda.bpm.engine.management.Metrics.ACTIVTY_INSTANCE_START; +public class MetricsUtil { + public static final Set METRICS_TO_REPORT = new HashSet<>(); + static { + METRICS_TO_REPORT.add(ROOT_PROCESS_INSTANCE_START); + METRICS_TO_REPORT.add(EXECUTED_DECISION_INSTANCES); + METRICS_TO_REPORT.add(EXECUTED_DECISION_ELEMENTS); + METRICS_TO_REPORT.add(ACTIVTY_INSTANCE_START); + } /** * Resolves the internal name of the metric by the public name. * diff --git a/engine/src/main/java/org/camunda/bpm/engine/impl/telemetry/reporter/TelemetrySendingTask.java b/engine/src/main/java/org/camunda/bpm/engine/impl/telemetry/reporter/TelemetrySendingTask.java index 7066f865326..5403a86fa1f 100644 --- a/engine/src/main/java/org/camunda/bpm/engine/impl/telemetry/reporter/TelemetrySendingTask.java +++ b/engine/src/main/java/org/camunda/bpm/engine/impl/telemetry/reporter/TelemetrySendingTask.java @@ -21,17 +21,9 @@ import static org.camunda.bpm.engine.impl.util.ConnectUtil.addRequestTimeoutConfiguration; import static org.camunda.bpm.engine.impl.util.ConnectUtil.assembleRequestParameters; import static org.camunda.bpm.engine.impl.util.StringUtil.hasText; -import static org.camunda.bpm.engine.management.Metrics.ACTIVTY_INSTANCE_START; -import static org.camunda.bpm.engine.management.Metrics.EXECUTED_DECISION_ELEMENTS; -import static org.camunda.bpm.engine.management.Metrics.EXECUTED_DECISION_INSTANCES; -import static org.camunda.bpm.engine.management.Metrics.ROOT_PROCESS_INSTANCE_START; - import java.net.HttpURLConnection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.TimerTask; +import java.util.*; + import org.camunda.bpm.engine.impl.ProcessEngineLogger; import org.camunda.bpm.engine.impl.cmd.IsTelemetryEnabledCmd; import org.camunda.bpm.engine.impl.interceptor.CommandExecutor; @@ -58,17 +50,9 @@ public class TelemetrySendingTask extends TimerTask { - protected static final Set METRICS_TO_REPORT = new HashSet<>(); protected static final TelemetryLogger LOG = ProcessEngineLogger.TELEMETRY_LOGGER; protected static final String UUID4_PATTERN = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}"; - static { - METRICS_TO_REPORT.add(ROOT_PROCESS_INSTANCE_START); - METRICS_TO_REPORT.add(EXECUTED_DECISION_INSTANCES); - METRICS_TO_REPORT.add(EXECUTED_DECISION_ELEMENTS); - METRICS_TO_REPORT.add(ACTIVTY_INSTANCE_START); - } - protected CommandExecutor commandExecutor; protected String telemetryEndpoint; protected TelemetryDataImpl staticData; @@ -107,12 +91,12 @@ public void run() { TelemetryUtil.toggleLocalTelemetry(true, telemetryRegistry, metricsRegistry); - performDataSend(() -> updateAndSendData(true, true)); + performDataSend(() -> updateAndSendData(true, true, null)); } - public TelemetryDataImpl updateAndSendData(boolean sendData, boolean addLegacyNames) { + public TelemetryDataImpl updateAndSendData(boolean sendData, boolean addLegacyNames, String metricFilter) { updateStaticData(); - InternalsImpl dynamicData = resolveDynamicData(sendData, addLegacyNames); + InternalsImpl dynamicData = resolveDynamicData(sendData, addLegacyNames, metricFilter); TelemetryDataImpl mergedData = new TelemetryDataImpl(staticData); mergedData.mergeInternals(dynamicData); @@ -206,17 +190,17 @@ protected void restoreDynamicData(InternalsImpl internals) { if (metricsRegistry != null) { Map metrics = internals.getMetrics(); - for (String metricToReport : METRICS_TO_REPORT) { + for (String metricToReport : MetricsUtil.METRICS_TO_REPORT) { Metric metricValue = metrics.get(metricToReport); metricsRegistry.markTelemetryOccurrence(metricToReport, metricValue.getCount()); } } } - protected InternalsImpl resolveDynamicData(boolean reset, boolean addLegacyNames) { + protected InternalsImpl resolveDynamicData(boolean reset, boolean addLegacyNames, String metricFilter) { InternalsImpl result = new InternalsImpl(); - Map metrics = calculateMetrics(reset, addLegacyNames); + Map metrics = calculateMetrics(reset, addLegacyNames, metricFilter); result.setMetrics(metrics); // command counts are modified after the metrics are retrieved, because @@ -243,14 +227,21 @@ protected Map fetchAndResetCommandCounts(boolean reset) { return commandsToReport; } - protected Map calculateMetrics(boolean reset, boolean addLegacyNames) { + protected Map calculateMetrics(boolean reset, boolean addLegacyNames, String metricFilter) { Map metrics = new HashMap<>(); if (metricsRegistry != null) { Map telemetryMeters = metricsRegistry.getTelemetryMeters(); - for (String metricToReport : METRICS_TO_REPORT) { + Set metricsToReport = MetricsUtil.METRICS_TO_REPORT; + if (metricFilter != null) + metricsToReport = Collections.singleton(MetricsUtil.resolveInternalName(metricFilter)); + + for (String metricToReport : metricsToReport) { + + if (telemetryMeters.get(metricToReport) == null) + continue; long value = telemetryMeters.get(metricToReport).get(reset); if (addLegacyNames) { diff --git a/engine/src/test/java/org/camunda/bpm/engine/test/api/authorization/ManagementAuthorizationTest.java b/engine/src/test/java/org/camunda/bpm/engine/test/api/authorization/ManagementAuthorizationTest.java index f658281da1f..af1605803e9 100644 --- a/engine/src/test/java/org/camunda/bpm/engine/test/api/authorization/ManagementAuthorizationTest.java +++ b/engine/src/test/java/org/camunda/bpm/engine/test/api/authorization/ManagementAuthorizationTest.java @@ -544,7 +544,7 @@ public void shouldGetTelemetryDataAsCamundaAdmin() { identityService.setAuthentication(userId, Collections.singletonList(Groups.CAMUNDA_ADMIN)); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData).isNotNull(); @@ -556,7 +556,7 @@ public void shouldGetTelemetryDataWithPermission() { createGrantAuthorization(Resources.SYSTEM, "*", userId, SystemPermissions.READ); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData).isNotNull(); @@ -569,7 +569,7 @@ public void shouldGetTelemetryDataWithAdminAndPermission() { createGrantAuthorization(Resources.SYSTEM, "*", userId, SystemPermissions.READ); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData).isNotNull(); @@ -582,7 +582,7 @@ public void shouldNotGetTelemetryDataWithoutAdminAndPermission() { assertThatThrownBy(() -> { // when - managementService.getTelemetryData(); + managementService.getTelemetryData(null, null, null); }) // then .hasMessageContaining(permissionException(Resources.SYSTEM, SystemPermissions.READ)); diff --git a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceGetTelemetryDataTest.java b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceGetTelemetryDataTest.java index 2dac291c96a..91d30cef23e 100644 --- a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceGetTelemetryDataTest.java +++ b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceGetTelemetryDataTest.java @@ -107,7 +107,7 @@ public void shouldReturnTelemetryData_TelemetryEnabled() { managementService.toggleTelemetry(true); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData).isNotNull(); @@ -120,7 +120,7 @@ public void shouldReturnTelemetryData_TelemetryDisabled() { managementService.toggleTelemetry(false); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData).isNotNull(); @@ -133,7 +133,7 @@ public void shouldReturnLicenseKey() { managementService.setLicenseKeyForTelemetry(new LicenseKeyDataImpl(null, null, null, null, null, "test license")); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData.getProduct().getInternals().getLicenseKey().getRaw()).isEqualTo("test license"); @@ -146,7 +146,7 @@ public void shouldReturnWebapps() { managementService.addWebappToTelemetry("admin"); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData.getProduct().getInternals().getWebapps()).containsExactlyInAnyOrder("cockpit", "admin"); @@ -158,7 +158,7 @@ public void shouldReturnApplicationServerInfo() { managementService.addApplicationServerInfoToTelemetry("Apache Tomcat/10.0.1"); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then ApplicationServer applicationServer = telemetryData.getProduct().getInternals().getApplicationServer(); @@ -171,7 +171,7 @@ public void shouldStartWithCommandCountZero() { // given default telemetry data and empty telemetry registry // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData.getProduct().getInternals().getCommands()).isEmpty(); @@ -184,8 +184,8 @@ public void shouldNotResetCommandCount() { managementService.isTelemetryEnabled(); // when invoking getter twice - managementService.getTelemetryData(); - TelemetryData telemetryData = managementService.getTelemetryData(); + managementService.getTelemetryData(null, null, null); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then count should not reset assertThat(telemetryData.getProduct().getInternals().getCommands().get(IS_TELEMETRY_ENABLED_CMD_NAME).getCount()).isEqualTo(1); @@ -196,7 +196,7 @@ public void shouldStartWithMetricsCountZero() { // given default telemetry data and empty telemetry registry // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then Map metrics = telemetryData.getProduct().getInternals().getMetrics(); @@ -215,8 +215,8 @@ public void shouldNotResetMetricsCount() { engineRule.getRuntimeService().startProcessInstanceByKey("oneTaskProcess"); // when invoking getter twice - managementService.getTelemetryData(); - TelemetryData telemetryData = managementService.getTelemetryData(); + managementService.getTelemetryData(null, null, null); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then count should not reset assertThat(telemetryData.getProduct().getInternals().getMetrics().get(FLOW_NODE_INSTANCES).getCount()).isEqualTo(2); @@ -232,7 +232,7 @@ public void shouldCollectMetrics_TelemetryEnabled() { engineRule.getRuntimeService().startProcessInstanceByKey("oneTaskProcess"); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData.getProduct().getInternals().getMetrics().get(PROCESS_INSTANCES).getCount()).isEqualTo(1); @@ -247,7 +247,7 @@ public void shouldCollectMetrics_TelemetryDisabled() { engineRule.getRuntimeService().startProcessInstanceByKey("oneTaskProcess"); // when - TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(); + TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryDataAfterPiStart.getProduct().getInternals().getMetrics().get(PROCESS_INSTANCES).getCount()).isEqualTo(1); @@ -263,7 +263,7 @@ public void shouldCollectCommands_TelemetryEnabled() { managementService.isTelemetryEnabled(); // when - TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(); + TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryDataAfterPiStart.getProduct().getInternals().getCommands().get(IS_TELEMETRY_ENABLED_CMD_NAME).getCount()).isEqualTo(1); @@ -279,7 +279,7 @@ public void shouldCollectCommands_TelemetryDisabled() { managementService.isTelemetryEnabled(); // when - TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(); + TelemetryData telemetryDataAfterPiStart = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryDataAfterPiStart.getProduct().getInternals().getCommands().get(IS_TELEMETRY_ENABLED_CMD_NAME).getCount()).isEqualTo(1); @@ -291,7 +291,7 @@ public void shouldThrowExceptionOnNullTelemetryReporter() { configuration.setTelemetryReporter(null); // when - assertThatThrownBy(() -> managementService.getTelemetryData()) + assertThatThrownBy(() -> managementService.getTelemetryData(null, null, null)) .isInstanceOf(ProcessEngineException.class) .hasMessageContaining("Error while retrieving telemetry data. Telemetry registry was not initialized."); } @@ -307,12 +307,12 @@ public void shouldResetCollectedCommandsDataWhenTelemetryEnabled() { managementService.toggleTelemetry(true); // execute commands after telemetry is activated - managementService.getTelemetryData(); - managementService.getTelemetryData(); + managementService.getTelemetryData(null, null, null); + managementService.getTelemetryData(null, null, null); managementService.isTelemetryEnabled(); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then command counts produced before telemetry was enabled should be deleted Map commands = telemetryData.getProduct().getInternals().getCommands(); @@ -338,7 +338,7 @@ public void shouldResetCollectedMetricsDataWhenTelemetryEnabled() { runtimeService.startProcessInstanceByKey("oneTaskProcess"); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then metrics produced before telemetry was enabled should be deleted Map metrics = telemetryData.getProduct().getInternals().getMetrics(); @@ -358,7 +358,7 @@ public void shouldSetDataCollectionTimeFrameToEngineStartTimeWhenTelemetryDisabl ClockUtil.offset(1000L); // when - TelemetryData telemetryData = managementService.getTelemetryData(); + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); // then assertThat(telemetryData.getProduct().getInternals().getDataCollectionStartDate()).isBefore(beforeGetTelemetry); @@ -367,10 +367,10 @@ public void shouldSetDataCollectionTimeFrameToEngineStartTimeWhenTelemetryDisabl @Test public void shouldNotResetCollectionTimeFrameAfterGetTelemetryWhenTelemetryDisabled() { // given default telemetry data and empty telemetry registry - TelemetryData initialTelemetryData = managementService.getTelemetryData(); + TelemetryData initialTelemetryData = managementService.getTelemetryData(null, null, null); // when fetching telemetry data again - TelemetryData secondTelemetryData = managementService.getTelemetryData(); + TelemetryData secondTelemetryData = managementService.getTelemetryData(null, null, null); // then the data collection time frame should not reset after the first call assertThat(initialTelemetryData.getProduct().getInternals().getDataCollectionStartDate()).isEqualTo(secondTelemetryData.getProduct().getInternals().getDataCollectionStartDate()); @@ -379,7 +379,7 @@ public void shouldNotResetCollectionTimeFrameAfterGetTelemetryWhenTelemetryDisab @Test public void shouldResetDataCollectionTimeFrameWhenTelemetryEnabled() { // given the collection date is set at engine startup - Date dataCollectionStartDateBeforeToggle = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date dataCollectionStartDateBeforeToggle = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); // pass at least one second between the two telemetry calls because MySQL has only second precision ClockUtil.offset(1000L); @@ -387,7 +387,7 @@ public void shouldResetDataCollectionTimeFrameWhenTelemetryEnabled() { managementService.toggleTelemetry(true); // then - Date dataCollectionStartDateAfterToggle = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date dataCollectionStartDateAfterToggle = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); assertThat(dataCollectionStartDateBeforeToggle).isBefore(dataCollectionStartDateAfterToggle); } @@ -398,10 +398,10 @@ public void shouldNotResetCollectionTimeFrameAfterGetTelemetryWhenTelemetryEnabl // activate telemetry managementService.toggleTelemetry(true); - TelemetryData initialTelemetryData = managementService.getTelemetryData(); + TelemetryData initialTelemetryData = managementService.getTelemetryData(null, null, null); // when fetching telemetry data again - TelemetryData secondTelemetryData = managementService.getTelemetryData(); + TelemetryData secondTelemetryData = managementService.getTelemetryData(null, null, null); // then the data collection time frame should not reset after the first call assertThat(initialTelemetryData.getProduct().getInternals().getDataCollectionStartDate()).isEqualTo(secondTelemetryData.getProduct().getInternals().getDataCollectionStartDate()); @@ -412,13 +412,13 @@ public void shouldNotResetCollectionTimeFrameAfterToggleTelemetry() { // given default telemetry data and empty telemetry registry // telemetry activated managementService.toggleTelemetry(true); - Date beforeToggleTelemetry = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date beforeToggleTelemetry = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); // when managementService.toggleTelemetry(false); // then - Date afterToggleTelemetry = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date afterToggleTelemetry = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); assertThat(beforeToggleTelemetry).isNotNull(); assertThat(beforeToggleTelemetry).isEqualTo(afterToggleTelemetry); @@ -429,11 +429,11 @@ public void shouldNotResetCollectionTimeFrameOnActivateTelemetryWhenAlreadyActiv // given default telemetry data and empty telemetry registry // telemetry activated managementService.toggleTelemetry(true); - Date beforeToggleTelemetry = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date beforeToggleTelemetry = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); // when managementService.toggleTelemetry(true); - Date afterToggleTelemetry = managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate(); + Date afterToggleTelemetry = managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate(); // then assertThat(beforeToggleTelemetry).isNotNull(); diff --git a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceTest.java b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceTest.java index 7c3c6850346..5c616712f26 100644 --- a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceTest.java +++ b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/ManagementServiceTest.java @@ -31,6 +31,8 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.HashSet; +import java.util.stream.Collectors; import org.camunda.bpm.engine.ProcessEngineException; import org.camunda.bpm.engine.exception.NotFoundException; @@ -43,6 +45,7 @@ import org.camunda.bpm.engine.impl.interceptor.CommandContext; import org.camunda.bpm.engine.impl.interceptor.CommandExecutor; import org.camunda.bpm.engine.impl.jobexecutor.JobExecutor; +import org.camunda.bpm.engine.impl.metrics.util.MetricsUtil; import org.camunda.bpm.engine.impl.persistence.entity.HistoricIncidentEntity; import org.camunda.bpm.engine.impl.persistence.entity.HistoricIncidentManager; import org.camunda.bpm.engine.impl.persistence.entity.JobEntity; @@ -58,6 +61,8 @@ import org.camunda.bpm.engine.runtime.JobQuery; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.task.Task; +import org.camunda.bpm.engine.telemetry.Metric; +import org.camunda.bpm.engine.telemetry.TelemetryData; import org.camunda.bpm.engine.test.Deployment; import org.camunda.bpm.engine.test.util.PluggableProcessEngineTest; import org.junit.After; @@ -1010,6 +1015,58 @@ public void testTelemetryEnabled() { assertThat(managementService.isTelemetryEnabled()).isTrue(); } + @Test + public void returnDefault4MetricsInTelemetry() { + //given + + //when + TelemetryData telemetryData = managementService.getTelemetryData(null, null, null); + + //then + Map metrics = telemetryData.getProduct().getInternals().getMetrics(); + assertThat(metrics.size()).isEqualTo(4); + assertThat(metrics.keySet()).isEqualTo(new HashSet<>(MetricsUtil.METRICS_TO_REPORT.stream().map(MetricsUtil::resolvePublicName).collect(Collectors.toList()))); + } + + @Test + public void returnFilteredMetricsDataInTelemetry() { + //given + + //when + TelemetryData telemetryData = managementService.getTelemetryData("process-instances", null, null); + + //then + Map metrics = telemetryData.getProduct().getInternals().getMetrics(); + assertThat(metrics.size()).isEqualTo(1); + assertThat(metrics.containsKey("process-instances")).isEqualTo(true); + } + + @Test + public void returnDefault4MetricsInTelemetryWithDateFilter() { + //given + + //when + TelemetryData telemetryData = managementService.getTelemetryData(null, new Date(), new Date()); + + //then + Map metrics = telemetryData.getProduct().getInternals().getMetrics(); + assertThat(metrics.size()).isEqualTo(4); + assertThat(metrics.keySet()).isEqualTo(new HashSet<>(MetricsUtil.METRICS_TO_REPORT.stream().map(MetricsUtil::resolvePublicName).collect(Collectors.toList()))); + } + + @Test + public void returnFilteredMetricsDataInTelemetryWithDateFilter() { + //given + + //when + TelemetryData telemetryData = managementService.getTelemetryData("task-users", new Date(), new Date()); + + //then + Map metrics = telemetryData.getProduct().getInternals().getMetrics(); + assertThat(metrics.size()).isEqualTo(1); + assertThat(metrics.containsKey("task-users")).isEqualTo(true); + } + @Test public void testTelemetryDisabled() { // given diff --git a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/telemetry/TelemetryReporterTest.java b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/telemetry/TelemetryReporterTest.java index 7f2f651f8c9..1426be1177c 100644 --- a/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/telemetry/TelemetryReporterTest.java +++ b/engine/src/test/java/org/camunda/bpm/engine/test/api/mgmt/telemetry/TelemetryReporterTest.java @@ -363,7 +363,7 @@ public void shouldSendCompleteTelemetryData() { configuration.getRuntimeService().startProcessInstanceByKey("oneTaskProcess"); // setup - TelemetryDataImpl initialTelemetryData = (TelemetryDataImpl) configuration.getManagementService().getTelemetryData(); + TelemetryDataImpl initialTelemetryData = (TelemetryDataImpl) configuration.getManagementService().getTelemetryData(null, null, null); TelemetryDataImpl expectedData = simpleData(b -> { b.installation(initialTelemetryData.getInstallation()); @@ -1134,7 +1134,7 @@ public void shouldResetDataCollectionTimeFrameAfterSending() { //then verify(postRequestedFor(urlEqualTo(TELEMETRY_ENDPOINT_PATH)) .withHeader("Content-Type", equalTo("application/json"))); - assertThat(managementService.getTelemetryData().getProduct().getInternals().getDataCollectionStartDate()) + assertThat(managementService.getTelemetryData(null, null, null).getProduct().getInternals().getDataCollectionStartDate()) .isAfter(telemetryDataTimeFrameBeforeReported); }