| /* |
| * 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.geode.admin.internal; |
| |
| import java.util.List; |
| |
| import org.apache.logging.log4j.Logger; |
| |
| import org.apache.geode.admin.GemFireHealth; |
| import org.apache.geode.admin.GemFireHealthConfig; |
| import org.apache.geode.distributed.internal.DistributionManager; |
| import org.apache.geode.logging.internal.log4j.api.LogService; |
| |
| /** |
| * The abstract superclass of all GemFire health evaluators. Basically, this class specifies what |
| * the health evaluators need and what they should do. |
| * |
| * <P> |
| * |
| * Note that evaluators never reside in the administration VM, they only in member VMs. They are not |
| * <code>Serializable</code> and aren't meant to be. |
| * |
| * |
| * @since GemFire 3.5 |
| */ |
| public abstract class AbstractHealthEvaluator { |
| |
| private static final Logger logger = LogService.getLogger(); |
| |
| /** |
| * The number of times this evaluator has been evaluated. Certain checks are not made the first |
| * time an evaluation occurs. |
| */ |
| private int numEvaluations; |
| |
| ////////////////////// Constructors ////////////////////// |
| |
| /** |
| * Creates a new <code>AbstractHealthEvaluator</code> with the given |
| * <code>GemFireHealthConfig</code> and <code>DistributionManager</code>. |
| * |
| * Originally, this method took an <code>InternalDistributedSystem</code>, but we found there were |
| * race conditions during initialization. Namely, that a <code>DistributionMessage</code> can be |
| * processed before the <code>InternalDistributedSystem</code>'s <code>DistributionManager</code> |
| * is set. |
| */ |
| protected AbstractHealthEvaluator(GemFireHealthConfig config, DistributionManager dm) { |
| this.numEvaluations = 0; |
| } |
| |
| ///////////////////// Instance Methods ///////////////////// |
| |
| /** |
| * Evaluates the health of a component of a GemFire distributed system. |
| * |
| * @param status A list of {@link AbstractHealthEvaluator.HealthStatus HealthStatus} objects that |
| * is populated when ill health is detected. |
| */ |
| public void evaluate(List status) { |
| this.numEvaluations++; |
| check(status); |
| } |
| |
| /** |
| * Checks the health of a component of a GemFire distributed system. |
| * |
| * @see #evaluate |
| */ |
| protected abstract void check(List status); |
| |
| /** |
| * Returns whether or not this is the first evaluation |
| */ |
| protected boolean isFirstEvaluation() { |
| return this.numEvaluations <= 1; |
| } |
| |
| /** |
| * A factory method that creates a {@link AbstractHealthEvaluator.HealthStatus HealthStats} with |
| * {@linkplain GemFireHealth#OKAY_HEALTH okay} status. |
| */ |
| protected HealthStatus okayHealth(String diagnosis) { |
| logger.info("OKAY_HEALTH: {}", |
| diagnosis); |
| return new HealthStatus(GemFireHealth.OKAY_HEALTH, diagnosis); |
| } |
| |
| /** |
| * A factory method that creates a {@link AbstractHealthEvaluator.HealthStatus HealthStats} with |
| * {@linkplain GemFireHealth#POOR_HEALTH poor} status. |
| */ |
| protected HealthStatus poorHealth(String diagnosis) { |
| logger.info("POOR_HEALTH: {}", |
| diagnosis); |
| return new HealthStatus(GemFireHealth.POOR_HEALTH, diagnosis); |
| } |
| |
| /** |
| * Returns a <code>String</code> describing the component whose health is evaluated by this |
| * evaluator. |
| */ |
| protected abstract String getDescription(); |
| |
| /** |
| * Closes this evaluator and releases all of its resources |
| */ |
| abstract void close(); |
| |
| /////////////////////// Inner Classes ////////////////////// |
| |
| /** |
| * Represents the health of a GemFire component. |
| */ |
| public class HealthStatus { |
| /** The health of a GemFire component */ |
| private GemFireHealth.Health healthCode; |
| |
| /** The diagnosis of the illness */ |
| private String diagnosis; |
| |
| ////////////////////// Constructors ////////////////////// |
| |
| /** |
| * Creates a new <code>HealthStatus</code> with the give <code>health</code> code and |
| * <code>dianosis</code> message. |
| * |
| * @see GemFireHealth#OKAY_HEALTH |
| * @see GemFireHealth#POOR_HEALTH |
| */ |
| HealthStatus(GemFireHealth.Health healthCode, String diagnosis) { |
| this.healthCode = healthCode; |
| this.diagnosis = "[" + AbstractHealthEvaluator.this.getDescription() + "] " + diagnosis; |
| } |
| |
| ///////////////////// Instance Methods ///////////////////// |
| |
| /** |
| * Returns the health code |
| * |
| * @see GemFireHealth#OKAY_HEALTH |
| * @see GemFireHealth#POOR_HEALTH |
| */ |
| public GemFireHealth.Health getHealthCode() { |
| return this.healthCode; |
| } |
| |
| /** |
| * Returns the diagnosis prepended with a description of the component that is ill. |
| */ |
| public String getDiagnosis() { |
| return this.diagnosis; |
| } |
| |
| } |
| |
| } |