Skip to content

Commit

Permalink
*: add telemetry support for IndexMerge (#39469)
Browse files Browse the repository at this point in the history
close #39475
  • Loading branch information
guo-shaoge authored Nov 30, 2022
1 parent 06072d6 commit e98e959
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 0 deletions.
1 change: 1 addition & 0 deletions executor/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ type TelemetryInfo struct {
UseFlashbackToCluster bool
PartitionTelemetry *PartitionTelemetryInfo
AccountLockTelemetry *AccountLockTelemetryInfo
UseIndexMerge bool
}

// PartitionTelemetryInfo records table partition telemetry information during execution.
Expand Down
3 changes: 3 additions & 0 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3977,6 +3977,9 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd
}

func (b *executorBuilder) buildIndexMergeReader(v *plannercore.PhysicalIndexMergeReader) Executor {
if b.Ti != nil {
b.Ti.UseIndexMerge = true
}
ts := v.TablePlans[0].(*plannercore.PhysicalTableScan)
if err := b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil {
b.err = err
Expand Down
26 changes: 26 additions & 0 deletions metrics/telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,13 @@ var (
Name: "flashback_cluster_usage",
Help: "Counter of usage of flashback cluster",
})
TelemetryIndexMergeUsage = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: "tidb",
Subsystem: "telemetry",
Name: "index_merge_usage",
Help: "Counter of usage of index merge",
})
TelemetryCompactPartitionCnt = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: "tidb",
Expand Down Expand Up @@ -396,3 +403,22 @@ func GetDDLUsageCounter() DDLUsageCounter {
FlashbackClusterUsed: readCounter(TelemetryFlashbackClusterCnt),
}
}

// IndexMergeUsageCounter records the usages of IndexMerge feature.
type IndexMergeUsageCounter struct {
IndexMergeUsed int64 `json:"index_merge_used"`
}

// Sub returns the difference of two counters.
func (i IndexMergeUsageCounter) Sub(rhs IndexMergeUsageCounter) IndexMergeUsageCounter {
return IndexMergeUsageCounter{
IndexMergeUsed: i.IndexMergeUsed - rhs.IndexMergeUsed,
}
}

// GetIndexMergeCounter gets the IndexMerge usage counter.
func GetIndexMergeCounter() IndexMergeUsageCounter {
return IndexMergeUsageCounter{
IndexMergeUsed: readCounter(TelemetryIndexMergeUsage),
}
}
6 changes: 6 additions & 0 deletions session/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ var (
telemetryLockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("lockUser")
telemetryUnlockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("unlockUser")
telemetryCreateOrAlterUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("createOrAlterUser")

telemetryIndexMerge = metrics.TelemetryIndexMergeUsage
)

// Session context, it is consistent with the lifecycle of a client connection.
Expand Down Expand Up @@ -3588,6 +3590,10 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) {
telemetryCTEUsageNotCTE.Inc()
}

if ti.UseIndexMerge {
telemetryIndexMerge.Inc()
}

if ti.UseMultiSchemaChange {
telemetryMultiSchemaChangeUsage.Inc()
}
Expand Down
14 changes: 14 additions & 0 deletions telemetry/data_feature_usage.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ type featureUsage struct {
DDLUsageCounter *m.DDLUsageCounter `json:"DDLUsageCounter"`
EnableGlobalMemoryControl bool `json:"enableGlobalMemoryControl"`
AutoIDNoCache bool `json:"autoIDNoCache"`
IndexMergeUsageCounter *m.IndexMergeUsageCounter `json:"indexMergeUsageCounter"`
}

type placementPolicyUsage struct {
Expand Down Expand Up @@ -108,6 +109,8 @@ func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsag

usage.EnableGlobalMemoryControl = getGlobalMemoryControl()

usage.IndexMergeUsageCounter = getIndexMergeUsageInfo()

return &usage, nil
}

Expand Down Expand Up @@ -244,6 +247,7 @@ var initialTablePartitionCounter m.TablePartitionUsageCounter
var initialSavepointStmtCounter int64
var initialLazyPessimisticUniqueCheckSetCount int64
var initialDDLUsageCounter m.DDLUsageCounter
var initialIndexMergeCounter m.IndexMergeUsageCounter

// getTxnUsageInfo gets the usage info of transaction related features. It's exported for tests.
func getTxnUsageInfo(ctx sessionctx.Context) *TxnUsage {
Expand Down Expand Up @@ -402,3 +406,13 @@ func getDDLUsageInfo(ctx sessionctx.Context) *m.DDLUsageCounter {
func getGlobalMemoryControl() bool {
return memory.ServerMemoryLimit.Load() > 0
}

func postReportIndexMergeUsage() {
initialIndexMergeCounter = m.GetIndexMergeCounter()
}

func getIndexMergeUsageInfo() *m.IndexMergeUsageCounter {
curr := m.GetIndexMergeCounter()
diff := curr.Sub(initialIndexMergeCounter)
return &diff
}
29 changes: 29 additions & 0 deletions telemetry/data_feature_usage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -554,3 +554,32 @@ func TestGlobalMemoryControl(t *testing.T) {
require.NoError(t, err)
require.False(t, usage.EnableGlobalMemoryControl)
}

func TestIndexMergeUsage(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)

tk.MustExec("use test")
tk.MustExec("create table t1(c1 int, c2 int, index idx1(c1), index idx2(c2))")
res := tk.MustQuery("explain select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 and c2 = 1").Rows()
require.Contains(t, res[0][0], "IndexMerge")

usage, err := telemetry.GetFeatureUsage(tk.Session())
require.NoError(t, err)
require.Equal(t, usage.IndexMergeUsageCounter.IndexMergeUsed, int64(0))

tk.MustExec("select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 and c2 = 1")
usage, err = telemetry.GetFeatureUsage(tk.Session())
require.NoError(t, err)
require.Equal(t, int64(1), usage.IndexMergeUsageCounter.IndexMergeUsed)

tk.MustExec("select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 or c2 = 1")
usage, err = telemetry.GetFeatureUsage(tk.Session())
require.NoError(t, err)
require.Equal(t, int64(2), usage.IndexMergeUsageCounter.IndexMergeUsed)

tk.MustExec("select /*+ no_index_merge() */ * from t1 where c1 = 1 or c2 = 1")
usage, err = telemetry.GetFeatureUsage(tk.Session())
require.NoError(t, err)
require.Equal(t, int64(2), usage.IndexMergeUsageCounter.IndexMergeUsed)
}

0 comments on commit e98e959

Please sign in to comment.