Skip to content

Commit

Permalink
Merge pull request pingcap#20 from qiuyesuifeng/tiboys/hackathon1022
Browse files Browse the repository at this point in the history
*: add information schema cluster info table and tiny fix
  • Loading branch information
qiuyesuifeng authored Oct 23, 2019
2 parents 56a4231 + b484fc9 commit 1cd0e16
Show file tree
Hide file tree
Showing 7 changed files with 190 additions and 17 deletions.
1 change: 1 addition & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ type Config struct {
DelayCleanTableLock uint64 `toml:"delay-clean-table-lock" json:"delay-clean-table-lock"`
SplitRegionMaxNum uint64 `toml:"split-region-max-num" json:"split-region-max-num"`
StmtSummary StmtSummary `toml:"stmt-summary" json:"stmt-summary"`
PrometheusAddr string `toml:"prometheus-addr" json:"prometheus-addr"`
}

// Log is the log section of config.
Expand Down
10 changes: 0 additions & 10 deletions domain/infosync/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,6 @@ type ServerVersionInfo struct {
GitHash string `json:"git_hash"`
}

type ClusterItemInfo struct {
ID string `json:"id"`
Type string `json:"type"`
Name string `json:"name"`
Address string `json:"address"`
Version string `json:"version"`
GitHash string `json:"git_hash"`
Config string `json:"config"`
}

var globalInfoSyncer *InfoSyncer

// GlobalInfoSyncerInit return a new InfoSyncer. It is exported for testing.
Expand Down
3 changes: 3 additions & 0 deletions infoschema/inspection/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ const tableTiDBClusterInfo = `CREATE TABLE %s.TIDB_CLUSTER_INFO (
const tableSystemInfo = `CREATE TABLE %s.SYSTEM_INFO (
ID bigint(21) unsigned DEFAULT NULL,
IP varchar(64) DEFAULT NULL,
Name varchar(64) DEFAULT NULL,
Type varchar(64) DEFAULT NULL,
STATUS_ADDRESS varchar(64) DEFAULT NULL,
CPU varchar(64) DEFAULT NULL,
CPU_USAGE double DEFAULT NULL,
MEMORY varchar(64) DEFAULT NULL,
Expand Down
54 changes: 48 additions & 6 deletions infoschema/inspection/inspection.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,30 @@ func NewInspectionHelper(ctx sessionctx.Context) *InspectionHelper {
p: parser.New(),
dbName: fmt.Sprintf("%s_%s", "TIDB_INSPECTION", time.Now().Format("20060102150405")),
tableNames: []string{},
items: []ClusterItem{},
}
}

type ClusterItem struct {
ID int64
IP string
Name string
Address string
Type string
}

type InspectionHelper struct {
ctx sessionctx.Context
p *parser.Parser
dbName string
tableNames []string

items []ClusterItem
isInit bool
}

func getIPfromAdress(address string) string {
return strings.Split(address, ":")[0]
}

func (i *InspectionHelper) GetDBName() string {
Expand Down Expand Up @@ -113,16 +129,21 @@ func (i *InspectionHelper) GetClusterInfo() error {

idx := 0
for _, item := range tidbItems {
tp := "tidb"
name := fmt.Sprintf("tidb-%d", idx)
tidbAddr := fmt.Sprintf("%s:%d", item.IP, item.Port)
tidbStatusAddr := fmt.Sprintf("%s:%d", item.IP, item.StatusPort)
tidbConfig := fmt.Sprintf("http://%s/config", tidbStatusAddr)
sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "tidb", "tidb-%d", "%s:%d", "%s", "%s", "%s", "%s");`,
i.dbName, idx, idx, item.IP, item.Port, tidbStatusAddr, item.Version, item.GitHash, tidbConfig)

sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "%s", "%s", "%s", "%s", "%s", "%s", "%s");`,
i.dbName, idx, tp, name, tidbAddr, tidbStatusAddr, item.Version, item.GitHash, tidbConfig)

_, _, err := i.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql)
if err != nil {
return errors.Trace(err)
}

i.items = append(i.items, ClusterItem{int64(idx), getIPfromAdress(tidbStatusAddr), name, tidbStatusAddr, "tidb"})
idx++
}

Expand Down Expand Up @@ -169,14 +190,18 @@ func (i *InspectionHelper) GetClusterInfo() error {
}

githash := m["git_hash"]
sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "pd", "pd-%d", "%s","%s", "%s", "%s","%s");`,
i.dbName, idx, ii, host, host, version, githash, config)

tp := "pd"
name := fmt.Sprintf("pd-%d", ii)
sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "%s", "%s", "%s","%s", "%s", "%s","%s");`,
i.dbName, idx, tp, name, host, host, version, githash, config)

_, _, err = i.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql)
if err != nil {
return errors.Trace(err)
}

i.items = append(i.items, ClusterItem{int64(idx), getIPfromAdress(host), name, host, tp})
idx++
}

