package act.metric;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* 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.
* #L%
*/
/**
* `Metric` is used to measure the application and framework performance.
*
* Two kinds of metrics are been implemented in ActFramework:
*
*
* * Counter - count number of time an event occurred</li>
* * Timer - measure the time spent on a specific event</li>
*
* ActFramework supports hierarchical metric. For example, suppose you want to measure
* the time spent on direct web request handling and background jobs:
*
* measure direct request handling
*
* ```
* {@literal @}PostAction("/xyz")
* public void handleXyzRequest(String param) {
* Timer timer = metric.startTimer("direct_req_handling:xyz");
* try {
* // your logic to handle xyz request
* } finally {
* timer.stop();
* }
* }
* ```
*
* measure a background job
*
* ```
* {@literal @}Every("1hr")
* public void scanDatabase() {
* Timer timer = metric.startTimer("background_job:scan_db");
* try {
* // your logic to scan database
* } finally {
* timer.stop();
* }
* }
* ```
*
* In the sample code shown above, the name used to start timers are `direct_req_handling:xyz`
* and `background_job:scan_db` respectively. Both name contains a metric hierarchy, say
* `direct_req_handling` followed by `xyz` and `background_job` followed by
* `scan_db`. The benefit of metric hierarchy is the value measured on child name will get
* aggregated automatically on parent name: Suppose you have two counters: "a:b": 100, and "a:c": 105,
* then your "a" counter will be 205.
*
*/
public interface Metric {
/**
* {@code PATH_SEPARATOR} is provided to support hierarchical metric
*/
String PATH_SEPARATOR = ":";
/**
* The do-nothing metric instance
*/
Metric NULL_METRIC = NullMetric.INSTANCE;
/**
* Call this method to increase one time for the counter specified
* @param name A string specifies the counter
*/
void countOnce(String name);
/**
* Call this method to start a {@link Timer} before starting a process.
*
* Note calling this method should automatically call {@link #countOnce(String)}
* method with the `name` specified
*
* @param name A string specifies the timer
* @return a Timer instance
*/
Timer startTimer(String name);
}