Grails的好处:添加健康检查指标

使用Grails 3,我们还可以获得Spring Boot Actuator 。 我们可以使用Spring Boot Actuator添加一些生产就绪的功能,以监视和管理Grails应用程序。 功能之一是添加一些带有有关我们应用程序信息的端点。 默认情况下,当我们启动Grails(3+)应用程序时,我们已经有一个/health端点。 它返回状态为UP的JSON响应。 让我们扩展此端点并添加磁盘空间,数据库和URL运行状况检查指示器。

我们可以将应用程序属性endpoints.health.sensitive设置为false (确保这些端点将是另一篇博客文章),然后我们会自动获得磁盘空间运行状况指示器。 默认阈值设置为10MB,因此当磁盘空间小于10MB时,状态设置为DOWN 。 以下代码片段显示了grails-app/conf/application.yml用于设置属性的更改:

...
---
endpoints:
    health:
        sensitive: false
...

如果调用/health端点,则会得到以下输出:

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "free": 97169154048,
        "threshold": 10485760
    }
}

如果要更改threshold则可以创建类型为DiskSpaceHealthIndicatorProperties的Spring bean,并将其命名为diskSpaceHealthIndicatorProperties以覆盖默认bean。 从Grails 3开始,我们可以在Application类中重写doWithSpring方法来定义Spring Bean:

package healthcheck

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.springframework.boot.actuate.health.DiskSpaceHealthIndicatorProperties

class Application extends GrailsAutoConfiguration {

    static void main(String[] args) {
        GrailsApp.run(Application)
    }

    @Override
    Closure doWithSpring() {
        { ->
            diskSpaceHealthIndicatorProperties(DiskSpaceHealthIndicatorProperties) {
                // Set threshold to 250MB.
                threshold = 250 * 1024 * 1024
            }
        }
    }
}

Spring Boot Actuator已经包含用于检查SQL数据库的实现,例如Mongo,Redis,Solr和RabbitMQ。 当将它们作为Spring bean添加到我们的应用程序上下文中时,我们可以激活它们。 然后,它们会被自动提取并添加到/health端点的结果中。 在以下示例中,我们创建一个类型为DataSourceHealthIndicator的Spring bean databaseHealth

package healthcheck

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.springframework.boot.actuate.health.DataSourceHealthIndicator
import org.springframework.boot.actuate.health.DiskSpaceHealthIndicatorProperties

class Application extends GrailsAutoConfiguration {

    static void main(String[] args) {
        GrailsApp.run(Application)
    }

    @Override
    Closure doWithSpring() {
        { ->
            // Configure data source health indicator based
            // on the dataSource in the application context.
            databaseHealthCheck(DataSourceHealthIndicator, dataSource)

            diskSpaceHealthIndicatorProperties(DiskSpaceHealthIndicatorProperties) {
                threshold = 250 * 1024 * 1024
            }
        }
    }
}

要创建自己的健康指标类,我们必须实现HealthIndicator接口。 最简单的方法是扩展AbstractHealthIndicator类并重写doHealthCheck方法。 有一个运行状况指示器可以检查URL是否可访问可能会很好。 例如,如果我们需要在应用程序中通过HTTP访问可访问的REST API,则可以检查它是否可用。

package healthcheck

import org.springframework.boot.actuate.health.AbstractHealthIndicator
import org.springframework.boot.actuate.health.Health

class UrlHealthIndicator extends AbstractHealthIndicator {

    private final String url

    private final int timeout

    UrlHealthIndicator(final String url, final int timeout = 10 * 1000) {
        this.url = url
        this.timeout = timeout
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        final HttpURLConnection urlConnection =
                (HttpURLConnection) url.toURL().openConnection()

        final int responseCode =
                urlConnection.with {
                    requestMethod = 'HEAD'
                    readTimeout = timeout
                    connectTimeout = timeout
                    connect()
                    responseCode
                }

        // If code in 200 to 399 range everything is fine.
        responseCode in (200..399) ?
                builder.up() :
                builder.down(
                        new Exception(
                                "Invalid responseCode '${responseCode}' checking '${url}'."))
    }
}

在我们的Application类中,我们为此运行状况指示器创建一个Spring bean,以便由Spring Boot Actuator代码进行拾取:

package healthcheck

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.springframework.boot.actuate.health.DataSourceHealthIndicator
import org.springframework.boot.actuate.health.DiskSpaceHealthIndicatorProperties

class Application extends GrailsAutoConfiguration {

    static void main(String[] args) {
        GrailsApp.run(Application)
    }

    @Override
    Closure doWithSpring() {
        { ->
            // Create instance for URL health indicator.
            urlHealthCheck(UrlHealthIndicator, 'http://intranet', 2000)

            databaseHealthCheck(DataSourceHealthIndicator, dataSource)

            diskSpaceHealthIndicatorProperties(DiskSpaceHealthIndicatorProperties) {
                threshold = 250 * 1024 * 1024
            }
        }
    }
}

现在,当我们运行Grails应用程序并访问/health端点时,我们将获得以下JSON:

{
    "status": "DOWN",
    "urlHealthCheck": {
        "status": "DOWN"
        "error": "java.net.UnknownHostException: intranet",
    },
    "databaseHealthCheck": {
        "status": "UP"
        "database": "H2",
        "hello": 1,
    },
    "diskSpace": {
        "status": "UP",
        "free": 96622411776,
        "threshold": 262144000
    },
}

请注意,URL运行状况检查失败,因此完整状态设置为DOWN

用Grails 3.0.1编写。

翻译自: https://www.javacodegeeks.com/2015/04/grails-goodness-adding-health-check-indicators.html

你可能感兴趣的:(数据库,java,spring,mysql,spring,boot)