/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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 org.onlab.metrics;

/**
 * Interface of reporter that reports all metrics value to third party monitor.
 */
public interface MetricsReporter {

    /**
     * Starts to report a set of metrics to the monitoring server.
     */
    void startReport();

    /**
     * Stops reporting metrics.
     */
    void stopReport();

    /**
     * Restarts metrics reporter.
     */
    void restartReport();

    /**
     * Notifies the changes on metric registry.
     */
    void notifyMetricsChange();
}
