Skip to content

Commit

Permalink
Merge pull request #782 from hawkular/HWKMETRICS-612
Browse files Browse the repository at this point in the history
[HWKMETRICS-612] Add DELETE APIs to all metric types. The API is appl…
  • Loading branch information
jsanda committed Mar 23, 2017
2 parents 3418410 + 1653f85 commit 65cace4
Show file tree
Hide file tree
Showing 13 changed files with 351 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,21 @@ public void getMetric(@Suspended final AsyncResponse asyncResponse, @PathParam("
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(serverError(t)));
}

@DELETE
@Path("/{id}")
@ApiOperation(value = "Deletes the metric and associated uncompressed data points, and updates internal indexes."
+ " Note: compressed data will not be deleted immediately. It is deleted as part of the normal"
+ " data expiration as defined by the data retention settings. Consequently, compressed data will"
+ " be accessible until it automatically expires.")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric deletion was successful."),
@ApiResponse(code = 500, message = "Unexpected error occurred trying to delete the metric.")
})
public void deleteMetric(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) {
MetricId<AvailabilityType> metric = new MetricId<>(getTenant(), AVAILABILITY, id);
metricsService.deleteMetric(metric).subscribe(new ResultSetObserver(asyncResponse));
}

@GET
@Path("/tags/{tags}")
@ApiOperation(value = "Retrieve availability type's tag values", response = Map.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,21 @@ public void getMetric(@Suspended final AsyncResponse asyncResponse, @PathParam("
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(serverError(t)));
}

@DELETE
@Path("/{id}")
@ApiOperation(value = "Deletes the metric and associated uncompressed data points, and updates internal indexes."
+ " Note: compressed data will not be deleted immediately. It is deleted as part of the normal"
+ " data expiration as defined by the data retention settings. Consequently, compressed data will"
+ " be accessible until it automatically expires.")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric deletion was successful."),
@ApiResponse(code = 500, message = "Unexpected error occurred trying to delete the metric.")
})
public void deleteMetric(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) {
MetricId<Long> metric = new MetricId<>(getTenant(), COUNTER, id);
metricsService.deleteMetric(metric).subscribe(new ResultSetObserver(asyncResponse));
}

@GET
@Path("/tags/{tags}")
@ApiOperation(value = "Retrieve counter type's tag values", response = Map.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,21 @@ public void getMetric(@Suspended final AsyncResponse asyncResponse, @PathParam("
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t)));
}

@DELETE
@Path("/{id}")
@ApiOperation(value = "Deletes the metric and associated uncompressed data points, and updates internal indexes."
+ " Note: compressed data will not be deleted immediately. It is deleted as part of the normal"
+ " data expiration as defined by the data retention settings. Consequently, compressed data will"
+ " be accessible until it automatically expires.")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric deletion was successful."),
@ApiResponse(code = 500, message = "Unexpected error occurred trying to delete the metric.")
})
public void deleteMetric(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) {
MetricId<Double> metric = new MetricId<>(getTenant(), GAUGE, id);
metricsService.deleteMetric(metric).subscribe(new ResultSetObserver(asyncResponse));
}

@GET
@Path("/tags/{tags}")
@ApiOperation(value = "Retrieve gauge type's tag values", response = Map.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,21 @@ public void getMetric(@Suspended final AsyncResponse asyncResponse, @PathParam("
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t)));
}

@DELETE
@Path("/{id}")
@ApiOperation(value = "Deletes the metric and associated uncompressed data points, and updates internal indexes."
+ " Note: compressed data will not be deleted immediately. It is deleted as part of the normal"
+ " data expiration as defined by the data retention settings. Consequently, compressed data will"
+ " be accessible until it automatically expires.")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric deletion was successful."),
@ApiResponse(code = 500, message = "Unexpected error occurred trying to delete the metric.")
})
public void deleteMetric(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) {
MetricId<String> metric = new MetricId<>(getTenant(), STRING, id);
metricsService.deleteMetric(metric).subscribe(new ResultSetObserver(asyncResponse));
}

