|
|
@ -8,8 +8,12 @@ import (
|
|
|
|
"github.com/zeromicro/go-zero/core/breaker"
|
|
|
|
"github.com/zeromicro/go-zero/core/breaker"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
"github.com/zeromicro/go-zero/core/timex"
|
|
|
|
"github.com/zeromicro/go-zero/core/timex"
|
|
|
|
|
|
|
|
"github.com/zeromicro/go-zero/core/trace"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
mopt "go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
mopt "go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
|
|
|
|
"go.mongodb.org/mongo-driver/x/mongo/driver/session"
|
|
|
|
|
|
|
|
"go.opentelemetry.io/otel"
|
|
|
|
|
|
|
|
tracesdk "go.opentelemetry.io/otel/trace"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
const defaultSlowThreshold = time.Millisecond * 500
|
|
|
|
const defaultSlowThreshold = time.Millisecond * 500
|
|
|
@ -112,6 +116,9 @@ func newCollection(collection *mongo.Collection, brk breaker.Breaker) Collection
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) Aggregate(ctx context.Context, pipeline interface{},
|
|
|
|
func (c *decoratedCollection) Aggregate(ctx context.Context, pipeline interface{},
|
|
|
|
opts ...*mopt.AggregateOptions) (cur *mongo.Cursor, err error) {
|
|
|
|
opts ...*mopt.AggregateOptions) (cur *mongo.Cursor, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
starTime := timex.Now()
|
|
|
|
starTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -126,6 +133,9 @@ func (c *decoratedCollection) Aggregate(ctx context.Context, pipeline interface{
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) BulkWrite(ctx context.Context, models []mongo.WriteModel,
|
|
|
|
func (c *decoratedCollection) BulkWrite(ctx context.Context, models []mongo.WriteModel,
|
|
|
|
opts ...*mopt.BulkWriteOptions) (res *mongo.BulkWriteResult, err error) {
|
|
|
|
opts ...*mopt.BulkWriteOptions) (res *mongo.BulkWriteResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -140,6 +150,9 @@ func (c *decoratedCollection) BulkWrite(ctx context.Context, models []mongo.Writ
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) CountDocuments(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) CountDocuments(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.CountOptions) (count int64, err error) {
|
|
|
|
opts ...*mopt.CountOptions) (count int64, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -154,6 +167,9 @@ func (c *decoratedCollection) CountDocuments(ctx context.Context, filter interfa
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) DeleteMany(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) DeleteMany(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.DeleteOptions) (res *mongo.DeleteResult, err error) {
|
|
|
|
opts ...*mopt.DeleteOptions) (res *mongo.DeleteResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -168,6 +184,9 @@ func (c *decoratedCollection) DeleteMany(ctx context.Context, filter interface{}
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) DeleteOne(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) DeleteOne(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.DeleteOptions) (res *mongo.DeleteResult, err error) {
|
|
|
|
opts ...*mopt.DeleteOptions) (res *mongo.DeleteResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -182,6 +201,9 @@ func (c *decoratedCollection) DeleteOne(ctx context.Context, filter interface{},
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) Distinct(ctx context.Context, fieldName string, filter interface{},
|
|
|
|
func (c *decoratedCollection) Distinct(ctx context.Context, fieldName string, filter interface{},
|
|
|
|
opts ...*mopt.DistinctOptions) (val []interface{}, err error) {
|
|
|
|
opts ...*mopt.DistinctOptions) (val []interface{}, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -196,6 +218,9 @@ func (c *decoratedCollection) Distinct(ctx context.Context, fieldName string, fi
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) EstimatedDocumentCount(ctx context.Context,
|
|
|
|
func (c *decoratedCollection) EstimatedDocumentCount(ctx context.Context,
|
|
|
|
opts ...*mopt.EstimatedDocumentCountOptions) (val int64, err error) {
|
|
|
|
opts ...*mopt.EstimatedDocumentCountOptions) (val int64, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -210,6 +235,9 @@ func (c *decoratedCollection) EstimatedDocumentCount(ctx context.Context,
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) Find(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) Find(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.FindOptions) (cur *mongo.Cursor, err error) {
|
|
|
|
opts ...*mopt.FindOptions) (cur *mongo.Cursor, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -224,6 +252,9 @@ func (c *decoratedCollection) Find(ctx context.Context, filter interface{},
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) FindOne(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) FindOne(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.FindOneOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
opts ...*mopt.FindOneOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -239,6 +270,9 @@ func (c *decoratedCollection) FindOne(ctx context.Context, filter interface{},
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) FindOneAndDelete(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) FindOneAndDelete(ctx context.Context, filter interface{},
|
|
|
|
opts ...*mopt.FindOneAndDeleteOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
opts ...*mopt.FindOneAndDeleteOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -255,6 +289,9 @@ func (c *decoratedCollection) FindOneAndDelete(ctx context.Context, filter inter
|
|
|
|
func (c *decoratedCollection) FindOneAndReplace(ctx context.Context, filter interface{},
|
|
|
|
func (c *decoratedCollection) FindOneAndReplace(ctx context.Context, filter interface{},
|
|
|
|
replacement interface{}, opts ...*mopt.FindOneAndReplaceOptions) (
|
|
|
|
replacement interface{}, opts ...*mopt.FindOneAndReplaceOptions) (
|
|
|
|
res *mongo.SingleResult, err error) {
|
|
|
|
res *mongo.SingleResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -270,6 +307,9 @@ func (c *decoratedCollection) FindOneAndReplace(ctx context.Context, filter inte
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) FindOneAndUpdate(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
func (c *decoratedCollection) FindOneAndUpdate(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
opts ...*mopt.FindOneAndUpdateOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
opts ...*mopt.FindOneAndUpdateOptions) (res *mongo.SingleResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -285,6 +325,9 @@ func (c *decoratedCollection) FindOneAndUpdate(ctx context.Context, filter inter
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) InsertMany(ctx context.Context, documents []interface{},
|
|
|
|
func (c *decoratedCollection) InsertMany(ctx context.Context, documents []interface{},
|
|
|
|
opts ...*mopt.InsertManyOptions) (res *mongo.InsertManyResult, err error) {
|
|
|
|
opts ...*mopt.InsertManyOptions) (res *mongo.InsertManyResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -299,6 +342,9 @@ func (c *decoratedCollection) InsertMany(ctx context.Context, documents []interf
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) InsertOne(ctx context.Context, document interface{},
|
|
|
|
func (c *decoratedCollection) InsertOne(ctx context.Context, document interface{},
|
|
|
|
opts ...*mopt.InsertOneOptions) (res *mongo.InsertOneResult, err error) {
|
|
|
|
opts ...*mopt.InsertOneOptions) (res *mongo.InsertOneResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -313,6 +359,9 @@ func (c *decoratedCollection) InsertOne(ctx context.Context, document interface{
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) ReplaceOne(ctx context.Context, filter interface{}, replacement interface{},
|
|
|
|
func (c *decoratedCollection) ReplaceOne(ctx context.Context, filter interface{}, replacement interface{},
|
|
|
|
opts ...*mopt.ReplaceOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
opts ...*mopt.ReplaceOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -327,6 +376,9 @@ func (c *decoratedCollection) ReplaceOne(ctx context.Context, filter interface{}
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) UpdateByID(ctx context.Context, id interface{}, update interface{},
|
|
|
|
func (c *decoratedCollection) UpdateByID(ctx context.Context, id interface{}, update interface{},
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -341,6 +393,9 @@ func (c *decoratedCollection) UpdateByID(ctx context.Context, id interface{}, up
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) UpdateMany(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
func (c *decoratedCollection) UpdateMany(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -355,6 +410,9 @@ func (c *decoratedCollection) UpdateMany(ctx context.Context, filter interface{}
|
|
|
|
|
|
|
|
|
|
|
|
func (c *decoratedCollection) UpdateOne(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
func (c *decoratedCollection) UpdateOne(ctx context.Context, filter interface{}, update interface{},
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
opts ...*mopt.UpdateOptions) (res *mongo.UpdateResult, err error) {
|
|
|
|
|
|
|
|
ctx, span := startSpan(ctx)
|
|
|
|
|
|
|
|
defer span.End()
|
|
|
|
|
|
|
|
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
err = c.brk.DoWithAcceptable(func() error {
|
|
|
|
startTime := timex.Now()
|
|
|
|
startTime := timex.Now()
|
|
|
|
defer func() {
|
|
|
|
defer func() {
|
|
|
@ -414,5 +472,14 @@ func (p keepablePromise) keep(err error) error {
|
|
|
|
|
|
|
|
|
|
|
|
func acceptable(err error) bool {
|
|
|
|
func acceptable(err error) bool {
|
|
|
|
return err == nil || err == mongo.ErrNoDocuments || err == mongo.ErrNilValue ||
|
|
|
|
return err == nil || err == mongo.ErrNoDocuments || err == mongo.ErrNilValue ||
|
|
|
|
err == mongo.ErrNilDocument || err == mongo.ErrNilCursor || err == mongo.ErrEmptySlice
|
|
|
|
err == mongo.ErrNilDocument || err == mongo.ErrNilCursor || err == mongo.ErrEmptySlice ||
|
|
|
|
|
|
|
|
// session err
|
|
|
|
|
|
|
|
err == session.ErrSessionEnded || err == session.ErrNoTransactStarted || err == session.ErrTransactInProgress ||
|
|
|
|
|
|
|
|
err == session.ErrAbortAfterCommit || err == session.ErrAbortTwice || err == session.ErrCommitAfterAbort ||
|
|
|
|
|
|
|
|
err == session.ErrUnackWCUnsupported || err == session.ErrSnapshotTransaction
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func startSpan(ctx context.Context) (context.Context, tracesdk.Span) {
|
|
|
|
|
|
|
|
tracer := otel.GetTracerProvider().Tracer(trace.TraceName)
|
|
|
|
|
|
|
|
return tracer.Start(ctx, "mongo")
|
|
|
|
}
|
|
|
|
}
|
|
|
|