Skip to content

Commit

Permalink
[HWKMETRICS-113] Introduce Metric and DataPoint interfaces
Browse files Browse the repository at this point in the history
This commit remove the Metric and MetricData class hierarchies.
There is still refactoring/clean up to do, but this gets rid of those classes
and has all tests passing.
  • Loading branch information
John Sanda committed Jun 1, 2015
1 parent eb6e3fd commit 15904fb
Show file tree
Hide file tree
Showing 37 changed files with 1,493 additions and 1,512 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,22 @@
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;

import org.hawkular.metrics.api.jaxrs.ApiError;
import org.hawkular.metrics.api.jaxrs.handler.observer.MetricCreatedObserver;
import org.hawkular.metrics.api.jaxrs.handler.observer.ResultSetObserver;
import org.hawkular.metrics.api.jaxrs.param.AvailabilityMetric;
import org.hawkular.metrics.api.jaxrs.param.Duration;
import org.hawkular.metrics.api.jaxrs.param.Tags;
import org.hawkular.metrics.api.jaxrs.request.TagRequest;
import org.hawkular.metrics.api.jaxrs.util.ApiUtils;
import org.hawkular.metrics.core.api.Availability;
import org.hawkular.metrics.core.api.AvailabilityData;
import org.hawkular.metrics.core.api.AvailabilityDataPoint;
import org.hawkular.metrics.core.api.BucketedOutput;
import org.hawkular.metrics.core.api.Buckets;
import org.hawkular.metrics.core.api.Metric;
import org.hawkular.metrics.core.api.MetricId;
import org.hawkular.metrics.core.api.MetricType;
import org.hawkular.metrics.core.api.MetricsService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;

