Categorygithub.com/csmith/goplum
repositorypackage
0.7.0
Repository: https://github.com/csmith/goplum.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

:toc: :toc-placement!:

image::.images/banner.png?raw=true[Goplum]

Goplum is an extensible monitoring and alerting daemon designed for personal infrastructure and small businesses. It can monitor websites and APIs, and send alerts by a variety of means if they go down.

toc::[]

== Features

Highly extensible: Goplum supports plugins written in Go to define new monitoring rules and alert types, and it has an API for integration with other services and tools.

Get alerts anywhere: Goplum supports a variety of ways to alert you out-of-the-box:

[width="100%",cols="3",frame="none",grid="none"] |===== | image:.images/alerts/discord.png[Discord logo] Discord | image:.images/alerts/mail.png[Mail icon] E-mail | image:.images/alerts/msteams.png[Microsoft Teams icon] Microsoft Teams | image:.images/alerts/phone.png[Phone icon] Phone call (via Twilio) | image:.images/alerts/pushover.png[Pushover logo] Pushover | image:.images/alerts/slack.png[Slack logo] Slack | image:.images/alerts/sms.png[SMS icon] SMS (via Twilio) | image:.images/alerts/webhook.png[Webhook logo] Webhook | |=====

Lightweight: Goplum has a small resource footprint, and all checks are purpose-written in Go. No need to worry about chains of interdependent scripts being executed.

Heartbeat monitoring: Have an offline service or a cron job that you want to monitor? Have it send a heartbeat to Goplum periodically and get alerted if it stops.

Simple to get started: If you're set up to run services in containers, you can get Goplum up and running in a couple of minutes.

== Getting started

=== Basic configuration

Goplum works by running a number of checks (which test to see if a service is working or not), and when they change state running an alert that notifies you about the problem.

Checks and alerts are both defined in Goplum's config file. A minimal example looks like this:

[source]

check http.get "example.com" { <1> url = "https://example.com/" <2> }

alert twilio.sms "Text Bob" { <3> sid = "sid" token = "token" from = "+01 867 5309" to = "+01 867 5309" <4> }

<1> Goplum's configuration consists of "blocks". The contents of the blocks are placed within braces ({}). This is a "check block"; these will likely make up the bulk of your configuration. * http.get is the type of check we want to execute. The http part indicates it comes from the HTTP plugin, while the get part is the type of check. * All checks (and alerts) have a unique name, in this case we've called it "example.com". If a check starts to fail, the alert you receive will contain the check name. <2> Parameters for the check are specified as key = value pairs within the body of the check. The documentation for each check and alert will explain what parameters are available, and whether they're required or not. <3> Like checks, alerts have both a type and a name. Here we're using the sms alert from the twilio plugin, and we've named it Text Bob. <4> The twilio.sms alert has a number of required parameters that define the account you wish to use and the phone numbers involved. These are all just given as key = value pairs.

This simple example will try to retrieve \https://example.com/ every thirty seconds. If it fails three times in a row, a text message will be sent using Twilio. Then if it consistently starts passing again another message will be sent saying it has recovered. Don't worry - these numbers are all configurable: see the <> section.

In this example we used the http.get check and the twilio.sms alert. See the <> section for details of the other types available by default.

There is a complete link:docs/syntax.adoc[syntax guide] available in the docs folder if you need to look up a specific aspect of the configuration syntax.

=== Docker

The easiest way to run Goplum is using Docker. Goplum doesn't require any privileges, settings, or ports exposed to get a basic setup running. It just needs the configuration file, and optionally a persistent file it can use to persist data across restarts:

Running it via the command line:

[source, shell script]

Create a configuration file

vi goplum.config

Make a 'tombstone' file that Goplum's unprivileged user can write

touch goplum.tomb chown 65532:65532 goplum.tomb

Start goplum

docker run -d --restart always
-v $(PWD)/goplum.conf:/goplum.conf:ro
-v $(PWD)/goplum.tomb:/tmp/goplum.tomb
ghcr.io/csmith/goplum

Or using Docker Compose:

[source,yaml]

version: "3.8"

services: goplum: image: ghcr.io/csmith/goplum volumes: - ./goplum.conf:/goplum.conf - ./goplum.tomb:/tmp/goplum.tomb restart: always

