com.google.cloud.logging.Metric Maven / Gradle / Ivy
Show all versions of gcloud-java-logging Show documentation
/*
* Copyright 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.cloud.logging;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Function;
import com.google.logging.v2.LogMetric;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Objects;
import java.util.concurrent.Future;
/**
* Stackdriver Logging metrics describe logs-based metric. The value of the metric is the number of
* log entries that match a logs filter (see {@link #filter()}).
*
* {@code Metric} adds a layer of service-related functionality over {@link MetricInfo}. Objects
* of this class are immutable. To get a {@code Metric} object with the most recent information use
* {@link #reload} or {@link #reloadAsync}.
*
* @see Logs-based Metrics
*
*/
public class Metric extends MetricInfo {
private static final long serialVersionUID = -1549310461066853001L;
private final LoggingOptions options;
private transient Logging logging;
/**
* A builder for {@code Metric} objects.
*/
public static final class Builder extends MetricInfo.Builder {
private final Logging logging;
private final BuilderImpl delegate;
private Builder(Metric metric) {
logging = metric.logging;
delegate = new BuilderImpl(metric);
}
@Override
public Builder name(String name) {
delegate.name(name);
return this;
}
@Override
public Builder description(String description) {
delegate.description(description);
return this;
}
@Override
public Builder filter(String filter) {
delegate.filter(filter);
return this;
}
@Override
public Metric build() {
return new Metric(this.logging, this.delegate);
}
}
Metric(Logging logging, BuilderImpl builder) {
super(builder);
this.logging = checkNotNull(logging);
options = logging.options();
}
@Override
public Builder toBuilder() {
return new Builder(this);
}
@Override
public final int hashCode() {
return Objects.hash(options, super.hashCode());
}
@Override
public final boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || !obj.getClass().equals(Metric.class)) {
return false;
}
Metric other = (Metric) obj;
return baseEquals(other) && Objects.equals(options, other.options);
}
/**
* Returns the metrics's {@code Logging} object used to issue requests.
*/
public Logging logging() {
return logging;
}
/**
* Deletes this metric.
*
* @return {@code true} if the metric was deleted, {@code false} if it was not found
* @throws LoggingException upon failure
*/
public boolean delete() {
return logging.deleteMetric(name());
}
/**
* Sends a request for deleting this metric. This method returns a {@code Future} object to
* consume the result. {@link Future#get()} returns {@code true} if the metric was deleted,
* {@code false} if it was not found.
*
* @throws LoggingException upon failure
*/
public Future deleteAsync() {
return logging.deleteMetricAsync(name());
}
/**
* Fetches current metric's latest information. Returns {@code null} if the metric does not exist.
*
* @return a {@code Metric} object with latest information or {@code null} if not found
* @throws LoggingException upon failure
*/
public Metric reload() {
return logging.getMetric(name());
}
/**
* Sends a request to fetch current metric's latest information. This method returns a
* {@code Future} object to consume the result. {@link Future#get()} returns a {@code Metric}
* object with latest information or {@code null} if not found.
*
* @throws LoggingException upon failure
*/
public Future reloadAsync() {
return logging.getMetricAsync(name());
}
/**
* Updates current metric. If the metric does not exist, it is created.
*
* @return a {@code Metric} object with updated information
* @throws LoggingException upon failure
*/
public Metric update(MetricInfo metricInfo) {
return logging.update(metricInfo);
}
/**
* Sends a request to update current metric. If the metric does not exist, it is created. This
* method returns a {@code Future} object to consume the result. {@link Future#get()} returns a
* {@code Metric} object with updated information.
*
* @throws LoggingException upon failure
*/
public Future updateAsync(MetricInfo metricInfo) {
return logging.updateAsync(metricInfo);
}
private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
input.defaultReadObject();
this.logging = options.service();
}
static Metric fromPb(Logging logging, LogMetric metricPb) {
MetricInfo metricInfo = MetricInfo.fromPb(metricPb);
return new Metric(logging, new BuilderImpl(metricInfo));
}
static Function fromPbFunction(final Logging logging) {
return new Function() {
@Override
public Metric apply(LogMetric metricPb) {
return metricPb != null ? fromPb(logging, metricPb) : null;
}
};
}
}