mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-15 07:55:51 +00:00
105 lines
2.6 KiB
Go
105 lines
2.6 KiB
Go
package profiler
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
tu "github.com/percona/percona-toolkit/src/go/internal/testutils"
|
|
"github.com/percona/percona-toolkit/src/go/lib/tutil"
|
|
"github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter"
|
|
"github.com/percona/percona-toolkit/src/go/mongolib/stats"
|
|
"github.com/percona/percona-toolkit/src/go/pt-mongodb-query-digest/filter"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
const (
|
|
samples = "/src/go/tests/"
|
|
)
|
|
|
|
type testVars struct {
|
|
RootPath string
|
|
}
|
|
|
|
var vars testVars
|
|
|
|
func parseDate(dateStr string) time.Time {
|
|
date, _ := time.Parse(time.RFC3339Nano, dateStr)
|
|
return date
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
var err error
|
|
if vars.RootPath, err = tutil.RootPath(); err != nil {
|
|
log.Printf("cannot get root path: %s", err.Error())
|
|
os.Exit(1)
|
|
}
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
func TestRegularIterator(t *testing.T) {
|
|
ctx := context.Background()
|
|
client, err := tu.TestClient(ctx, tu.MongoDBShard1PrimaryPort)
|
|
require.NoError(t, err)
|
|
|
|
database := "test"
|
|
// Disable the profiler and drop the db. This should also remove the system.profile collection
|
|
// so the stats should be re-initialized
|
|
res := client.Database("admin").RunCommand(ctx, primitive.M{"profile": 0})
|
|
if res.Err() != nil {
|
|
t.Fatalf("Cannot enable profiler: %s", res.Err())
|
|
}
|
|
err = client.Database(database).Drop(ctx)
|
|
assert.NoError(t, err)
|
|
|
|
// re-enable the profiler
|
|
res = client.Database("test").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}})
|
|
if res.Err() != nil {
|
|
t.Fatalf("Cannot enable profiler: %s", res.Err())
|
|
}
|
|
|
|
// run some queries to have something to profile
|
|
count := 1000
|
|
for j := 0; j < count; j++ {
|
|
_, err := client.Database("test").Collection("testc").InsertOne(ctx, primitive.M{"number": j})
|
|
assert.NoError(t, err)
|
|
time.Sleep(20 * time.Millisecond)
|
|
}
|
|
|
|
cursor, err := client.Database(database).Collection("system.profile").Find(ctx, primitive.M{})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
filters := []filter.Filter{}
|
|
|
|
fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters())
|
|
s := stats.New(fp)
|
|
prof := NewProfiler(cursor, filters, nil, s)
|
|
prof.Start(ctx)
|
|
|
|
queries := <-prof.QueriesChan()
|
|
found := false
|
|
valid := false
|
|
|
|
for _, query := range queries {
|
|
if query.Namespace == "test.testc" && query.Operation == "INSERT" {
|
|
found = true
|
|
if query.Fingerprint == "INSERT testc" && query.Count == count {
|
|
valid = true
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
t.Errorf("Insert query was not found")
|
|
}
|
|
if !valid {
|
|
t.Errorf("Query stats are not valid")
|
|
}
|
|
}
|