/**
Expand All @@ -81,6 +80,8 @@
public class AvailabilityHandler {
private static final long EIGHT_HOURS = MILLISECONDS.convert(8, HOURS);

private static final Logger logger = LoggerFactory.getLogger(AvailabilityHandler.class);

@Inject
private MetricsService metricsService;

Expand All @@ -99,7 +100,7 @@ public class AvailabilityHandler {
response = ApiError.class) })
public void createAvailabilityMetric(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(required = true) Availability metric,
@ApiParam(required = true) AvailabilityMetric metric,
@Context UriInfo uriInfo
) {
if (metric == null) {
Expand All @@ -113,7 +114,7 @@ public void createAvailabilityMetric(

@GET
@Path("/{id}")
@ApiOperation(value = "Retrieve single metric definition.", response = Metric.class)
@ApiOperation(value = "Retrieve single metric definition.", response = AvailabilityMetric.class)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric's definition was successfully retrieved."),
@ApiResponse(code = 204, message = "Query was successful, but no metrics definition is set."),
Expand All @@ -123,10 +124,17 @@ public void getAvailabilityMetric(@Suspended final AsyncResponse asyncResponse,
@HeaderParam("tenantId") String tenantId, @PathParam("id") String id) {

metricsService.findMetric(tenantId, MetricType.AVAILABILITY, new MetricId(id))
.map(metric -> Response.ok(metric).build())
.switchIfEmpty(Observable.just(ApiUtils.noContent()))
.subscribe(
optional -> asyncResponse.resume(ApiUtils.valueToResponse(optional)),
asyncResponse::resume,
t -> asyncResponse.resume(ApiUtils.serverError(t))
);
//
// .subscribe(
// metric -> asyncResponse.resume(Response.ok(metric).build()),
// t -> asyncResponse.resume(ApiUtils.serverError(t))
// );
}

@GET
Expand Down Expand Up @@ -159,7 +167,7 @@ public void updateAvailabilityMetricTags(
@PathParam("id") String id,
@ApiParam(required = true) Map<String, String> tags
) {
Availability metric = new Availability(tenantId, new MetricId(id));
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
metricsService.addTags(metric, tags).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -176,7 +184,7 @@ public void deleteAvailabilityMetricTags(
@PathParam("id") String id,
@ApiParam("Tag list") @PathParam("tags") Tags tags
) {
Availability metric = new Availability(tenantId, new MetricId(id));
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
metricsService.deleteTags(metric, tags.getTags()).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -190,13 +198,13 @@ public void deleteAvailabilityMetricTags(
response = ApiError.class) })
public void addAvailabilityForMetric(
@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id,
@ApiParam(value = "List of availability datapoints", required = true) List<AvailabilityData> data
@ApiParam(value = "List of availability datapoints", required = true) List<AvailabilityDataPoint> data
) {
if (data == null) {
asyncResponse.resume(ApiUtils.emptyPayload());
} else {
Availability metric = new Availability(tenantId, new MetricId(id));
metric.getData().addAll(data);
AvailabilityMetric metric = new AvailabilityMetric(new MetricId(id), data);
metric.setTenantId(tenantId);
metricsService.addAvailabilityData(Collections.singletonList(metric)).subscribe(
new ResultSetObserver(asyncResponse));
}
Expand All @@ -211,7 +219,8 @@ public void addAvailabilityForMetric(
response = ApiError.class) })
public void addAvailabilityData(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(value = "List of availability metrics", required = true) List<Availability> metrics
@ApiParam(value = "List of availability metrics", required = true)
List<AvailabilityMetric> metrics
) {
if (metrics.isEmpty()) {
asyncResponse.resume(Response.ok().build());
Expand Down Expand Up @@ -274,11 +283,16 @@ public void findAvailabilityData(
Long startTime = start == null ? now - EIGHT_HOURS : start;
Long endTime = end == null ? now : end;

Availability metric = new Availability(tenantId, new MetricId(id));
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
if (bucketsCount == null && bucketDuration == null) {
metricsService.findAvailabilityData(tenantId, metric.getId(), startTime, endTime, distinct).toList()
.map(ApiUtils::collectionToResponse)
.subscribe(r -> asyncResponse.resume(r), t -> ApiUtils.serverError(t));
.subscribe(
asyncResponse::resume,
t -> {
logger.warn("Failed to fetch availability data", t);
ApiUtils.serverError(t);
});
} else if (bucketsCount != null && bucketDuration != null) {
asyncResponse.resume(badRequest(new ApiError("Both buckets and bucketDuration parameters are used")));
} else {
Expand Down Expand Up @@ -311,7 +325,7 @@ public void tagAvailabilityData(
@ApiParam(required = true) TagRequest params
) {
Observable<Void> resultSetObservable;
Availability metric = new Availability(tenantId, new MetricId(id));
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
if (params.getTimestamp() != null) {
resultSetObservable = metricsService.tagAvailabilityData(metric, params.getTags(), params.getTimestamp());
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,30 +45,25 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import com.google.common.util.concurrent.ListenableFuture;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;

import org.hawkular.metrics.api.jaxrs.ApiError;
import org.hawkular.metrics.api.jaxrs.handler.observer.MetricCreatedObserver;
import org.hawkular.metrics.api.jaxrs.handler.observer.ResultSetObserver;
import org.hawkular.metrics.api.jaxrs.param.Duration;
import org.hawkular.metrics.api.jaxrs.param.GaugeMetric;
import org.hawkular.metrics.api.jaxrs.param.Tags;
import org.hawkular.metrics.api.jaxrs.request.TagRequest;
import org.hawkular.metrics.api.jaxrs.util.ApiUtils;
import org.hawkular.metrics.core.api.BucketedOutput;
import org.hawkular.metrics.core.api.Buckets;
import org.hawkular.metrics.core.api.Gauge;
import org.hawkular.metrics.core.api.GaugeBucketDataPoint;
import org.hawkular.metrics.core.api.GaugeData;
import org.hawkular.metrics.core.api.Metric;
import org.hawkular.metrics.core.api.GaugeDataPoint;
import org.hawkular.metrics.core.api.MetricId;
import org.hawkular.metrics.core.api.MetricType;
import org.hawkular.metrics.core.api.MetricsService;

import rx.Observable;

/**
Expand Down Expand Up @@ -102,7 +97,7 @@ public class GaugeHandler {
response = ApiError.class) })
public void createGaugeMetric(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(required = true) Gauge metric,
@ApiParam(required = true) GaugeMetric metric,
@Context UriInfo uriInfo
) {
if (metric == null) {
Expand All @@ -116,7 +111,7 @@ public void createGaugeMetric(

@GET
@Path("/{id}")
@ApiOperation(value = "Retrieve single metric definition.", response = Metric.class)
@ApiOperation(value = "Retrieve single metric definition.", response = GaugeMetric.class)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Metric's definition was successfully retrieved."),
@ApiResponse(code = 204, message = "Query was successful, but no metrics definition is set."),
Expand All @@ -125,8 +120,10 @@ public void createGaugeMetric(
public void getGaugeMetric(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) {

metricsService.findMetric(tenantId, MetricType.GAUGE, new MetricId(id))
.map(metric -> Response.ok(metric).build())
.switchIfEmpty(Observable.just(ApiUtils.noContent()))
.subscribe(
optional -> asyncResponse.resume(ApiUtils.valueToResponse(optional)),
asyncResponse::resume,
t -> asyncResponse.resume(ApiUtils.serverError(t))
);
}
Expand Down Expand Up @@ -163,7 +160,8 @@ public void updateGaugeMetricTags(
@PathParam("id") String id,
@ApiParam(required = true) Map<String, String> tags
) {
Gauge metric = new Gauge(tenantId, new MetricId(id));
GaugeMetric metric = new GaugeMetric(new MetricId(id));
metric.setTenantId(tenantId);
metricsService.addTags(metric, tags).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -180,7 +178,8 @@ public void deleteGaugeMetricTags(
@PathParam("id") String id,
@ApiParam("Tag list") @PathParam("tags") Tags tags
) {
Gauge metric = new Gauge(tenantId, new MetricId(id));
GaugeMetric metric = new GaugeMetric(new MetricId(id));
metric.setTenantId(tenantId);
metricsService.deleteTags(metric, tags.getTags()).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -196,13 +195,13 @@ public void addDataForMetric(
@Suspended final AsyncResponse asyncResponse,
@PathParam("id") String id,
@ApiParam(value = "List of datapoints containing timestamp and value", required = true)
List<GaugeData> data
List<GaugeDataPoint> data
) {
if (data.isEmpty()) {
asyncResponse.resume(emptyPayload());
} else {
Gauge metric = new Gauge(tenantId, new MetricId(id));
metric.getData().addAll(data);
GaugeMetric metric = new GaugeMetric(new MetricId(id), data);
metric.setTenantId(tenantId);
Observable<Void> observable = metricsService.addGaugeData(Observable.just(metric));
observable.subscribe(new ResultSetObserver(asyncResponse));
}
Expand All @@ -216,7 +215,7 @@ public void addDataForMetric(
@ApiResponse(code = 500, message = "Unexpected error happened while storing the data",
response = ApiError.class) })
public void addGaugeData(@Suspended final AsyncResponse asyncResponse,
@ApiParam(value = "List of metrics", required = true) List<Gauge> metrics) {
@ApiParam(value = "List of metrics", required = true) List<GaugeMetric> metrics) {

if (metrics.isEmpty()) {
asyncResponse.resume(emptyPayload());
Expand Down Expand Up @@ -293,7 +292,8 @@ public void findGaugeData(
long startTime = start == null ? now - EIGHT_HOURS : start;
long endTime = end == null ? now : end;

Gauge metric = new Gauge(tenantId, new MetricId(id));
GaugeMetric metric = new GaugeMetric(new MetricId(id));
metric.setTenantId(tenantId);

Buckets buckets;
try {
Expand All @@ -307,9 +307,8 @@ public void findGaugeData(
return;
}

ListenableFuture<BucketedOutput<GaugeBucketDataPoint>> dataFuture;
metricsService.findGaugeStats(metric, startTime, endTime, buckets)
.map(BucketedOutput<GaugeBucketDataPoint>::getData)
.map(BucketedOutput::getData)
.map(ApiUtils::collectionToResponse)
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t)));
}
Expand Down Expand Up @@ -414,7 +413,8 @@ public void tagGaugeData(
@PathParam("id") final String id, @ApiParam(required = true) TagRequest params
) {
Observable<Void> resultSetObservable;
Gauge metric = new Gauge(tenantId, new MetricId(id));
GaugeMetric metric = new GaugeMetric(new MetricId(id));
metric.setTenantId(tenantId);
if (params.getTimestamp() != null) {
resultSetObservable = metricsService.tagGaugeData(metric, params.getTags(), params.getTimestamp());
} else {
Expand Down

0 comments on commit 15904fb

Please sign in to comment.