outpost: add lightweight, anonymous metrics

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-11-04 14:10:43 +01:00
parent 5000c5b061
commit 9ac3b29418
2 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,80 @@
package ak
import (
"bytes"
"crypto/sha512"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
log "github.com/sirupsen/logrus"
"goauthentik.io/internal/constants"
)
func exists(name string) bool {
_, err := os.Stat(name)
if err == nil {
return true
}
if errors.Is(err, os.ErrNotExist) {
return false
}
return false
}
func getEnv() string {
if _, o := os.LookupEnv("KUBERNETES_SERVICE_HOST"); o {
return "kubernetes"
}
if _, o := os.LookupEnv("CI"); o {
return "ci"
}
if exists("/tmp/authentik-mode") {
return "embedded"
}
return "custom"
}
func analytics(akURL url.URL, on string) {
if _, s := os.LookupEnv("AUTHENTIK_DISABLE_ANALYTICS"); s {
return
}
body := struct {
Domain string `json:"domain"`
Name string `json:"name"`
URL string `json:"url"`
Referrer string `json:"referrer"`
}{
Domain: "authentik",
Name: "pageview",
URL: fmt.Sprintf("http://localhost/outpost/%s", getEnv()),
Referrer: fmt.Sprintf("%s (%s)", constants.VERSION, constants.BUILD()),
}
b, err := json.Marshal(body)
if err != nil {
log.WithError(err).Debug("test")
}
ua := fmt.Sprintf("%s-%s", akURL.Host, on)
h := sha512.New()
h.Write([]byte(ua))
req, err := http.NewRequest("POST", "https://goauthentik.io/api/event", bytes.NewReader(b))
if err != nil {
log.WithError(err).Debug("test")
}
req.Header.Set("Content-Type", "text/plain")
req.Header.Set("User-Agent", hex.EncodeToString(h.Sum(nil)))
r, err := http.DefaultClient.Do(req)
if err != nil {
log.WithError(err).Debug("test")
}
if r.StatusCode >= 400 {
b, _ := ioutil.ReadAll(r.Body)
log.WithField("status", r.StatusCode).WithField("body", string(b)).Debug("failed")
}
}

View File

@ -67,6 +67,7 @@ func NewAPIController(akURL url.URL, token string) *APIController {
}
outpost := outposts.Results[0]
doGlobalSetup(outpost.Config)
go analytics(akURL, outpost.Name)
log.WithField("name", outpost.Name).Debug("Fetched outpost configuration")