Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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" : {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -44,5 +46,5 @@ public interface TelemetryRestService {
@GET
@Path("/data")
@Produces(MediaType.APPLICATION_JSON)
TelemetryDataDto getTelemetryData();
TelemetryDataDto getTelemetryData(@Context UriInfo uriInfo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;


/**
Expand All @@ -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<String, String> 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<String, String> queryParameters, DateConverter dateConverter) {
if(queryParameters.getFirst("endDate") != null) {
return dateConverter.convertQueryParameterToType(queryParameters.getFirst("endDate"));
}
return null;
}

protected Date extractStartDate(MultivaluedMap<String, String> queryParameters, DateConverter dateConverter) {
if(queryParameters.getFirst("startDate") != null) {
return dateConverter.convertQueryParameterToType(queryParameters.getFirst("startDate"));
}
return null;
}

}
Original file line number Diff line number Diff line change
@@ -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<String, String> queryParameters, DateConverter dateConverter) {
if(queryParameters.getFirst("endDate") != null) {
return dateConverter.convertQueryParameterToType(queryParameters.getFirst("endDate"));
}
return null;
}

public static Date extractStartDate(MultivaluedMap<String, String> queryParameters, DateConverter dateConverter) {
if(queryParameters.getFirst("startDate") != null) {
return dateConverter.convertQueryParameterToType(queryParameters.getFirst("startDate"));
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -225,7 +226,7 @@ public void shouldGetTelemetryData() throws JsonProcessingException {
.when()
.get(TELEMETRY_DATA_URL);

verify(managementServiceMock).getTelemetryData();
verify(managementServiceMock).getTelemetryData(null, null, null);
}

@Test
Expand All @@ -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())
Expand All @@ -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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -1304,6 +1304,16 @@ Batch setJobRetriesAsync (List<String> 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
Expand Down Expand Up @@ -1450,6 +1460,6 @@ Batch setJobRetriesAsync (List<String> processInstanceIds,
*
* @see <a href="https://docs.camunda.org/manual/latest/introduction/telemetry/#collected-data">Camunda Documentation: Telemetry</a>
*/
TelemetryData getTelemetryData();
TelemetryData getTelemetryData(String metricFilter, Date startDate, Date endDate);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;


Expand Down Expand Up @@ -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));

Expand Down Expand Up @@ -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<String, Metric> metrics = new HashMap<>();
Set<String> 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;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@

public class GetTelemetryDataCmd implements Command<TelemetryDataImpl> {

String metricFilter;

public GetTelemetryDataCmd(String metricFilter){
this.metricFilter = metricFilter;
}

ProcessEngineConfigurationImpl configuration;

@Override
Expand All @@ -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();
}
Expand Down
Loading