code: @Nullable
      public <T> T gauge(String name, Iterable<Tag> tags, @Nullable T obj, ToDoubleFunction<T> valueFunction) {
          Gauge.builder(name, obj, valueFunction).tags(tags).register(this);
          return obj;
      }
docs: Register a gauge that reports the value of the object after the function
  {@code valueFunction} is applied. The registration will keep a weak reference to the object so it will
  not prevent garbage collection. Applying {@code valueFunction} on the object should be thread safe.
  
  @param name          Name of the gauge being registered.
  @param tags          Sequence of dimensions for breaking down the name.
  @param obj           State object used to compute a value.
  @param valueFunction Function that produces an instantaneous gauge value from the state object.
  @param <T>           The type of the state object from which the gauge value is extracted.
  @return The number that was passed in so the registration can be done as part of an assignment
  statement.