Skip to content

Commit

Permalink
[HWKMETRICS-612] Add DELETE APIs to all metric types. The API is appl…
Browse files Browse the repository at this point in the history
…icable to individual metrics and it removes the metric information from all the indexes (metric, tag, and retention) and all the metric's data points.
  • Loading branch information
Stefan Negrea committed Mar 21, 2017
1 parent 3418410 commit 26ac8ae
Show file tree
Hide file tree
Showing 13 changed files with 334 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,18 @@ 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 data points, and updates internal indexes.")
@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,18 @@ 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 data points, and updates internal indexes.")
@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,18 @@ 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 data points, and updates internal indexes.")
@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,18 @@ 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 data points, and updates internal indexes.")
@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,19 @@ 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);

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 26ac8ae

Please sign in to comment.