alertmanager-config-controller

command module
v0.0.0-...-e3793bb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 31, 2017 License: Apache-2.0 Imports: 19 Imported by: 0

README

alertmanager-config-controller

Kubernetes controller that generate a ConfigMap containing a Prometheus Alertmanager configuration.

As Alertmanager does not allow include files for its configuration, this will collect the data from other ConfigMaps and generate an Alertmanager config.

Heavily influenced by konfd

Status

This was written as part of a simple internal proof-of-concept. It is not well tested. The documentation probably lags the implementation and is probably full of typos and grammatical errors.

Docker images availible at https://quay.io/repository/bakins/alertmanager-config-controller?tab=tags

Usage

$ ./alertmanager-config-controller
Collects alertmanager configs as defined in configmaps and generates a single config

Usage:
  alertmanager-config-controller [target-namespace] [target-name] [flags]

Flags:
  -e, --endpoint string          kubernetes endpoint (default "http://127.0.0.1:8001")
  -n, --namespace stringArray    namespace to query. can be used multiple times. default is all namespaces
  -o, --onetime                  run one time and exit.
  -s, --selector string          label selector
  -i, --sync-interval duration   the time duration between processing. (default 1m0s)

The controller assumes you are running kubectl in proxy mode to handle authentication with Kubernetes.

You may want to use configmap-reload to reload Alertmanager when the configmap changes. An HTTP POST to /-/reload in Alertmanager will tell it to reload its config. Alertmanager logs will show any errors.

The controller will list all ConfigMaps - optionally using a label selector and/or limiting to certain namespaces.

ConfigMaps were used rather than Third Party Resources as various tools (helm, kubectl, etc have issues with TPRs. One some of those issues are resolved, the controller my use TPRs.

The controller supports all the current configuration options for Alertmanager. It expects certain annotations to be set on the ConfigMaps. Only a single "object" may be defined in a config map. All ConfigMaps expect to have the Alertmanager data in the spec key of the config map.

The controller will hash the existing ConfigMap data - if it exists - and the generated data and only update if these do not match.

The controller will always skip the target ConfigMap when gathering config maps for consideration of config snippets.

Alertmanager Configuration "Types"

The "type" of the ConfigMap is set using the alertmanager-type annotation key. The value of the key is case-insenstive as it is lowercased before being checked.

An invalid type is ignored. Any syntax error within the ConfigMap data spec will cause the controller to error and it will not generate a config map.

Global

A "global" type specifies the configuration for the global section of the Alertmanager configuration. Currently, the controller does not check for duplicates and the section will simple be overwritten.

Example:

apiVersion: v1
kind: ConfigMap
metadata:
  name: global-alertmanager-config
  namespace: kube-system
  labels:
    type: alertmanager
    kubernetes.io/cluster-service: "true"
  annotations:
    alertmanager-type: Global
data:
  spec: |-
    resolve_timeout: 60s
    smtp_smarthost: 'localhost:25'
    smtp_from: 'alertmanager@example.org'

In this example, we expect the controller to be ran with the selector argument set like --selector=type=alertmanager.

The controller will parse the spec to ensure it is a valid global configuration.

InhibitRule

InhibitRule generates a single inhibit_rule. All the rules are added to a list and this generates the inhibit_rules section of the Alertmanager config.

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-inhibit-rule
  namespace: kube-system
  labels:
    type: alertmanager
  annotations:
    alertmanager-type: InhibitRule
data:
  spec: |-
    target_match:
      foo: bar
Receiver

Receiver generates a single receiver. All the receivers are added to a list and set as the receivers section. See the Alertmanager documents for the format of each receiver type.

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-default-webhook
  namespace: kube-system
  labels:
    type: alertmanager
    kubernetes.io/cluster-service: "true"
  annotations:
    alertmanager-type: Receiver
data:
  spec: |-
    name: mywebhook

    webhook_configs:
     - url: http://alertmanager-webhook/alerts
       send_resolved: true
Template

Template expects a single string that is a path for loading templates. Templates are not handled by the controller currently. A second ConfigMap - possible generated using the configmap-aggregator - could be used to store templates. Only the path, as seen by the Alertmanager process, needs to be set here.

Route

Route generates a single route. one - and only one - route should be marked as the default route by setting the alertmanager-default-route: "true" annotation. Specifying zero or more than one will cause the controller to error. The other routes are added as the list of routes on this route. Any nested routes are ignored.

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-default-route
  namespace: kube-system
  labels:
    type: alertmanager
    kubernetes.io/cluster-service: "true"
  annotations:
    alertmanager-type: Route
    alertmanager-default-route: "true"
data:
  spec: |-
    receiver: team-X-mails

TODO

  • sort various lists to ensure we are not needlessly regerating a new ConfigMap.

LICENSE

See LICENSE

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL