All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gobblin.metrics.reporter.ContextAwareScheduledReporter Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2014-2016 LinkedIn Corp. All rights reserved.
 *
 * 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.
 */

package gobblin.metrics.reporter;

import java.util.SortedMap;
import java.util.concurrent.TimeUnit;

import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.ScheduledReporter;
import com.codahale.metrics.Timer;

import com.google.common.base.Optional;

import gobblin.metrics.MetricContext;


/**
 * A custom {@link com.codahale.metrics.ScheduledReporter} that is aware of the
 * {@link gobblin.metrics.MetricContext} it is associated to.
 *
 * @author Yinan Li
 */
public abstract class ContextAwareScheduledReporter extends ScheduledReporter {

  private final MetricContext context;
  private final Optional filter;

  protected ContextAwareScheduledReporter(MetricContext context, String name, MetricFilter filter,
      TimeUnit rateUnit, TimeUnit durationUnit) {
    super(context, name, filter, rateUnit, durationUnit);
    this.context = context;
    this.filter = Optional.fromNullable(filter);
  }

  @Override
  public void report() {
    if (this.filter.isPresent()) {
      report(this.context.getGauges(this.filter.get()),
             this.context.getCounters(this.filter.get()),
             this.context.getHistograms(this.filter.get()),
             this.context.getMeters(this.filter.get()),
             this.context.getTimers(this.filter.get()));
    } else {
      report(this.context.getGauges(),
             this.context.getCounters(),
             this.context.getHistograms(),
             this.context.getMeters(),
             this.context.getTimers());
    }
  }

  @Override
  public void report(SortedMap gauges,
                     SortedMap counters,
                     SortedMap histograms,
                     SortedMap meters,
                     SortedMap timers) {
    reportInContext(this.context, gauges, counters, histograms, meters, timers);
  }

  /**
   * Report all the given metrics in the {@link MetricContext}.
   *
   * 

* Called periodically by the polling thread. Subclasses should report all the given metrics. *

* *

* The metric names (the keys in the given {@link SortedMap}s) may or may not include the * {@link gobblin.metrics.Tag}s of the {@link MetricContext} depending on if the {@link MetricContext} is * configured to report fully-qualified metric names or not using the method * {@link MetricContext.Builder#reportFullyQualifiedNames(boolean)}. It is up to the * implementation of this method to decide on whether to include the name of the * {@link MetricContext} (given by {@link MetricContext#getName()}) and the {@link gobblin.metrics.Tag}s * of individual {@link gobblin.metrics.ContextAwareMetric}s when reporting them. *

* * @param gauges all of the gauges in the {@link MetricContext} * @param counters all of the counters in the {@link MetricContext} * @param histograms all of the histograms in the {@link MetricContext} * @param meters all of the meters in the {@link MetricContext} * @param timers all of the timers in the {@link MetricContext} */ protected abstract void reportInContext(MetricContext context, SortedMap gauges, SortedMap counters, SortedMap histograms, SortedMap meters, SortedMap timers); /** * A builder class for {@link ContextAwareScheduledReporter}. * * @param type of a subclass of {@link ContextAwareScheduledReporter} * @param type of a subclass of {@link Builder} */ @SuppressWarnings("unchecked") public abstract static class Builder { protected final String name; protected MetricFilter filter = MetricFilter.ALL; protected TimeUnit rateUnit = TimeUnit.SECONDS; protected TimeUnit durationUnit = TimeUnit.MILLISECONDS; public Builder(String name) { this.name = name; } /** * Get the name of the {@link ContextAwareScheduledReporter} that is going to be built by this * {@link ContextAwareScheduledReporter.Builder}. * * @return name of the {@link ContextAwareScheduledReporter} that is going to be built */ public String getName() { return this.name; } /** * Build a new {@link ContextAwareScheduledReporter}. * * @param context the {@link MetricContext} of this {@link ContextAwareScheduledReporter} * @return the newly built {@link ContextAwareScheduledReporter} */ public abstract R build(MetricContext context); /** * Only report metrics which match the given filter. * * @param filter a {@link MetricFilter} * @return {@code this} */ public B filter(MetricFilter filter) { this.filter = filter; return (B) this; } /** * Convert rates to the given time unit. * * @param rateUnit a unit of time * @return {@code this} */ public B convertRatesTo(TimeUnit rateUnit) { this.rateUnit = rateUnit; return (B) this; } /** * Convert durations to the given time unit. * * @param durationUnit a unit of time * @return {@code this} */ public B convertDurationsTo(TimeUnit durationUnit) { this.durationUnit = durationUnit; return (B) this; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy