From c163b7d2a83769e76f12f90a2087badc4e3236b1 Mon Sep 17 00:00:00 2001 From: Alex Ellis Date: Thu, 24 Aug 2017 23:15:38 +0100 Subject: [PATCH] Add gateway_service_count metric for external provider Signed-off-by: Alex Ellis --- gateway/metrics/externalwatcher.go | 72 ++++++++++++++++++++++++++++++ gateway/server.go | 2 + 2 files changed, 74 insertions(+) create mode 100644 gateway/metrics/externalwatcher.go diff --git a/gateway/metrics/externalwatcher.go b/gateway/metrics/externalwatcher.go new file mode 100644 index 00000000..44b6e416 --- /dev/null +++ b/gateway/metrics/externalwatcher.go @@ -0,0 +1,72 @@ +// Copyright (c) Alex Ellis 2017. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +package metrics + +import ( + "encoding/json" + "io/ioutil" + "net" + "net/http" + "net/url" + "time" + + "log" + + "github.com/alexellis/faas/gateway/requests" +) + +func AttachExternalWatcher(endpointURL url.URL, metricsOptions MetricOptions, label string, interval time.Duration) { + ticker := time.NewTicker(interval) + quit := make(chan struct{}) + proxyClient := http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 3 * time.Second, + KeepAlive: 0, + }).DialContext, + MaxIdleConns: 1, + DisableKeepAlives: true, + IdleConnTimeout: 120 * time.Millisecond, + ExpectContinueTimeout: 1500 * time.Millisecond, + }, + } + + go func() { + for { + select { + case <-ticker.C: + + get, _ := http.NewRequest(http.MethodGet, endpointURL.String()+"system/functions", nil) + + services := []requests.Function{} + res, err := proxyClient.Do(get) + if err != nil { + log.Println(err) + continue + } + bytesOut, readErr := ioutil.ReadAll(res.Body) + if readErr != nil { + log.Println(err) + continue + } + unmarshalErr := json.Unmarshal(bytesOut, &services) + if unmarshalErr != nil { + log.Println(err) + continue + } + + for _, service := range services { + metricsOptions.ServiceReplicasCounter. + WithLabelValues(service.Name). + Set(float64(service.Replicas)) + } + + break + case <-quit: + return + } + } + }() +} diff --git a/gateway/server.go b/gateway/server.go index c12da0fc..1db0d738 100644 --- a/gateway/server.go +++ b/gateway/server.go @@ -77,6 +77,8 @@ func main() { faasHandlers.DeployFunction = makeHandler(reverseProxy, &metricsOptions) faasHandlers.DeleteFunction = makeHandler(reverseProxy, &metricsOptions) + metrics.AttachExternalWatcher(*config.FunctionsProviderURL, metricsOptions, "func", time.Second*5) + } else { maxRestarts := uint64(5)