/*
 * Copyright 2014 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;

import com.codahale.metrics.Gauge;
import com.codahale.metrics.Meter;

/**
 * Metric measurements for events.
 */
public class EventMetric {
    private static final String GAUGE_TIMESTAMP_NAME = "Timestamp.EpochMs";
    private static final String METER_RATE_NAME = "Rate";

    private final MetricsService metricsService;
    private final String componentName;
    private final String featureName;

    private MetricsComponent metricsComponent;
    private MetricsFeature metricsFeature;

    private volatile long lastEventTimestampEpochMs = 0;
    private Gauge<Long> lastEventTimestampGauge;
    private Meter eventRateMeter;

    /**
     * Constructor.
     *
     * @param metricsService the Metrics Service to use for Metrics
     * registration and deregistration
     * @param componentName the Metrics Component Name to use for Metrics
     * registration and deregistration
     * @param featureName the Metrics Feature Name to use for Metrics
     * registration and deregistration
     */
    public EventMetric(MetricsService metricsService, String componentName,
                       String featureName) {
        this.metricsService = metricsService;
        this.componentName = componentName;
        this.featureName = featureName;
    }

    /**
     * Registers the metrics.
     */
    public void registerMetrics() {
        metricsComponent = metricsService.registerComponent(componentName);
        metricsFeature = metricsComponent.registerFeature(featureName);

        lastEventTimestampEpochMs = 0;
        lastEventTimestampGauge =
            metricsService.registerMetric(metricsComponent,
                                          metricsFeature,
                                          GAUGE_TIMESTAMP_NAME,
                                          new Gauge<Long>() {
                                              @Override
                                              public Long getValue() {
                                                  return lastEventTimestampEpochMs;
                                              }
                                          });

        eventRateMeter = metricsService.createMeter(metricsComponent,
                                                    metricsFeature,
                                                    METER_RATE_NAME);
    }

    /**
     * Removes the metrics.
     */
    public void removeMetrics() {
        lastEventTimestampEpochMs = 0;
        metricsService.removeMetric(metricsComponent,
                                    metricsFeature,
                                    GAUGE_TIMESTAMP_NAME);
        metricsService.removeMetric(metricsComponent,
                                    metricsFeature,
                                    METER_RATE_NAME);
    }

    /**
     * Updates the metric measurements for a single event.
     */
    public void eventReceived() {
        lastEventTimestampEpochMs = System.currentTimeMillis();
        eventRateMeter.mark(1);
    }

    /**
     * Gets the last event timestamp Gauge (ms from the Epoch).
     *
     * @return the last event timestamp Gauge (ms from the Epoch)
     */
    public Gauge<Long> lastEventTimestampGauge() {
        return lastEventTimestampGauge;
    }

    /**
     * Gets the event rate meter.
     *
     * @return the event rate meter
     */
    public Meter eventRateMeter() {
        return eventRateMeter;
    }
}
