Index: src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java (working copy) @@ -63,10 +63,13 @@ this.tableResource = tableResource; } - static void delete(final String id) { + static boolean delete(final String id) { ScannerInstanceResource instance = scanners.remove(id); if (instance != null) { instance.generator.close(); + return true; + } else { + return false; } } @@ -94,16 +97,20 @@ } UriBuilder builder = uriInfo.getAbsolutePathBuilder(); URI uri = builder.path(id).build(); + servlet.getMetrics().incrementSucessfulPutRequests(1); return Response.created(uri).build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedPutRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } catch (RuntimeException e) { + servlet.getMetrics().incrementFailedPutRequests(1); if (e.getCause() instanceof TableNotFoundException) { throw new WebApplicationException(e, Response.Status.NOT_FOUND); } throw new WebApplicationException(e, Response.Status.BAD_REQUEST); } catch (Exception e) { + servlet.getMetrics().incrementFailedPutRequests(1); throw new WebApplicationException(e, Response.Status.BAD_REQUEST); } } @@ -133,7 +140,10 @@ final @PathParam("scanner") String id) { ScannerInstanceResource instance = scanners.get(id); if (instance == null) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(Response.Status.NOT_FOUND); + } else { + servlet.getMetrics().incrementSucessfulGetRequests(1); } return instance; } Index: src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java (working copy) @@ -96,10 +96,13 @@ ResponseBuilder response = Response.ok(new TableSchemaModel(getTableSchema())); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (TableNotFoundException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(Response.Status.NOT_FOUND); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } @@ -126,8 +129,10 @@ admin.disableTable(name); admin.modifyTable(name, htd); admin.enableTable(name); + servlet.getMetrics().incrementSucessfulPutRequests(1); } else try { admin.createTable(htd); + servlet.getMetrics().incrementSucessfulPutRequests(1); } catch (TableExistsException e) { // race, someone else created a table with the same name throw new WebApplicationException(e, Response.Status.NOT_MODIFIED); @@ -165,6 +170,7 @@ } finally { admin.enableTable(tableResource.getName()); } + servlet.getMetrics().incrementSucessfulPutRequests(1); return Response.ok().build(); } catch (IOException e) { throw new WebApplicationException(e, @@ -183,6 +189,7 @@ return update(name, model, uriInfo, admin); } } catch (IOException e) { + servlet.getMetrics().incrementFailedPutRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } @@ -229,10 +236,13 @@ throw new IOException("could not disable table"); } admin.deleteTable(tableResource.getName()); + servlet.getMetrics().incrementSucessfulDeleteRequests(1); return Response.ok().build(); } catch (TableNotFoundException e) { + servlet.getMetrics().incrementFailedDeleteRequests(1); throw new WebApplicationException(Response.Status.NOT_FOUND); } catch (IOException e) { + servlet.getMetrics().incrementFailedDeleteRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/RegionsResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/RegionsResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/RegionsResource.java (working copy) @@ -100,10 +100,13 @@ } ResponseBuilder response = Response.ok(model); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (TableNotFoundException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(Response.Status.NOT_FOUND); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/RowResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/RowResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/RowResource.java (working copy) @@ -105,8 +105,10 @@ value = generator.next(); } while (value != null); model.addRow(rowModel); + servlet.getMetrics().incrementSucessfulGetRequests(1); return Response.ok(model).build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } @@ -133,8 +135,10 @@ KeyValue value = generator.next(); ResponseBuilder response = Response.ok(value.getValue()); response.header("X-Timestamp", value.getTimestamp()); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } @@ -186,8 +190,10 @@ table.put(puts); table.flushCommits(); ResponseBuilder response = Response.ok(); + servlet.getMetrics().incrementSucessfulPutRequests(1); return response.build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedPutRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } finally { @@ -246,8 +252,10 @@ if (LOG.isDebugEnabled()) { LOG.debug("PUT " + put.toString()); } + servlet.getMetrics().incrementSucessfulPutRequests(1); return Response.ok().build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedPutRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } finally { @@ -338,10 +346,12 @@ try { table = pool.getTable(tableResource.getName()); table.delete(delete); + servlet.getMetrics().incrementSucessfulDeleteRequests(1); if (LOG.isDebugEnabled()) { LOG.debug("DELETE " + delete.toString()); } } catch (IOException e) { + servlet.getMetrics().incrementFailedDeleteRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } finally { Index: src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java (working copy) @@ -93,8 +93,10 @@ } ResponseBuilder response = Response.ok(model); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java (working copy) @@ -69,8 +69,10 @@ model.setVersion(admin.getClusterStatus().getHBaseVersion()); ResponseBuilder response = Response.ok(model); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/metrics/RESTMetrics.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/metrics/RESTMetrics.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/metrics/RESTMetrics.java (working copy) @@ -35,6 +35,19 @@ private final RESTStatistics restStatistics; private MetricsRate requests = new MetricsRate("requests", registry); + private MetricsRate sucessfulGetCount = + new MetricsRate("sucessful.get.count", registry); + private MetricsRate sucessfulPutCount = + new MetricsRate("sucessful.put.count", registry); + private MetricsRate sucessfulDeleteCount = + new MetricsRate("sucessful.delete.count", registry); + + private MetricsRate failedGetCount = + new MetricsRate("failed.get.count", registry); + private MetricsRate failedPutCount = + new MetricsRate("failed.put.count", registry); + private MetricsRate failedDeleteCount = + new MetricsRate("failed.delete.count", registry); public RESTMetrics() { MetricsContext context = MetricsUtil.getContext("rest"); @@ -62,6 +75,12 @@ public void doUpdates(MetricsContext unused) { synchronized (this) { requests.pushMetric(metricsRecord); + sucessfulGetCount.pushMetric(metricsRecord); + sucessfulPutCount.pushMetric(metricsRecord); + sucessfulDeleteCount.pushMetric(metricsRecord); + failedGetCount.pushMetric(metricsRecord); + failedPutCount.pushMetric(metricsRecord); + failedDeleteCount.pushMetric(metricsRecord); } this.metricsRecord.update(); } @@ -83,5 +102,89 @@ public void incrementRequests(final int inc) { requests.inc(inc); } + + /** + * @return Count of sucessfulGetCount. + */ + public float getSucessfulGetCount() { + return sucessfulGetCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to sucessfulGetCount. + */ + public void incrementSucessfulGetRequests(final int inc) { + sucessfulGetCount.inc(inc); + } + + /** + * @return Count of sucessfulGetCount. + */ + public float getSucessfulPutCount() { + return sucessfulPutCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to sucessfulPutCount. + */ + public void incrementSucessfulPutRequests(final int inc) { + sucessfulPutCount.inc(inc); + } + + /** + * @return Count of failedPutCount. + */ + public float getFailedPutCount() { + return failedPutCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to failedPutCount. + */ + public void incrementFailedPutRequests(final int inc) { + failedPutCount.inc(inc); + } + + /** + * @return Count of failedGetCount. + */ + public float getFailedGetCount() { + return failedGetCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to failedGetCount. + */ + public void incrementFailedGetRequests(final int inc) { + failedGetCount.inc(inc); + } + + /** + * @return Count of sucessfulGetCount. + */ + public float getSucessfulDeleteCount() { + return sucessfulDeleteCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to sucessfulDeleteCount. + */ + public void incrementSucessfulDeleteRequests(final int inc) { + sucessfulDeleteCount.inc(inc); + } + /** + * @return Count of failedDeleteCount. + */ + public float getFailedDeleteCount() { + return failedDeleteCount.getPreviousIntervalValue(); + } + + /** + * @param inc How much to add to failedDeleteCount. + */ + public void incrementFailedDeleteRequests(final int inc) { + failedDeleteCount.inc(inc); + } + } Index: src/main/java/org/apache/hadoop/hbase/rest/ScannerInstanceResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/ScannerInstanceResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/ScannerInstanceResource.java (working copy) @@ -86,7 +86,12 @@ try { value = generator.next(); } catch (IllegalStateException e) { - ScannerResource.delete(id); + if (ScannerResource.delete(id)) { + servlet.getMetrics().incrementSucessfulDeleteRequests(1); + } else { + servlet.getMetrics().incrementFailedDeleteRequests(1); + } + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(Response.Status.GONE); } if (value == null) { @@ -122,6 +127,7 @@ model.addRow(rowModel); ResponseBuilder response = Response.ok(model); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } @@ -146,9 +152,15 @@ Base64.encodeBytes( KeyValue.makeColumn(value.getFamily(), value.getQualifier()))); response.header("X-Timestamp", value.getTimestamp()); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (IllegalStateException e) { - ScannerResource.delete(id); + if (ScannerResource.delete(id)) { + servlet.getMetrics().incrementSucessfulDeleteRequests(1); + } else { + servlet.getMetrics().incrementFailedDeleteRequests(1); + } + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(Response.Status.GONE); } } @@ -162,7 +174,11 @@ if (servlet.isReadOnly()) { throw new WebApplicationException(Response.Status.FORBIDDEN); } - ScannerResource.delete(id); + if (ScannerResource.delete(id)) { + servlet.getMetrics().incrementSucessfulDeleteRequests(1); + } else { + servlet.getMetrics().incrementFailedDeleteRequests(1); + } return Response.ok().build(); } } Index: src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java (working copy) @@ -89,8 +89,10 @@ model.addRow(rowModel); } + servlet.getMetrics().incrementSucessfulGetRequests(1); return Response.ok(model).build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/RootResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/RootResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/RootResource.java (working copy) @@ -80,8 +80,10 @@ try { ResponseBuilder response = Response.ok(getTableList()); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); } catch (IOException e) { + servlet.getMetrics().incrementFailedGetRequests(1); throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); } Index: src/main/java/org/apache/hadoop/hbase/rest/VersionResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/VersionResource.java (revision 1291525) +++ src/main/java/org/apache/hadoop/hbase/rest/VersionResource.java (working copy) @@ -79,6 +79,7 @@ servlet.getMetrics().incrementRequests(1); ResponseBuilder response = Response.ok(new VersionModel(context)); response.cacheControl(cacheControl); + servlet.getMetrics().incrementSucessfulGetRequests(1); return response.build(); }