Skip to content

Commit

Permalink
[HWKMETRICS-113] remove jackson deps from core-api and make Metric co…
Browse files Browse the repository at this point in the history
…ncrete

Jackson depends are now gone from metrics-core and are only in the REST API. I
also decided to change Metric from an interface to a concrete type. I am not
sure that there is much to be gained from having it as an interface.
  • Loading branch information
John Sanda committed Jun 4, 2015
1 parent c2a4b76 commit 13cfcf3
Show file tree
Hide file tree
Showing 31 changed files with 525 additions and 467 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@

import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.stream.Collectors.toList;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.hawkular.metrics.api.jaxrs.filter.TenantFilter.TENANT_HEADER_NAME;
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.badRequest;
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.emptyPayload;
import static org.hawkular.metrics.core.api.MetricType.AVAILABILITY;

import java.net.URI;
import java.util.Collections;
Expand Down Expand Up @@ -54,16 +56,17 @@
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.Availability;
import org.hawkular.metrics.api.jaxrs.param.Duration;
import org.hawkular.metrics.api.jaxrs.param.MetricDefinition;
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.AvailabilityDataPoint;
import org.hawkular.metrics.core.api.BucketedOutput;
import org.hawkular.metrics.core.api.Buckets;
import org.hawkular.metrics.core.api.MetricId;
import org.hawkular.metrics.core.api.MetricType;
import org.hawkular.metrics.core.api.Metric;
import org.hawkular.metrics.core.api.MetricsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -100,21 +103,23 @@ public class AvailabilityHandler {
response = ApiError.class) })
public void createAvailabilityMetric(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(required = true) AvailabilityMetric metric,
@ApiParam(required = true) MetricDefinition metricDefinition,
@Context UriInfo uriInfo
) {
if (metric == null) {
if (metricDefinition == null) {
asyncResponse.resume(emptyPayload());
return;
}
metric.setTenantId(tenantId);
URI location = uriInfo.getBaseUriBuilder().path("/availability/{id}").build(metric.getId().getName());

URI location = uriInfo.getBaseUriBuilder().path("/availability/{id}").build(metricDefinition.getId());
Metric metric = new Metric(tenantId, AVAILABILITY, new MetricId(metricDefinition.getId()),
metricDefinition.getTags(), metricDefinition.getDataRetention());
metricsService.createMetric(metric).subscribe(new MetricCreatedObserver(asyncResponse, location));
}

@GET
@Path("/{id}")
@ApiOperation(value = "Retrieve single metric definition.", response = AvailabilityMetric.class)
@ApiOperation(value = "Retrieve single metric definition.", response = MetricDefinition.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,12 +128,11 @@ public void createAvailabilityMetric(
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())
metricsService.findMetric(tenantId, AVAILABILITY, new MetricId(id))
.map(MetricDefinition::new)
.map(metricDef -> Response.ok(metricDef).build())
.switchIfEmpty(Observable.just(ApiUtils.noContent()))
.subscribe(
asyncResponse::resume,
t -> asyncResponse.resume(ApiUtils.serverError(t))
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t))
);
}

