/*
* 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 gobblin.runtime.api;
import java.util.concurrent.Executor;
import com.codahale.metrics.Gauge;
import com.google.common.util.concurrent.Service;
import gobblin.annotation.Alpha;
import gobblin.metrics.ContextAwareCounter;
import gobblin.metrics.ContextAwareGauge;
import lombok.Getter;
/**
* An interface that defines a Gobblin Instance driver which knows how to monitor for Gobblin
* {@link JobSpec}s and run them.
* */
@Alpha
public interface GobblinInstanceDriver extends Service, JobLifecycleListenersContainer,
GobblinInstanceEnvironment {
/** The service that keeps track of jobs that are known to Gobblin */
JobCatalog getJobCatalog();
/**
* Returns a mutable instance of the job catalog
* (if it implements the {@link MutableJobCatalog} interface). Implementation will throw
* ClassCastException if the current catalog is not mutable.
*/
MutableJobCatalog getMutableJobCatalog();
/** The service the determine when jobs should be executed.*/
JobSpecScheduler getJobScheduler();
/** The service for executing Gobblin jobs */
JobExecutionLauncher getJobLauncher();
/** Metrics for instance */
StandardMetrics getMetrics();
public class StandardMetrics extends Service.Listener {
public static final String INSTANCE_NAME_TAG = "instanceName";
public static final String UPTIMEMS_NAME = "uptimeMs";
public static final String UPFLAG_NAME = "upFlag";
public static final String NUM_UNCLASSIFIED_ERRORS_NAME = "numUnclassifiedErrors";
/** The time in milliseconds since the instance started or 0 if not running. */
@Getter private final ContextAwareGauge<Long> uptimeMs;
/** 1 if running, -1 if stopped due to error, 0 if not started or shutdown */
@Getter private final ContextAwareGauge<Integer> upFlag;
/** Total error count detected by this instance which have not been classified and tracked in
* a dedicated counter. */
@Getter private final ContextAwareCounter numUnclassifiedErrors;
private long startTimeMs;
public StandardMetrics(final GobblinInstanceDriver parent) {
this.uptimeMs = parent.getMetricContext().newContextAwareGauge(UPTIMEMS_NAME, new Gauge<Long>() {
@Override public Long getValue() {
return startTimeMs > 0 ? System.currentTimeMillis() - startTimeMs : 0;
}
});
this.upFlag = parent.getMetricContext().newContextAwareGauge(UPFLAG_NAME, new Gauge<Integer>() {
@Override public Integer getValue() {
switch (parent.state()) {
case RUNNING: return 1;
case FAILED: return -1;
default: return 0;
}
}
});
this.numUnclassifiedErrors = parent.getMetricContext().contextAwareCounter(NUM_UNCLASSIFIED_ERRORS_NAME);
parent.addListener(this, new Executor() {
@Override public void execute(Runnable command) {
command.run();
}
});
}
@Override public void running() {
this.startTimeMs = System.currentTimeMillis();
}
@Override public void terminated(State from) {
this.startTimeMs = 0;
}
@Override public void failed(State from, Throwable failure) {
this.startTimeMs = 0;
}
}
}