使用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