Expand All @@ -145,7 +149,7 @@ public void getAvailabilityMetricTags(
@Suspended final AsyncResponse asyncResponse,
@PathParam("id") String id
) {
metricsService.getMetricTags(tenantId, MetricType.AVAILABILITY, new MetricId(id)).subscribe(
metricsService.getMetricTags(tenantId, AVAILABILITY, new MetricId(id)).subscribe(
optional -> asyncResponse.resume(ApiUtils.valueToResponse(optional)),
t -> asyncResponse.resume(ApiUtils.serverError(t)));
}
Expand All @@ -162,7 +166,7 @@ public void updateAvailabilityMetricTags(
@PathParam("id") String id,
@ApiParam(required = true) Map<String, String> tags
) {
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
Metric<AvailabilityDataPoint> metric = new Metric<>(tenantId, AVAILABILITY, new MetricId(id));
metricsService.addTags(metric, tags).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -179,7 +183,7 @@ public void deleteAvailabilityMetricTags(
@PathParam("id") String id,
@ApiParam("Tag list") @PathParam("tags") Tags tags
) {
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
Metric<AvailabilityDataPoint> metric = new Metric<>(tenantId, AVAILABILITY, new MetricId(id));
metricsService.deleteTags(metric, tags.getTags()).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -198,8 +202,8 @@ public void addAvailabilityForMetric(
if (data == null) {
asyncResponse.resume(ApiUtils.emptyPayload());
} else {
AvailabilityMetric metric = new AvailabilityMetric(new MetricId(id), data);
metric.setTenantId(tenantId);
Metric<AvailabilityDataPoint> metric = new Metric<>(tenantId,
AVAILABILITY, new MetricId(id), data);
metricsService.addAvailabilityData(Collections.singletonList(metric)).subscribe(
new ResultSetObserver(asyncResponse));
}
Expand All @@ -215,12 +219,15 @@ public void addAvailabilityForMetric(
public void addAvailabilityData(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(value = "List of availability metrics", required = true)
List<AvailabilityMetric> metrics
List<Availability> availabilities
) {
if (metrics.isEmpty()) {
if (availabilities.isEmpty()) {
asyncResponse.resume(Response.ok().build());
} else {
metrics.forEach(m -> m.setTenantId(tenantId));
List<Metric<AvailabilityDataPoint>> metrics = availabilities.stream().map(availability ->
new Metric<>(tenantId, AVAILABILITY, new MetricId(availability.getId()),
availability.getData()))
.collect(toList());
metricsService.addAvailabilityData(metrics).subscribe(new ResultSetObserver(asyncResponse));
}
}
Expand Down Expand Up @@ -278,7 +285,7 @@ public void findAvailabilityData(
Long startTime = start == null ? now - EIGHT_HOURS : start;
Long endTime = end == null ? now : end;

AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
Metric<AvailabilityDataPoint> metric = new Metric<>(tenantId, AVAILABILITY, new MetricId(id));
if (bucketsCount == null && bucketDuration == null) {
metricsService.findAvailabilityData(tenantId, metric.getId(), startTime, endTime, distinct).toList()
.map(ApiUtils::collectionToResponse)
Expand Down Expand Up @@ -306,7 +313,7 @@ public void findAvailabilityData(
metricsService.findAvailabilityStats(metric, startTime, endTime, buckets).map(
BucketedOutput::getData)
.map(ApiUtils::collectionToResponse)
.subscribe(r -> asyncResponse.resume(r), t -> ApiUtils.serverError(t));
.subscribe(asyncResponse::resume, ApiUtils::serverError);
}
}

Expand All @@ -320,7 +327,7 @@ public void tagAvailabilityData(
@ApiParam(required = true) TagRequest params
) {
Observable<Void> resultSetObservable;
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
Metric<AvailabilityDataPoint> metric = new Metric<>(tenantId, AVAILABILITY, 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 @@ -18,10 +18,12 @@

import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.stream.Collectors.toList;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.hawkular.metrics.api.jaxrs.filter.TenantFilter.TENANT_HEADER_NAME;
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.badRequest;
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.emptyPayload;
import static org.hawkular.metrics.core.api.MetricType.GAUGE;

import java.net.URI;
import java.util.List;
Expand Down Expand Up @@ -54,15 +56,16 @@
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.Gauge;
import org.hawkular.metrics.api.jaxrs.param.MetricDefinition;
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.GaugeDataPoint;
import org.hawkular.metrics.core.api.MetricId;
import org.hawkular.metrics.core.api.MetricType;
import org.hawkular.metrics.core.api.Metric;
import org.hawkular.metrics.core.api.MetricsService;
import rx.Observable;

Expand Down Expand Up @@ -97,35 +100,34 @@ public class GaugeHandler {
response = ApiError.class) })
public void createGaugeMetric(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(required = true) GaugeMetric metric,
@ApiParam(required = true) MetricDefinition metricDefinition,
@Context UriInfo uriInfo
) {
if (metric == null) {
if (metricDefinition == null) {
asyncResponse.resume(emptyPayload());
return;
}
metric.setTenantId(tenantId);
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(metricDefinition.getId()),
metricDefinition.getTags(), metricDefinition.getDataRetention());
URI location = uriInfo.getBaseUriBuilder().path("/gauges/{id}").build(metric.getId().getName());
metricsService.createMetric(metric).subscribe(new MetricCreatedObserver(asyncResponse, location));
}

@GET
@Path("/{id}")
@ApiOperation(value = "Retrieve single metric definition.", response = GaugeMetric.class)
@ApiOperation(value = "Retrieve single metric definition.", response = MetricDefinition.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."),
@ApiResponse(code = 500, message = "Unexpected error occurred while fetching metric's definition.",
response = ApiError.class) })
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())
metricsService.findMetric(tenantId, GAUGE, new MetricId(id))
.map(MetricDefinition::new)
.map(metricDef -> Response.ok(metricDef).build())
.switchIfEmpty(Observable.just(ApiUtils.noContent()))
.subscribe(
asyncResponse::resume,
t -> asyncResponse.resume(ApiUtils.serverError(t))
);
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t)));
}

@GET
Expand All @@ -141,7 +143,7 @@ public void getGaugeMetricTags(
@Suspended final AsyncResponse asyncResponse,
@PathParam("id") String id
) {
metricsService.getMetricTags(tenantId, MetricType.GAUGE, new MetricId(id))
metricsService.getMetricTags(tenantId, GAUGE, new MetricId(id))
.subscribe(
optional -> asyncResponse.resume(ApiUtils.valueToResponse(optional)),
t ->asyncResponse.resume(ApiUtils.serverError(t))
Expand All @@ -160,7 +162,7 @@ public void updateGaugeMetricTags(
@PathParam("id") String id,
@ApiParam(required = true) Map<String, String> tags
) {
GaugeMetric metric = new GaugeMetric(tenantId, new MetricId(id));
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(id));
metricsService.addTags(metric, tags).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -177,7 +179,7 @@ public void deleteGaugeMetricTags(
@PathParam("id") String id,
@ApiParam("Tag list") @PathParam("tags") Tags tags
) {
GaugeMetric metric = new GaugeMetric(tenantId, new MetricId(id));
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(id));
metricsService.deleteTags(metric, tags.getTags()).subscribe(new ResultSetObserver(asyncResponse));
}

Expand All @@ -198,8 +200,7 @@ public void addDataForMetric(
if (data.isEmpty()) {
asyncResponse.resume(emptyPayload());
} else {
GaugeMetric metric = new GaugeMetric(new MetricId(id), data);
metric.setTenantId(tenantId);
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(id), data);
Observable<Void> observable = metricsService.addGaugeData(Observable.just(metric));
observable.subscribe(new ResultSetObserver(asyncResponse));
}
Expand All @@ -213,12 +214,14 @@ 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<GaugeMetric> metrics) {
@ApiParam(value = "List of metrics", required = true) List<Gauge> gauges) {

if (metrics.isEmpty()) {
if (gauges.isEmpty()) {
asyncResponse.resume(emptyPayload());
} else {
metrics.forEach(m -> m.setTenantId(tenantId));
List<Metric<GaugeDataPoint>> metrics = gauges.stream().map(gauge ->
new Metric<>(tenantId, GAUGE, new MetricId(gauge.getId()), gauge.getData()))
.collect(toList());
Observable<Void> observable = metricsService.addGaugeData(Observable.from(metrics));
observable.subscribe(new ResultSetObserver(asyncResponse));
}
Expand Down Expand Up @@ -290,7 +293,7 @@ public void findGaugeData(
long startTime = start == null ? now - EIGHT_HOURS : start;
long endTime = end == null ? now : end;

GaugeMetric metric = new GaugeMetric(tenantId, new MetricId(id));
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(id));

Buckets buckets;
try {
Expand Down Expand Up @@ -410,7 +413,7 @@ public void tagGaugeData(
@PathParam("id") final String id, @ApiParam(required = true) TagRequest params
) {
Observable<Void> resultSetObservable;
GaugeMetric metric = new GaugeMetric(tenantId, new MetricId(id));
Metric<GaugeDataPoint> metric = new Metric<>(tenantId, GAUGE, new MetricId(id));
if (params.getTimestamp() != null) {
resultSetObservable = metricsService.tagGaugeData(metric, params.getTags(), params.getTimestamp());
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
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.param.MetricDefinition;
import org.hawkular.metrics.api.jaxrs.request.MixedMetricsRequest;
import org.hawkular.metrics.api.jaxrs.util.ApiUtils;
import org.hawkular.metrics.core.api.MetricType;
Expand Down Expand Up @@ -82,6 +83,7 @@ public void findMetrics(

try {
metricsService.findMetrics(tenantId, MetricType.fromTextCode(type))
.map(MetricDefinition::new)
.toList()
.map(ApiUtils::collectionToResponse)
.subscribe(asyncResponse::resume, t -> asyncResponse.resume(ApiUtils.serverError(t)));
Expand Down Expand Up @@ -112,23 +114,23 @@ public void addMetricsData(

List<ListenableFuture<Void>> simpleFuturesList = new ArrayList<>();

if (metricsRequest.getGaugeMetrics() != null && !metricsRequest.getGaugeMetrics().isEmpty()) {
metricsRequest.getGaugeMetrics().forEach(m -> m.setTenantId(tenantId));
// TODO This needs to be fix - this needs to refactored..
// Temporarily commented out to get it to compile as we midst of updating MetricsService
// to use rx.Observable instead of ListenableFuture

// Observable<Void> voidObservable = metricsService.addGaugeData(Observable.
// from(metricsRequest.getGaugeMetrics()));
// simpleFuturesList.add(metricsService.addGaugeData(metricsRequest.getGaugeMetrics()));
}

if (metricsRequest.getAvailabilityMetrics() != null && !metricsRequest.getAvailabilityMetrics().isEmpty()) {
metricsRequest.getAvailabilityMetrics().forEach(m -> m.setTenantId(tenantId));
metricsService.addAvailabilityData(metricsRequest.getAvailabilityMetrics())
.subscribe(r -> asyncResponse.resume(Response.ok().build()),
t -> asyncResponse.resume(ApiUtils.serverError(t)));
}
// if (metricsRequest.getGaugeMetrics() != null && !metricsRequest.getGaugeMetrics().isEmpty()) {
// metricsRequest.getGaugeMetrics().forEach(m -> m.setTenantId(tenantId));
// // TODO This needs to be fix - this needs to refactored..
// // Temporarily commented out to get it to compile as we midst of updating MetricsService
// // to use rx.Observable instead of ListenableFuture
//
// // Observable<Void> voidObservable = metricsService.addGaugeData(Observable.
// // from(metricsRequest.getGaugeMetrics()));
// // simpleFuturesList.add(metricsService.addGaugeData(metricsRequest.getGaugeMetrics()));
// }
//
// if (metricsRequest.getAvailabilityMetrics() != null && !metricsRequest.getAvailabilityMetrics().isEmpty()) {
// metricsRequest.getAvailabilityMetrics().forEach(m -> m.setTenantId(tenantId));
// metricsService.addAvailabilityData(metricsRequest.getAvailabilityMetrics())
// .subscribe(r -> asyncResponse.resume(Response.ok().build()),
// t -> asyncResponse.resume(ApiUtils.serverError(t)));
// }

return Futures.transform(Futures.successfulAsList(simpleFuturesList), ApiUtils.MAP_LIST_VOID);
});
Expand Down

0 comments on commit 13cfcf3

Please sign in to comment.