parent
3053d4a5ce
commit
88eb7d5b82
@ -0,0 +1 @@
|
|||||||
|
package unrelation // import "github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation"
|
@ -0,0 +1 @@
|
|||||||
|
package kafka // import "github.com/openimsdk/open-im-server/v3/pkg/common/kafka"
|
@ -0,0 +1 @@
|
|||||||
|
package servererrs // import "github.com/openimsdk/open-im-server/v3/pkg/common/servererrs"
|
@ -0,0 +1 @@
|
|||||||
|
package conversationutil // import "github.com/openimsdk/open-im-server/v3/pkg/util/conversationutil"
|
@ -0,0 +1,20 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServiceChecker interface {
|
||||||
|
Check(ctx context.Context, config *config.GlobalConfig) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckServices(ctx context.Context, cfg *config.GlobalConfig, checkers []ServiceChecker) error {
|
||||||
|
for _, checker := range checkers {
|
||||||
|
if err := checker.Check(ctx, cfg); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
type EtcdCheck struct{}
|
||||||
|
|
||||||
|
func CheckEtcd(ctx context.Context, config *EtcdCheck) error {
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
"github.com/openimsdk/tools/log"
|
||||||
|
"github.com/openimsdk/tools/mq/kafka"
|
||||||
|
)
|
||||||
|
|
||||||
|
type KafkaCheck struct {
|
||||||
|
Kafka *config.Kafka
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckKafka(ctx context.Context, config *KafkaCheck) error {
|
||||||
|
kafkaConfig := &kafka.Config{
|
||||||
|
Addr: config.Kafka.Addr,
|
||||||
|
Username: config.Kafka.Username,
|
||||||
|
Password: config.Kafka.Password,
|
||||||
|
}
|
||||||
|
|
||||||
|
requiredTopics := []string{
|
||||||
|
config.Kafka.MsgToMongo.Topic,
|
||||||
|
config.Kafka.MsgToPush.Topic,
|
||||||
|
config.Kafka.LatestMsgToRedis.Topic,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Checking Kafka connection", "Address", kafkaConfig.Addr, "Topics", requiredTopics)
|
||||||
|
|
||||||
|
err := kafka.CheckKafka(ctx, kafkaConfig, requiredTopics)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(ctx, "Kafka connection failed", "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Kafka connection and required topics verified successfully")
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/openimsdk/tools/errs"
|
||||||
|
"github.com/openimsdk/tools/utils/jsonutil"
|
||||||
|
|
||||||
|
"github.com/minio/minio-go/v7"
|
||||||
|
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||||
|
"github.com/openimsdk/tools/log"
|
||||||
|
|
||||||
|
s3minio "github.com/openimsdk/open-im-server/v3/pkg/common/db/s3/minio"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
minioHealthCheckDuration = 1
|
||||||
|
mongoConnTimeout = 5 * time.Second
|
||||||
|
MaxRetry = 300
|
||||||
|
)
|
||||||
|
|
||||||
|
type MinioConfig struct {
|
||||||
|
s3minio.Config
|
||||||
|
UseSSL string
|
||||||
|
ApiURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckMinio checks the MinIO connection.
|
||||||
|
func CheckMinio(minioStu MinioConfig) error {
|
||||||
|
if minioStu.Endpoint == "" || minioStu.AccessKeyID == "" || minioStu.SecretAccessKey == "" {
|
||||||
|
log.CInfo(nil, "Missing configuration for MinIO", "endpoint", minioStu.Endpoint, "accessKeyID", minioStu.AccessKeyID, "secretAccessKey", minioStu.SecretAccessKey)
|
||||||
|
return errs.New("missing configuration for endpoint, accessKeyID, or secretAccessKey").Wrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
minioInfo, err := jsonutil.JsonMarshal(minioStu)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(nil, "MinioStu Marshal failed", "error", err)
|
||||||
|
return errs.WrapMsg(err, "minioStu Marshal failed")
|
||||||
|
}
|
||||||
|
logJsonInfo := string(minioInfo)
|
||||||
|
|
||||||
|
u, err := url.Parse(minioStu.Endpoint)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(nil, "URL parse failed", "error", err, "minioInfo", logJsonInfo)
|
||||||
|
return errs.WrapMsg(err, "url parse failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
secure := u.Scheme == "https" || minioStu.UseSSL == "true"
|
||||||
|
|
||||||
|
minioClient, err := minio.New(u.Host, &minio.Options{
|
||||||
|
Creds: credentials.NewStaticV4(minioStu.AccessKeyID, minioStu.SecretAccessKey, ""),
|
||||||
|
Secure: secure,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(nil, "Initialize MinIO client failed", "error", err, "minioInfo", logJsonInfo)
|
||||||
|
return errs.WrapMsg(err, "initialize minio client failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel, err := minioClient.HealthCheck(time.Duration(minioHealthCheckDuration) * time.Second)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(nil, "MinIO client health check failed", "error", err, "minioInfo", logJsonInfo)
|
||||||
|
return errs.WrapMsg(err, "minio client health check failed")
|
||||||
|
}
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if minioClient.IsOffline() {
|
||||||
|
log.CInfo(nil, "MinIO client is offline", "minioInfo", logJsonInfo)
|
||||||
|
return errors.New("minio client is offline")
|
||||||
|
}
|
||||||
|
|
||||||
|
apiURL, err := exactIP(minioStu.ApiURL)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
signEndPoint, err := exactIP(minioStu.SignEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if apiURL == "127.0.0.1" {
|
||||||
|
log.CInfo(nil, "Warning, MinIOStu.apiURL contains localhost", "apiURL", minioStu.ApiURL)
|
||||||
|
}
|
||||||
|
if signEndPoint == "127.0.0.1" {
|
||||||
|
log.CInfo(nil, "Warning, MinIOStu.signEndPoint contains localhost", "signEndPoint", minioStu.SignEndpoint)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func exactIP(urlStr string) (string, error) {
|
||||||
|
u, err := url.Parse(urlStr)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(nil, "URL parse error", "error", err, "url", urlStr)
|
||||||
|
return "", errs.WrapMsg(err, "url parse error")
|
||||||
|
}
|
||||||
|
host, _, err := net.SplitHostPort(u.Host)
|
||||||
|
if err != nil {
|
||||||
|
host = u.Host // Assume the entire host part is the host name if split fails
|
||||||
|
}
|
||||||
|
if strings.HasSuffix(host, ":") {
|
||||||
|
host = host[:len(host)-1]
|
||||||
|
}
|
||||||
|
return host, nil
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
"github.com/openimsdk/tools/db/mongoutil"
|
||||||
|
"github.com/openimsdk/tools/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MongoCheck struct {
|
||||||
|
Mongo *config.Mongo
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckMongo(ctx context.Context, config *MongoCheck) error {
|
||||||
|
mongoConfig := &mongoutil.Config{
|
||||||
|
Uri: config.Mongo.Uri,
|
||||||
|
Address: config.Mongo.Address,
|
||||||
|
Database: config.Mongo.Database,
|
||||||
|
Username: config.Mongo.Username,
|
||||||
|
Password: config.Mongo.Password,
|
||||||
|
MaxPoolSize: config.Mongo.MaxPoolSize,
|
||||||
|
MaxRetry: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Checking MongoDB connection", "URI", mongoConfig.Uri, "Database", mongoConfig.Database)
|
||||||
|
|
||||||
|
err := mongoutil.CheckMongo(ctx, mongoConfig)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(ctx, "MongoDB connection failed", "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "MongoDB connection established successfully")
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
"github.com/openimsdk/tools/db/redisutil"
|
||||||
|
"github.com/openimsdk/tools/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RedisCheck struct {
|
||||||
|
Redis *config.Redis
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckRedis(ctx context.Context, config *RedisCheck) error {
|
||||||
|
redisConfig := &redisutil.Config{
|
||||||
|
Address: config.Redis.Address,
|
||||||
|
Username: config.Redis.Username,
|
||||||
|
Password: config.Redis.Password,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Checking Redis connection", "Address", redisConfig.Address)
|
||||||
|
|
||||||
|
err := redisutil.CheckRedis(ctx, redisConfig)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(ctx, "Redis connection failed", "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Redis connection established successfully")
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package checks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
"github.com/openimsdk/tools/discovery/zookeeper"
|
||||||
|
"github.com/openimsdk/tools/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ZookeeperCheck struct {
|
||||||
|
Zookeeper *config.Zookeeper
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkZookeeper(ctx context.Context, config *ZookeeperCheck) error {
|
||||||
|
zkServers := config.Zookeeper.ZkAddr
|
||||||
|
schema := config.Zookeeper.Schema
|
||||||
|
|
||||||
|
authOption := zookeeper.WithUserNameAndPassword(config.Zookeeper.Username, config.Zookeeper.Password)
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Checking Zookeeper connection", "Schema", schema, "ZkServers", zkServers)
|
||||||
|
|
||||||
|
err := zookeeper.CheckZookeeper(ctx, zkServers, config.Zookeeper.Schema, authOption)
|
||||||
|
if err != nil {
|
||||||
|
log.CInfo(ctx, "Zookeeper connection failed", "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.CInfo(ctx, "Zookeeper connection established successfully")
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue