diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/ProviderService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/ProviderService.java index c31b2ac..8025be7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/ProviderService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/ProviderService.java @@ -27,6 +27,7 @@ import org.apache.slider.core.exceptions.SliderException; import org.apache.slider.core.launch.ContainerLauncher; import org.apache.slider.server.appmaster.state.StateAccessForProviders; +import org.apache.slider.server.appmaster.timelineservice.ServiceTimelinePublisher; import org.apache.slider.server.services.yarnregistry.YarnRegistryViewForProviders; import java.io.IOException; @@ -55,4 +56,11 @@ void buildContainerLaunchContext(ContainerLauncher containerLauncher, */ boolean processContainerStatus(ContainerId containerId, ContainerStatus status); + + /** + * Set service publisher. + * @param serviceTimelinePublisher service publisher. + */ + void setServiceTimelinePublisher( + ServiceTimelinePublisher serviceTimelinePublisher); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/docker/DockerProviderService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/docker/DockerProviderService.java index 511f7bc..8a847c9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/docker/DockerProviderService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/providers/docker/DockerProviderService.java @@ -38,6 +38,7 @@ import org.apache.slider.providers.ProviderUtils; import org.apache.slider.server.appmaster.state.RoleInstance; import org.apache.slider.server.appmaster.state.StateAccessForProviders; +import org.apache.slider.server.appmaster.timelineservice.ServiceTimelinePublisher; import org.apache.slider.server.services.yarnregistry.YarnRegistryViewForProviders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +56,7 @@ private static final String QUICK_LINKS = "quicklinks"; protected StateAccessForProviders amState; protected YarnRegistryViewForProviders yarnRegistry; + private ServiceTimelinePublisher serviceTimelinePublisher; protected DockerProviderService() { super("DockerProviderService"); @@ -138,6 +140,9 @@ public void buildContainerLaunchContext(ContainerLauncher launcher, PublishedConfiguration pubconf = new PublishedConfiguration(QUICK_LINKS, application.getQuicklinks().entrySet()); amState.getPublishedSliderConfigurations().put(QUICK_LINKS, pubconf); + if (serviceTimelinePublisher != null) { + serviceTimelinePublisher.serviceAttemptUpdated(application); + } } public boolean processContainerStatus(ContainerId containerId, @@ -167,4 +172,9 @@ public boolean processContainerStatus(ContainerId containerId, } return false; } + + @Override + public void setServiceTimelinePublisher(ServiceTimelinePublisher publisher) { + this.serviceTimelinePublisher = publisher; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java index 4aeffa6..f5d4580 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java @@ -663,11 +663,13 @@ private int createAndRunCluster(String appName) throws Throwable { asyncRMClient.registerTimelineV2Client(timelineClient); timelineClient.init(getConfig()); timelineClient.start(); - log.info("Timeline client started."); + log.info("Timeline v2 client started."); serviceTimelinePublisher = new ServiceTimelinePublisher(timelineClient); serviceTimelinePublisher.init(getConfig()); serviceTimelinePublisher.start(); + + providerService.setServiceTimelinePublisher(serviceTimelinePublisher); appState.setServiceTimelinePublisher(serviceTimelinePublisher); log.info("ServiceTimelinePublisher started."); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/ServiceTimelinePublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/ServiceTimelinePublisher.java index 0e04af5..7504140 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/ServiceTimelinePublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/ServiceTimelinePublisher.java @@ -31,7 +31,6 @@ import org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity; import org.apache.hadoop.yarn.api.records.timelineservice.TimelineEvent; import org.apache.hadoop.yarn.api.records.timelineservice.TimelineMetric; -import org.apache.hadoop.yarn.client.api.TimelineClient; import org.apache.hadoop.yarn.client.api.TimelineV2Client; import org.apache.hadoop.yarn.util.timeline.TimelineUtils; import org.apache.slider.api.resource.Application; @@ -109,6 +108,13 @@ public void serviceAttemptRegistered(AppState appState) { publishComponents(application.getComponents()); } + public void serviceAttemptUpdated(Application application) { + TimelineEntity entity = createServiceAttemptEntity(application.getId()); + entity.addInfo(SliderTimelineMetricsConstants.QUICK_LINKS, + application.getQuicklinks()); + putEntity(entity); + } + public void serviceAttemptUnregistered(AppState appState, ActionStopSlider stopAction) { long currentTimeMillis = System.currentTimeMillis(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/SliderTimelineMetricsConstants.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/SliderTimelineMetricsConstants.java index 23e059d..58d77ce 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/SliderTimelineMetricsConstants.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/timelineservice/SliderTimelineMetricsConstants.java @@ -37,6 +37,8 @@ public static final String LAUNCH_TIME = "LAUNCH_TIME"; + public static final String QUICK_LINKS = "QUICK_LINKS"; + public static final String LAUNCH_COMMAND = "LAUNCH_COMMAND"; public static final String TOTAL_CONTAINERS = "NUMBER_OF_CONTAINERS"; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java index 29eb5ca..aa8ffd3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java @@ -35,10 +35,9 @@ import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity; import org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity.Identifier; -import org.apache.hadoop.yarn.client.api.TimelineClient; import org.apache.hadoop.yarn.client.api.TimelineV2Client; -import org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl; import org.apache.hadoop.yarn.client.api.impl.TimelineV2ClientImpl; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.slider.api.resource.Application; import org.apache.slider.api.resource.ApplicationState; @@ -77,6 +76,8 @@ @Before public void setUp() throws Exception { config = new Configuration(); + config.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, true); + config.setFloat(YarnConfiguration.TIMELINE_SERVICE_VERSION, 2.0f); timelineClient = new DummyTimelineClient(ApplicationId.fromString(SERVICEID)); serviceTimelinePublisher = new ServiceTimelinePublisher(timelineClient); @@ -88,8 +89,12 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - serviceTimelinePublisher.stop(); - timelineClient.stop(); + if (serviceTimelinePublisher != null) { + serviceTimelinePublisher.stop(); + } + if (timelineClient != null) { + timelineClient.stop(); + } } @Test @@ -264,6 +269,12 @@ public DummyTimelineClient(ApplicationId appId) { @Override public void putEntitiesAsync(TimelineEntity... entities) throws IOException, YarnException { + putEntities(entities); + } + + @Override + public void putEntities(TimelineEntity... entities) + throws IOException, YarnException { for (TimelineEntity timelineEntity : entities) { TimelineEntity entity = lastPublishedEntities.get(timelineEntity.getIdentifier());