org.sonar.server.platform.ws.HealthActionSupport.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.server.platform.ws.HealthActionSupport.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2018 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.server.platform.ws;

import com.google.common.io.Resources;
import java.util.Comparator;
import org.sonar.api.server.ws.WebService;
import org.sonar.process.cluster.health.NodeDetails;
import org.sonar.process.cluster.health.NodeHealth;
import org.sonar.server.health.ClusterHealth;
import org.sonar.server.health.Health;
import org.sonar.server.health.HealthChecker;
import org.sonarqube.ws.System;

import static org.sonar.api.utils.DateUtils.formatDateTime;

public class HealthActionSupport {
    private static final Comparator<NodeHealth> NODE_HEALTH_COMPARATOR = Comparator
            .<NodeHealth>comparingInt(s -> s.getDetails().getType().ordinal())
            .thenComparing(a -> a.getDetails().getName()).thenComparing(a -> a.getDetails().getHost())
            .thenComparing(a -> a.getDetails().getPort());
    private final HealthChecker healthChecker;

    public HealthActionSupport(HealthChecker healthChecker) {
        this.healthChecker = healthChecker;
    }

    void define(WebService.NewController controller, SystemWsAction handler) {
        controller.createAction("health").setDescription("Provide health status of SonarQube."
                + "<p>Require 'Administer System' permission or authentication with passcode</p>" + "<p> " + " <ul>"
                + " <li>GREEN: SonarQube is fully operational</li>"
                + " <li>YELLOW: SonarQube is usable, but it needs attention in order to be fully operational</li>"
                + " <li>RED: SonarQube is not operational</li>" + " </ul>" + "</p>").setSince("6.6")
                .setResponseExample(Resources.getResource(this.getClass(), "example-health.json"))
                .setHandler(handler);
    }

    System.HealthResponse checkNodeHealth() {
        Health check = healthChecker.checkNode();
        System.HealthResponse.Builder responseBuilder = System.HealthResponse.newBuilder()
                .setHealth(System.Health.valueOf(check.getStatus().name()));
        System.Cause.Builder causeBuilder = System.Cause.newBuilder();
        check.getCauses().forEach(str -> responseBuilder.addCauses(causeBuilder.clear().setMessage(str).build()));

        return responseBuilder.build();
    }

    System.HealthResponse checkClusterHealth() {
        ClusterHealth check = healthChecker.checkCluster();
        return toResponse(check);
    }

    private static System.HealthResponse toResponse(ClusterHealth check) {
        System.HealthResponse.Builder responseBuilder = System.HealthResponse.newBuilder();
        System.Node.Builder nodeBuilder = System.Node.newBuilder();
        System.Cause.Builder causeBuilder = System.Cause.newBuilder();

        Health health = check.getHealth();
        responseBuilder.setHealth(System.Health.valueOf(health.getStatus().name()));
        health.getCauses().forEach(str -> responseBuilder.addCauses(toCause(str, causeBuilder)));

        System.Nodes.Builder nodesBuilder = System.Nodes.newBuilder();
        check.getNodes().stream().sorted(NODE_HEALTH_COMPARATOR)
                .map(node -> toNode(node, nodeBuilder, causeBuilder)).forEach(nodesBuilder::addNodes);
        responseBuilder.setNodes(nodesBuilder.build());

        return responseBuilder.build();
    }

    private static System.Node toNode(NodeHealth nodeHealth, System.Node.Builder nodeBuilder,
            System.Cause.Builder causeBuilder) {
        nodeBuilder.clear();
        nodeBuilder.setHealth(System.Health.valueOf(nodeHealth.getStatus().name()));
        nodeHealth.getCauses().forEach(str -> nodeBuilder.addCauses(toCause(str, causeBuilder)));
        NodeDetails details = nodeHealth.getDetails();
        nodeBuilder.setType(System.NodeType.valueOf(details.getType().name())).setName(details.getName())
                .setHost(details.getHost()).setPort(details.getPort())
                .setStartedAt(formatDateTime(details.getStartedAt()));
        return nodeBuilder.build();
    }

    private static System.Cause toCause(String str, System.Cause.Builder causeBuilder) {
        return causeBuilder.clear().setMessage(str).build();
    }
}