The latest tag points to the latest stable release of Goplum, if you wish to run the very latest build from this repository you can use the dev tag.

=== Without Docker

While Docker is the easiest way to run Goplum, it's not that hard to run it directly on a host without containerisation. See the link:docs/baremetal.adoc[installing without Docker] guide for more information.

== Usage

=== Available checks and alerts

All checks and alerts in Goplum are implemented as plugins. The following are maintained in this repository and are available by default in the Docker image. Each plugin has its own documentation, that explains how its checks and alerts need to be configured.

|==== | Plugin | checks | alerts

link:plugins/discord[discord]
message

| link:plugins/http[http] | get, healthcheck | webhook

| link:plugins/network[network]

connect, portscan

| link:plugins/heartbeat[heartbeat]

received
link:plugins/msteams[msteams]
message
link:plugins/pushover[pushover]
message
link:plugins/slack[slack]
message
link:plugins/smtp[smtp]
send

| link:plugins/snmp[snmp]

int, string
link:plugins/twilio[twilio]
call, sms

| link:plugins/debug[debug] | random | sysout

| link:plugins/exec[exec]

command
====

The docs folder contains link:docs/example.conf[an example configuration file] that contains an example of every check and alert fully configured.

=== Settling and thresholds

When Goplum first starts, it is not aware of the current state of your services. To avoid immediately sending alerts when the state is determined, Goplum waits for each check to settle into a state, and then only alerts when that state subsequently changes.

Goplum uses thresholds to decide how many times a check result must happen in a row before it's considered settled. By default, this the threshold is two "good" results or two "failing" results, but this can be changed - see <>.

For example:


Goplum Failing Recovery starts Alert Alert ↓ ↓ ↓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ 🗙 ✓ ✓ ✓ 🗙 🗙 🗙 🗙 🗙 ✓ 🗙 ✓ 🗙 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ … ↑ ↑ ↑ State settles State becomes State becomes as "good" "failing" "good"

=== Default Settings

All checks have a number of additional settings to control how they work. These can be specified for each check, or changed globally by putting them in the "defaults" section. If they're not specified then Goplum's built-in defaults will be used.

|=== |Setting |Description |Default

|interval |Length of time between each run of the check. |30s

|timeout |Maximum length of time the check can run for before it's terminated. |20s

|alerts |A list of alert names to trigger when the service changes state. Supports '*' as a wildcard. |["*"]

|failing_threshold |The number of checks that must fail in a row before a failure alert is raised. |2

|good_threshold |The number of checks that must pass in a row before a recovery alert is raised. |2 |===

For example, to change the interval and timeout for all checks:

[source,goplum]

defaults { interval = 2m timeout = 30s }

Or to specify a custom timeout and alerts for one check:

[source,goplum]

check http.get "get" { url = "https://www.example.com/" timeout = 60s alerts = ["Text Bob"] }

== Advanced topics

=== Creating new plugins

Goplum is designed to be easily extensible. Plugins must have a main package which contains a function named "Plum" that returns an implementation of goplum.Plugin. They are then compiled with the -buildtype=plugin flag to create a shared library.

The Docker image loads plugins recursively from the /plugins directory, allowing you to mount custom folders if you wish to supply your own plugins.

Note that the Go plugin loader does not work on Windows. For Windows-based development, the goplumdev command hardcodes plugins, skipping the loader.

=== gRPC API

In addition to allowing plugins to define new checks and alerts, GoPlum provides a gRPC API to enable development of custom tooling and facilitate use cases not supported by GoPlum itself (e.g. persisting check history indefinitely). The API is currently in development; more information can be found in the link:docs/api.adoc[API documentation].

=== plumctl command-line tool

Goplum comes with plumctl, a command-line interface to inspect the state of Goplum as well as perform certain operations such as pausing and resuming a check. plumctl uses the <>. For more information see the link:docs/plumctl.adoc[plumctl documentation].

== Licence and credits

Goplum is licensed under the MIT licence. A full copy of the licence is available in the link:LICENCE[LICENCE] file.

Some icons in this README are modifications of the Material Design icons created by Google and released under the https://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0 licence].

Goplum makes use of a number of third-party libraries. See the link:go.mod[go.mod] file for a list of direct dependencies. Users of the docker image will find a copy of the relevant licence and notice files under the /notices directory in the image.