Add storagedriver section to health check configuration

Add default storagedriver health check to example configuration files
with parameters matching the previous hardcoded configuration.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
This commit is contained in:
Aaron Lehmann 2015-08-19 14:12:51 -07:00
parent b09b0ffcf9
commit 216df32510
6 changed files with 117 additions and 7 deletions

View file

@ -48,3 +48,8 @@ proxy:
remoteurl: https://registry-1.docker.io remoteurl: https://registry-1.docker.io
username: username username: username
password: password password: password
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

View file

@ -59,4 +59,8 @@ notifications:
threshold: 10 threshold: 10
backoff: 1s backoff: 1s
disabled: true disabled: true
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

View file

@ -11,3 +11,8 @@ http:
addr: :5000 addr: :5000
headers: headers:
X-Content-Type-Options: [nosniff] X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

View file

@ -210,6 +210,17 @@ type Health struct {
FileCheckers []FileChecker `yaml:"file,omitempty"` FileCheckers []FileChecker `yaml:"file,omitempty"`
// HTTPChecker is a list of URIs to check // HTTPChecker is a list of URIs to check
HTTPCheckers []HTTPChecker `yaml:"http,omitempty"` HTTPCheckers []HTTPChecker `yaml:"http,omitempty"`
// StorageDriver configures a health check on the configured storage
// driver
StorageDriver struct {
// Enabled turns on the health check for the storage driver
Enabled bool `yaml:"enabled,omitempty"`
// Interval is the number of seconds in between checks
Interval time.Duration `yaml:"interval,omitempty"`
// Threshold is the number of times a check must fail to trigger an
// unhealthy state
Threshold int `yaml:"threshold,omitempty"`
} `yaml:"storagedriver,omitempty"`
} }
// v0_1Configuration is a Version 0.1 Configuration struct // v0_1Configuration is a Version 0.1 Configuration struct

View file

@ -196,6 +196,10 @@ information about each option that appears later in this page.
maxactive: 64 maxactive: 64
idletimeout: 300s idletimeout: 300s
health: health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
file: file:
- file: /path/to/checked/file - file: /path/to/checked/file
interval: 10s interval: 10s
@ -1600,6 +1604,10 @@ Configure the behavior of the Redis connection pool.
## health ## health
health: health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
file: file:
- file: /path/to/checked/file - file: /path/to/checked/file
interval: 10s interval: 10s
@ -1609,8 +1617,72 @@ Configure the behavior of the Redis connection pool.
interval: 10s interval: 10s
threshold: 3 threshold: 3
The health option is **optional**. It may contain lists of file checkers The health option is **optional**. It may contain preferences for a periodic
and/or HTTP checkers. health check on the storage driver's backend storage, and optional periodic
checks on local files and/or HTTP URIs. The results of the health checks are
available at /debug/health on the debug HTTP server if the debug HTTP server is
enabled (see http section).
### storagedriver
storagedriver contains options for a health check on the configured storage
driver's backend storage. enabled must be set to true for this health check to
be active.
<table>
<tr>
<th>Parameter</th>
<th>Required</th>
<th>Description</th>
</tr>
<tr>
<td>
<code>enabled</code>
</td>
<td>
yes
</td>
<td>
"true" to enable the storage driver health check or "false" to disable it.
</td>
</tr>
<tr>
<td>
<code>interval</code>
</td>
<td>
no
</td>
<td>
The length of time to wait between repetitions of the check. This field
takes a positive integer and an optional suffix indicating the unit of
time. Possible units are:
<ul>
<li><code>ns</code> (nanoseconds)</li>
<li><code>us</code> (microseconds)</li>
<li><code>ms</code> (milliseconds)</li>
<li><code>s</code> (seconds)</li>
<li><code>m</code> (minutes)</li>
<li><code>h</code> (hours)</li>
</ul>
If you omit the suffix, the system interprets the value as nanoseconds.
The default value is 10 seconds if this field is omitted.
</td>
</tr>
<tr>
<td>
<code>threshold</code>
</td>
<td>
no
</td>
<td>
An integer specifying the number of times the check must fail before the
check triggers an unhealthy state. If this filed is not specified, a
single failure will trigger an unhealthy state.
</td>
</tr>
</table>
### file ### file

View file

@ -235,10 +235,23 @@ func NewApp(ctx context.Context, configuration configuration.Configuration) *App
// implementing this properly will require a refactor. This method may panic // implementing this properly will require a refactor. This method may panic
// if called twice in the same process. // if called twice in the same process.
func (app *App) RegisterHealthChecks() { func (app *App) RegisterHealthChecks() {
health.RegisterPeriodicThresholdFunc("storagedriver_"+app.Config.Storage.Type(), defaultCheckInterval, 3, func() error { if app.Config.Health.StorageDriver.Enabled {
interval := app.Config.Health.StorageDriver.Interval
if interval == 0 {
interval = defaultCheckInterval
}
storageDriverCheck := func() error {
_, err := app.driver.List(app, "/") // "/" should always exist _, err := app.driver.List(app, "/") // "/" should always exist
return err // any error will be treated as failure return err // any error will be treated as failure
}) }
if app.Config.Health.StorageDriver.Threshold != 0 {
health.RegisterPeriodicThresholdFunc("storagedriver_"+app.Config.Storage.Type(), interval, app.Config.Health.StorageDriver.Threshold, storageDriverCheck)
} else {
health.RegisterPeriodicFunc("storagedriver_"+app.Config.Storage.Type(), interval, storageDriverCheck)
}
}
for _, fileChecker := range app.Config.Health.FileCheckers { for _, fileChecker := range app.Config.Health.FileCheckers {
interval := fileChecker.Interval interval := fileChecker.Interval