wormhole-explorer/pipeline/healthcheck/mongo.go

55 lines
1.6 KiB
Go

package healthcheck
import (
"context"
"fmt"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
type mongoStatus struct {
Ok int32 `bson:"ok"`
Host string `bson:"host"`
Version string `bson:"version"`
Process string `bson:"process"`
Pid int32 `bson:"pid"`
Uptime int32 `bson:"uptime"`
Connections *mongoConnections `bson:"connections"`
}
// mongoConnections represents a mongo server connection.
type mongoConnections struct {
Current int32 `bson:"current"`
Available int32 `bson:"available"`
TotalCreated int32 `bson:"totalCreated"`
}
func Mongo(db *mongo.Database) Check {
return func(ctx context.Context) error {
command := bson.D{{Key: "serverStatus", Value: 1}}
result := db.RunCommand(ctx, command)
if result.Err() != nil {
return errors.WithStack(result.Err())
}
var mongoStatus mongoStatus
err := result.Decode(&mongoStatus)
if err != nil {
return errors.WithStack(err)
}
// check mongo server status
mongoStatusCheck := (mongoStatus.Ok == 1 && mongoStatus.Pid > 0 && mongoStatus.Uptime > 0)
if !mongoStatusCheck {
return fmt.Errorf("mongo server not ready (Ok = %v, Pid = %v, Uptime = %v)", mongoStatus.Ok, mongoStatus.Pid, mongoStatus.Uptime)
}
// check mongo connections
if mongoStatus.Connections.Available <= 0 {
return fmt.Errorf("mongo server without available connections (availableConection = %v)", mongoStatus.Connections.Available)
}
return nil
}
}