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