private void onGetBlobDataError(Exception e, GetBlobOptionsInternal options, boolean encrypted) {
    onError(e);
    Counter blobErrorCount = encrypted ? getEncryptedBlobErrorCount : getBlobErrorCount;
    Counter blobWithRangeErrorCount = encrypted ? getEncryptedBlobWithRangeErrorCount : getBlobWithRangeErrorCount;
    Counter blobWithSegmentErrorCount =
        encrypted ? getEncryptedBlobWithSegmentErrorCount : getBlobWithSegmentErrorCount;
    Meter operationErrorRateMeter = encrypted ? encryptedOperationErrorRate : operationErrorRate;
    if (RouterUtils.isSystemHealthError(e)) {
      blobErrorCount.inc();
      if (options != null) {
        if (options.getBlobOptions.getRange() != null) {
          blobWithRangeErrorCount.inc();
        }
        if (options.getBlobOptions.hasBlobSegmentIdx()) {
          blobWithSegmentErrorCount.inc();
        }
      }
      operationErrorRateMeter.mark();
    }
  }
Update appropriate metrics on a getBlob (Data or All) operation related error.
@param e the {@link Exception} associated with the error.
@param options the {@link GetBlobOptionsInternal} associated with the request.
@param encrypted {@code true} if blob is encrypted, {@code false} otherwise
ambry-router/src/main/java/com/github/ambry/router/NonBlockingRouterMetrics.java