blob: 98ca5a4aab92162d848f9c34b31fd510062c0138 [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.iotdb.commons;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
class Metric {
private static final Logger logger = LoggerFactory.getLogger(Metric.class);
private static final int DEFAULT_PRINT_RATE = 1000;
public String stepName;
public long invokeCount;
public long totalTime;
public long lastCycleTime;
public int printRate;
public Metric(String stepName) {
this(stepName, DEFAULT_PRINT_RATE);
}
public Metric(String stepName, int printRate) {
this.stepName = stepName;
this.invokeCount = 0;
this.totalTime = 0;
this.lastCycleTime = 0;
this.printRate = printRate;
}
public void trace(long startTime, long endTime) {
this.invokeCount++;
this.totalTime += (endTime - startTime);
}
public void tryPrint() {
if (invokeCount % printRate == 0) {
logger.info(
String.format(
"step metrics [%d]-[%s] - Total: %d, SUM: %.2fms, AVG: %fms, Last%dAVG: %fms",
Thread.currentThread().getId(),
stepName,
invokeCount,
totalTime * 1.0 / 1000000,
totalTime * 1.0 / 1000000 / invokeCount,
printRate,
(totalTime * 1.0 - lastCycleTime) / 1000000 / printRate));
lastCycleTime = totalTime;
}
}
}
public class StepTracker {
private static final ThreadLocal<Map<String, Metric>> metrics = new ThreadLocal<>();
public static void trace(String stepName, long startTime, long endTime) {
if (metrics.get() == null) {
metrics.set(new HashMap<>());
}
metrics.get().computeIfAbsent(stepName, Metric::new).trace(startTime, endTime);
metrics.get().get(stepName).tryPrint();
}
public static void trace(String stepName, int printRate, long startTime, long endTime) {
if (metrics.get() == null) {
metrics.set(new HashMap<>());
}
metrics
.get()
.computeIfAbsent(stepName, key -> new Metric(stepName, printRate))
.trace(startTime, endTime);
metrics.get().get(stepName).tryPrint();
}
public static void cleanup() {
metrics.remove();
}
}