blob: 5f8bee365fabbcd591e77ad3f8fa003d759fb761 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The ASF licenses this file to you 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 org.apache.storm.metricstore;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Class containing metric values and all identifying fields to be stored in a MetricStore.
*/
public class Metric implements Comparable<Metric> {
private static final Logger LOG = LoggerFactory.getLogger(Metric.class);
// key fields
private String name;
private long timestamp;
private String topologyId;
private String componentId;
private String executorId;
private String hostname;
private String streamId;
private int port;
private AggLevel aggLevel = AggLevel.AGG_LEVEL_NONE;
// value fields
private double value;
private long count = 1;
private double min = 0.0;
private double max = 0.0;
private double sum = 0.0;
/**
* Metric constructor.
*/
public Metric(String name, Long timestamp, String topologyId, double value, String componentId, String executorId,
String hostname, String streamId, int port, AggLevel aggLevel) throws MetricException {
this.name = name;
this.timestamp = timestamp;
this.topologyId = topologyId;
this.componentId = componentId;
this.executorId = executorId;
this.hostname = hostname;
this.streamId = streamId;
this.port = port;
this.setValue(value);
setAggLevel(aggLevel);
}
/**
* A Metric constructor with the same settings cloned from another.
*/
public Metric(Metric o) {
this.name = o.getMetricName();
this.timestamp = o.getTimestamp();
this.topologyId = o.getTopologyId();
this.value = o.getValue();
this.componentId = o.getComponentId();
this.executorId = o.getExecutorId();
this.hostname = o.getHostname();
this.streamId = o.getStreamId();
this.port = o.getPort();
this.count = o.getCount();
this.min = o.getMin();
this.max = o.getMax();
this.sum = o.getSum();
this.aggLevel = o.getAggLevel();
}
/**
* Check if a Metric matches another object.
*/
@Override
public boolean equals(Object other) {
if (!(other instanceof Metric)) {
return false;
}
Metric o = (Metric) other;
return this == other
|| (this.name.equals(o.getMetricName())
&& this.timestamp == o.getTimestamp()
&& this.topologyId.equals(o.getTopologyId())
&& this.value == o.getValue()
&& this.componentId.equals(o.getComponentId())
&& this.executorId.equals(o.getExecutorId())
&& this.hostname.equals(o.getHostname())
&& this.streamId.equals(o.getStreamId())
&& this.port == o.getPort()
&& this.count == o.getCount()
&& this.min == o.getMin()
&& this.max == o.getMax()
&& this.sum == o.getSum()
&& this.aggLevel == o.getAggLevel());
}
public AggLevel getAggLevel() {
return this.aggLevel;
}
/**
* Set the aggLevel.
*/
public void setAggLevel(AggLevel aggLevel) throws MetricException {
if (aggLevel == null) {
throw new MetricException("AggLevel not set for metric");
}
this.aggLevel = aggLevel;
}
/**
* Adds an additional value to the metric.
*/
public void addValue(double value) {
this.count += 1;
this.min = Math.min(this.min, value);
this.max = Math.max(this.max, value);
this.sum += value;
this.value = this.sum / this.count;
}
public double getSum() {
return this.sum;
}
public void setSum(double sum) {
this.sum = sum;
}
public long getCount() {
return this.count;
}
public void setCount(long count) {
this.count = count;
}
public double getMin() {
return this.min;
}
public void setMin(double min) {
this.min = min;
}
public double getMax() {
return this.max;
}
public void setMax(double max) {
this.max = max;
}
public String getTopologyId() {
return this.topologyId;
}
public void setTopologyId(String topologyId) {
this.topologyId = topologyId;
}
public long getTimestamp() {
return this.timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public double getValue() {
return this.value;
}
/**
* Initialize the metric value.
*/
public void setValue(double value) {
this.count = 1L;
this.min = value;
this.max = value;
this.sum = value;
this.value = value;
}
public String getMetricName() {
return this.name;
}
public String getComponentId() {
return this.componentId;
}
public String getExecutorId() {
return this.executorId;
}
public String getHostname() {
return this.hostname;
}
public String getStreamId() {
return this.streamId;
}
public Integer getPort() {
return this.port;
}
@Override
public int compareTo(Metric o) {
long a = this.getTimestamp();
long b = o.getTimestamp();
return Long.compare(a, b);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Date date = new Date(this.timestamp);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
sb.append(format.format(date));
sb.append("|");
sb.append(this.topologyId);
sb.append("|");
sb.append(aggLevel);
sb.append("|");
sb.append(this.name);
sb.append("|");
sb.append(this.componentId);
sb.append("|");
sb.append(this.executorId);
sb.append("|");
sb.append(this.hostname);
sb.append("|");
sb.append(this.port);
sb.append("|");
sb.append(this.streamId);
return String.format("%s -- count: %d -- value: %f -- min: %f -- max: %f -- sum: %f",
sb.toString(),
this.count,
this.value,
this.min,
this.max,
this.sum);
}
}