Expand All @@ -186,17 +211,34 @@ func (i *InspectionHelper) GetClusterInfo() error {
return errors.Trace(err)
}
for ii, storeStat := range storesStat.Stores {
tp := "tikv"
name := fmt.Sprintf("tikv-%d", ii)
tikvConfig := fmt.Sprintf("http://%s/config", storeStat.Store.StatusAddress)
sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "tikv", "tikv-%d", "%s", "%s", "%s", "%s", "%s");`,
i.dbName, idx, ii, storeStat.Store.Address, storeStat.Store.StatusAddress, storeStat.Store.Version, storeStat.Store.GitHash, tikvConfig)

sql := fmt.Sprintf(`insert into %s.TIDB_CLUSTER_INFO values (%d, "%s", "%s", "%s", "%s", "%s", "%s", "%s");`,
i.dbName, idx, tp, name, storeStat.Store.Address, storeStat.Store.StatusAddress, storeStat.Store.Version, storeStat.Store.GitHash, tikvConfig)

_, _, err := i.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql)
if err != nil {
return errors.Trace(err)
}

i.items = append(i.items, ClusterItem{int64(idx), getIPfromAdress(storeStat.Store.StatusAddress), name, storeStat.Store.StatusAddress, tp})
idx++
}

i.isInit = true
return nil
}

func (i *InspectionHelper) getSystemInfo(item ClusterItem) error {
return nil
}

func (i *InspectionHelper) GetSystemInfo() error {
if !i.isInit {
return errors.New("InspectionHelper is not init.")
}

return nil
}
130 changes: 130 additions & 0 deletions infoschema/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"encoding/json"
"fmt"
"sort"
"strings"
"sync"
"time"

Expand All @@ -37,6 +38,7 @@ import (
"github.com/pingcap/tidb/table"
"github.com/pingcap/tidb/types"
binaryJson "github.com/pingcap/tidb/types/json"
"github.com/pingcap/tidb/util"
"github.com/pingcap/tidb/util/pdapi"
"github.com/pingcap/tidb/util/set"
"github.com/pingcap/tidb/util/sqlexec"
Expand Down Expand Up @@ -84,6 +86,7 @@ const (
tableTiKVRegionStatus = "TIKV_REGION_STATUS"
tableTiKVRegionPeers = "TIKV_REGION_PEERS"
tableTiDBServersInfo = "TIDB_SERVERS_INFO"
tableTiDBClusterInfo = "TIDB_CLUSTER_INFO"
)

type columnInfo struct {
Expand Down Expand Up @@ -659,6 +662,16 @@ var tableTiDBServersInfoCols = []columnInfo{
{"GIT_HASH", mysql.TypeVarchar, 64, 0, nil, nil},
}

var tableTiDBClusterInfoCols = []columnInfo{
{"ID", mysql.TypeLonglong, 21, 0, nil, nil},
{"TYPE", mysql.TypeVarchar, 64, 0, nil, nil},
{"NAME", mysql.TypeVarchar, 64, 0, nil, nil},
{"ADDRESS", mysql.TypeVarchar, 64, 0, nil, nil},
{"STATUS_ADDRESS", mysql.TypeVarchar, 64, 0, nil, nil},
{"VERSION", mysql.TypeVarchar, 64, 0, nil, nil},
{"GIT_HASH", mysql.TypeVarchar, 64, 0, nil, nil},
}

func dataForTiKVRegionStatus(ctx sessionctx.Context) (records [][]types.Datum, err error) {
tikvStore, ok := ctx.GetStore().(tikv.Storage)
if !ok {
Expand Down Expand Up @@ -1816,6 +1829,120 @@ func dataForServersInfo() ([][]types.Datum, error) {
return rows, nil
}

func dataForTiDBClusterInfo(ctx sessionctx.Context) ([][]types.Datum, error) {
// get tidb servers info.
tidbItems, err := infosync.GetAllServerInfo(context.Background())
if err != nil {
return nil, errors.Trace(err)
}

rows := make([][]types.Datum, 0, len(tidbItems))

idx := 0
for _, item := range tidbItems {
tp := "tidb"
name := fmt.Sprintf("tidb-%d", idx)
tidbAddr := fmt.Sprintf("%s:%d", item.IP, item.Port)
tidbStatusAddr := fmt.Sprintf("%s:%d", item.IP, item.StatusPort)

row := types.MakeDatums(
idx,
tp,
name,
tidbAddr,
tidbStatusAddr,
item.Version,
item.GitHash,
)

rows = append(rows, row)
idx++
}

// get tidb servers info.
tikvStore, ok := ctx.GetStore().(tikv.Storage)
if !ok {
return nil, errors.New("Information about TiKV store status can be gotten only when the storage is TiKV")
}
tikvHelper := &helper.Helper{
Store: tikvStore,
RegionCache: tikvStore.GetRegionCache(),
}

pdHosts, err := tikvHelper.GetPDAddrs()
if err != nil {
return nil, errors.Trace(err)
}
for i, host := range pdHosts {
host = strings.TrimSpace(host)

// get pd version
url := fmt.Sprintf("http://%s/pd/api/v1/config/cluster-version", host)
d, err := util.Get(url).Bytes()
if err != nil {
return nil, errors.Trace(err)
}

version := strings.Trim(strings.Trim(string(d), "\n"), "\"")

// get pd git_hash
url = fmt.Sprintf("http://%s/pd/api/v1/status", host)
dd, err := util.Get(url).Bytes()
if err != nil {
return nil, errors.Trace(err)
}

m := make(map[string]interface{})
err = json.Unmarshal(dd, &m)
if err != nil {
return nil, errors.Trace(err)
}

githash := m["git_hash"]

tp := "pd"
name := fmt.Sprintf("pd-%d", i)

row := types.MakeDatums(
idx,
tp,
name,
host,
host,
version,
githash,
)

rows = append(rows, row)
idx++
}

// get tikv servers info.
storesStat, err := tikvHelper.GetStoresStat()
if err != nil {
return nil, errors.Trace(err)
}
for i, storeStat := range storesStat.Stores {
tp := "tikv"
name := fmt.Sprintf("tikv-%d", i)

row := types.MakeDatums(
idx,
tp,
name,
storeStat.Store.Address,
storeStat.Store.StatusAddress,
storeStat.Store.Version,
storeStat.Store.GitHash,
)

rows = append(rows, row)
idx++
}

return rows, nil
}

var tableNameToColumns = map[string][]columnInfo{
tableSchemata: schemataCols,
tableTables: tablesCols,
Expand Down Expand Up @@ -1857,6 +1984,7 @@ var tableNameToColumns = map[string][]columnInfo{
tableTiKVRegionStatus: tableTiKVRegionStatusCols,
tableTiKVRegionPeers: tableTiKVRegionPeersCols,
tableTiDBServersInfo: tableTiDBServersInfoCols,
tableTiDBClusterInfo: tableTiDBClusterInfoCols,
}

func createInfoSchemaTable(handle *Handle, meta *model.TableInfo) *infoschemaTable {
Expand Down Expand Up @@ -1962,6 +2090,8 @@ func (it *infoschemaTable) getRows(ctx sessionctx.Context, cols []*table.Column)
fullRows, err = dataForTikVRegionPeers(ctx)
case tableTiDBServersInfo:
fullRows, err = dataForServersInfo()
case tableTiDBClusterInfo:
fullRows, err = dataForTiDBClusterInfo(ctx)
}
if err != nil {
return nil, err
Expand Down
2 changes: 1 addition & 1 deletion server/http_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func (s *Server) startHTTPServer() {
router.Handle("/ddl/history", ddlHistoryJobHandler{tikvHandlerTool}).Name("DDL_History")
router.Handle("/ddl/owner/resign", ddlResignOwnerHandler{tikvHandlerTool.Store.(kv.Storage)}).Name("DDL_Owner_Resign")

//
// HTTP path for get server config.
router.Handle("/config", serverConfigHandler{}).Name("Config")

// HTTP path for get server info.
Expand Down
7 changes: 7 additions & 0 deletions tidb-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ const (
nmStatusPort = "status"
nmMetricsAddr = "metrics-addr"
nmMetricsInterval = "metrics-interval"
nmPrometheusAddr = "prometheus-addr"
nmDdlLease = "lease"
nmTokenLimit = "token-limit"
nmPluginDir = "plugin-dir"
Expand Down Expand Up @@ -129,6 +130,8 @@ var (
metricsAddr = flag.String(nmMetricsAddr, "", "prometheus pushgateway address, leaves it empty will disable prometheus push.")
metricsInterval = flag.Uint(nmMetricsInterval, 15, "prometheus client push interval in second, set \"0\" to disable prometheus push.")

prometheusAddr = flag.String(nmPrometheusAddr, "", "prometheus server address.")

// PROXY Protocol
proxyProtocolNetworks = flag.String(nmProxyProtocolNetworks, "", "proxy protocol networks allowed IP or *, empty mean disable proxy protocol support")
proxyProtocolHeaderTimeout = flag.Uint(nmProxyProtocolHeaderTimeout, 5, "proxy protocol header read timeout, unit is second.")
Expand Down Expand Up @@ -470,6 +473,10 @@ func overrideConfig() {
cfg.Status.MetricsInterval = *metricsInterval
}

if actualFlags[nmPrometheusAddr] {
cfg.PrometheusAddr = *prometheusAddr
}

// PROXY Protocol
if actualFlags[nmProxyProtocolNetworks] {
cfg.ProxyProtocol.Networks = *proxyProtocolNetworks
Expand Down

0 comments on commit 1cd0e16

Please sign in to comment.