alertmanager/server.go (55 lines of code) (raw):
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package main
import (
"flag"
"fmt"
"strings"
"github.com/facebookincubator/prometheus-configmanager/alertmanager/client"
"github.com/facebookincubator/prometheus-configmanager/alertmanager/handlers"
"github.com/facebookincubator/prometheus-configmanager/fsclient"
"github.com/facebookincubator/prometheus-configmanager/prometheus/alert"
"github.com/golang/glog"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
const (
defaultPort = "9101"
defaultAlertmanagerURL = "alertmanager:9093"
defaultAlertmanagerConfigPath = "./alertmanager.yml"
defaultTemplateDir = "./templates/"
)
func main() {
port := flag.String("port", defaultPort, fmt.Sprintf("Port to listen for requests. Default is %s", defaultPort))
alertmanagerConfPath := flag.String("alertmanager-conf", defaultAlertmanagerConfigPath, fmt.Sprintf("Path to alertmanager configuration file. Default is %s", defaultAlertmanagerConfigPath))
alertmanagerURL := flag.String("alertmanagerURL", defaultAlertmanagerURL, fmt.Sprintf("URL of the alertmanager instance that is being used. Default is %s", defaultAlertmanagerURL))
matcherLabel := flag.String("multitenant-label", "", "LabelName to use for enabling multitenancy through route matching. Leave empty for single tenant use cases.")
templateDirPath := flag.String("template-directory", defaultTemplateDir, fmt.Sprintf("Directory where template files are stored. Default is %s", defaultTemplateDir))
deleteRoutesByDefault := flag.Bool("delete-route-with-receiver", false, fmt.Sprintf("When a receiver is deleted, also delete all references in the route tree. Otherwise deleting before modifying tree will throw error."))
flag.Parse()
if !strings.HasSuffix(*templateDirPath, "/") {
*templateDirPath += "/"
}
tenancy := &alert.TenancyConfig{
RestrictorLabel: *matcherLabel,
}
e := echo.New()
e.Use(middleware.CORS())
e.Use(middleware.Logger())
fileLocks, err := alert.NewFileLocker(alert.NewDirectoryClient(*templateDirPath))
if err != nil {
panic(fmt.Errorf("error configuring file configmanager: %v", err))
}
config := client.ClientConfig{
ConfigPath: *alertmanagerConfPath,
AlertmanagerURL: *alertmanagerURL,
FsClient: fsclient.NewFSClient("/"),
Tenancy: tenancy,
DeleteRoutes: *deleteRoutesByDefault,
}
receiverClient := client.NewClient(config)
templateClient := client.NewTemplateClient(fsclient.NewFSClient(*templateDirPath), fileLocks)
handlers.RegisterBaseHandlers(e)
handlers.RegisterV0Handlers(e, receiverClient)
handlers.RegisterV1Handlers(e, receiverClient, templateClient)
glog.Infof("Alertmanager Config server listening on port: %s\n", *port)
e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", *port)))
}