Skip to content

Commit

Permalink
keyviz: support obtaining table info with clustered index from tidb (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
HunDunDM authored Mar 12, 2021
1 parent 28460ce commit ed090dc
Show file tree
Hide file tree
Showing 21 changed files with 556 additions and 379 deletions.
9 changes: 4 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ require (
github.com/joomcode/errorx v1.0.1
github.com/oleiade/reflections v1.0.1
github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d
github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd
github.com/pingcap/log v0.0.0-20200511115504-543df19646ad
github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd
github.com/pkg/errors v0.9.1
github.com/rs/cors v1.7.0
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0
Expand All @@ -38,9 +37,9 @@ require (
github.com/thoas/go-funk v0.7.0
github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738
go.uber.org/atomic v1.5.0
go.uber.org/atomic v1.6.0
go.uber.org/fx v1.10.0
go.uber.org/zap v1.13.0
go.uber.org/zap v1.15.0
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect
golang.org/x/sync v0.0.0-20190423024810-112230192c58
Expand Down
14 changes: 10 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -225,13 +225,15 @@ github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JH
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011 h1:58naV4XMEqm0hl9LcYo6cZoGBGiLtefMQMF/vo3XLgQ=
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d h1:TH18wFO5Nq/zUQuWu9ms2urgZnLP69XJYiI2JZAkUGc=
github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ=
github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w=
github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c h1:wO9VvZezAU4ZPZj8+P5uWfsT/ppuABjJPmHNrpCQnlc=
github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
github.com/pingcap/log v0.0.0-20200511115504-543df19646ad h1:SveG82rmu/GFxYanffxsSF503SiQV+2JLnWEiGiF+Tc=
github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd h1:k7CIHMFVKjHsda3PKkiN4zv++NEnexlUwiJEhryWpG0=
github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand Down Expand Up @@ -335,6 +337,8 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/dig v1.8.0 h1:1rR6hnL/bu1EVcjnRDN5kx1vbIjEJDTGhSQ2B3ddpcI=
go.uber.org/dig v1.8.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw=
go.uber.org/fx v1.10.0 h1:S2K/H8oNied0Je/mLKdWzEWKZfv9jtxSDm8CnwK+5Fg=
Expand All @@ -345,14 +349,16 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E=
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand Down
54 changes: 31 additions & 23 deletions pkg/keyvisual/decorator/decorator.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,41 +27,49 @@ type LabelKey struct {
}

// LabelStrategy requires cross-border determination and key decoration scheme.
// It supports dynamic reload configuration and generation of an actuator.
type LabelStrategy interface {
ReloadConfig(cfg *config.KeyVisualConfig)
NewLabeler() Labeler
}

// Labeler is an executor of LabelStrategy, and its functions should not be called concurrently.
type Labeler interface {
// CrossBorder determines whether two keys not belong to the same logical range.
CrossBorder(startKey, endKey string) bool
// Label returns the Label information of the key.
// Note: When the key is "", need to use LabelGlobalStart or LabelGlobalEnd.
Label(key string) LabelKey
LabelGlobalStart() LabelKey
LabelGlobalEnd() LabelKey
// Label returns the Label information of the keys.
Label(keys []string) []LabelKey
}

// NaiveLabelStrategy is one of the simplest LabelStrategy.
type NaiveLabelStrategy struct{}

func (s NaiveLabelStrategy) ReloadConfig(cfg *config.KeyVisualConfig) {
func NaiveLabelStrategy() LabelStrategy {
return naiveLabelStrategy{}
}

// CrossBorder always returns false. So NaiveLabelStrategy believes that there are no cross-border situations.
func (s NaiveLabelStrategy) CrossBorder(startKey, endKey string) bool {
return false
}
type naiveLabelStrategy struct{}

// Label only decodes the key.
func (s NaiveLabelStrategy) Label(key string) LabelKey {
str := hex.EncodeToString([]byte(key))
return LabelKey{
Key: str,
Labels: []string{str},
}
type naiveLabeler struct{}

func (s naiveLabelStrategy) ReloadConfig(cfg *config.KeyVisualConfig) {}

func (s naiveLabelStrategy) NewLabeler() Labeler {
return naiveLabeler{}
}

func (s NaiveLabelStrategy) LabelGlobalStart() LabelKey {
return s.Label("")
// CrossBorder always returns false. So naiveLabelStrategy believes that there are no cross-border situations.
func (e naiveLabeler) CrossBorder(startKey, endKey string) bool {
return false
}

func (s NaiveLabelStrategy) LabelGlobalEnd() LabelKey {
return s.Label("")
// Label only encodes the keys.
func (e naiveLabeler) Label(keys []string) []LabelKey {
labelKeys := make([]LabelKey, len(keys))
for i, key := range keys {
str := hex.EncodeToString([]byte(key))
labelKeys[i] = LabelKey{
Key: str,
Labels: []string{str},
}
}
return labelKeys
}
65 changes: 43 additions & 22 deletions pkg/keyvisual/decorator/separator.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
// Copyright 2019 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.

package decorator

import (
Expand All @@ -10,44 +23,52 @@ import (
"github.com/pingcap/tidb-dashboard/pkg/config"
)

// NaiveLabelStrategy is one of the simplest LabelStrategy.
type separatorLabelStrategy struct {
Separator atomic.Value
}

// SeparatorLabelStrategy implements the LabelStrategy interface. It obtains label information after splitting the key.
func SeparatorLabelStrategy(cfg *config.KeyVisualConfig) LabelStrategy {
s := &separatorLabelStrategy{}
s.Separator.Store(cfg.PolicyKVSeparator)
return s
}

type separatorLabelStrategy struct {
Separator atomic.Value
}

type separatorLabeler struct {
Separator string
}

// ReloadConfig reset separator
func (s *separatorLabelStrategy) ReloadConfig(cfg *config.KeyVisualConfig) {
s.Separator.Store(cfg.PolicyKVSeparator)
log.Debug("Reload config", zap.String("separator", cfg.PolicyKVSeparator))
}

func (s *separatorLabelStrategy) NewLabeler() Labeler {
return &separatorLabeler{
Separator: s.Separator.Load().(string),
}
}

// CrossBorder is temporarily not considering cross-border logic
func (s *separatorLabelStrategy) CrossBorder(startKey, endKey string) bool {
func (e *separatorLabeler) CrossBorder(startKey, endKey string) bool {
return false
}

// Label uses separator to split key
func (s *separatorLabelStrategy) Label(key string) (label LabelKey) {
label.Key = key
separator := s.Separator.Load().(string)
if separator == "" {
label.Labels = []string{key}
return
func (e *separatorLabeler) Label(keys []string) []LabelKey {
labelKeys := make([]LabelKey, len(keys))
for i, key := range keys {
var labels []string
if e.Separator == "" {
labels = []string{key}
} else {
labels = strings.Split(key, e.Separator)
}
labelKeys[i] = LabelKey{
Key: key,
Labels: labels,
}
}
label.Labels = strings.Split(key, separator)
return
}

func (s *separatorLabelStrategy) LabelGlobalStart() LabelKey {
return s.Label("")
}

func (s *separatorLabelStrategy) LabelGlobalEnd() LabelKey {
return s.Label("")
return labelKeys
}
Loading

0 comments on commit ed090dc

Please sign in to comment.