@GET
@Path("/tags/{tags}")
@ApiOperation(value = "Retrieve string type's tag values", response = Map.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public interface IMetricsHandler<T> {

void getMetric(AsyncResponse asyncResponse, String id);

void deleteMetric(AsyncResponse asyncResponse, String id);

//Tags
void getTags(AsyncResponse asyncResponse, Tags tags);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

import org.hawkular.metrics.core.service.compress.CompressedPointContainer;
import org.hawkular.metrics.model.AvailabilityType;
import org.hawkular.metrics.model.Interval;
import org.hawkular.metrics.model.Metric;
import org.hawkular.metrics.model.MetricId;
import org.hawkular.metrics.model.MetricType;
Expand Down Expand Up @@ -104,7 +103,11 @@ Observable<Row> findAvailabilityData(MetricId<AvailabilityType> id, long startTi

Observable<Row> findAvailabilityData(MetricId<AvailabilityType> id, long timestamp);

Observable<ResultSet> deleteGaugeMetric(String tenantId, String metric, Interval interval, long dpart);
<T> Observable<ResultSet> deleteMetricData(MetricId<T> id);

<T> Observable<ResultSet> deleteMetricFromRetentionIndex(MetricId<T> id);

<T> Observable<ResultSet> deleteMetricFromMetricsIndex(MetricId<T> id);

Observable<Integer> insertAvailabilityDatas(Observable<Metric<AvailabilityType>> avail, Function<MetricId,
Integer> ttlFetcher);
Expand All @@ -122,7 +125,7 @@ <T> Observable<ResultSet> updateRetentionsIndex(String tenantId, MetricType<T> t

<T> Observable<ResultSet> insertIntoMetricsTagsIndex(Metric<T> metric, Map<String, String> tags);

<T> Observable<ResultSet> deleteFromMetricsTagsIndex(Metric<T> metric, Map<String, String> tags);
<T> Observable<ResultSet> deleteFromMetricsTagsIndex(MetricId<T> id, Map<String, String> tags);

Observable<Row> findMetricsByTagName(String tenantId, String tag);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import org.hawkular.metrics.core.service.transformers.BoundBatchStatementTransformer;
import org.hawkular.metrics.model.AvailabilityType;
import org.hawkular.metrics.model.DataPoint;
import org.hawkular.metrics.model.Interval;
import org.hawkular.metrics.model.Metric;
import org.hawkular.metrics.model.MetricId;
import org.hawkular.metrics.model.MetricType;
Expand Down Expand Up @@ -175,9 +174,13 @@ public class DataAccessImpl implements DataAccess {

private PreparedStatement findAvailabilityByDateRangeInclusive;

private PreparedStatement deleteGaugeMetric;
private PreparedStatement deleteMetricData;

private PreparedStatement deleteDatapoints;
private PreparedStatement deleteMetricFromRetentionIndex;

private PreparedStatement deleteMetricFromMetricsIndex;

private PreparedStatement deleteMetricDataWithLimit;

private PreparedStatement insertAvailability;

Expand Down Expand Up @@ -471,13 +474,21 @@ protected void initPreparedStatements() {
"SELECT time, availability, WRITETIME(availability) FROM data " +
"WHERE tenant_id = ? AND type = ? AND metric = ? AND dpart = ? AND time >= ? AND time <= ?");

deleteGaugeMetric = session.prepare(
deleteMetricData = session.prepare(
"DELETE FROM data " +
"WHERE tenant_id = ? AND type = ? AND metric = ? AND dpart = ?");

deleteDatapoints = session.prepare(
"DELETE FROM data " +
"WHERE tenant_id = ? AND type = ? AND metric = ? AND dpart = ? AND time >= ? AND time < ?");
deleteMetricDataWithLimit = session.prepare(
"DELETE FROM data " +
"WHERE tenant_id = ? AND type = ? AND metric = ? AND dpart = ? AND time >= ? AND time < ?");

deleteMetricFromRetentionIndex = session.prepare(
"DELETE FROM retentions_idx " +
"WHERE tenant_id = ? AND type = ? AND metric = ?");

deleteMetricFromMetricsIndex = session.prepare(
"DELETE FROM metrics_idx " +
"WHERE tenant_id = ? AND type = ? AND metric = ?");

insertAvailability = session.prepare(
"UPDATE data " +
Expand Down Expand Up @@ -1025,9 +1036,20 @@ public Observable<Row> findAvailabilityData(MetricId<AvailabilityType> id, long
}

@Override
public Observable<ResultSet> deleteGaugeMetric(String tenantId, String metric, Interval interval, long dpart) {
return rxSession.execute(deleteGaugeMetric.bind(tenantId, GAUGE.getCode(), metric,
interval.toString(), dpart));
public <T> Observable<ResultSet> deleteMetricData(MetricId<T> id) {
return rxSession.execute(deleteMetricData.bind(id.getTenantId(), id.getType().getCode(), id.getName(), DPART));
}

@Override
public <T> Observable<ResultSet> deleteMetricFromRetentionIndex(MetricId<T> id) {
return rxSession
.execute(deleteMetricFromRetentionIndex.bind(id.getTenantId(), id.getType().getCode(), id.getName()));
}

@Override
public <T> Observable<ResultSet> deleteMetricFromMetricsIndex(MetricId<T> id) {
return rxSession
.execute(deleteMetricFromMetricsIndex.bind(id.getTenantId(), id.getType().getCode(), id.getName()));
}

private Observable.Transformer<DataPoint<AvailabilityType>, BoundStatement> mapAvailabilityDatapoint(
Expand Down Expand Up @@ -1107,10 +1129,9 @@ public <T> Observable<ResultSet> insertIntoMetricsTagsIndex(Metric<T> metric, Ma
}

@Override
public <T> Observable<ResultSet> deleteFromMetricsTagsIndex(Metric<T> metric, Map<String, String> tags) {
MetricId<T> metricId = metric.getMetricId();
return tagsUpdates(tags, (name, value) -> deleteMetricsTagsIndex.bind(metricId.getTenantId(), name, value,
metricId.getType().getCode(), metricId.getName()));
public <T> Observable<ResultSet> deleteFromMetricsTagsIndex(MetricId<T> id, Map<String, String> tags) {
return tagsUpdates(tags, (name, value) -> deleteMetricsTagsIndex.bind(id.getTenantId(), name, value,
id.getType().getCode(), id.getName()));
}

private Observable<ResultSet> tagsUpdates(Map<String, String> tags,
Expand Down Expand Up @@ -1172,7 +1193,7 @@ public <T> Observable<ResultSet> deleteAndInsertCompressedGauge(MetricId<T> id,
mapper.accept(b, 2);
}

return Observable.just(deleteDatapoints.bind()
return Observable.just(deleteMetricDataWithLimit.bind()
.setString(0, id.getTenantId())
.setByte(1, id.getType().getCode())
.setString(2, id.getName())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ public interface MetricsService {

<T> Observable<Metric<T>> findMetric(MetricId<T> id);

<T> Observable<Void> deleteMetric(MetricId<T> id);

/**
* Returns tenant's metric definitions. The results can be filtered using a type.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,8 @@ public Observable<Void> deleteTags(Metric<?> metric, Set<String> tags) {
})
.flatMap(tagsToDelete -> {
return dataAccess.deleteTags(metric, tagsToDelete.keySet()).mergeWith(
dataAccess.deleteFromMetricsTagsIndex(metric, tagsToDelete)).toList().map(r -> null);
dataAccess.deleteFromMetricsTagsIndex(metric.getMetricId(), tagsToDelete)).toList()
.map(r -> null);
});
}

Expand Down Expand Up @@ -1047,4 +1048,22 @@ private <T> T time(Timer timer, Callable<T> callable) {
throw new RuntimeException("There was an error during a timed event", e);
}
}

@Override
public <T> Observable<Void> deleteMetric(MetricId<T> id) {
Observable<Void> result = dataAccess.getMetricTags(id)
.map(row -> row.getMap(0, String.class, String.class))
.defaultIfEmpty(new HashMap<>())
.flatMap(map -> dataAccess.deleteFromMetricsTagsIndex(id, map))
.toList()
.flatMap(r -> dataAccess.deleteMetricFromMetricsIndex(id))
.flatMap(r -> null);

//NOTE: compressed data is not deleted due to the using TWCS compaction strategy
// for the compressed data table.
result.mergeWith(dataAccess.deleteMetricData(id).flatMap(r -> null));

result.mergeWith(dataAccess.deleteMetricFromRetentionIndex(id).flatMap(r -> null));
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

import org.hawkular.metrics.core.service.compress.CompressedPointContainer;
import org.hawkular.metrics.model.AvailabilityType;
import org.hawkular.metrics.model.Interval;
import org.hawkular.metrics.model.Metric;
import org.hawkular.metrics.model.MetricId;
import org.hawkular.metrics.model.MetricType;
Expand Down Expand Up @@ -192,8 +191,18 @@ public Observable<Row> findAvailabilityData(MetricId<AvailabilityType> id, long
}

@Override
public Observable<ResultSet> deleteGaugeMetric(String tenantId, String metric, Interval interval, long dpart) {
return delegate.deleteGaugeMetric(tenantId, metric, interval, dpart);
public <T> Observable<ResultSet> deleteMetricData(MetricId<T> id) {
return delegate.deleteMetricData(id);
}

@Override
public <T> Observable<ResultSet> deleteMetricFromRetentionIndex(MetricId<T> id) {
return delegate.deleteMetricFromRetentionIndex(id);
}

@Override
public <T> Observable<ResultSet> deleteMetricFromMetricsIndex(MetricId<T> id) {
return delegate.deleteMetricFromMetricsIndex(id);
}

@Override
Expand Down Expand Up @@ -234,8 +243,8 @@ public <T> Observable<ResultSet> insertIntoMetricsTagsIndex(Metric<T> metric, Ma
}

@Override
public <T> Observable<ResultSet> deleteFromMetricsTagsIndex(Metric<T> metric, Map<String, String> tags) {
return delegate.deleteFromMetricsTagsIndex(metric, tags);
public <T> Observable<ResultSet> deleteFromMetricsTagsIndex(MetricId<T> id, Map<String, String> tags) {
return delegate.deleteFromMetricsTagsIndex(id, tags);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 Red Hat, Inc. and/or its affiliates
* Copyright 2014-2017 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
Expand All @@ -23,6 +23,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.IntStream;

Expand Down Expand Up @@ -304,4 +305,8 @@ public InMemoryPercentileWrapper(double percentile) {
return percentileCalculator.getQuantile();
}
}

protected String createRandomId() {
return UUID.randomUUID().toString();
}
}

0 comments on commit 65cace4

Please sign in to comment.