From 677f48ff3f87d41db16b43fc5d526546909c72d8 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Fri, 10 Apr 2020 03:07:53 +0300 Subject: [PATCH] Simple implementation of the health checker for the worker --- Gopkg.lock | 9 ++++++ Gopkg.toml | 4 +++ cmd/worker.go | 7 +++++ eventsubscribers/health_checkers.go | 30 ++++++++++++++++++++ eventsubscribers/health_checkers_test.go | 35 ++++++++++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 eventsubscribers/health_checkers.go create mode 100644 eventsubscribers/health_checkers_test.go diff --git a/Gopkg.lock b/Gopkg.lock index 7d9c796..22a403d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -39,6 +39,14 @@ revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" +[[projects]] + digest = "1:2e7c296138d042515eb2995fe58026eaef2c08f660a5f36584faecf34eea3cf0" + name = "github.com/etherlabsio/healthcheck" + packages = ["."] + pruneopts = "" + revision = "dd3d2fd8c3f620a32b7f3cd9b4f0d2f7d0875ab1" + version = "2.0.3" + [[projects]] digest = "1:9f1e571696860f2b4f8a241b43ce91c6085e7aaed849ccca53f590a4dc7b95bd" name = "github.com/fsnotify/fsnotify" @@ -311,6 +319,7 @@ "github.com/SermoDigital/jose/crypto", "github.com/SermoDigital/jose/jws", "github.com/asaskevich/EventBus", + "github.com/etherlabsio/healthcheck", "github.com/getsentry/raven-go", "github.com/gorilla/mux", "github.com/h2non/gock", diff --git a/Gopkg.toml b/Gopkg.toml index b903930..28174fd 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -41,6 +41,10 @@ ignored = ["github.com/elyby/chrly"] source = "https://github.com/erickskrauch/EventBus.git" branch = "publish_nil_values" +[[constraint]] + name = "github.com/etherlabsio/healthcheck" + version = "2.0.3" + # Testing dependencies [[constraint]] diff --git a/cmd/worker.go b/cmd/worker.go index c383516..c3a3a7f 100644 --- a/cmd/worker.go +++ b/cmd/worker.go @@ -5,6 +5,7 @@ import ( "log" "os" + "github.com/etherlabsio/healthcheck" "github.com/mono83/slf/wd" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -51,6 +52,12 @@ var workerCmd = &cobra.Command{ Emitter: dispatcher, UUIDsProvider: uuidsProvider, }).CreateHandler() + handler.Handle("/healthcheck", healthcheck.Handler( + healthcheck.WithChecker( + "mojang-batch-uuids-provider-response", + eventsubscribers.MojangBatchUuidsProviderChecker(dispatcher), + ), + )).Methods("GET") finishChan := make(chan bool) go func() { diff --git a/eventsubscribers/health_checkers.go b/eventsubscribers/health_checkers.go new file mode 100644 index 0000000..32e33dc --- /dev/null +++ b/eventsubscribers/health_checkers.go @@ -0,0 +1,30 @@ +package eventsubscribers + +import ( + "context" + "sync" + + "github.com/etherlabsio/healthcheck" + + "github.com/elyby/chrly/api/mojang" +) + +func MojangBatchUuidsProviderChecker(dispatcher Subscriber) healthcheck.CheckerFunc { + var mutex sync.Mutex + var lastCallErr error // TODO: need to reset this value after some time + dispatcher.Subscribe( + "mojang_textures:batch_uuids_provider:result", + func(usernames []string, profiles []*mojang.ProfileInfo, err error) { + mutex.Lock() + lastCallErr = err + mutex.Unlock() + }, + ) + + return func(ctx context.Context) error { + mutex.Lock() + defer mutex.Unlock() + + return lastCallErr + } +} diff --git a/eventsubscribers/health_checkers_test.go b/eventsubscribers/health_checkers_test.go new file mode 100644 index 0000000..15a386f --- /dev/null +++ b/eventsubscribers/health_checkers_test.go @@ -0,0 +1,35 @@ +package eventsubscribers + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/elyby/chrly/api/mojang" + "github.com/elyby/chrly/bootstrap" +) + +func TestMojangBatchUuidsProviderChecker(t *testing.T) { + t.Run("empty state", func(t *testing.T) { + dispatcher := bootstrap.CreateEventDispatcher() + checker := MojangBatchUuidsProviderChecker(dispatcher) + assert.Nil(t, checker(context.Background())) + }) + + t.Run("when no error occurred", func(t *testing.T) { + dispatcher := bootstrap.CreateEventDispatcher() + checker := MojangBatchUuidsProviderChecker(dispatcher) + dispatcher.Emit("mojang_textures:batch_uuids_provider:result", []string{"username"}, []*mojang.ProfileInfo{}, nil) + assert.Nil(t, checker(context.Background())) + }) + + t.Run("when error occurred", func(t *testing.T) { + dispatcher := bootstrap.CreateEventDispatcher() + checker := MojangBatchUuidsProviderChecker(dispatcher) + err := errors.New("some error occurred") + dispatcher.Emit("mojang_textures:batch_uuids_provider:result", []string{"username"}, nil, err) + assert.Equal(t, err, checker(context.Background())) + }) +}