/* * 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.brooklyn.core.server.entity; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.mgmt.internal.LocalSubscriptionManager; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.util.core.task.BasicExecutionManager; import com.google.common.util.concurrent.ThreadFactoryBuilder; public class BrooklynMetricsImpl extends AbstractEntity implements BrooklynMetrics { private ScheduledExecutorService executor; public BrooklynMetricsImpl() { } @Override public void onManagementBecomingMaster() { // TODO Don't use own thread pool; use new "feeds" (see FunctionFeed, or variants there of) ThreadFactory threadFactory = new ThreadFactoryBuilder() .setNameFormat("brooklyn-brooklynmetrics-poller-%d") .build(); executor = Executors.newSingleThreadScheduledExecutor(threadFactory); executor.scheduleWithFixedDelay( new Runnable() { public void run() { refreshSensors(); }}, 0, getConfig(UPDATE_PERIOD), TimeUnit.MILLISECONDS); } /** * Invoked by {@link ManagementContext} when this entity becomes mastered at a particular management node, * including the final management end and subsequent management node master-change for this entity. */ @Override public void onManagementNoLongerMaster() { if (executor != null) executor.shutdownNow(); } private void refreshSensors() { ManagementContext managementContext = getManagementContext(); BasicExecutionManager execManager = (BasicExecutionManager) (managementContext != null ? managementContext.getExecutionManager() : null); LocalSubscriptionManager subsManager = (LocalSubscriptionManager) (managementContext != null ? managementContext.getSubscriptionManager() : null); if (managementContext != null) { sensors().set(TOTAL_EFFECTORS_INVOKED, ((ManagementContextInternal)managementContext).getTotalEffectorInvocations()); } if (execManager != null) { sensors().set(TOTAL_TASKS_SUBMITTED, execManager.getTotalTasksSubmitted()); sensors().set(NUM_INCOMPLETE_TASKS, execManager.getNumIncompleteTasks()); sensors().set(NUM_ACTIVE_TASKS, execManager.getNumActiveTasks()); } if (subsManager != null) { sensors().set(TOTAL_EVENTS_PUBLISHED, subsManager.getTotalEventsPublished()); sensors().set(TOTAL_EVENTS_DELIVERED, subsManager.getTotalEventsDelivered()); sensors().set(NUM_SUBSCRIPTIONS, subsManager.getNumSubscriptions()); } } }