GH-15742: added db health check method in app (#15752)
Этот коммит содержится в:
@@ -97,21 +97,14 @@ func getSystemPing(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
dbStatusKey := "database_status"
|
dbStatusKey := "database_status"
|
||||||
s[dbStatusKey] = model.STATUS_OK
|
s[dbStatusKey] = model.STATUS_OK
|
||||||
|
|
||||||
// Database Write Check
|
writeErr := c.App.DBHealthCheckWrite()
|
||||||
currentTime := fmt.Sprintf("%d", time.Now().Unix())
|
|
||||||
healthCheckKey := fmt.Sprintf("health_check_%s", c.App.GetClusterId())
|
|
||||||
|
|
||||||
writeErr := c.App.Srv().Store.System().SaveOrUpdate(&model.System{
|
|
||||||
Name: healthCheckKey,
|
|
||||||
Value: currentTime,
|
|
||||||
})
|
|
||||||
if writeErr != nil {
|
if writeErr != nil {
|
||||||
mlog.Warn("Unable to write to database.", mlog.Err(writeErr))
|
mlog.Warn("Unable to write to database.", mlog.Err(writeErr))
|
||||||
s[dbStatusKey] = model.STATUS_UNHEALTHY
|
s[dbStatusKey] = model.STATUS_UNHEALTHY
|
||||||
s[model.STATUS] = model.STATUS_UNHEALTHY
|
s[model.STATUS] = model.STATUS_UNHEALTHY
|
||||||
}
|
}
|
||||||
|
|
||||||
_, writeErr = c.App.Srv().Store.System().PermanentDeleteByName(healthCheckKey)
|
writeErr = c.App.DBHealthCheckDelete()
|
||||||
if writeErr != nil {
|
if writeErr != nil {
|
||||||
mlog.Warn("Unable to remove ping health check value from database.", mlog.Err(writeErr))
|
mlog.Warn("Unable to remove ping health check value from database.", mlog.Err(writeErr))
|
||||||
s[dbStatusKey] = model.STATUS_UNHEALTHY
|
s[dbStatusKey] = model.STATUS_UNHEALTHY
|
||||||
|
|||||||
19
app/app.go
19
app/app.go
@@ -10,6 +10,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/mattermost/go-i18n/i18n"
|
"github.com/mattermost/go-i18n/i18n"
|
||||||
goi18n "github.com/mattermost/go-i18n/i18n"
|
goi18n "github.com/mattermost/go-i18n/i18n"
|
||||||
@@ -677,3 +678,21 @@ func (a *App) SetServer(srv *Server) {
|
|||||||
func (a *App) GetT() goi18n.TranslateFunc {
|
func (a *App) GetT() goi18n.TranslateFunc {
|
||||||
return a.t
|
return a.t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) DBHealthCheckWrite() error {
|
||||||
|
currentTime := strconv.FormatInt(time.Now().Unix(), 10)
|
||||||
|
|
||||||
|
return a.Srv().Store.System().SaveOrUpdate(&model.System{
|
||||||
|
Name: a.dbHealthCheckKey(),
|
||||||
|
Value: currentTime,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) DBHealthCheckDelete() error {
|
||||||
|
_, err := a.Srv().Store.System().PermanentDeleteByName(a.dbHealthCheckKey())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) dbHealthCheckKey() string {
|
||||||
|
return fmt.Sprintf("health_check_%s", a.GetClusterId())
|
||||||
|
}
|
||||||
|
|||||||
@@ -436,6 +436,8 @@ type AppIface interface {
|
|||||||
CreateUserWithInviteId(user *model.User, inviteId, redirect string) (*model.User, *model.AppError)
|
CreateUserWithInviteId(user *model.User, inviteId, redirect string) (*model.User, *model.AppError)
|
||||||
CreateUserWithToken(user *model.User, token *model.Token) (*model.User, *model.AppError)
|
CreateUserWithToken(user *model.User, token *model.Token) (*model.User, *model.AppError)
|
||||||
CreateWebhookPost(userId string, channel *model.Channel, text, overrideUsername, overrideIconUrl, overrideIconEmoji string, props model.StringInterface, postType string, postRootId string) (*model.Post, *model.AppError)
|
CreateWebhookPost(userId string, channel *model.Channel, text, overrideUsername, overrideIconUrl, overrideIconEmoji string, props model.StringInterface, postType string, postRootId string) (*model.Post, *model.AppError)
|
||||||
|
DBHealthCheckDelete() error
|
||||||
|
DBHealthCheckWrite() error
|
||||||
DataRetention() einterfaces.DataRetentionInterface
|
DataRetention() einterfaces.DataRetentionInterface
|
||||||
DeactivateGuests() *model.AppError
|
DeactivateGuests() *model.AppError
|
||||||
DeactivateMfa(userId string) *model.AppError
|
DeactivateMfa(userId string) *model.AppError
|
||||||
|
|||||||
@@ -473,3 +473,27 @@ func TestDoEmojisPermissionsMigration(t *testing.T) {
|
|||||||
sort.Strings(systemAdmin2.Permissions)
|
sort.Strings(systemAdmin2.Permissions)
|
||||||
assert.Equal(t, expectedSystemAdmin, systemAdmin2.Permissions, fmt.Sprintf("'%v' did not have expected permissions", model.SYSTEM_ADMIN_ROLE_ID))
|
assert.Equal(t, expectedSystemAdmin, systemAdmin2.Permissions, fmt.Sprintf("'%v' did not have expected permissions", model.SYSTEM_ADMIN_ROLE_ID))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDBHealthCheckWriteAndDelete(t *testing.T) {
|
||||||
|
th := Setup(t)
|
||||||
|
defer th.TearDown()
|
||||||
|
|
||||||
|
expectedKey := "health_check_" + th.App.GetClusterId()
|
||||||
|
assert.Equal(t, expectedKey, th.App.dbHealthCheckKey())
|
||||||
|
|
||||||
|
_, err := th.App.Srv().Store.System().GetByName(expectedKey)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
|
||||||
|
err = th.App.DBHealthCheckWrite()
|
||||||
|
assert.Nil(t, err)
|
||||||
|
|
||||||
|
systemVal, err := th.App.Srv().Store.System().GetByName(expectedKey)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.NotNil(t, systemVal)
|
||||||
|
|
||||||
|
err = th.App.DBHealthCheckDelete()
|
||||||
|
assert.Nil(t, err)
|
||||||
|
|
||||||
|
_, err = th.App.Srv().Store.System().GetByName(expectedKey)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
}
|
||||||
|
|||||||
@@ -2350,6 +2350,50 @@ func (a *OpenTracingAppLayer) CreateWebhookPost(userId string, channel *model.Ch
|
|||||||
return resultVar0, resultVar1
|
return resultVar0, resultVar1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *OpenTracingAppLayer) DBHealthCheckDelete() error {
|
||||||
|
origCtx := a.ctx
|
||||||
|
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.DBHealthCheckDelete")
|
||||||
|
|
||||||
|
a.ctx = newCtx
|
||||||
|
a.app.Srv().Store.SetContext(newCtx)
|
||||||
|
defer func() {
|
||||||
|
a.app.Srv().Store.SetContext(origCtx)
|
||||||
|
a.ctx = origCtx
|
||||||
|
}()
|
||||||
|
|
||||||
|
defer span.Finish()
|
||||||
|
resultVar0 := a.app.DBHealthCheckDelete()
|
||||||
|
|
||||||
|
if resultVar0 != nil {
|
||||||
|
span.LogFields(spanlog.Error(resultVar0))
|
||||||
|
ext.Error.Set(span, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultVar0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *OpenTracingAppLayer) DBHealthCheckWrite() error {
|
||||||
|
origCtx := a.ctx
|
||||||
|
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.DBHealthCheckWrite")
|
||||||
|
|
||||||
|
a.ctx = newCtx
|
||||||
|
a.app.Srv().Store.SetContext(newCtx)
|
||||||
|
defer func() {
|
||||||
|
a.app.Srv().Store.SetContext(origCtx)
|
||||||
|
a.ctx = origCtx
|
||||||
|
}()
|
||||||
|
|
||||||
|
defer span.Finish()
|
||||||
|
resultVar0 := a.app.DBHealthCheckWrite()
|
||||||
|
|
||||||
|
if resultVar0 != nil {
|
||||||
|
span.LogFields(spanlog.Error(resultVar0))
|
||||||
|
ext.Error.Set(span, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultVar0
|
||||||
|
}
|
||||||
|
|
||||||
func (a *OpenTracingAppLayer) DeactivateGuests() *model.AppError {
|
func (a *OpenTracingAppLayer) DeactivateGuests() *model.AppError {
|
||||||
origCtx := a.ctx
|
origCtx := a.ctx
|
||||||
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.DeactivateGuests")
|
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.DeactivateGuests")
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user