Documentation ¶
Overview ¶
Package checkup provides means for checking and reporting the status and performance of various endpoints in a distributed, lock-free, self-hosted fashion.
Index ¶
- Constants
- Variables
- func DisableColor()
- func GenerateFilename() *string
- func Timestamp() int64
- type Attempt
- type Attempts
- type Checker
- type Checkup
- type DNSChecker
- type Errors
- type FS
- type GitHub
- type HTTPChecker
- type Maintainer
- type Notifier
- type ProvisionInfo
- type Provisioner
- type Result
- type S3
- type SQL
- type Slack
- type Stats
- type StatusText
- type Storage
- type StorageReader
- type TCPChecker
- type TLSChecker
Constants ¶
const FilenameFormatString = "%d-check.json"
FilenameFormatString is the format string used by GenerateFilename to create a filename.
Variables ¶
var DefaultConcurrentChecks = 5
DefaultConcurrentChecks is how many checks, at most, to perform concurrently.
var DefaultHTTPClient = &http.Client{ Transport: &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 10 * time.Second, KeepAlive: 0, }).Dial, TLSHandshakeTimeout: 5 * time.Second, ExpectContinueTimeout: 1 * time.Second, MaxIdleConnsPerHost: 1, DisableCompression: true, DisableKeepAlives: true, ResponseHeaderTimeout: 5 * time.Second, }, CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, Timeout: 10 * time.Second, }
DefaultHTTPClient is used when no other http.Client is specified on a HTTPChecker.
Functions ¶
func DisableColor ¶ added in v1.0.0
func DisableColor()
DisableColor disables ANSI colors in the Result default string.
func GenerateFilename ¶
func GenerateFilename() *string
GenerateFilename returns a filename that is ideal for storing the results file on a storage provider that relies on the filename for retrieval that is sorted by date/timeframe. It returns a string pointer to be used by the AWS SDK...
Types ¶
type Checkup ¶
type Checkup struct { // Checkers is the list of Checkers to use with // which to perform checks. Checkers []Checker `json:"checkers,omitempty"` // ConcurrentChecks is how many checks, at most, to // perform concurrently. Default is // DefaultConcurrentChecks. ConcurrentChecks int `json:"concurrent_checks,omitempty"` // Timestamp is the timestamp to force for all checks. // Useful if wanting to perform distributed check // "at the same time" even if they might actually // be a few milliseconds or seconds apart. Timestamp time.Time `json:"timestamp,omitempty"` // Storage is the storage mechanism for saving the // results of checks. Required if calling Store(). // If Storage is also a Maintainer, its Maintain() // method will be called by c.CheckAndStore(). Storage Storage `json:"storage,omitempty"` // Notifier is a notifier that will be passed the // results after checks from all checkers have // completed. Notifier may evaluate and choose to // send a notification of potential problems. Notifier Notifier `json:"notifier,omitempty"` }
Checkup performs a routine checkup on endpoints or services.
func (Checkup) Check ¶
Check performs the health checks. An error is only returned in the case of a misconfiguration or if any one of the Checkers returns an error.
func (Checkup) CheckAndStore ¶
CheckAndStore performs health checks and immediately stores the results to the configured storage if there were no errors. Checks are not performed if c.Storage is nil. If c.Storage is also a Maintainer, Maintain() will be called if Store() is successful.
func (Checkup) CheckAndStoreEvery ¶
CheckAndStoreEvery calls CheckAndStore every interval. It returns the ticker that it's using so you can stop it when you don't want it to run anymore. This function does NOT block (it runs the ticker in a goroutine). Any errors are written to the standard logger. It would not be wise to set an interval lower than the time it takes to perform the checks.
func (Checkup) MarshalJSON ¶
MarshalJSON marshals c into JSON with type information included on the interface values.
func (*Checkup) UnmarshalJSON ¶
UnmarshalJSON unmarshales b into c. To succeed, it requires type information for the interface values.
type DNSChecker ¶ added in v0.2.0
type DNSChecker struct { // Name is the name of the endpoint. Name string `json:"endpoint_name"` // This is the name of the DNS server you are testing. URL string `json:"endpoint_url"` // This is the fqdn of the target server to query the DNS server for. Host string `json:"hostname_fqdn,omitempty"` // Timeout is the maximum time to wait for a // TCP connection to be established. Timeout time.Duration `json:"timeout,omitempty"` // ThresholdRTT is the maximum round trip time to // allow for a healthy endpoint. If non-zero and a // request takes longer than ThresholdRTT, the // endpoint will be considered unhealthy. Note that // this duration includes any in-between network // latency. ThresholdRTT time.Duration `json:"threshold_rtt,omitempty"` // Attempts is how many requests the client will // make to the endpoint in a single check. Attempts int `json:"attempts,omitempty"` }
DNSChecker implements a Checker for TCP endpoints.
func (DNSChecker) Check ¶ added in v0.2.0
func (c DNSChecker) Check() (Result, error)
Check performs checks using c according to its configuration. An error is only returned if there is a configuration error.
type Errors ¶
type Errors []error
Errors is an error type that concatenates multiple errors.
type FS ¶ added in v0.2.0
type FS struct { // The path to the directory where check files will be stored. Dir string `json:"dir"` // The URL corresponding to fs.Dir. URL string `json:"url"` // Check files older than CheckExpiry will be // deleted on calls to Maintain(). If this is // the zero value, no old check files will be // deleted. CheckExpiry time.Duration `json:"check_expiry,omitempty"` }
FS is a way to store checkup results on the local filesystem.
type GitHub ¶ added in v1.0.0
type GitHub struct { // AccessToken is the API token used to authenticate with GitHub (required). AccessToken string `json:"access_token"` // RepositoryOwner is the account which owns the repository on GitHub (required). // For https://github.com/octocat/kit, the owner is "octocat". RepositoryOwner string `json:"repository_owner"` // RepositoryName is the name of the repository on GitHub (required). // For https://github.com/octocat/kit, the name is "kit". RepositoryName string `json:"repository_name"` // CommitterName is the display name of the user corresponding to the AccessToken (required). // If the AccessToken is for user @octocat, then this might be "Mona Lisa," her name. CommitterName string `json:"committer_name"` // CommitterEmail is the email address of the user corresponding to the AccessToken (required). // If the AccessToken is for user @octocat, then this might be "mona@github.com". CommitterEmail string `json:"committer_email"` // Branch is the git branch to store the files to (required). Branch string `json:"branch"` // Dir is the subdirectory in the Git tree in which to store the files (required). // For example, to write to the directory "updates" in the Git repo, this should be "updates". Dir string `json:"dir"` // Check files older than CheckExpiry will be // deleted on calls to Maintain(). If this is // the zero value, no old check files will be // deleted. CheckExpiry time.Duration `json:"check_expiry,omitempty"` // contains filtered or unexported fields }
GitHub is a way to store checkup results in a GitHub repository.
type HTTPChecker ¶
type HTTPChecker struct { // Name is the name of the endpoint. Name string `json:"endpoint_name"` // URL is the URL of the endpoint. URL string `json:"endpoint_url"` // UpStatus is the HTTP status code expected by // a healthy endpoint. Default is http.StatusOK. UpStatus int `json:"up_status,omitempty"` // ThresholdRTT is the maximum round trip time to // allow for a healthy endpoint. If non-zero and a // request takes longer than ThresholdRTT, the // endpoint will be considered unhealthy. Note that // this duration includes any in-between network // latency. ThresholdRTT time.Duration `json:"threshold_rtt,omitempty"` // MustContain is a string that the response body // must contain in order to be considered up. // NOTE: If set, the entire response body will // be consumed, which has the potential of using // lots of memory and slowing down checks if the // response body is large. MustContain string `json:"must_contain,omitempty"` // MustNotContain is a string that the response // body must NOT contain in order to be considered // up. If both MustContain and MustNotContain are // set, they are and-ed together. NOTE: If set, // the entire response body will be consumed, which // has the potential of using lots of memory and // slowing down checks if the response body is large. MustNotContain string `json:"must_not_contain,omitempty"` // Attempts is how many requests the client will // make to the endpoint in a single check. Attempts int `json:"attempts,omitempty"` // AttemptSpacing spaces out each attempt in a check // by this duration to avoid hitting a remote too // quickly in succession. By default, no waiting // occurs between attempts. AttemptSpacing time.Duration `json:"attempt_spacing,omitempty"` // Client is the http.Client with which to make // requests. If not set, DefaultHTTPClient is // used. Client *http.Client `json:"-"` // Headers contains headers to added to the request // that is sent for the check Headers http.Header `json:"headers,omitempty"` }
HTTPChecker implements a Checker for HTTP endpoints.
func (HTTPChecker) Check ¶
func (c HTTPChecker) Check() (Result, error)
Check performs checks using c according to its configuration. An error is only returned if there is a configuration error.
type Maintainer ¶
type Maintainer interface {
Maintain() error
}
Maintainer can maintain a store of results by deleting old check files that are no longer needed or performing other required tasks.
type Notifier ¶
Notifier can notify ops or sysadmins of potential problems. A Notifier should keep state to avoid sending repeated notices more often than the admin would like.
type ProvisionInfo ¶
type ProvisionInfo struct { // The ID of a user that was created for accessing checks. UserID string `json:"user_id"` // The username of a user that was created for accessing checks. Username string `json:"username"` // The ID or name of the ID/key used to access checks. Expect // this value to be made public. (It should have read-only // access to the checks.) PublicAccessKeyID string `json:"public_access_key_id"` // The "secret" associated with the PublicAccessKeyID, but // expect this value to be made public. (It should provide // read-only access to the checks.) PublicAccessKey string `json:"public_access_key"` }
ProvisionInfo contains the results of provisioning a new storage facility for check files. Its values should be used by the status page in order to obtain read-only access to the check files.
func (ProvisionInfo) String ¶
func (i ProvisionInfo) String() string
String returns the information in i in a human-readable format along with an important notice.
type Provisioner ¶
type Provisioner interface {
Provision() (ProvisionInfo, error)
}
Provisioner is a type of storage mechanism that can provision itself for use with checkup. Provisioning need only happen once and is merely a convenience so that the user can get up and running with their status page more quickly. Presumably, the info returned from Provision should be used on the status page side of things ot access the check files (like a key pair that is used for read-only access).
type Result ¶
type Result struct { // Title is the title (or name) of the thing that was checked. // It should be unique, as it acts like an identifier to users. Title string `json:"title,omitempty"` // Endpoint is the URL/address/path/identifier/locator/whatever // of what was checked. Endpoint string `json:"endpoint,omitempty"` // Timestamp is when the check occurred; UTC UnixNano format. Timestamp int64 `json:"timestamp,omitempty"` // Times is a list of each individual check attempt. Times Attempts `json:"times,omitempty"` // ThresholdRTT is the maximum RTT that was tolerated before // considering performance to be degraded. Leave 0 if irrelevant. ThresholdRTT time.Duration `json:"threshold,omitempty"` // Healthy, Degraded, and Down contain the ultimate conclusion // about the endpoint. Exactly one of these should be true; // any more or less is a bug. Healthy bool `json:"healthy,omitempty"` Degraded bool `json:"degraded,omitempty"` Down bool `json:"down,omitempty"` // Notice contains a description of some condition of this // check that might have affected the result in some way. // For example, that the median RTT is above the threshold. Notice string `json:"notice,omitempty"` // Message is an optional message to show on the status page. // For example, what you're doing to fix a problem. Message string `json:"message,omitempty"` }
Result is the result of a health check.
func (Result) ComputeStats ¶
ComputeStats computes basic statistics about r.
func (Result) Status ¶
func (r Result) Status() StatusText
Status returns a text representation of the overall status indicated in r.
type S3 ¶
type S3 struct { AccessKeyID string `json:"access_key_id"` SecretAccessKey string `json:"secret_access_key"` Region string `json:"region,omitempty"` Bucket string `json:"bucket"` // Check files older than CheckExpiry will be // deleted on calls to Maintain(). If this is // the zero value, no old check files will be // deleted. CheckExpiry time.Duration `json:"check_expiry,omitempty"` }
S3 is a way to store checkup results in an S3 bucket.
func (S3) Provision ¶
func (s S3) Provision() (ProvisionInfo, error)
Provision creates a new IAM user in the account specified by s, and configures a bucket according to the values in s. The credentials in s must have the IAMFullAccess and AmazonS3FullAccess permissions in order to succeed.
The name of the created IAM user is "checkup-monitor-s3-public". It will have read-only permission to S3.
Provision need only be called once per status page (bucket), not once per endpoint.
type SQL ¶ added in v1.0.0
type SQL struct { // SqliteDBFile is the sqlite3 DB where check results will be stored. SqliteDBFile string `json:"sqlite_db_file,omitempty"` // PostgreSQL contains the Postgres connection settings. PostgreSQL *struct { Host string `json:"host,omitempty"` Port int `json:"port,omitempty"` User string `json:"user"` Password string `json:"password,omitempty"` DBName string `json:"dbname"` SSLMode string `json:"sslmode,omitempty"` } `json:"postgresql"` // Check files older than CheckExpiry will be // deleted on calls to Maintain(). If this is // the zero value, no old check files will be // deleted. CheckExpiry time.Duration `json:"check_expiry,omitempty"` }
SQL is a way to store checkup results in a SQL database.
type Slack ¶ added in v1.0.0
type Slack struct { Name string `json:"name"` Username string `json:"username"` Channel string `json:"channel"` Webhook string `json:"webhook"` }
Slack consist of all the sub components required to use Slack API
type Stats ¶
type Stats struct { Total time.Duration `json:"total,omitempty"` Mean time.Duration `json:"mean,omitempty"` Median time.Duration `json:"median,omitempty"` Min time.Duration `json:"min,omitempty"` Max time.Duration `json:"max,omitempty"` }
Stats is a type that holds information about a Result, especially its various Attempts.
type StatusText ¶
type StatusText string
StatusText is the textual representation of the result of a status check.
const ( Healthy StatusText = "healthy" Degraded StatusText = "degraded" Down StatusText = "down" Unknown StatusText = "unknown" )
Text representations for the status of a check.
func (StatusText) PriorityOver ¶
func (s StatusText) PriorityOver(other StatusText) bool
PriorityOver returns whether s has priority over other. For example, a Down status has priority over Degraded.
type StorageReader ¶ added in v1.0.0
type StorageReader interface { // Fetch returns the contents of a check file. Fetch(checkFile string) ([]Result, error) // GetIndex returns the storage index, as a map where keys are check // result filenames and values are the associated check timestamps. GetIndex() (map[string]int64, error) }
StorageReader can read results from the Storage.
type TCPChecker ¶ added in v0.2.0
type TCPChecker struct { // Name is the name of the endpoint. Name string `json:"endpoint_name"` // URL is the URL of the endpoint. URL string `json:"endpoint_url"` // TLSEnabled controls whether to enable TLS or not. // If set, TLS is enabled. TLSEnabled bool `json:"tls,omitempty"` // TLSSkipVerify controls whether to skip server TLS // certificat validation or not. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` // TLSCAFile is the Certificate Authority used // to validate the server TLS certificate. TLSCAFile string `json:"tls_ca_file,omitempty"` // Timeout is the maximum time to wait for a // TCP connection to be established. Timeout time.Duration `json:"timeout,omitempty"` // ThresholdRTT is the maximum round trip time to // allow for a healthy endpoint. If non-zero and a // request takes longer than ThresholdRTT, the // endpoint will be considered unhealthy. Note that // this duration includes any in-between network // latency. ThresholdRTT time.Duration `json:"threshold_rtt,omitempty"` // Attempts is how many requests the client will // make to the endpoint in a single check. Attempts int `json:"attempts,omitempty"` }
TCPChecker implements a Checker for TCP endpoints.
func (TCPChecker) Check ¶ added in v0.2.0
func (c TCPChecker) Check() (Result, error)
Check performs checks using c according to its configuration. An error is only returned if there is a configuration error.
type TLSChecker ¶ added in v0.2.0
type TLSChecker struct { // Name is the name of the endpoint. Name string `json:"endpoint_name"` // URL is the host:port of the remote endpoint to check. URL string `json:"endpoint_url"` // Timeout is the maximum time to wait for a // TLS connection to be established. Timeout time.Duration `json:"timeout,omitempty"` // ThresholdRTT is the maximum round trip time to // allow for a healthy endpoint. If non-zero and a // request takes longer than ThresholdRTT, the // endpoint will be considered unhealthy. Note that // this duration includes any in-between network // latency. ThresholdRTT time.Duration `json:"threshold_rtt,omitempty"` // Attempts is how many requests the client will // make to the endpoint in a single check. Attempts int `json:"attempts,omitempty"` // CertExpiryThreshold is how close to expiration // the TLS certificate must be before declaring // a degraded status. Default is 14 days. CertExpiryThreshold time.Duration `json:"cert_expiry_threshold,omitempty"` // TrustedRoots is a list of PEM files to load as // trusted root CAs when connecting to TLS remotes. TrustedRoots []string `json:"trusted_roots,omitempty"` // contains filtered or unexported fields }
TLSChecker implements a Checker for TLS endpoints.
TODO: Implement more checks on the certificate and TLS configuration.
- Cipher suites
- Protocol versions
- OCSP stapling
- Multiple SNIs
- Other things that you might see at SSL Labs or other TLS health checks
func (TLSChecker) Check ¶ added in v0.2.0
func (c TLSChecker) Check() (Result, error)
Check performs checks using c according to its configuration. An error is only returned if there is a configuration error.