/*
 * 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.beam.runners.dataflow.worker;

import com.google.auto.service.AutoService;
import java.io.Closeable;
import java.io.IOException;
import org.apache.beam.runners.core.metrics.ExecutionStateTracker;
import org.apache.beam.sdk.metrics.MetricsEnvironment;
import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.annotations.VisibleForTesting;

/**
 * Registration of a {@link ContextActivationObserver} for the {@link MetricsEnvironment} with the
 * {@link DataflowExecutionContext}.
 */
public class MetricsEnvironmentContextActivationObserverRegistration {

  /** A {@link ContextActivationObserver} to register default metrics. */
  @VisibleForTesting
  static class MetricsEnvironmentContextActivationObserver implements ContextActivationObserver {
    @Override
    public void close() throws IOException {}

    @Override
    public Closeable activate(ExecutionStateTracker e) {
      return MetricsEnvironment.scopedMetricsContainer(new DataflowMetricsContainer(e));
    }
  }

  /**
   * A {@link ContextActivationObserver.Registrar} to register {@link ContextActivationObserver} for
   * {@link MetricsEnvironment}.
   */
  @AutoService(ContextActivationObserver.Registrar.class)
  public static class MetricsEnvironmentContextActivationObserverRegistrar
      implements ContextActivationObserver.Registrar {

    @Override
    public boolean isEnabled() {
      return true;
    }

    @Override
    public ContextActivationObserver getContextActivationObserver() {
      return new MetricsEnvironmentContextActivationObserver();
    }
  }
}
