Showing preview only (6,823K chars total). Download the full file or copy to clipboard to get everything.
Repository: pingcap/tidb-dashboard
Branch: master
Commit: 5d39d7905988
Files: 1662
Total size: 6.1 MB
Directory structure:
gitextract_tfv9ubrh/
├── .all-contributorsrc
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── feature-request.md
│ │ └── question.md
│ ├── autolabeler.yml
│ ├── codecov.yml
│ ├── stale.yml
│ └── workflows/
│ ├── build.yaml
│ ├── manual-create-pd-pr.yaml
│ ├── release.yaml
│ ├── test-docker-image.yaml
│ ├── test.yaml
│ └── upload-e2e-snapshots.yaml
├── .gitignore
├── .golangci.yml
├── .prettierrc
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY.md
├── cmd/
│ └── tidb-dashboard/
│ └── main.go
├── dockerfiles/
│ └── docker-compose.yml
├── etc/
│ ├── go.mod
│ └── manualTestEnv/
│ ├── .gitignore
│ ├── _shared/
│ │ ├── Vagrantfile.partial.pubKey.rb
│ │ ├── vagrant_key
│ │ └── vagrant_key.pub
│ ├── complexCase1/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── multiHost/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── multiReplica/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── singleHost/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ └── singleHostMultiDisk/
│ ├── .gitignore
│ ├── README.md
│ ├── Vagrantfile
│ └── topology.yaml
├── go.mod
├── go.sum
├── pkg/
│ ├── apiserver/
│ │ ├── apiserver.go
│ │ ├── clusterinfo/
│ │ │ ├── host.go
│ │ │ ├── hostinfo/
│ │ │ │ ├── cluster_config.go
│ │ │ │ ├── cluster_hardware.go
│ │ │ │ ├── cluster_load.go
│ │ │ │ └── hostinfo.go
│ │ │ ├── service.go
│ │ │ ├── statistics.go
│ │ │ └── topology.go
│ │ ├── configuration/
│ │ │ ├── editable.go
│ │ │ ├── flatten.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── conprof/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── deadlock/
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── debugapi/
│ │ │ ├── apis.go
│ │ │ ├── endpoint/
│ │ │ │ ├── 1_main_test.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── models.go
│ │ │ │ ├── models_test.go
│ │ │ │ ├── payload.go
│ │ │ │ └── payload_test.go
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── diagnose/
│ │ │ ├── compare.go
│ │ │ ├── diagnose.go
│ │ │ ├── inspection.go
│ │ │ ├── model.go
│ │ │ ├── query.go
│ │ │ ├── report.go
│ │ │ └── report_test.go
│ │ ├── info/
│ │ │ └── info.go
│ │ ├── logsearch/
│ │ │ ├── models.go
│ │ │ ├── pack.go
│ │ │ ├── scheduler.go
│ │ │ ├── service.go
│ │ │ └── task.go
│ │ ├── metrics/
│ │ │ ├── prom_resolve.go
│ │ │ ├── prom_resolve_test.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── model/
│ │ │ └── common_models.go
│ │ ├── profiling/
│ │ │ ├── fetcher.go
│ │ │ ├── jeprof.in
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ ├── pprof.go
│ │ │ ├── profile.go
│ │ │ ├── protobuf_to_svg.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── queryeditor/
│ │ │ └── service.go
│ │ ├── resource_manager/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── slowquery/
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ ├── queries.go
│ │ │ ├── service.go
│ │ │ └── statement_gen.go
│ │ ├── statement/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── models.go
│ │ │ ├── module.go
│ │ │ ├── queries.go
│ │ │ ├── service.go
│ │ │ └── statement_gen.go
│ │ ├── topsql/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── user/
│ │ │ ├── auth.go
│ │ │ ├── code/
│ │ │ │ ├── codeauth/
│ │ │ │ │ └── auth.go
│ │ │ │ ├── router.go
│ │ │ │ └── service.go
│ │ │ ├── module.go
│ │ │ ├── rsa_utils.go
│ │ │ ├── sqlauth/
│ │ │ │ └── sqlauth.go
│ │ │ ├── sso/
│ │ │ │ ├── models.go
│ │ │ │ ├── router.go
│ │ │ │ ├── service.go
│ │ │ │ └── ssoauth/
│ │ │ │ └── auth.go
│ │ │ ├── verify_sql_user.go
│ │ │ └── verify_sql_user_test.go
│ │ ├── utils/
│ │ │ ├── auth.go
│ │ │ ├── binary_plan.go
│ │ │ ├── binary_plan_test.go
│ │ │ ├── error.go
│ │ │ ├── export.go
│ │ │ ├── gorm.go
│ │ │ ├── gorm_test.go
│ │ │ ├── jwt.go
│ │ │ ├── mw_experimental.go
│ │ │ ├── ngm.go
│ │ │ ├── subset.go
│ │ │ └── tidb_conn.go
│ │ └── visualplan/
│ │ ├── module.go
│ │ └── service.go
│ ├── config/
│ │ ├── config.go
│ │ ├── dynamic_config.go
│ │ └── dynamic_config_manager.go
│ ├── dbstore/
│ │ └── dbstore.go
│ ├── httpc/
│ │ ├── client.go
│ │ └── client_test.go
│ ├── keyvisual/
│ │ ├── decorator/
│ │ │ ├── decorator.go
│ │ │ ├── decorator_test.go
│ │ │ ├── separator.go
│ │ │ ├── tidb.go
│ │ │ ├── tidb_requests.go
│ │ │ └── tidb_test.go
│ │ ├── input/
│ │ │ ├── api.go
│ │ │ ├── file.go
│ │ │ ├── input.go
│ │ │ └── periodic.go
│ │ ├── manager.go
│ │ ├── matrix/
│ │ │ ├── average.go
│ │ │ ├── average_test.go
│ │ │ ├── axis.go
│ │ │ ├── axis_test.go
│ │ │ ├── distance.go
│ │ │ ├── distance_test.go
│ │ │ ├── interface.go
│ │ │ ├── key.go
│ │ │ ├── key_test.go
│ │ │ ├── matrix.go
│ │ │ ├── matrix_test.go
│ │ │ ├── plane.go
│ │ │ ├── plane_test.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ ├── region/
│ │ │ ├── interface.go
│ │ │ ├── tag.go
│ │ │ └── utils.go
│ │ ├── service.go
│ │ ├── storage/
│ │ │ ├── model.go
│ │ │ ├── model_test.go
│ │ │ ├── region.go
│ │ │ ├── region_test.go
│ │ │ ├── stat.go
│ │ │ ├── stat_persist.go
│ │ │ └── stat_test.go
│ │ └── testdata/
│ │ └── dis.json.gzip
│ ├── pd/
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── etcd.go
│ │ └── pd.go
│ ├── scheduling/
│ │ ├── client.go
│ │ └── scheduling.go
│ ├── swaggerserver/
│ │ └── handler.go
│ ├── ticdc/
│ │ ├── client.go
│ │ └── ticdc.go
│ ├── tidb/
│ │ ├── client.go
│ │ ├── forwarder.go
│ │ ├── model/
│ │ │ ├── codec.go
│ │ │ ├── codec_test.go
│ │ │ └── model.go
│ │ ├── proxy.go
│ │ ├── proxy_test.go
│ │ └── tidb.go
│ ├── tiflash/
│ │ ├── client.go
│ │ └── tiflash.go
│ ├── tikv/
│ │ ├── client.go
│ │ └── tikv.go
│ ├── tiproxy/
│ │ ├── client.go
│ │ └── tiproxy.go
│ ├── tso/
│ │ ├── client.go
│ │ └── tso.go
│ ├── uiserver/
│ │ ├── .gitignore
│ │ ├── embedded_assets_rewriter.go
│ │ ├── empty_assets_handler.go
│ │ └── uiserver.go
│ └── utils/
│ ├── fx.go
│ ├── grpc.go
│ ├── service_status.go
│ ├── sys_schema.go
│ ├── topology/
│ │ ├── models.go
│ │ ├── monitor.go
│ │ ├── pd.go
│ │ ├── scheduling.go
│ │ ├── store.go
│ │ ├── ticdc.go
│ │ ├── tidb.go
│ │ ├── tiproxy.go
│ │ ├── topology.go
│ │ └── tso.go
│ └── version/
│ ├── fips.go
│ └── version.go
├── release-version
├── scripts/
│ ├── _inc/
│ │ ├── download_tools.sh
│ │ └── run_services.sh
│ ├── create_release_tag.js
│ ├── distro/
│ │ ├── write_strings.go
│ │ └── write_strings.sh
│ ├── embed_ui_assets.sh
│ ├── generate_assets.go
│ ├── generate_swagger_spec.sh
│ ├── go.mod
│ ├── go.sum
│ ├── install_go_tools.sh
│ ├── lint.sh
│ ├── pd_version_matrix.go
│ ├── start_tiup.sh
│ ├── tiup.config.toml
│ ├── tools.go
│ └── wait_tiup_playground.sh
├── swaggerspec/
│ ├── .gitignore
│ └── placeholder.go
├── tests/
│ ├── create_table.sh
│ ├── dump.sh
│ ├── fixtures/
│ │ └── CLUSTER_SLOW_QUERY.yml
│ ├── integration/
│ │ ├── diagnose_report_test.go
│ │ ├── info/
│ │ │ └── info_test.go
│ │ ├── slowquery/
│ │ │ ├── compatibility_test.go
│ │ │ └── mock_db_test.go
│ │ └── user/
│ │ └── user_test.go
│ ├── run.sh
│ ├── schema/
│ │ └── test.CLUSTER_SLOW_QUERY-schema.sql
│ └── util/
│ ├── compatibility.go
│ ├── dump/
│ │ └── dump.go
│ ├── fixtures.go
│ ├── gin_test_helper.go
│ ├── mock_app.go
│ └── tidb_version.go
├── ui/
│ ├── .editorconfig
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .husky/
│ │ └── pre-commit
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── OWNERS
│ ├── README.md
│ ├── go.mod
│ ├── less-vars.js
│ ├── netlify.toml
│ ├── package.json
│ ├── packages/
│ │ ├── clinic-client/
│ │ │ ├── gulpfile.js
│ │ │ ├── openapitools.json
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── client/
│ │ │ │ └── api/
│ │ │ │ ├── api.ts
│ │ │ │ ├── base.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── configuration.ts
│ │ │ │ └── index.ts
│ │ │ ├── swagger/
│ │ │ │ ├── .openapi_config.yaml
│ │ │ │ ├── gen_api.sh
│ │ │ │ └── spec.json
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-client/
│ │ │ ├── gulpfile.js
│ │ │ ├── openapitools.json
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── client/
│ │ │ │ └── api/
│ │ │ │ ├── api/
│ │ │ │ │ ├── default-api.ts
│ │ │ │ │ └── statement-api.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── base.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── configuration.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── models/
│ │ │ │ ├── clusterinfo-cluster-statistics-partial.ts
│ │ │ │ ├── clusterinfo-cluster-statistics.ts
│ │ │ │ ├── clusterinfo-get-hosts-info-response.ts
│ │ │ │ ├── clusterinfo-store-topology-response.ts
│ │ │ │ ├── code-share-request.ts
│ │ │ │ ├── code-share-response.ts
│ │ │ │ ├── config-key-visual-config.ts
│ │ │ │ ├── config-profiling-config.ts
│ │ │ │ ├── config-ssocore-config.ts
│ │ │ │ ├── configuration-all-config-items.ts
│ │ │ │ ├── configuration-edit-request.ts
│ │ │ │ ├── configuration-edit-response.ts
│ │ │ │ ├── configuration-item.ts
│ │ │ │ ├── conprof-component-num.ts
│ │ │ │ ├── conprof-component.ts
│ │ │ │ ├── conprof-continuous-profiling-config.ts
│ │ │ │ ├── conprof-estimate-size-res.ts
│ │ │ │ ├── conprof-group-profile-detail.ts
│ │ │ │ ├── conprof-group-profiles.ts
│ │ │ │ ├── conprof-ng-monitoring-config.ts
│ │ │ │ ├── conprof-profile-detail.ts
│ │ │ │ ├── conprof-target.ts
│ │ │ │ ├── deadlock-model.ts
│ │ │ │ ├── decorator-label-key.ts
│ │ │ │ ├── diagnose-gen-diagnosis-report-request.ts
│ │ │ │ ├── diagnose-generate-metrics-relation-request.ts
│ │ │ │ ├── diagnose-generate-report-request.ts
│ │ │ │ ├── diagnose-report.ts
│ │ │ │ ├── diagnose-table-def.ts
│ │ │ │ ├── diagnose-table-row-def.ts
│ │ │ │ ├── endpoint-apidefinition.ts
│ │ │ │ ├── endpoint-apiparam-definition.ts
│ │ │ │ ├── endpoint-request-payload.ts
│ │ │ │ ├── hostinfo-cpuinfo.ts
│ │ │ │ ├── hostinfo-cpuusage-info.ts
│ │ │ │ ├── hostinfo-info.ts
│ │ │ │ ├── hostinfo-instance-info.ts
│ │ │ │ ├── hostinfo-memory-usage-info.ts
│ │ │ │ ├── hostinfo-partition-info.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── info-info-response.ts
│ │ │ │ ├── info-table-schema.ts
│ │ │ │ ├── info-who-am-iresponse.ts
│ │ │ │ ├── logsearch-create-task-group-request.ts
│ │ │ │ ├── logsearch-preview-model.ts
│ │ │ │ ├── logsearch-search-log-request.ts
│ │ │ │ ├── logsearch-task-group-model.ts
│ │ │ │ ├── logsearch-task-group-response.ts
│ │ │ │ ├── logsearch-task-model.ts
│ │ │ │ ├── matrix-matrix.ts
│ │ │ │ ├── metrics-get-prom-address-config-response.ts
│ │ │ │ ├── metrics-put-custom-prom-address-request.ts
│ │ │ │ ├── metrics-put-custom-prom-address-response.ts
│ │ │ │ ├── metrics-query-response.ts
│ │ │ │ ├── model-request-target-node.ts
│ │ │ │ ├── model-request-target-statistics.ts
│ │ │ │ ├── profiling-group-detail-response.ts
│ │ │ │ ├── profiling-start-request.ts
│ │ │ │ ├── profiling-task-group-model.ts
│ │ │ │ ├── profiling-task-model.ts
│ │ │ │ ├── queryeditor-run-request.ts
│ │ │ │ ├── queryeditor-run-response.ts
│ │ │ │ ├── resourcemanager-calibrate-response.ts
│ │ │ │ ├── resourcemanager-get-config-response.ts
│ │ │ │ ├── resourcemanager-resource-info-row-def.ts
│ │ │ │ ├── rest-error-response.ts
│ │ │ │ ├── slowquery-get-list-request.ts
│ │ │ │ ├── slowquery-model.ts
│ │ │ │ ├── sso-create-impersonation-request.ts
│ │ │ │ ├── sso-set-config-request.ts
│ │ │ │ ├── sso-ssoimpersonation-model.ts
│ │ │ │ ├── statement-binding.ts
│ │ │ │ ├── statement-editable-config.ts
│ │ │ │ ├── statement-get-statements-request.ts
│ │ │ │ ├── statement-model.ts
│ │ │ │ ├── statement-time-range.ts
│ │ │ │ ├── topology-alert-manager-info.ts
│ │ │ │ ├── topology-grafana-info.ts
│ │ │ │ ├── topology-pdinfo.ts
│ │ │ │ ├── topology-scheduling-info.ts
│ │ │ │ ├── topology-store-info.ts
│ │ │ │ ├── topology-store-labels.ts
│ │ │ │ ├── topology-store-location.ts
│ │ │ │ ├── topology-ti-cdcinfo.ts
│ │ │ │ ├── topology-ti-dbinfo.ts
│ │ │ │ ├── topology-ti-proxy-info.ts
│ │ │ │ ├── topology-tsoinfo.ts
│ │ │ │ ├── topsql-editable-config.ts
│ │ │ │ ├── topsql-instance-item.ts
│ │ │ │ ├── topsql-instance-response.ts
│ │ │ │ ├── topsql-summary-by-item.ts
│ │ │ │ ├── topsql-summary-item.ts
│ │ │ │ ├── topsql-summary-plan-item.ts
│ │ │ │ ├── topsql-summary-response.ts
│ │ │ │ ├── topsql-tikv-network-io-collection-config.ts
│ │ │ │ ├── topsql-update-tikv-network-io-collection-response.ts
│ │ │ │ ├── user-authenticate-form.ts
│ │ │ │ ├── user-get-login-info-response.ts
│ │ │ │ ├── user-sign-out-info.ts
│ │ │ │ ├── user-token-response.ts
│ │ │ │ └── version-info.ts
│ │ │ ├── swagger/
│ │ │ │ ├── .openapi_config.yaml
│ │ │ │ ├── gen_api.sh
│ │ │ │ └── spec.json
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-clinic-cloud/
│ │ │ ├── .gitignore
│ │ │ ├── builder.js
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ ├── diagnose-report/
│ │ │ │ │ └── index.html
│ │ │ │ ├── graphvizlib.wasm
│ │ │ │ ├── index.html
│ │ │ │ └── ngm.html
│ │ │ ├── src/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── ClusterInfo/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Deadlock/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── DebugAPI/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Diagnose/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── KeyViz/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Monitoring/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── QueryEditor/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ResourceManager/
│ │ │ │ │ │ ├── context-impl.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SearchLogs/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SlowQuery/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Statement/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SystemReport/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSQL/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSlowQuery/
│ │ │ │ │ │ ├── context-provider.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ └── slowqueries.json
│ │ │ │ │ └── UserProfile/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── meta.ts
│ │ │ │ ├── client/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── dashboardApp/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── Sider/
│ │ │ │ │ │ │ │ ├── Banner.module.less
│ │ │ │ │ │ │ │ ├── Banner.tsx
│ │ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── nprogress.less
│ │ │ │ ├── diagnoseReportApp/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiagnosisReport.tsx
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── index.css
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── react-app-env.d.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── types.ts
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ ├── styles/
│ │ │ │ │ ├── override.less
│ │ │ │ │ └── style.less
│ │ │ │ └── utils/
│ │ │ │ ├── distro/
│ │ │ │ │ ├── assetsRes.ts
│ │ │ │ │ ├── stringsRes.ts
│ │ │ │ │ └── strings_res.json
│ │ │ │ ├── globalConfig.ts
│ │ │ │ ├── publicPathPrefix.ts
│ │ │ │ ├── registry.ts
│ │ │ │ └── store.ts
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-clinic-op/
│ │ │ ├── README.md
│ │ │ ├── builder.js
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ ├── src/
│ │ │ │ ├── App.tsx
│ │ │ │ ├── apps/
│ │ │ │ │ └── SlowQuery/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── client/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── index.tsx
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ └── styles/
│ │ │ │ ├── override.less
│ │ │ │ └── style.less
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-op/
│ │ │ ├── builder.js
│ │ │ ├── cypress/
│ │ │ │ ├── .eslintrc.json
│ │ │ │ ├── README.md
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── topsql_instance:end=1641934800&start=1641916800.json
│ │ │ │ │ ├── topsql_summary:end=1641934800&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641916800&top=5&window=123s.json
│ │ │ │ │ ├── topsql_summary_large_timerange:end=1641916800&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641484800&top=5&window=2929s.json
│ │ │ │ │ ├── topsql_summary_small_timerange:end=1641920460&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641920400&top=5&window=1s.json
│ │ │ │ │ └── uri.json
│ │ │ │ ├── integration/
│ │ │ │ │ ├── components.js
│ │ │ │ │ ├── login/
│ │ │ │ │ │ ├── login_session.spec.js
│ │ │ │ │ │ ├── user_login.compat_spec.js
│ │ │ │ │ │ └── user_login.spec.js
│ │ │ │ │ ├── slow_query/
│ │ │ │ │ │ ├── 01-list.spec.js
│ │ │ │ │ │ ├── 02-detail.spec.js
│ │ │ │ │ │ └── list.compat_spec.js
│ │ │ │ │ ├── statement/
│ │ │ │ │ │ ├── 01-list.spec.js
│ │ │ │ │ │ ├── 02-detail.spec.js
│ │ │ │ │ │ └── list.compat_spec.js
│ │ │ │ │ ├── topsql/
│ │ │ │ │ │ ├── topsql.spec.ts
│ │ │ │ │ │ ├── topsql.without_ngm_spec.js
│ │ │ │ │ │ └── topsql_security.spec.js
│ │ │ │ │ └── utils.js
│ │ │ │ ├── plugins/
│ │ │ │ │ └── index.js
│ │ │ │ ├── support/
│ │ │ │ │ ├── commands.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── types/
│ │ │ │ ├── global.d.ts
│ │ │ │ └── mocha.d.ts
│ │ │ ├── cypress.json
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── diagnoseReport.html
│ │ │ │ ├── graphvizlib.wasm
│ │ │ │ ├── index.html
│ │ │ │ └── test-portal/
│ │ │ │ └── index.html
│ │ │ ├── src/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── ClusterInfo/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Deadlock/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── DebugAPI/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Diagnose/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── KeyViz/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Monitoring/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── QueryEditor/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ResourceManager/
│ │ │ │ │ │ ├── context-impl.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SearchLogs/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SlowQuery/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Statement/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SystemReport/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSQL/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ └── UserProfile/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── meta.ts
│ │ │ │ ├── client/
│ │ │ │ │ ├── apiBasePath.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── dashboardApp/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── Sider/
│ │ │ │ │ │ │ │ ├── Banner.module.less
│ │ │ │ │ │ │ │ ├── Banner.tsx
│ │ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── signin/
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── nprogress.less
│ │ │ │ ├── diagnoseReportApp/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiagnosisReport.tsx
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── index.css
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── react-app-env.d.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── types.ts
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ ├── styles/
│ │ │ │ │ ├── override.less
│ │ │ │ │ └── style.less
│ │ │ │ └── utils/
│ │ │ │ ├── appOptions.ts
│ │ │ │ ├── auth.ts
│ │ │ │ ├── authSSO.ts
│ │ │ │ ├── distro/
│ │ │ │ │ ├── assetsRes.ts
│ │ │ │ │ ├── stringsRes.ts
│ │ │ │ │ └── strings_res.json
│ │ │ │ ├── publicPathPrefix.ts
│ │ │ │ ├── registry.ts
│ │ │ │ └── store.ts
│ │ │ └── tsconfig.json
│ │ └── tidb-dashboard-lib/
│ │ ├── builder.js
│ │ ├── gulpfile.js
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── apps/
│ │ │ │ ├── ClusterInfo/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiskTable.tsx
│ │ │ │ │ │ ├── HostTable.tsx
│ │ │ │ │ │ ├── InstanceTable.tsx
│ │ │ │ │ │ ├── Statistics.module.less
│ │ │ │ │ │ ├── Statistics.tsx
│ │ │ │ │ │ ├── StoreLocation.tsx
│ │ │ │ │ │ └── StoreLocationTree/
│ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ └── List.tsx
│ │ │ │ │ ├── status/
│ │ │ │ │ │ └── status.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Configuration/
│ │ │ │ │ ├── InlineEditor.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ConProfSettingForm.tsx
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── Deadlock/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DeadlockChainGraph.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── DebugAPI/
│ │ │ │ │ ├── apilist/
│ │ │ │ │ │ ├── ApiForm.tsx
│ │ │ │ │ │ ├── ApiList.module.less
│ │ │ │ │ │ ├── ApiList.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ ├── Database.tsx
│ │ │ │ │ │ ├── Enum.tsx
│ │ │ │ │ │ ├── Host.tsx
│ │ │ │ │ │ ├── Table.tsx
│ │ │ │ │ │ ├── TableID.tsx
│ │ │ │ │ │ ├── Text.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── useLimitSelection.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Diagnose/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── DiagnoseGenerator.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── tableColumns.tsx
│ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── combineTargetStats.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── KeyViz/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── KeyViz.less
│ │ │ │ │ │ ├── KeyViz.tsx
│ │ │ │ │ │ ├── KeyVizSettingForm.tsx
│ │ │ │ │ │ └── KeyVizToolbar.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── heatmap/
│ │ │ │ │ │ ├── axis/
│ │ │ │ │ │ │ ├── histogram.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── label-axis.ts
│ │ │ │ │ │ ├── buffer.ts
│ │ │ │ │ │ ├── chart.ts
│ │ │ │ │ │ ├── color.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── legend.ts
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── api.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── Monitoring/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── Monitoring.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── LogicalOperatorTree.tsx
│ │ │ │ │ │ ├── OperatorTree.module.less
│ │ │ │ │ │ ├── PhysicalCostTree.tsx
│ │ │ │ │ │ └── PhysicalOperatorTree.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── examples/
│ │ │ │ │ │ ├── new-format.json
│ │ │ │ │ │ └── old-format.json
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Overview/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Instances.tsx
│ │ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ │ ├── MonitorAlert.tsx
│ │ │ │ │ │ └── Styles.module.less
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── QueryEditor/
│ │ │ │ │ ├── Editor.module.less
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── ResultTable.module.less
│ │ │ │ │ ├── ResultTable.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── editorThemes/
│ │ │ │ │ │ ├── oneHalfDark.js
│ │ │ │ │ │ └── oneHalfLight.js
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── ResourceManager/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Configuration.tsx
│ │ │ │ │ │ ├── EstimateCapacity.tsx
│ │ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── uilts/
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── metricQueries.ts
│ │ │ │ │ └── url-state.ts
│ │ │ │ ├── SQLAdvisor/
│ │ │ │ │ ├── component/
│ │ │ │ │ │ ├── IndexInsightList.tsx
│ │ │ │ │ │ ├── IndexInsightListWithRegister.module.less
│ │ │ │ │ │ ├── IndexInsightListWithRegister.tsx
│ │ │ │ │ │ ├── IndexInsightTable.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── types/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── dbaasSecuritySetting.ts
│ │ │ │ │ └── suggestedCommandMaps.tsx
│ │ │ │ ├── SearchLogs/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Icon.tsx
│ │ │ │ │ │ ├── LogRow.module.less
│ │ │ │ │ │ ├── LogRow.tsx
│ │ │ │ │ │ ├── SearchHeader.tsx
│ │ │ │ │ │ ├── SearchProgress.tsx
│ │ │ │ │ │ ├── SearchResult.tsx
│ │ │ │ │ │ ├── Styles.module.less
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── LogSearch.tsx
│ │ │ │ │ │ ├── LogSearchDetail.tsx
│ │ │ │ │ │ ├── LogSearchHistory.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── SlowQuery/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── LimitTimeRange.tsx
│ │ │ │ │ │ ├── SlowQueriesTable.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DetailTabBasic.tsx
│ │ │ │ │ │ │ ├── DetailTabCopr.tsx
│ │ │ │ │ │ │ ├── DetailTabRuV2.tsx
│ │ │ │ │ │ │ ├── DetailTabTime.tsx
│ │ │ │ │ │ │ ├── DetailTabTxn.tsx
│ │ │ │ │ │ │ ├── DetailTabs.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── DownloadDBFileModal.tsx
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ ├── tableColumns.tsx
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ ├── useSchemaColumns.ts
│ │ │ │ │ └── useSlowQueryTableController.ts
│ │ │ │ ├── Statement/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── StatementsTable.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── PlanBind.module.less
│ │ │ │ │ │ │ ├── PlanBind.tsx
│ │ │ │ │ │ │ ├── PlanDetail.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabBasic.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabCopr.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabTime.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabTxn.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabs.tsx
│ │ │ │ │ │ │ ├── SlowQueryTab.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ ├── StatementSettingForm.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── tableColumns.tsx
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ ├── useSchemaColumns.ts
│ │ │ │ │ └── useStatementTableController.ts
│ │ │ │ ├── SystemReport/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── ReportHistory.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ReportGenerator.tsx
│ │ │ │ │ │ ├── ReportStatus.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── TopSQL/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── Filter/
│ │ │ │ │ │ ├── InstanceSelect.tsx
│ │ │ │ │ │ ├── common.module.less
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ ├── ListChart.tsx
│ │ │ │ │ │ ├── ListDetail/
│ │ │ │ │ │ │ ├── ListDetail.tsx
│ │ │ │ │ │ │ ├── ListDetailContent.tsx
│ │ │ │ │ │ │ ├── ListDetailTable.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── ListTable.tsx
│ │ │ │ │ │ ├── SettingsForm.module.less
│ │ │ │ │ │ ├── SettingsForm.tsx
│ │ │ │ │ │ └── legendAction.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── specialRecord.ts
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ └── useRecordSelection.ts
│ │ │ │ ├── TopSlowQuery/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── CountChart.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── ListTable.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── uilts/
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ └── url-state.ts
│ │ │ │ ├── UserProfile/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Form.Language.tsx
│ │ │ │ │ │ ├── Form.PrometheusAddr.tsx
│ │ │ │ │ │ ├── Form.SSO.tsx
│ │ │ │ │ │ ├── Form.Session.tsx
│ │ │ │ │ │ ├── Form.Version.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── helper.ts
│ │ │ │ └── index.ts
│ │ │ ├── client/
│ │ │ │ ├── clinic-extensions.d.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── models.ts
│ │ │ ├── components/
│ │ │ │ ├── AnimatedSkeleton/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── AppearAnimate/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── AutoRefreshButton/
│ │ │ │ │ ├── AutoRefreshButton.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Bar/
│ │ │ │ │ ├── Bar.module.less
│ │ │ │ │ ├── Bar.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── BaseSelect/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── BinaryPlanTable/
│ │ │ │ │ ├── BinaryPlanColsSelector.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── sample-data/
│ │ │ │ │ ├── binary-plan.json
│ │ │ │ │ └── detail-res.json
│ │ │ │ ├── Blink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Card/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CardTable/
│ │ │ │ │ ├── GroupHeader.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CardTabs/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ColumnsSelector/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CopyLink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DatePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DateTime/
│ │ │ │ │ ├── Calendar.tsx
│ │ │ │ │ ├── Long.tsx
│ │ │ │ │ ├── calendarPlugin.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Descriptions/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DrawerFooter/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ErrorBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Expand/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Head/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── HighlightSQL/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── InstanceSelect/
│ │ │ │ │ ├── DropOverlay.tsx
│ │ │ │ │ ├── TableWithFilter.module.less
│ │ │ │ │ ├── TableWithFilter.tsx
│ │ │ │ │ ├── ValueDisplay.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── InstanceStatusBadge/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LanguageDropdown/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LimitTimeRange/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MultiSelect/
│ │ │ │ │ ├── DropOverlay.tsx
│ │ │ │ │ ├── Plain.tsx
│ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Ngm/
│ │ │ │ │ ├── NgmNotStarted.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── ParamsPageWrapper/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── PlanText/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Pre/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Root/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TextWithInfo/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TextWrap/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TimePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TimeRangeSelector/
│ │ │ │ │ ├── WithZoomOut.tsx
│ │ │ │ │ ├── hook.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Toolbar/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TxtDownloadLink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ValueWithTooltip/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── VisualPlan/
│ │ │ │ │ ├── DetailDrawer.tsx
│ │ │ │ │ ├── VisualPlan.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ └── index.ts
│ │ │ ├── hooks/
│ │ │ │ ├── useLocationChange.ts
│ │ │ │ ├── useQueryParams.ts
│ │ │ │ └── useURLTimeRange.ts
│ │ │ ├── index.ts
│ │ │ ├── react-app-env.d.ts
│ │ │ ├── types/
│ │ │ │ ├── index.ts
│ │ │ │ └── reqConfig.ts
│ │ │ └── utils/
│ │ │ ├── charts.ts
│ │ │ ├── distro.ts
│ │ │ ├── format.ts
│ │ │ ├── i18n.ts
│ │ │ ├── index.ts
│ │ │ ├── instanceTable.ts
│ │ │ ├── local-download.ts
│ │ │ ├── openLink.ts
│ │ │ ├── prometheus/
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── query.ts
│ │ │ ├── routing.ts
│ │ │ ├── selectionWithFilter.ts
│ │ │ ├── sqlFormatter/
│ │ │ │ └── index.ts
│ │ │ ├── store.ts
│ │ │ ├── tableColumnFactory.tsx
│ │ │ ├── tableColumns.tsx
│ │ │ ├── telemetry.ts
│ │ │ ├── timezone.ts
│ │ │ ├── useCache.ts
│ │ │ ├── useCacheItemIndex.ts
│ │ │ ├── useChange.ts
│ │ │ ├── useClientRequest.ts
│ │ │ ├── useOrderState.ts
│ │ │ ├── useQueryParams.ts
│ │ │ ├── useVersionedLocalStorageState.ts
│ │ │ └── wdyr.ts
│ │ └── tsconfig.json
│ ├── pnpm-workspace.yaml
│ └── tsconfig.json
├── ui-v2/
│ ├── .changeset/
│ │ ├── README.md
│ │ └── config.json
│ ├── .gitignore
│ ├── .husky/
│ │ └── pre-commit
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── README.md
│ ├── api-specs/
│ │ └── azores.json
│ ├── eslint.config.js
│ ├── orval.config.ts
│ ├── package.json
│ ├── packages/
│ │ ├── api/
│ │ │ ├── client/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── http/
│ │ │ │ │ │ └── client.ts
│ │ │ │ │ └── index.ts
│ │ │ │ └── tsconfig.json
│ │ │ └── server/
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── azores/
│ │ │ │ ├── handlers/
│ │ │ │ │ ├── apiKeyServiceCreateApiKey.ts
│ │ │ │ │ ├── apiKeyServiceDeleteApiKey.ts
│ │ │ │ │ ├── apiKeyServiceGetApiKey.ts
│ │ │ │ │ ├── apiKeyServiceGetTemErrorDetail.ts
│ │ │ │ │ ├── apiKeyServiceListApiKeys.ts
│ │ │ │ │ ├── apiKeyServiceResetSecretKey.ts
│ │ │ │ │ ├── apiKeyServiceUpdateApiKey.ts
│ │ │ │ │ ├── clusterBRServiceCreateBackupTask.ts
│ │ │ │ │ ├── clusterBRServiceCreateRestoreTask.ts
│ │ │ │ │ ├── clusterBRServiceDetectCluster.ts
│ │ │ │ │ ├── clusterBRServiceGetClusterBackupPolicy.ts
│ │ │ │ │ ├── clusterBRServiceListClusterBRTasks.ts
│ │ │ │ │ ├── clusterBRServiceListClusterBackupRecords.ts
│ │ │ │ │ ├── clusterServiceDeleteProcess.ts
│ │ │ │ │ ├── clusterServiceGetProcessList.ts
│ │ │ │ │ ├── credentialServiceCreateCredential.ts
│ │ │ │ │ ├── credentialServiceDeleteCredential.ts
│ │ │ │ │ ├── credentialServiceDownloadRSAKey.ts
│ │ │ │ │ ├── credentialServiceGenerateRSAKey.ts
│ │ │ │ │ ├── credentialServiceGetCredential.ts
│ │ │ │ │ ├── credentialServiceListCredentials.ts
│ │ │ │ │ ├── credentialServiceUpdateCredential.ts
│ │ │ │ │ ├── credentialServiceValidateConnection.ts
│ │ │ │ │ ├── diagnosisServiceAddSqlLimit.ts
│ │ │ │ │ ├── diagnosisServiceBindSqlPlan.ts
│ │ │ │ │ ├── diagnosisServiceCheckSqlLimitSupport.ts
│ │ │ │ │ ├── diagnosisServiceCheckSqlPlanSupport.ts
│ │ │ │ │ ├── diagnosisServiceDownloadSlowQueryList.ts
│ │ │ │ │ ├── diagnosisServiceGetResourceGroupList.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableAdvancedFilterInfo.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableAdvancedFilters.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableFields.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryDetail.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlLimitList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlPlanBindingList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlPlanList.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableAdvancedFilterInfo.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableAdvancedFilters.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableFields.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlConfigs.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlDetail.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlList.ts
│ │ │ │ │ ├── diagnosisServiceRemoveSqlLimit.ts
│ │ │ │ │ ├── diagnosisServiceUnbindSqlPlan.ts
│ │ │ │ │ ├── diagnosisServiceUpdateTopSqlConfigs.ts
│ │ │ │ │ ├── globalBRServiceCreateBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceDeleteBRTask.ts
│ │ │ │ │ ├── globalBRServiceDeleteBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceGetBRSummary.ts
│ │ │ │ │ ├── globalBRServiceGetBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceListBRTasks.ts
│ │ │ │ │ ├── globalBRServiceListBackupPolicies.ts
│ │ │ │ │ ├── globalBRServicePreCheckBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceStartBRTask.ts
│ │ │ │ │ ├── globalBRServiceStopBRTask.ts
│ │ │ │ │ ├── globalBRServiceUpdateBackupPolicy.ts
│ │ │ │ │ ├── hostServiceBatchDelete.ts
│ │ │ │ │ ├── hostServiceCheck.ts
│ │ │ │ │ ├── hostServiceCreateHosts.ts
│ │ │ │ │ ├── hostServiceDelete.ts
│ │ │ │ │ ├── hostServiceDownloadHostTemplate.ts
│ │ │ │ │ ├── hostServiceDownloadListHosts.ts
│ │ │ │ │ ├── hostServiceFix.ts
│ │ │ │ │ ├── hostServiceGetDisks.ts
│ │ │ │ │ ├── hostServiceGetHost.ts
│ │ │ │ │ ├── hostServiceGetTiDBProcesses.ts
│ │ │ │ │ ├── hostServiceHostConfirm.ts
│ │ │ │ │ ├── hostServiceImport.ts
│ │ │ │ │ ├── hostServiceImportTask.ts
│ │ │ │ │ ├── hostServiceListHosts.ts
│ │ │ │ │ ├── hostServiceReport.ts
│ │ │ │ │ ├── hostServiceUpdateHost.ts
│ │ │ │ │ ├── labelServiceBatchCreateLabels.ts
│ │ │ │ │ ├── labelServiceBindLabel.ts
│ │ │ │ │ ├── labelServiceBindResource.ts
│ │ │ │ │ ├── labelServiceCreateLabel.ts
│ │ │ │ │ ├── labelServiceDeleteLabel.ts
│ │ │ │ │ ├── labelServiceGetLabel.ts
│ │ │ │ │ ├── labelServiceGetLabelWithBindings.ts
│ │ │ │ │ ├── labelServiceListLabelKeys.ts
│ │ │ │ │ ├── labelServiceListLabels.ts
│ │ │ │ │ ├── labelServiceListLabelsByResourceType.ts
│ │ │ │ │ ├── labelServiceListLabelsWithBindings.ts
│ │ │ │ │ ├── labelServiceUpdateLabel.ts
│ │ │ │ │ ├── licenseServiceActivateFreeLicense.ts
│ │ │ │ │ ├── licenseServiceActivateLicense.ts
│ │ │ │ │ ├── licenseServiceGetDeviceCode.ts
│ │ │ │ │ ├── licenseServiceGetLicense.ts
│ │ │ │ │ ├── locationServiceCreateLocations.ts
│ │ │ │ │ ├── locationServiceDeleteLocation.ts
│ │ │ │ │ ├── locationServiceGetLocations.ts
│ │ │ │ │ ├── locationServiceListLocations.ts
│ │ │ │ │ ├── locationServiceUpdateLocations.ts
│ │ │ │ │ ├── metricsServiceGetClusterMetricData.ts
│ │ │ │ │ ├── metricsServiceGetClusterMetricInstance.ts
│ │ │ │ │ ├── metricsServiceGetHostMetricData.ts
│ │ │ │ │ ├── metricsServiceGetMetrics.ts
│ │ │ │ │ ├── metricsServiceGetOverviewStatus.ts
│ │ │ │ │ ├── metricsServiceGetTopMetricConfig.ts
│ │ │ │ │ ├── metricsServiceGetTopMetricData.ts
│ │ │ │ │ ├── roleServiceCreateRole.ts
│ │ │ │ │ ├── roleServiceDeleteRole.ts
│ │ │ │ │ ├── roleServiceListRoles.ts
│ │ │ │ │ ├── roleServiceUpdateRole.ts
│ │ │ │ │ ├── tagServiceBatchCreateTags.ts
│ │ │ │ │ ├── tagServiceBindResource.ts
│ │ │ │ │ ├── tagServiceBindTag.ts
│ │ │ │ │ ├── tagServiceCreateTag.ts
│ │ │ │ │ ├── tagServiceDeleteTag.ts
│ │ │ │ │ ├── tagServiceGetTag.ts
│ │ │ │ │ ├── tagServiceGetTagWithBindings.ts
│ │ │ │ │ ├── tagServiceListTagKeys.ts
│ │ │ │ │ ├── tagServiceListTags.ts
│ │ │ │ │ ├── tagServiceListTagsByResourceType.ts
│ │ │ │ │ ├── tagServiceListTagsWithBindings.ts
│ │ │ │ │ ├── tagServiceUpdateTag.ts
│ │ │ │ │ ├── tiupsServiceCreateTiups.ts
│ │ │ │ │ ├── tiupsServiceDeleteTiups.ts
│ │ │ │ │ ├── tiupsServiceGetTiups.ts
│ │ │ │ │ ├── tiupsServiceGetTiupsCluster.ts
│ │ │ │ │ ├── tiupsServiceListTiups.ts
│ │ │ │ │ ├── tiupsServiceUpdateTiups.ts
│ │ │ │ │ ├── userServiceChangePassword.ts
│ │ │ │ │ ├── userServiceCreateUser.ts
│ │ │ │ │ ├── userServiceDeleteUser.ts
│ │ │ │ │ ├── userServiceGetUser.ts
│ │ │ │ │ ├── userServiceGetUserProfile.ts
│ │ │ │ │ ├── userServiceListUserRoles.ts
│ │ │ │ │ ├── userServiceListUsers.ts
│ │ │ │ │ ├── userServiceLogin.ts
│ │ │ │ │ ├── userServiceLogout.ts
│ │ │ │ │ ├── userServiceResetPassword.ts
│ │ │ │ │ ├── userServiceUpdateUser.ts
│ │ │ │ │ └── userServiceValidateSession.ts
│ │ │ │ ├── index.context.ts
│ │ │ │ ├── index.schemas.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── index.validator.ts
│ │ │ │ ├── index.zod.ts
│ │ │ │ └── sample-res/
│ │ │ │ ├── metrics-config-cluster-overview.json
│ │ │ │ ├── metrics-config-cluster.json
│ │ │ │ ├── metrics-config-host.json
│ │ │ │ ├── metrics-config-overview.json
│ │ │ │ ├── metrics-data-cpu-usage.json
│ │ │ │ ├── slow-query-detail.json
│ │ │ │ ├── slow-query-list.json
│ │ │ │ ├── statement-list.json
│ │ │ │ ├── statement-plans-detail.json
│ │ │ │ ├── statement-plans-list.json
│ │ │ │ └── statement-slow-query-list.json
│ │ │ ├── tsconfig.json
│ │ │ └── wrangler.toml
│ │ ├── libs/
│ │ │ ├── 1-charts/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── chart-theme-switch.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── sample-data.ts
│ │ │ │ │ ├── series-chart.tsx
│ │ │ │ │ ├── series-render.tsx
│ │ │ │ │ ├── style.scss
│ │ │ │ │ └── type.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── 1-icons/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── 1-utils/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── delay.ts
│ │ │ │ │ ├── env.d.ts
│ │ │ │ │ ├── format.ts
│ │ │ │ │ ├── i18n.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── memory-state/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── reset-filters-state.ts
│ │ │ │ │ ├── prom.ts
│ │ │ │ │ ├── time-range.ts
│ │ │ │ │ └── url-state/
│ │ │ │ │ ├── advanced-filters-url-state.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── pagination-url-state.ts
│ │ │ │ │ ├── pro-table-pagination-state.ts
│ │ │ │ │ ├── pro-table-sort-state.ts
│ │ │ │ │ ├── search-url-state.ts
│ │ │ │ │ ├── sort-url-state.ts
│ │ │ │ │ ├── timerange-url-state.ts
│ │ │ │ │ └── use-url-state.tsx
│ │ │ │ └── tsconfig.json
│ │ │ ├── 2-primitive-ui/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── uikit-theme-provider.tsx
│ │ │ │ └── tsconfig.json
│ │ │ ├── 3-biz-ui/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── action-drawer.tsx
│ │ │ │ │ ├── advanced-filters/
│ │ │ │ │ │ ├── filter-setting.tsx
│ │ │ │ │ │ ├── filters-modal.tsx
│ │ │ │ │ │ ├── filters-setting.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── locales.ts
│ │ │ │ │ ├── auto-refresh-button/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── progress.tsx
│ │ │ │ │ ├── charts-multi-select.tsx
│ │ │ │ │ ├── cols-multi-select.tsx
│ │ │ │ │ ├── custom-json-view.tsx
│ │ │ │ │ ├── filter-multi-select.tsx
│ │ │ │ │ ├── highlight-sql.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── info-table.tsx
│ │ │ │ │ ├── loading-skeleton.tsx
│ │ │ │ │ ├── plan-table/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── parser.ts
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ ├── plan-v1-1.txt
│ │ │ │ │ │ ├── plan-v1-2.txt
│ │ │ │ │ │ ├── plan-v2-1.txt
│ │ │ │ │ │ └── slow-query-detail.json
│ │ │ │ │ ├── sql-with-hover.tsx
│ │ │ │ │ ├── status-indicator.tsx
│ │ │ │ │ └── time-range-picker/
│ │ │ │ │ ├── custom.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── tsconfig.json
│ │ │ └── 4-apps/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── package.json
│ │ │ ├── rollup.config.js
│ │ │ ├── src/
│ │ │ │ ├── _re-exports/
│ │ │ │ │ ├── biz-ui.ts
│ │ │ │ │ ├── charts-css.ts
│ │ │ │ │ ├── charts.ts
│ │ │ │ │ ├── primitive-ui.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── _shared/
│ │ │ │ │ ├── cols-factory.tsx
│ │ │ │ │ ├── sql-history/
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── chart.tsx
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── time-range-clip-alert.tsx
│ │ │ │ │ │ ├── ctx/
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── locales/
│ │ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── zh.json
│ │ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── use-data.ts
│ │ │ │ │ ├── sql-limit/
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── setting.tsx
│ │ │ │ │ │ │ └── table.tsx
│ │ │ │ │ │ ├── ctx/
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── locales/
│ │ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── zh.json
│ │ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── use-data.ts
│ │ │ │ │ └── state-filters.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── metric/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── chart-actions-menu.tsx
│ │ │ │ │ │ ├── chart-body.tsx
│ │ │ │ │ │ ├── chart-header.tsx
│ │ │ │ │ │ ├── charts-select.tsx
│ │ │ │ │ │ └── loading-card.tsx
│ │ │ │ │ ├── ctx/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.json
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── azores-cluster/
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-cluster-overview/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-host/
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-metric-detail/
│ │ │ │ │ │ │ ├── body.tsx
│ │ │ │ │ │ │ ├── drawer.tsx
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ └── modal.tsx
│ │ │ │ │ │ ├── azores-overview/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ └── normal/
│ │ │ │ │ │ ├── chart-card.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ ├── memory-state.ts
│ │ │ │ │ │ └── url-state.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── use-data.ts
│ │ │ │ ├── slow-query/
│ │ │ │ │ ├── ctx/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── preset.ts
│ │ │ │ │ │ └── zh.json
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── advanced-filter-info-model.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── slowquery-model.ts
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── detail/
│ │ │ │ │ │ │ ├── detail-basic.tsx
│ │ │ │ │ │ │ ├── detail-copr.tsx
│ │ │ │ │ │ │ ├── detail-tabs.tsx
│ │ │ │ │ │ │ ├── detail-time.tsx
│ │ │ │ │ │ │ ├── detail-txn.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── plan.tsx
│ │ │ │ │ │ │ ├── query.tsx
│ │ │ │ │ │ │ ├── related-statement-button.tsx
│ │ │ │ │ │ │ ├── related-statement-link.tsx
│ │ │ │ │ │ │ ├── sql-history.tsx
│ │ │ │ │ │ │ └── sql-limit.tsx
│ │ │ │ │ │ └── list/
│ │ │ │ │ │ ├── advanced-filters-modal.tsx
│ │ │ │ │ │ ├── cols-select.tsx
│ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ ├── filters-with-advanced.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── refresh-button.tsx
│ │ │ │ │ │ ├── table.tsx
│ │ │ │ │ │ └── time-range-clip-alert.tsx
│ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ └── use-data.ts
│ │ │ │ └── statement/
│ │ │ │ ├── ctx/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── locales/
│ │ │ │ │ ├── en.json
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── preset.ts
│ │ │ │ │ └── zh.json
│ │ │ │ ├── models/
│ │ │ │ │ ├── advanced-filter-info-model.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── statement-config-model.ts
│ │ │ │ │ └── statement-model.ts
│ │ │ │ ├── pages/
│ │ │ │ │ ├── detail/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── plan-detail/
│ │ │ │ │ │ │ ├── detail-basic.tsx
│ │ │ │ │ │ │ ├── detail-copr.tsx
│ │ │ │ │ │ │ ├── detail-tabs.tsx
│ │ │ │ │ │ │ ├── detail-time.tsx
│ │ │ │ │ │ │ ├── detail-txn.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── plan.tsx
│ │ │ │ │ │ ├── plans-list/
│ │ │ │ │ │ │ ├── bind-sql-cell.tsx
│ │ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── plan-check-cell.tsx
│ │ │ │ │ │ │ ├── slow-query-cell.tsx
│ │ │ │ │ │ │ └── table.tsx
│ │ │ │ │ │ ├── sql-history.tsx
│ │ │ │ │ │ ├── sql-limit.tsx
│ │ │ │ │ │ ├── stmt-basic.tsx
│ │ │ │ │ │ └── stmt-sql.tsx
│ │ │ │ │ ├── list/
│ │ │ │ │ │ ├── advanced-filters-modal.tsx
│ │ │ │ │ │ ├── cols-select.tsx
│ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ ├── disabled-status.tsx
│ │ │ │ │ │ ├── filters-with-advanced.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── refresh-button.tsx
│ │ │ │ │ │ ├── stmt-setting-button.tsx
│ │ │ │ │ │ ├── table.tsx
│ │ │ │ │ │ └── time-range-fix-alert.tsx
│ │ │ │ │ └── setting/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── shared-state/
│ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ └── memory-state.ts
│ │ │ │ └── utils/
│ │ │ │ ├── constants.ts
│ │ │ │ └── use-data.ts
│ │ │ └── tsconfig.json
│ │ ├── portals/
│ │ │ └── test/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── public/
│ │ │ │ └── swagger.index-advisor.json
│ │ │ ├── src/
│ │ │ │ ├── App.css
│ │ │ │ ├── App.tsx
│ │ │ │ ├── apps/
│ │ │ │ │ ├── metric/
│ │ │ │ │ │ ├── mock-api-app-provider.tsx
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ ├── normal-configs.ts
│ │ │ │ │ │ └── qps-type.json
│ │ │ │ │ ├── slow-query/
│ │ │ │ │ │ └── mock-api-app-provider.tsx
│ │ │ │ │ └── statement/
│ │ │ │ │ ├── mock-api-app-provider.tsx
│ │ │ │ │ └── stmt-types.ts
│ │ │ │ ├── index.css
│ │ │ │ ├── main.tsx
│ │ │ │ ├── providers/
│ │ │ │ │ ├── react-query-provider.tsx
│ │ │ │ │ └── url-state-provider.tsx
│ │ │ │ ├── router/
│ │ │ │ │ ├── devtools.tsx
│ │ │ │ │ ├── provider.tsx
│ │ │ │ │ └── router.ts
│ │ │ │ ├── routes/
│ │ │ │ │ ├── __root.tsx
│ │ │ │ │ ├── _apps-layout/
│ │ │ │ │ │ ├── metrics/
│ │ │ │ │ │ │ ├── azores-cluster-overview.lazy.tsx
│ │ │ │ │ │ │ ├── azores-cluster.lazy.tsx
│ │ │ │ │ │ │ ├── azores-host.lazy.tsx
│ │ │ │ │ │ │ ├── azores-overview.lazy.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── normal.lazy.tsx
│ │ │ │ │ │ ├── metrics.lazy.tsx
│ │ │ │ │ │ ├── slow-query/
│ │ │ │ │ │ │ ├── detail.lazy.tsx
│ │ │ │ │ │ │ └── index.lazy.tsx
│ │ │ │ │ │ ├── slow-query.lazy.tsx
│ │ │ │ │ │ ├── statement/
│ │ │ │ │ │ │ ├── detail.lazy.tsx
│ │ │ │ │ │ │ └── index.lazy.tsx
│ │ │ │ │ │ └── statement.lazy.tsx
│ │ │ │ │ ├── _apps-layout.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── login.lazy.tsx
│ │ │ │ └── vite-env.d.ts
│ │ │ ├── tsconfig.json
│ │ │ └── vite.config.ts
│ │ └── tsconfig.app.json
│ ├── pnpm-workspace.yaml
│ └── scripts/
│ ├── gen-locales.ts
│ └── gogocode-test/
│ ├── 1.js
│ └── 2.js
└── util/
├── assertutil/
│ ├── 1_main_test.go
│ ├── json.go
│ ├── json_test.go
│ └── mock.go
├── client/
│ ├── httpclient/
│ │ ├── 1_main_test.go
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── info.go
│ │ ├── request.go
│ │ ├── request_resty.go
│ │ ├── response.go
│ │ └── response_test.go
│ ├── pdclient/
│ │ ├── 1_main_test.go
│ │ ├── etcd_client.go
│ │ ├── fixture/
│ │ │ └── pd_server.go
│ │ ├── pd_api.go
│ │ ├── pd_api_client.go
│ │ ├── pd_api_highlevel.go
│ │ ├── pd_api_highlevel_test.go
│ │ └── pd_api_test.go
│ ├── schedulingclient/
│ │ └── status_client.go
│ ├── ticdcclient/
│ │ └── status_client.go
│ ├── tidbclient/
│ │ ├── sql_client.go
│ │ ├── status_client.go
│ │ ├── tidbproto/
│ │ │ ├── 1_main_test.go
│ │ │ ├── codec.go
│ │ │ ├── codec_test.go
│ │ │ └── model.go
│ │ └── tidbproxy/
│ │ └── proxy.go
│ ├── tiflashclient/
│ │ └── status_client.go
│ ├── tikvclient/
│ │ └── status_client.go
│ ├── tiproxyclient/
│ │ └── status_client.go
│ └── tsoclient/
│ └── status_client.go
├── csvutil/
│ ├── 1_main_test.go
│ ├── writer.go
│ └── writer_test.go
├── distro/
│ ├── 1_main_test.go
│ ├── distro.go
│ └── distro_test.go
├── featureflag/
│ ├── 1_main_test.go
│ ├── featureflag.go
│ ├── featureflag_test.go
│ ├── registry.go
│ └── registry_test.go
├── fxprinter/
│ └── fxprinter.go
├── gormutil/
│ ├── datatype/
│ │ ├── 1_main_test.go
│ │ ├── int.go
│ │ ├── int_test.go
│ │ ├── int_withdb_test.go
│ │ ├── nullable/
│ │ │ └── nullable.go
│ │ ├── timestamp.go
│ │ ├── timestamp_test.go
│ │ └── timestamp_withdb_test.go
│ └── virtualview/
│ ├── 1_main_test.go
│ ├── schema.go
│ ├── schema_test.go
│ ├── virtualview.go
│ └── virtualview_test.go
├── israce/
│ ├── no_race.go
│ └── race.go
├── jsonserde/
│ ├── 1_main_test.go
│ ├── convert.go
│ ├── default.go
│ ├── default_test.go
│ └── ginadapter/
│ ├── 1_main_test.go
│ ├── binding.go
│ ├── binding_test.go
│ ├── render.go
│ └── render_test.go
├── lifecyclectx/
│ ├── fx.go
│ └── lifecyclectxtest/
│ └── test.go
├── netutil/
│ ├── 1_main_test.go
│ ├── parse.go
│ └── parse_test.go
├── nocopy/
│ └── nocopy.go
├── proxy/
│ ├── 1_main_test.go
│ ├── proxy.go
│ ├── proxy_test.go
│ └── upstream.go
├── reflectutil/
│ ├── 1_main_test.go
│ ├── field.go
│ ├── field_test.go
│ ├── tag.go
│ └── tag_test.go
├── rest/
│ ├── 1_main_test.go
│ ├── context_helpers.go
│ ├── context_helpers_test.go
│ ├── empty_resp.go
│ ├── error.go
│ ├── error_resp.go
│ ├── error_resp_test.go
│ ├── error_test.go
│ └── fileswap/
│ ├── 1_main_test.go
│ ├── server.go
│ └── server_test.go
├── sqlitestore/
│ └── sqlitestore.go
├── testutil/
│ ├── db.go
│ ├── gintest/
│ │ └── context.go
│ ├── http_server.go
│ ├── httpmockutil/
│ │ └── responder.go
│ └── testdefault/
│ └── main.go
├── timeutil/
│ ├── 1_main_test.go
│ ├── format.go
│ └── format_test.go
├── tlsutil/
│ ├── 1_main_test.go
│ ├── config_ext.go
│ └── config_ext_test.go
├── topo/
│ ├── 1_main_test.go
│ ├── mock_TopologyProvider.go
│ ├── model.go
│ ├── model_desc.go
│ ├── model_info.go
│ ├── pdtopo/
│ │ ├── 1_main_test.go
│ │ ├── monitor.go
│ │ ├── pd.go
│ │ ├── pd_test.go
│ │ ├── provider_pd.go
│ │ ├── std_comp.go
│ │ ├── store.go
│ │ ├── store_test.go
│ │ └── tidb.go
│ ├── provider.go
│ ├── provider_cached.go
│ └── provider_cached_test.go
└── ziputil/
└── zip_writer.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .all-contributorsrc
================================================
{
"files": [
"README.md"
],
"imageSize": 50,
"commit": false,
"contributors": [
{
"login": "Fullstop000",
"name": "Fullstop000",
"avatar_url": "https://avatars1.githubusercontent.com/u/12471960?v=4",
"profile": "https://github.com/Fullstop000",
"contributions": [
"code"
]
},
{
"login": "rleungx",
"name": "Ryan Leung",
"avatar_url": "https://avatars3.githubusercontent.com/u/35896542?v=4",
"profile": "http://rleungx.github.io",
"contributions": [
"code"
]
},
{
"login": "zzh-wisdom",
"name": "zzh-wisdom",
"avatar_url": "https://avatars2.githubusercontent.com/u/52516344?v=4",
"profile": "https://github.com/zzh-wisdom",
"contributions": [
"code"
]
},
{
"login": "STRRL",
"name": "STRRL",
"avatar_url": "https://avatars0.githubusercontent.com/u/20221408?v=4",
"profile": "https://github.com/STRRL",
"contributions": [
"code"
]
},
{
"login": "SSebo",
"name": "SSebo",
"avatar_url": "https://avatars0.githubusercontent.com/u/5784607?v=4",
"profile": "https://github.com/SSebo",
"contributions": [
"code"
]
},
{
"login": "Yisaer",
"name": "Song Gao",
"avatar_url": "https://avatars1.githubusercontent.com/u/13427348?v=4",
"profile": "https://yisaer.github.io/",
"contributions": [
"code"
]
},
{
"login": "gauss1314",
"name": "gauss1314",
"avatar_url": "https://avatars2.githubusercontent.com/u/3862518?v=4",
"profile": "https://github.com/gauss1314",
"contributions": [
"code"
]
},
{
"login": "leiysky",
"name": "lei yu",
"avatar_url": "https://avatars2.githubusercontent.com/u/22445410?v=4",
"profile": "https://github.com/leiysky",
"contributions": [
"code"
]
},
{
"login": "niedhui",
"name": "niedhui",
"avatar_url": "https://avatars0.githubusercontent.com/u/66329?v=4",
"profile": "https://github.com/niedhui",
"contributions": [
"code"
]
},
{
"login": "weihanglo",
"name": "Weihang Lo",
"avatar_url": "https://avatars2.githubusercontent.com/u/14314532?v=4",
"profile": "https://weihanglo.tw/",
"contributions": [
"code"
]
},
{
"login": "yikeke",
"name": "Keke Yi",
"avatar_url": "https://avatars1.githubusercontent.com/u/40977455?v=4",
"profile": "https://github.com/yikeke",
"contributions": [
"content"
]
},
{
"login": "qxhy123",
"name": "Michael.Yang",
"avatar_url": "https://avatars2.githubusercontent.com/u/518969?v=4",
"profile": "https://github.com/qxhy123",
"contributions": [
"code"
]
},
{
"login": "Rustin-Liu",
"name": "二手掉包工程师",
"avatar_url": "https://avatars0.githubusercontent.com/u/29879298?v=4",
"profile": "http://www.rustin.cn",
"contributions": [
"code"
]
},
{
"login": "ericsyh",
"name": "Eric Shen",
"avatar_url": "https://avatars3.githubusercontent.com/u/10498732?v=4",
"profile": "https://github.com/ericsyh",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 10,
"contributorsSortAlphabetically": true,
"contributorTemplate": "<a href=\"<%= contributor.profile %>\"><img src=\"<%= contributor.avatar_url %>\" width=\"<%= options.imageSize %>px;\" alt=\"\"/></a>",
"projectName": "tidb-dashboard",
"projectOwner": "pingcap",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "none"
}
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: "\U0001F41B Bug Report"
about: Something isn't working as expected
title: ""
labels: type/bug
assignees: ""
---
## Bug Report
Please answer these questions before submitting your issue. Thanks!
**What did you do?**
<!-- If possible, provide a recipe for reproducing the error. -->
**What did you expect to see?**
<!-- Please fill. -->
**What did you see instead?**
<!-- Please fill. -->
**What version of TiDB Dashboard are you using (`./tidb-dashboard --version`)?**
<!-- Please fill. -->
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: "\U0001F680 Feature Request"
about: I have a suggestion
title: ""
labels: status/discussion, type/feature-request
assignees: ""
---
## Feature Request
**Is your feature request related to a problem? Please describe:**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the feature you'd like:**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered:**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Teachability, Documentation, Adoption, Migration Strategy:**
<!-- If you can, explain some scenarios how users might use this, situations it would be helpful in. Any API designs, mockups, or diagrams are also helpful. -->
================================================
FILE: .github/ISSUE_TEMPLATE/question.md
================================================
---
name: "\U0001F914 Question"
about: I have a question
label: "type/question"
---
## Question
<!--
Thanks for using TiDB Dashboard! Before asking a question, please take a look in the following places:
- GitHub issues
https://github.com/pingcap/tidb-dashboard/issues?q=is%3Aissue
- Documentation (English)
https://docs.pingcap.com/tidb/stable/dashboard-intro
- Documentation (Chinese)
https://docs.pingcap.com/zh/tidb/stable/dashboard-intro
- AskTUG forum (Chinese)
https://asktug.com/
You might also get a faster response in Slack (English / Chinese):
https://slack.tidb.io/invite?team=tidb-community&channel=sig-diagnosis&ref=github_issue_create
-->
================================================
FILE: .github/autolabeler.yml
================================================
area/frontend:
- /ui
area/backend:
- *.go
================================================
FILE: .github/codecov.yml
================================================
comment:
layout: "diff,flags,footer"
================================================
FILE: .github/stale.yml
================================================
daysUntilStale: 60
daysUntilClose: 7
exemptLabels:
- type/feature-request
- type/pinned
staleLabel: type/stale
================================================
FILE: .github/workflows/build.yaml
================================================
name: Build
on:
push:
branches:
- master
pull_request:
branches:
- master
- release-*
jobs:
backend:
name: Backend
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version-file: "go.mod"
- name: Load go module cache
uses: actions/cache@v5
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Load golangci-lint cache
uses: actions/cache@v5
with:
path: ~/.cache/golangci-lint
key: ${{ runner.os }}-golint
restore-keys: |
${{ runner.os }}-golint
- name: Lint and build
run: |
make dev
- name: Check uncommitted lint changes
run: |
git diff --exit-code
frontend:
name: Frontend
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
# https://pnpm.io/continuous-integration#github-actions
- name: Setup PNPM
uses: pnpm/action-setup@v5
with:
version: 8
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: "22"
cache: "pnpm"
cache-dependency-path: "ui/pnpm-lock.yaml"
- uses: actions/setup-go@v6
with:
go-version-file: "go.mod"
- name: Load go module cache
uses: actions/cache@v5
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Install ui packages
run: |
make ui_deps
- name: Check format
run: |
pnpm fmt-check || (echo "::error ::Please format your code by using 'pnpm fmt-fix'"; exit 1)
working-directory: ui
- name: Build UI
run: |
make ui
env:
NO_MINIMIZE: true
CI: true
================================================
FILE: .github/workflows/manual-create-pd-pr.yaml
================================================
name: Create PD PR Manually
on:
workflow_dispatch:
inputs:
release_version:
description: 'Release version, e.g. v7.6.0-f7bbcdcf'
required: true
pd_branchs:
description: 'PD branch, e.g. ["master", "release-7.6"]'
default: '["master"]'
required: true
jobs:
pd_pr:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# https://stackoverflow.com/questions/69781005/combine-dynamic-github-workflow-matrix-with-input-values-and-predefined-values
branch: ${{ fromJson(github.event.inputs.pd_branchs) }}
name: Create PD PR - ${{ matrix.branch }}
steps:
- name: Check out PD code base
uses: actions/checkout@v4
with:
repository: tikv/pd
ref: ${{ matrix.branch }}
- uses: actions/setup-go@v3
with:
go-version: '1.25.7'
- name: Load go module cache
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-pd-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-pd-
- name: Update TiDB Dashboard in PD code base
run: |
scripts/update-dashboard.sh ${{ github.event.inputs.release_version }}
- name: Commit PD code base change
id: git_commit
run: |
git diff
git config user.name "baurine"
git config user.email "2008.hbl@gmail.com"
git add .
if git status | grep -q "Changes to be committed"
then
git commit --signoff --message "chore(dashboard): update TiDB Dashboard to ${{ github.event.inputs.release_version }}"
echo "::set-output name=committed::1"
else
echo "No changes detected, skipped"
fi
- name: Set build ID
id: build_id
run: echo "::set-output name=id::$(date +%s)"
- name: Create PR based on PD code base
id: cpr
uses: peter-evans/create-pull-request@v3
if: steps.git_commit.outputs.committed == 1
with:
push-to-fork: baurine/pd
token: ${{ secrets.PAT_TO_PUSH_PD_FORK }}
branch: update-tidb-dashboard/${{ matrix.branch }}-${{ github.event.inputs.release_version }}-${{ steps.build_id.outputs.id }}
title: 'chore(dashboard): update TiDB Dashboard to ${{ github.event.inputs.release_version }} [${{ matrix.branch }}]'
body: |
### What problem does this PR solve?
Issue Number: ref #4257
Update TiDB Dashboard to [${{ github.event.inputs.release_version }}](https://github.com/pingcap/tidb-dashboard/releases/tag/${{ github.event.inputs.release_version }}).
### Release note
```release-note
None
```
- name: Check outputs
if: steps.git_commit.outputs.committed == 1
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
================================================
FILE: .github/workflows/release.yaml
================================================
name: Release
on:
push:
tags:
- "v*"
- "!v*-alpha"
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
# https://pnpm.io/continuous-integration#github-actions
- name: Setup PNPM
uses: pnpm/action-setup@v2
with:
version: 8
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "pnpm"
cache-dependency-path: "ui/pnpm-lock.yaml"
- uses: actions/setup-go@v3
with:
go-version: "1.25.7"
- name: Load go module cache
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Build UI
env:
REACT_APP_MIXPANEL_TOKEN: ${{ secrets.REACT_APP_MIXPANEL_TOKEN }}
run: |
make ui
- name: Pack UI assets for release
working-directory: ui/packages/tidb-dashboard-for-op/dist
run: |
zip -r ../static-assets.zip .
# TODO: generate changelog
# - name: Generate Changelog
# id: build_changelog
# uses: mikepenz/release-changelog-builder-action@v4.1.0
- name: Create release
id: create_release
uses: fleskesvor/create-release@feature/support-target-commitish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Internal Version ${{ github.ref }}
draft: false
prerelease: false
# body: ${{steps.build_changelog.outputs.changelog}}
- name: Upload UI assets
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./ui/packages/tidb-dashboard-for-op/static-assets.zip
asset_name: static-assets.zip
asset_content_type: application/zip
- name: Generate embedded UI assets
run: |
NO_ASSET_BUILD_TAG=1 scripts/embed_ui_assets.sh
cp pkg/uiserver/embedded_assets_handler.go embedded_assets_handler.go
- name: Pack embedded assets for release
run: |
zip -r embedded-assets-golang.zip ./embedded_assets_handler.go
- name: Upload embedded UI assets
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./embedded-assets-golang.zip
asset_name: embedded-assets-golang.zip
asset_content_type: application/zip
================================================
FILE: .github/workflows/test-docker-image.yaml
================================================
name: Test Docker Image
on:
push:
branches:
- master
pull_request:
branches:
- master
concurrency:
group: ${{ github.ref }}-${{ github.workflow }}
cancel-in-progress: true
jobs:
test-build-docker-image:
runs-on: ${{ matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
strategy:
matrix:
platform: [linux/amd64, linux/arm64]
remote_dockerfile: # download from: https://github.com/PingCAP-QE/artifacts/tree/main/dockerfiles/cd/builders/tidb-dashboard
- Dockerfile # builder is rocky linux 8
- centos7/Dockerfile # builder is centos 7
fail-fast: true
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Read VERSION file
id: getversion
run: echo "::set-output name=version::$(git describe --tags --dirty --always)"
- name: Download Dockerfile
run: |
wget "https://github.com/PingCAP-QE/artifacts/raw/refs/heads/main/dockerfiles/cd/builders/tidb-dashboard/${{ matrix.remote_dockerfile }}" -O Dockerfile
- name: Build
uses: docker/build-push-action@v6
with:
push: false
context: .
file: Dockerfile
platforms: ${{ matrix.platform }}
tags: pingcap/tidb-dashboard:${{ steps.getversion.outputs.version }}
================================================
FILE: .github/workflows/test.yaml
================================================
name: Test
on:
push:
branches:
- master
pull_request:
branches:
- master
- release-*
jobs:
backend_ut:
name: Backend - Unit
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: actions/setup-go@v3
with:
go-version: "1.25.7"
- name: Load go module cache
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Run unit test
run: |
make unit_test
# - name: Upload coverage to Codecov
# uses: codecov/codecov-action@v2
# with:
# files: ./coverage/unit_test.txt
# fail_ci_if_error: true
# flags: backend_ut
# verbose: true
backend_integration:
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
matrix:
# tidb_version: [nightly, ^6.0, ^5.4, ^5.0]
tidb_version: [nightly, ^6.0]
name: Backend - Integration - TiDB@${{ matrix.tidb_version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: actions/setup-go@v3
with:
go-version: "1.25.7"
- name: Load go module cache
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Load TiUP cache
uses: actions/cache@v3
with:
path: ~/.tiup/components
key: ${{ runner.os }}-tiup-${{ matrix.tidb_version }}
- name: Run integration test
run: |
make integration_test TIDB_VERSION=${{ matrix.tidb_version }}
# - name: Upload coverage to Codecov
# uses: codecov/codecov-action@v2
# with:
# files: ./coverage/integration_${{ matrix.tidb_version }}.txt
# fail_ci_if_error: true
# flags: backend_integration
# verbose: true
# e2e_test:
# runs-on: ubuntu-latest
# timeout-minutes: 30
# strategy:
# fail-fast: false
# matrix:
# # test latest features and compatibility of lower version
# include:
# - feature_version: 6.0.0 # You must ensure feature_version and tidb_version is matching!
# tidb_version: nightly
# without_ngm: true
# - feature_version: 6.0.0
# tidb_version: ^6.0
# without_ngm: true
# - feature_version: 5.4.0
# tidb_version: ^5.4
# without_ngm: true
# - feature_version: 5.0.0
# tidb_version: ^5.0
# without_ngm: true
# name: E2E - TiDB@${{ matrix.tidb_version }}${{ !matrix.without_ngm && '+ngm' || '' }}
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# # https://pnpm.io/continuous-integration#github-actions
# - name: Setup PNPM
# uses: pnpm/action-setup@v2.2.2
# with:
# version: 7
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: "16"
# cache: "pnpm"
# cache-dependency-path: "ui/pnpm-lock.yaml"
# - name: Load cypress cache
# uses: actions/cache@v3
# id: cypress-cache
# with:
# path: ~/.cache/Cypress
# key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
# restore-keys: |
# ${{ runner.os }}-cypress-
# - uses: actions/setup-go@v3
# with:
# go-version: "1.21"
# - name: Load go module cache
# uses: actions/cache@v3
# with:
# path: |
# ~/.cache/go-build
# ~/go/pkg/mod
# key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
# restore-keys: |
# ${{ runner.os }}-go-
# - name: Load TiUP cache
# uses: actions/cache@v3
# with:
# path: ~/.tiup/components
# key: ${{ runner.os }}-tiup-${{ matrix.tidb_version }}
# - name: Install and run TiUP in the background
# run: |
# chmod u+x scripts/start_tiup.sh
# scripts/start_tiup.sh ${{ matrix.tidb_version }} ${{ matrix.without_ngm }}
# - name: Build UI
# run: |
# make ui
# env:
# NO_MINIMIZE: true
# CI: true
# E2E_TEST: true
# - name: Wait TiUP Playground
# run: |
# chmod u+x scripts/wait_tiup_playground.sh
# scripts/wait_tiup_playground.sh 15 20
# - name: Debug TiUP
# run: |
# source /home/runner/.profile
# tiup --version
# ls /home/runner/.tiup/components/playground/
# DATA_PATH=$(ls /home/runner/.tiup/data/)
# echo $DATA_PATH
# echo "==== TiDB Log ===="
# head -n 3 /home/runner/.tiup/data/$DATA_PATH/tidb-0/tidb.log
# echo "==== TiKV Log ===="
# head -n 3 /home/runner/.tiup/data/$DATA_PATH/tikv-0/tikv.log
# echo "==== PD Log ===="
# head -n 3 /home/runner/.tiup/data/$DATA_PATH/pd-0/pd.log
# - name: Build and run backend in the background
# run: |
# make
# make run &
# env:
# UI: 1
# FEATURE_VERSION: ${{ matrix.feature_version }}
# - name: Run E2E Features Test
# run: make e2e_test
# env:
# SERVER_URL: http://127.0.0.1:12333/dashboard/
# CI: true
# FEATURE_VERSION: ${{ matrix.feature_version }}
# TIDB_VERSION: ${{ matrix.tidb_version }}
# CYPRESS_ALLOW_SCREENSHOT: true
# WITHOUT_NGM: ${{ matrix.without_ngm }}
# - name: Upload coverage to Codecov
# uses: codecov/codecov-action@v2
# with:
# files: ./ui/packages/tidb-dashboard-for-op/.nyc_output/out.json
# fail_ci_if_error: false
# flags: e2e_test
# verbose: true
================================================
FILE: .github/workflows/upload-e2e-snapshots.yaml
================================================
# Copyright 2024 PingCAP, Inc. Licensed under Apache-2.0.
name: Upload E2E Snapshots
on:
workflow_dispatch:
inputs:
ref:
description: "The branch, tag or SHA to create snapshots"
required: true
spec:
description: "Specify the spec files to run, example: `topsql/topsql.spec.ts`"
required: true
jobs:
e2e_test_snapshots:
name: Take E2E Test Snapshots
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
# test latest features and compatibility of lower version
include:
- feature_version: 6.0.0
tidb_version: latest
- feature_version: 5.4.0
tidb_version: v5.4.0
- feature_version: 5.0.0
tidb_version: v5.0.0
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.ref }}
# https://pnpm.io/continuous-integration#github-actions
- name: Setup PNPM
uses: pnpm/action-setup@v2
with:
version: 8
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "pnpm"
cache-dependency-path: "ui/pnpm-lock.yaml"
- uses: actions/setup-go@v3
with:
go-version: "1.25.7"
- name: Load go module cache
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Load TiUP cache
uses: actions/cache@v3
with:
path: ~/.tiup/components
key: ${{ runner.os }}-tiup
restore-keys: |
${{ runner.os }}-tiup
- name: Install and run TiUP in the background
run: |
chmod u+x scripts/start_tiup.sh
scripts/start_tiup.sh ${{ matrix.tidb_version }} false
- name: Build UI
run: |
make ui
env:
NO_MINIMIZE: true
CI: true
- name: Wait TiUP Playground
run: |
chmod u+x scripts/wait_tiup_playground.sh
scripts/wait_tiup_playground.sh 15 20
- name: Debug TiUP
run: |
source /home/runner/.profile
tiup --version
ls /home/runner/.tiup/components/playground/
DATA_PATH=$(ls /home/runner/.tiup/data/)
echo $DATA_PATH
echo "==== TiDB Log ===="
head -n 3 /home/runner/.tiup/data/$DATA_PATH/tidb-0/tidb.log
echo "==== TiKV Log ===="
head -n 3 /home/runner/.tiup/data/$DATA_PATH/tikv-0/tikv.log
echo "==== PD Log ===="
head -n 3 /home/runner/.tiup/data/$DATA_PATH/pd-0/pd.log
- name: Build and run backend in the background
run: |
make
make run &
env:
UI: 1
FEATURE_VERSION: ${{ matrix.feature_version }}
- name: Delete Previous Snapshots
run: rm -rf ${{ github.workspace }}/ui/packages/tidb-dashboard-for-op/cypress/snapshots
- name: Run E2E Features Test
run: make e2e_test_specify
env:
SERVER_URL: http://127.0.0.1:12333/dashboard/
CI: true
FEATURE_VERSION: ${{ matrix.feature_version }}
TIDB_VERSION: ${{ matrix.tidb_version }}
CYPRESS_ALLOW_SCREENSHOT: true
E2E_SPEC: cypress/integration/${{ github.event.inputs.spec }}
- name: Archive Test Video
if: always()
uses: actions/upload-artifact@v2
with:
name: e2e-video-${{ matrix.feature_version }}
path: ${{ github.workspace }}/ui/packages/tidb-dashboard-for-op/cypress/videos/**/*
- name: Upload snapshots artifact
uses: actions/upload-artifact@v2
if: always()
with:
name: e2e-snapshots-${{ matrix.feature_version }}
path: ${{ github.workspace }}/ui/packages/tidb-dashboard-for-op/cypress/snapshots/**/*
================================================
FILE: .gitignore
================================================
.env
/bin
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
coverage/
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
.idea
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# VSCode
.vscode/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
# ui
.pnpm-debug.log
================================================
FILE: .golangci.yml
================================================
version: "2"
linters:
enable:
- asciicheck
- dogsled
- durationcheck
- errorlint
- exhaustive
- godot
- goheader
- gosec
- importas
- misspell
- nestif
- prealloc
- predeclared
- revive
- unconvert
- whitespace
settings:
exhaustive:
default-signifies-exhaustive: true
godot:
exclude:
- ^\s*@
goheader:
template: Copyright {{ YEAR }} PingCAP, Inc. Licensed under Apache-2.0.
revive:
rules:
- name: var-naming
severity: warning
disabled: false
exclude: [""]
arguments:
- [ "utils" ] # AllowList
- [ "VM" ] # DenyList
- - skip-package-name-checks: true
gosec:
excludes:
- G115 # Type conversion which leads to integer overflow
exclusions:
generated: lax
presets:
- comments
- std-error-handling
rules:
- path: ^pkg/|^cmd/
linters:
- errorlint
- exhaustive
- nestif
- wastedassign
- path: _test.go
linters:
- gosec
test: "G705"
paths:
- swaggerspec
- pkg/uiserver
- ui
- third_party$
- builtin$
- examples$
formatters:
enable:
- gofumpt
- goimports
settings:
goimports:
local-prefixes:
- github.com/pingcap/tidb-dashboard
exclusions:
generated: lax
paths:
- swaggerspec
- pkg/uiserver
- ui
- third_party$
- builtin$
- examples$
================================================
FILE: .prettierrc
================================================
{
"semi": false,
"trailingComma": "none",
"singleQuote": true
}
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to TiDB Dashboard
Thanks for your interest in contributing to TiDB Dashboard! This document outlines some of the conventions on building, running, and testing TiDB Dashboard, the development workflow, commit message formatting, contact points and other resources.
If you need any help (for example, mentoring getting started or understanding the codebase), feel free to reach out on the [TiDB Internals forum](https://internals.tidb.io/).
## Setting up a development workspace
The following steps are describing how to develop TiDB Dashboard by running a self-built and standalone TiDB Dashboard server along with a separated TiDB cluster ([TiDB] + [TiKV] + [PD]). TiDB Dashboard cannot work without a TiDB cluster.
Although TiDB Dashboard can also be integrated into [PD], this form is not convenient for developing. Thus we will not cover it here.
### Step 1. Start a TiDB cluster
[TiUP](https://docs.pingcap.com/tidb/stable/tiup-overview) is the official component manager for [TiDB]. It can help you set up a local TiDB cluster in a few minutes.
Download and install TiUP:
```bash
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
```
Declare the global environment variable:
> **Note:**
>
> After the installation, TiUP displays the absolute path of the corresponding `profile` file. You need to modify the following `source` command according to the path.
```bash
source ~/.bash_profile
```
Start a local TiDB cluster:
```bash
tiup playground
```
You might notice that there is already a TiDB Dashboard integrated into the PD started by TiUP. For development purpose, it will not be used intentionally.
### Step 2. Prepare Dev Prerequisites
The followings are required for developing TiDB Dashboard:
- git - Version control
- make - Build tool (run common workflows)
- [Golang 1.21+](https://golang.org/) - To compile the server.
- [Node.js 22](https://nodejs.org/) - To compile the front-end.
- [PNPM 8](https://pnpm.io/) - To manage front-end dependencies.
- [Java 8+](https://www.java.com/ES/download/) - To generate JavaScript API client by OpenAPI specification.
### Step 3. Build and Run TiDB Dashboard
> Make sure that `tiup playground` is running on the background.
Package frontend and backend into a single binary:
```bash
# Build a binary into `bin/tidb-dashboard`.
make package
# Run.
make run
```
You can access TiDB Dashboard now: [http://127.0.0.1:12333/dashboard](http://127.0.0.1:12333/dashboard)
#### Develop Frontend and Backend Separately
1. Build and run TiDB Dashboard back-end server:
```bash
# In tidb-dashboard directory:
make dev && make run
```
2. Build and run front-end server in a new terminal:
```bash
# In tidb-dashboard directory:
cd ui
pnpm i # install all dependencies
pnpm dev
```
3. That's it! You can access TiDB Dashboard now: [http://127.0.0.1:3001](http://127.0.0.1:3001)
### Step 4. Run E2E Tests (optional)
When back-end server and front-end server are both started, E2E tests can be run by:
```bash
cd ui/packages/tidb-dashboard-for-op
pnpm open:cypress
```
> Now we have only a few e2e tests. Contributions are welcome!
## Additional Guides
### Style Guidelines
This project follows the [Uber's Golang style guide](https://github.com/uber-go/guide/blob/master/style.md). Please refer to [its documentation](https://github.com/uber-go/guide/blob/master/style.md) for details.
### Swagger UI
We use [Swagger] to generate the API server and corresponding clients. Swagger provides a web UI in which you can
see all TiDB Dashboard API endpoints and specifications, or even send API requests.
Swagger UI is available at http://localhost:12333/dashboard/api/swagger after the above Step 3 is finished.
### Build and run docker image locally
If you want to develop docker image locally 🤔.
1. Ensure the Docker Buildx is installed on your local machine.
> Docker Buildx is included in Docker Desktop for Windows, macOS, and Linux.
> Docker Linux packages also include Docker Buildx when installed using the DEB or RPM packages.
2. Build the docker image.
```bash
# On repository root directory (only build locally, no push remote), run:
make docker-build-image-locally-amd64
# Or, if you want to build the image for arm64 platform (only build locally, no push remote), run:
make docker-build-image-locally-arm64
# Or, if you want to build cross-platform image and push it to your dev docker registry, run:
REPOSITORY=your-tidb-dashboard-repository make docker-build-and-push-image
# Or, if you want to build centos7 based image, run:
DOCKERFILE=./dockerfiles/centos7.Dockerfile make docker-build-image-locally-arm64
# Finally, if you update npm modules or go modules, and want to disable docker layer cache to force rebuild, set NO_CACHE="--pull --no-cache" before make command. For example:
NO_CACHE="--pull --no-cache" make docker-build-image-locally-amd64
```
3. Run newly build image with docker-compose.
> Please make sure that `tiup playground` is not running on the background.
```bash
# On repository root directory, run:
docker-compose -f ./dockerfiles/docker-compose.yml up
```
4. Access TiDB Dashboard at [http://localhost:12333/dashboard](http://localhost:12333/dashboard).
> The old Dashboard **_in PD_** can be accessed at [http://localhost:2379/dashboard](http://localhost:2379/dashboard).
### How to update TiDB Dashboard in PD
To update the TiDB Dashboard in PD, we need to release a TiDB Dashboard version and submit a PR to PD.
1. In a release branch, likes `release-7.6`, run `make tag` to add a new tag for TiDB Dashboard. The new tag is like `v7.6.x-<sha>`.
1. Push the new tag to the remote repository, it will trigger the CI to release a new TiDB Dashboard version.
1. After the new version is created, go to https://github.com/pingcap/tidb-dashboard/actions/workflows/manual-create-pd-pr.yaml, click `Run workflow` button, fill the required parameters and submit the workflow, it will trigger the CI to create a PR to PD which will update the TiDB Dashboard version in PD.
## Contribution flow
This is a rough outline of what a contributor's workflow looks like:
- Create a Git branch from where you want to base your work. This is usually master.
- Write code, add test cases, and commit your work (see below for message format).
- Run lints and / or formatters.
- Backend:
```bash
# In tidb-dashboard directory:
make dev
```
- Frontend:
```bash
# In ui directory:
pnpm fmt-check
```
> Recommended to install [Prettier plugin](https://prettier.io/docs/en/editors.html) for your editor so that there will be auto format on save.
- Run tests and make sure all tests pass.
- Push your changes to a branch in your fork of the repository and submit a pull request.
- Your PR will be reviewed by two maintainers, who may request some changes.
- Once you've made changes, your PR must be re-reviewed and approved.
- If the PR becomes out of date, you can use GitHub's 'update branch' button.
- If there are conflicts, you can rebase (or merge) and resolve them locally. Then force push to your PR branch.
You do not need to get re-review just for resolving conflicts, but you should request re-review if there are significant changes.
- Our CI system automatically tests all pull requests.
- If all tests passed and got an approval, reviewers will merge your PR.
Thanks for your contributions!
### Finding something to work on
For beginners, we have prepared many suitable tasks for you. Checkout our [help wanted issues](https://github.com/pingcap/tidb-dashboard/issues?q=is%3Aopen+label%3Astatus%2Fhelp-wanted+sort%3Aupdated-desc) for a list, in which we have also marked the difficulty level.
If you are planning something big, for example, relates to multiple components or changes current behaviors, make sure to open an issue to discuss with us before going on.
### Format of the commit message
We follow a rough convention for commit messages that is designed to answer two
questions: what changed and why. The subject line should feature the what and
the body of the commit should describe the why.
```plain
cluster: add comment for variable declaration.
Improve documentation.
```
The format can be described more formally as follows:
```plain
<subsystem>: <what changed>
<BLANK LINE>
<why this change was made>
<BLANK LINE>
```
If the change affects more than one subsystem, you can use comma to separate them like `keyviz, cluster: foo`.
If the change affects many subsystems, you can use `*` instead, like `*: foo`.
The body of the commit message should describe why the change was made and at a high level, how the code works.
[pd]: https://github.com/pingcap/pd
[tidb]: https://github.com/pingcap/tidb
[tikv]: https://github.com/tikv/tikv
[tiup]: https://tiup.io
[swagger]: https://swagger.io
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
DASHBOARD_PKG := github.com/pingcap/tidb-dashboard
BUILD_TAGS ?=
PNPM_INSTALL_TAGS ?=
LDFLAGS ?=
FEATURE_VERSION ?= 999.999.999
WITHOUT_NGM ?= false
E2E_SPEC ?=
UI ?=
RELEASE_VERSION := $(shell git describe --tags --dirty --always)
GITHASH := $(shell git rev-parse HEAD)
LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.InternalVersion=$(RELEASE_VERSION)"
LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.Standalone=Yes"
LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.PDVersion=N/A"
LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.BuildGitHash=$(GITHASH)"
TIDB_VERSION ?= latest
# Docker build variables.
REPOSITORY ?= pingcap/tidb-dashboard
IMAGE ?= $(REPOSITORY):$(RELEASE_VERSION)
AMD64 := linux/amd64
ARM64 := linux/arm64
PLATFORMS := $(AMD64),$(ARM64)
DOCKERFILE ?= ./dockerfiles/alpine316.Dockerfile
# If you want to build with no cache (after update go module, npm module, etc.), set "NO_CACHE=--pull --no-cache".
NO_CACHE ?=
BUILD_GOEXPERIMENT ?=
BUILD_CGO_ENABLED ?=
ifeq ("${ENABLE_FIPS}", "1")
BUILD_TAGS += boringcrypto
BUILD_GOEXPERIMENT = GOEXPERIMENT=boringcrypto
BUILD_CGO_ENABLED = CGO_ENABLED=1
endif
default: server
.PHONY: clean
clean:
rm -rf ./coverage
.PHONY: install_tools
install_tools:
scripts/install_go_tools.sh
.PHONY: lint
lint:
scripts/lint.sh
.PHONY: test
test: clean unit_test integration_test
.PHONY: unit_test
unit_test:
@mkdir -p ./coverage
go test -v ./pkg/... ./util/...
.PHONY: integration_test
integration_test:
@mkdir -p ./coverage
@TIDB_VERSION=${TIDB_VERSION} tests/run.sh
.PHONY: e2e_test
e2e_test:
@if $(WITHOUT_NGM); then\
make e2e_without_ngm_test;\
else\
make e2e_compat_features_test;\
make e2e_common_features_test;\
fi
.PHONY: e2e_compat_features_test
e2e_compat_features_test:
cd ui &&\
pnpm i &&\
cd packages/tidb-dashboard-for-op &&\
pnpm run:e2e-test:compat-features --env FEATURE_VERSION=$(FEATURE_VERSION) TIDB_VERSION=$(TIDB_VERSION)
.PHONY: e2e_common_features_test
e2e_common_features_test:
cd ui &&\
pnpm i &&\
cd packages/tidb-dashboard-for-op &&\
pnpm run:e2e-test:common-features --env TIDB_VERSION=$(TIDB_VERSION)
.PHONY: e2e_without_ngm_test
e2e_without_ngm_test:
cd ui &&\
pnpm i &&\
cd packages/tidb-dashboard-for-op &&\
pnpm run:e2e-test:without-ngm --env TIDB_VERSION=$(TIDB_VERSION) WITHOUT_NGM=$(WITHOUT_NGM)
.PHONY: e2e_test_specify
e2e_test_specify:
cd ui &&\
pnpm i &&\
cd packages/tidb-dashboard-for-op &&\
pnpm run:e2e-test:specify --env TIDB_VERSION=$(TIDB_VERSION) -- --spec $(E2E_SPEC)
.PHONY: dev
dev: lint default
.PHONY: ui_deps
ui_deps: install_tools
cd ui &&\
pnpm i ${PNPM_INSTALL_TAGS}
.PHONY: ui
ui: ui_deps
cd ui &&\
pnpm build
.PHONY: go_generate
go_generate: export PATH := $(shell pwd)/bin:$(PATH)
go_generate:
scripts/generate_swagger_spec.sh
go generate -x ./...
.PHONY: server
ifeq ($(UI),1)
BUILD_TAGS += ui_server
endif
server: install_tools go_generate
ifeq ($(UI),1)
scripts/embed_ui_assets.sh
endif
$(BUILD_GOEXPERIMENT) $(BUILD_CGO_ENABLED) go build -o bin/tidb-dashboard -ldflags '$(LDFLAGS)' -tags "${BUILD_TAGS}" cmd/tidb-dashboard/main.go
.PHONY: embed_ui_assets
embed_ui_assets: ui
scripts/embed_ui_assets.sh
.PHONY: package # Build frontend and backend server, and then packages them into a single binary.
package: BUILD_TAGS += ui_server
package: embed_ui_assets server
.PHONY: docker-build-and-push-image # For locally dev, set IMAGE to your dev docker registry.
docker-build-and-push-image: clean
docker buildx build ${NO_CACHE} --push -t $(IMAGE) --platform $(PLATFORMS) -f $(DOCKERFILE) .
.PHONY: docker-build-image-locally-amd64
docker-build-image-locally-amd64: clean
docker buildx build ${NO_CACHE} --load -t $(IMAGE) --platform $(AMD64) -f $(DOCKERFILE) .
docker run --rm $(IMAGE) -v
.PHONY: docker-build-image-locally-arm64
docker-build-image-locally-arm64: clean
docker buildx build ${NO_CACHE} --load -t $(IMAGE) --platform $(ARM64) -f $(DOCKERFILE) .
docker run --rm $(IMAGE) -v
.PHONY: tag
tag:
node scripts/create_release_tag.js
.PHONY: run # please ensure that tiup playground is running in the background.
run:
bin/tidb-dashboard --debug --experimental --feature-version "$(FEATURE_VERSION)" --host 0.0.0.0
================================================
FILE: OWNERS
================================================
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- baurine
- breezewish
- crazycs520
- Deardrops
- HunDunDM
- iosmanthus
- shhdgit
- zhongzc
- XuHuaiyu
- zimulala
- nolouch
- yibin87
- StinsonZhao
- bosn
reviewers:
- Fullstop000
- Renkai
- XuHuaiyu
- zimulala
- nolouch
- yibin87
================================================
FILE: README.md
================================================
# TiDB Dashboard
[](https://github.com/pingcap/tidb-dashboard/blob/master/LICENSE)
TiDB Dashboard is a Web UI for monitoring, diagnosing and managing the TiDB cluster.
## Documentation
- [Product User Manual (English)](https://docs.pingcap.com/tidb/stable/dashboard-intro)
- [Product User Manual (Chinese)](https://docs.pingcap.com/zh/tidb/stable/dashboard-intro)
- [FAQ (English)](https://docs.pingcap.com/tidb/stable/dashboard-faq)
- [FAQ (Chinese)](https://docs.pingcap.com/zh/tidb/stable/dashboard-faq)
## Question, Suggestion
Feel free to [open GitHub issues](https://github.com/pingcap/tidb-dashboard/issues/new/choose)
for questions, support and suggestions.
You may also consider to reach out on the [TiDB Internals forum](https://internals.tidb.io/) if you encounter any problems about TiDB development.
For Chinese users, you can visit the PingCAP official user forum [AskTUG.com] to make life easier.
## Getting Started
The most easy way to use TiDB Dashboard with an existing TiDB cluster is to use the one embedded
into [PD]: <http://127.0.0.1:2379/dashboard>. You need PD master branch or 4.0+ version to use
TiDB Dashboard.
Note: The TiDB Dashboard inside PD may be not up to date. To play with latest TiDB Dashboard, build
it from source (see next section).
## Contributing & Developing
Checkout our [help wanted issues](https://github.com/pingcap/tidb-dashboard/issues?q=is%3Aopen+label%3Astatus%2Fhelp-wanted+sort%3Aupdated-desc)
for a list of recommended tasks, in which we have also marked the difficulty level.
See [CONTRIBUTING.md](./CONTRIBUTING.md) for a detailed step-by-step contributing guide, or steps to
build TiDB Dashboard from source.
If you need any help, feel free to reach out on the [TiDB Internals forum](https://internals.tidb.io/).
Thank you to all the people who already contributed to TiDB Dashboard!
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/Fullstop000"><img src="https://avatars1.githubusercontent.com/u/12471960?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="http://rleungx.github.io"><img src="https://avatars3.githubusercontent.com/u/35896542?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/zzh-wisdom"><img src="https://avatars2.githubusercontent.com/u/52516344?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/STRRL"><img src="https://avatars0.githubusercontent.com/u/20221408?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/SSebo"><img src="https://avatars0.githubusercontent.com/u/5784607?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://yisaer.github.io/"><img src="https://avatars1.githubusercontent.com/u/13427348?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/gauss1314"><img src="https://avatars2.githubusercontent.com/u/3862518?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/leiysky"><img src="https://avatars2.githubusercontent.com/u/22445410?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/niedhui"><img src="https://avatars0.githubusercontent.com/u/66329?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://weihanglo.tw/"><img src="https://avatars2.githubusercontent.com/u/14314532?v=4" width="50px;" alt=""/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/yikeke"><img src="https://avatars1.githubusercontent.com/u/40977455?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/qxhy123"><img src="https://avatars2.githubusercontent.com/u/518969?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="http://www.rustin.cn"><img src="https://avatars0.githubusercontent.com/u/29879298?v=4" width="50px;" alt=""/></a></td>
<td align="center"><a href="https://github.com/ericsyh"><img src="https://avatars3.githubusercontent.com/u/10498732?v=4" width="50px;" alt=""/></a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## Architecture
This repository contains both Dashboard HTTP API and Dashboard UI. Dashboard HTTP API is placed in
`pkg/` directory, written in Golang. Dashboard UI is placed in `ui/` directory, powered by React.
TiDB Dashboard can also be integrated into PD, as follows:

## License
[Apache License](/LICENSE)
Copyright 2020 PingCAP, Inc.
[pd]: https://github.com/pingcap/pd
[asktug.com]: https://asktug.com/
================================================
FILE: SECURITY.md
================================================
# Security Vulnerability Disclosure and Response Process
TiDB is a fast-growing open source database. To ensure its security, a security vulnerability disclosure and response process is adopted.
The primary goal of this process is to reduce the total exposure time of users to publicly known vulnerabilities. To quickly fix vulnerabilities of TiDB products, the security team is responsible for the entire vulnerability management process, including internal communication and external disclosure.
If you find a vulnerability or encounter a security incident involving vulnerabilities of TiDB products, please report it as soon as possible to the TiDB security team (security@tidb.io).
Please kindly help provide as much vulnerability information as possible in the following format:
- Issue title*:
- Overview*:
- Affected components and version number*:
- CVE number (if any):
- Vulnerability verification process*:
- Contact information*:
The asterisk (*) indicates the required field.
# Response Time
The TiDB security team will confirm the vulnerabilities and contact you within 2 working days after your submission.
We will publicly thank you after fixing the security vulnerability. To avoid negative impact, please keep the vulnerability confidential until we fix it. We would appreciate it if you could obey the following code of conduct:
The vulnerability will not be disclosed until TiDB releases a patch for it.
The details of the vulnerability, for example, exploits code, will not be disclosed.
================================================
FILE: cmd/tidb-dashboard/main.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
// @title Dashboard API
// @version 1.0
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @BasePath /dashboard/api
// @query.collection.format multi
// @securityDefinitions.apikey JwtAuth
// @in header
// @name Authorization
package main
import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"net"
"net/http"
_ "net/http/pprof" // #nosec
"os"
"os/signal"
"path"
"slices"
"strconv"
"strings"
"sync"
"syscall"
"github.com/pingcap/log"
flag "github.com/spf13/pflag"
"go.etcd.io/etcd/client/pkg/v3/transport"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/pingcap/tidb-dashboard/pkg/apiserver"
"github.com/pingcap/tidb-dashboard/pkg/config"
keyvisualregion "github.com/pingcap/tidb-dashboard/pkg/keyvisual/region"
"github.com/pingcap/tidb-dashboard/pkg/swaggerserver"
"github.com/pingcap/tidb-dashboard/pkg/uiserver"
"github.com/pingcap/tidb-dashboard/pkg/utils/version"
"github.com/pingcap/tidb-dashboard/util/distro"
)
type DashboardCLIConfig struct {
ListenHost string
ListenPort int
EnableDebugLog bool
CoreConfig *config.Config
// key-visual file mode for debug
KVFileStartTime int64
KVFileEndTime int64
}
// NewCLIConfig generates the configuration of the dashboard in standalone mode.
func NewCLIConfig() *DashboardCLIConfig {
cfg := &DashboardCLIConfig{}
cfg.CoreConfig = config.Default()
flag.StringVarP(&cfg.ListenHost, "host", "h", "127.0.0.1", "listen host of the Dashboard Server")
flag.IntVarP(&cfg.ListenPort, "port", "p", 12333, "listen port of the Dashboard Server")
flag.BoolVarP(&cfg.EnableDebugLog, "debug", "d", false, "enable debug logs")
flag.StringVar(&cfg.CoreConfig.DataDir, "data-dir", cfg.CoreConfig.DataDir, "path to the Dashboard Server data directory")
flag.StringVar(&cfg.CoreConfig.TempDir, "temp-dir", cfg.CoreConfig.TempDir, "path to the Dashboard Server temporary directory, used to store the searched logs")
flag.StringVar(&cfg.CoreConfig.PublicPathPrefix, "path-prefix", cfg.CoreConfig.PublicPathPrefix, "public URL path prefix for reverse proxies")
flag.StringVar(&cfg.CoreConfig.PDEndPoint, "pd", cfg.CoreConfig.PDEndPoint, "PD endpoint address that Dashboard Server connects to")
flag.BoolVar(&cfg.CoreConfig.EnableTelemetry, "telemetry", cfg.CoreConfig.EnableTelemetry, "allow telemetry")
flag.BoolVar(&cfg.CoreConfig.EnableExperimental, "experimental", cfg.CoreConfig.EnableExperimental, "allow experimental features")
flag.StringVar(&cfg.CoreConfig.FeatureVersion, "feature-version", cfg.CoreConfig.FeatureVersion, "target TiDB version for standalone mode")
flag.IntVar(&cfg.CoreConfig.NgmTimeout, "ngm-timeout", cfg.CoreConfig.NgmTimeout, "timeout secs for accessing the ngm API")
flag.BoolVar(&cfg.CoreConfig.EnableKeyVisualizer, "keyviz", true, "enable/disable key visualizer(default: true)")
flag.BoolVar(&cfg.CoreConfig.DisableCustomPromAddr, "disable-custom-prom-addr", false, "do not allow custom prometheus address")
showVersion := flag.BoolP("version", "v", false, "print version information and exit")
clusterCaPath := flag.String("cluster-ca", "", "(TLS between components of the TiDB cluster) path of file that contains list of trusted SSL CAs")
clusterCertPath := flag.String("cluster-cert", "", "(TLS between components of the TiDB cluster) path of file that contains X509 certificate in PEM format")
clusterKeyPath := flag.String("cluster-key", "", "(TLS between components of the TiDB cluster) path of file that contains X509 key in PEM format")
clusterAllowedNames := flag.String("cluster-allowed-names", "", "comma-delimited list of acceptable peer certificate SAN identities")
tidbCaPath := flag.String("tidb-ca", "", "(TLS for MySQL client) path of file that contains list of trusted SSL CAs")
tidbCertPath := flag.String("tidb-cert", "", "(TLS for MySQL client) path of file that contains X509 certificate in PEM format")
tidbKeyPath := flag.String("tidb-key", "", "(TLS for MySQL client) path of file that contains X509 key in PEM format")
tidbAllowedNames := flag.String("tidb-allowed-names", "", "comma-delimited list of acceptable peer certificate SAN identities")
// debug for keyvisual,hide help information
flag.Int64Var(&cfg.KVFileStartTime, "keyviz-file-start", 0, "(debug) start time for file range in file mode")
flag.Int64Var(&cfg.KVFileEndTime, "keyviz-file-end", 0, "(debug) end time for file range in file mode")
_ = flag.CommandLine.MarkHidden("keyviz-file-start")
_ = flag.CommandLine.MarkHidden("keyviz-file-end")
flag.Parse()
if *showVersion {
version.PrintStandaloneModeInfo()
_ = log.Sync()
os.Exit(0)
}
cfg.CoreConfig.NormalizePublicPathPrefix()
// setup TLS config for TiDB components
if len(*clusterCaPath) != 0 && len(*clusterCertPath) != 0 && len(*clusterKeyPath) != 0 {
tlsInfo := &transport.TLSInfo{
TrustedCAFile: *clusterCaPath,
KeyFile: *clusterKeyPath,
CertFile: *clusterCertPath,
}
cfg.CoreConfig.ClusterTLSInfo = tlsInfo
cfg.CoreConfig.ClusterTLSConfig = buildTLSConfig(tlsInfo, clusterAllowedNames)
}
// setup TLS config for MySQL client
// See https://github.com/pingcap/docs/blob/7a62321b3ce9318cbda8697503c920b2a01aeb3d/how-to/secure/enable-tls-clients.md#enable-authentication
if (len(*tidbCertPath) != 0 && len(*tidbKeyPath) != 0) || len(*tidbCaPath) != 0 {
tlsInfo := &transport.TLSInfo{
TrustedCAFile: *tidbCaPath,
KeyFile: *tidbKeyPath,
CertFile: *tidbCertPath,
}
cfg.CoreConfig.TiDBTLSConfig = buildTLSConfig(tlsInfo, tidbAllowedNames)
}
if err := cfg.CoreConfig.NormalizePDEndPoint(); err != nil {
log.Fatal("Invalid PD Endpoint", zap.Error(err))
}
// keyvisual check
startTime := cfg.KVFileStartTime
endTime := cfg.KVFileEndTime
if startTime != 0 || endTime != 0 {
// file mode (debug)
if startTime == 0 || endTime == 0 || startTime >= endTime {
log.Fatal("keyviz-file-start must be smaller than keyviz-file-end, and none of them are 0")
}
}
return cfg
}
func getContext() context.Context {
ctx, cancel := context.WithCancel(context.Background())
go func() {
sc := make(chan os.Signal, 1)
signal.Notify(sc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
<-sc
cancel()
}()
return ctx
}
func buildTLSConfig(tlsInfo *transport.TLSInfo, allowedNames *string) *tls.Config {
tlsConfig, err := tlsInfo.ClientConfig()
if err != nil {
log.Fatal("Failed to load certificates", zap.Error(err))
}
// Disable the default server verification routine in favor of a manually defined connection
// verification callback. The custom verification process verifies that the server
// certificate is issued by a trusted root CA, and that the peer certificate identities
// matches at least one entry specified in verifyNames (if specified). This is required
// because tidb-dashboard directs requests to a loopback-bound forwarding proxy, which would
// otherwise cause server hostname verification to fail.
tlsConfig.InsecureSkipVerify = true
tlsConfig.VerifyConnection = func(state tls.ConnectionState) error {
opts := x509.VerifyOptions{
Intermediates: x509.NewCertPool(),
Roots: tlsConfig.RootCAs,
}
for _, cert := range state.PeerCertificates[1:] {
opts.Intermediates.AddCert(cert)
}
_, err := state.PeerCertificates[0].Verify(opts)
// Optionally verify the peer SANs when available. If no peer identities are
// provided, simply reuse the verification result of the CA verification.
if err != nil || *allowedNames == "" {
return err
}
for name := range strings.SplitSeq(*allowedNames, ",") {
if slices.Contains(state.PeerCertificates[0].DNSNames, name) {
return nil
}
for _, uri := range state.PeerCertificates[0].URIs {
if name == uri.String() {
return nil
}
}
}
return fmt.Errorf(
"no SANs in server certificate (%v, %v) match allowed names %v",
state.PeerCertificates[0].DNSNames,
state.PeerCertificates[0].URIs,
strings.Split(*allowedNames, ","),
)
}
return tlsConfig
}
const (
distroResFolderName string = "distro-res"
distroStringsResFileName string = "strings.json"
)
func loadDistroStringsRes() {
exePath, err := os.Executable()
if err != nil {
log.Fatal("Failed to get executable path", zap.Error(err))
}
distroStringsResPath := path.Join(path.Dir(exePath), distroResFolderName, distroStringsResFileName)
distroStringsRes, err := distro.ReadResourceStringsFromFile(distroStringsResPath)
if err != nil {
log.Fatal("Failed to load distro strings res", zap.String("path", distroStringsResPath), zap.Error(err))
}
distro.ReplaceGlobal(distroStringsRes)
}
func main() {
// Flushing any buffered log entries
defer log.Sync() //nolint:errcheck
// init log will register the `pingcap-log` logfmt for
_, _, err := log.InitLogger(&log.Config{})
if err != nil {
log.Fatal("failed to init log", zap.Error(err))
}
cliConfig := NewCLIConfig()
ctx := getContext()
if cliConfig.EnableDebugLog {
log.SetLevel(zapcore.DebugLevel)
}
loadDistroStringsRes()
listenAddr := net.JoinHostPort(cliConfig.ListenHost, strconv.Itoa(cliConfig.ListenPort))
listener, err := net.Listen("tcp", listenAddr)
if err != nil {
log.Fatal("Dashboard server listen failed", zap.String("addr", listenAddr), zap.Error(err))
}
var customKeyVisualProvider *keyvisualregion.DataProvider
if cliConfig.KVFileStartTime > 0 {
customKeyVisualProvider = &keyvisualregion.DataProvider{
FileStartTime: cliConfig.KVFileStartTime,
FileEndTime: cliConfig.KVFileEndTime,
}
}
assets := uiserver.Assets(cliConfig.CoreConfig)
s := apiserver.NewService(
cliConfig.CoreConfig,
apiserver.StoppedHandler,
assets,
customKeyVisualProvider,
)
if err := s.Start(ctx); err != nil {
log.Fatal("Can not start server", zap.Error(err))
}
defer s.Stop(context.Background()) //nolint:errcheck
mux := http.DefaultServeMux
uiHandler := http.StripPrefix(strings.TrimRight(config.UIPathPrefix, "/"), uiserver.Handler(assets))
mux.Handle("/", http.RedirectHandler(config.UIPathPrefix, http.StatusFound))
mux.Handle(config.UIPathPrefix, uiHandler)
mux.Handle(config.APIPathPrefix, apiserver.Handler(s))
mux.Handle(config.SwaggerPathPrefix, swaggerserver.Handler())
log.Info(fmt.Sprintf("Dashboard server is listening at %s", listenAddr))
log.Info(fmt.Sprintf("UI: http://%s/dashboard/", net.JoinHostPort(cliConfig.ListenHost, strconv.Itoa(cliConfig.ListenPort))))
log.Info(fmt.Sprintf("API: http://%s/dashboard/api/", net.JoinHostPort(cliConfig.ListenHost, strconv.Itoa(cliConfig.ListenPort))))
log.Info(fmt.Sprintf("Swagger: http://%s/dashboard/api/swagger/", net.JoinHostPort(cliConfig.ListenHost, strconv.Itoa(cliConfig.ListenPort))))
srv := &http.Server{Handler: mux} // nolint:gosec
var wg sync.WaitGroup
wg.Go(func() {
if err := srv.Serve(listener); err != http.ErrServerClosed {
log.Error("Server aborted with an error", zap.Error(err))
}
})
<-ctx.Done()
if err := srv.Shutdown(context.Background()); err != nil {
log.Error("Can not stop server", zap.Error(err))
}
wg.Wait()
log.Info("Stop dashboard server")
}
================================================
FILE: dockerfiles/docker-compose.yml
================================================
version: '2'
services:
tidb-dashboard:
image: pingcap/tidb-dashboard:nightly
ports:
- "12333:12333"
command:
- --pd=http://pd:2379
- --debug
- --experimental
- --feature-version=999.999.999
- --host=0.0.0.0
depends_on:
- "pd"
restart: on-failure
pd:
image: pingcap/pd:nightly
ports:
- "2379:2379"
command:
- --name=pd
- --client-urls=http://0.0.0.0:2379
- --peer-urls=http://0.0.0.0:2380
- --advertise-client-urls=http://pd:2379
- --advertise-peer-urls=http://pd:2380
- --initial-cluster=pd=http://pd:2380
restart: on-failure
tikv:
image: pingcap/tikv:nightly
ports:
- "20180:20180"
command:
- --addr=0.0.0.0:20160
- --advertise-addr=tikv:20160
- --status-addr=0.0.0.0:20180
- --pd=pd:2379
depends_on:
- "pd"
restart: on-failure
tidb:
image: pingcap/tidb:nightly
ports:
- "4000:4000"
- "10080:10080"
command:
- --host=0.0.0.0
- --advertise-address=tidb
- --store=tikv
- --path=pd:2379
depends_on:
- "tikv"
restart: on-failure
tiflash:
image: pingcap/tiflash:nightly
volumes:
- ./tiflash.toml:/tiflash.toml:ro
ports:
- "9000:9000"
- "8123:8123"
- "8234:8234"
- "3930:3930"
- "20170:20170"
- "20292:20292"
command:
- --config=/tiflash.toml
depends_on:
- "tikv"
- "tidb"
restart: on-failure
error-metric-trigger:
image: mariadb:10.6.5
command:
- mysql
- -uroot
- -htidb
- -P4000
- -e
- "select * from foo.bar;"
depends_on:
- "tikv"
- "tidb"
- "tiflash"
restart: on-failure
================================================
FILE: etc/go.mod
================================================
module ignore_etc // a hack to ignore this directory in go commands
go 1.13
================================================
FILE: etc/manualTestEnv/.gitignore
================================================
.vagrant/
tiup-cluster-*.log
================================================
FILE: etc/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb
================================================
Vagrant.configure("2") do |config|
ssh_pub_key = File.readlines("#{File.dirname(__FILE__)}/vagrant_key.pub").first.strip
config.vm.box = "hashicorp/bionic64"
config.vm.provision "zsh", type: "shell", privileged: false, inline: <<-SHELL
echo "Installing zsh"
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sudo chsh -s /usr/bin/zsh vagrant
SHELL
config.vm.provision "private_key", type: "shell", privileged: false, inline: <<-SHELL
echo "Inserting private key"
echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
SHELL
config.vm.provision "ulimit", type: "shell", privileged: true, inline: <<-SHELL
echo "Setting ulimit"
echo "fs.file-max = 65535" >> /etc/sysctl.conf
sysctl -p
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "root hard nofile 65535" >> /etc/security/limits.conf
echo "root hard nofile 65535" >> /etc/security/limits.conf
SHELL
end
================================================
FILE: etc/manualTestEnv/_shared/vagrant_key
================================================
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEAxboZzYumqNoVOQ/hKKhIZHxNhf5tmnkLZry8i6Xur4FPLDiRxos/
xVVDx0ynTPOyQVVaXtNxZnAmbR4HuNBzRvNoklwSXazt5YgWeiKCHtPpKFt3PJeE2cn6FJ
p6F6qFChG0NSPbZxJWWxv4noX0U3PLKgHNIehYK2Fu0E6plhSZazzJEVWapwo9d7aGnAsz
bBCd5TNZ5ogrXn+3bSFcdCbAfWOwYg54a+PzTQlzgt6JmhlEjpFfPhhpBW92pQXxmQ2c17
iPCbA8G++FiaEwA5teex8k1+HzmHf7YjyhPr+I67EzEiIueJg2+0PYbM1p06S8kVTNDXsf
0eJx4Dr8qQAAA9iFPcpVhT3KVQAAAAdzc2gtcnNhAAABAQDFuhnNi6ao2hU5D+EoqEhkfE
2F/m2aeQtmvLyLpe6vgU8sOJHGiz/FVUPHTKdM87JBVVpe03FmcCZtHge40HNG82iSXBJd
rO3liBZ6IoIe0+koW3c8l4TZyfoUmnoXqoUKEbQ1I9tnElZbG/iehfRTc8sqAc0h6FgrYW
7QTqmWFJlrPMkRVZqnCj13toacCzNsEJ3lM1nmiCtef7dtIVx0JsB9Y7BiDnhr4/NNCXOC
3omaGUSOkV8+GGkFb3alBfGZDZzXuI8JsDwb74WJoTADm157HyTX4fOYd/tiPKE+v4jrsT
MSIi54mDb7Q9hszWnTpLyRVM0Nex/R4nHgOvypAAAAAwEAAQAAAQBtk0+/YDgQ9SKzx8AQ
xwmvXk+cBT76T0BpRAj9HwziiDe3GvZ2YC8MDc+NAEbq11ae7E0zpdv/WAGDkRPYcPShij
0Wdx3aef4wqLVEJCGWMfvRWLcAhjuiclM73cvxl5c42EzU8jUhrsDapuql9zhKky4w7mSe
+OL7z3gYyq8isvcQMe+1eXJqiv27AJJfAir+rLJZO/gDW36hOowhnZxYRlVYPgZ8GwetxD
VdCrgwUgR/2HYmbXYdVxI0PwswGc6rEqs5XXOYRzwvPTvRKdD3J5MxmsvJljT7FMr4kCLT
X1+aWysk1cgAUIdzzwQL8DLE/N9PFFYdZyNBkZMgedl9AAAAgCtP3F8XYFR18gQLPGLDyQ
FFg8+JHN9b/yIg2pymC6SI8qEp+GnuEK9IKhqh/Uw14KEKcs/9sgbZo0K9uTBTDG5F6Qmp
hADVbWXJ/97Xeya6kH2Sa56UKLCQ/uQWBKwLQ0auU/qwxATIZowh31XUXjzVBg6wgUjT7Q
+3Fk1zGYxnAAAAgQD5USIRUNwkI+htv+f1g8QdmrFAGymcGEkXAixKvBTon9cWQb2iyiK+
2IO8EwFwRdL5kw2foILCnlp/4FevfxHU7wTcoFEp3PItUlcxYqO8vY2VCZ913oNLKBIt9p
uFfG2BZM5szMRNMh0svelu61FePsfN5Z8J0ltPrS8UKB95ywAAAIEAywbyNbjz1AxEjWIX
2Vbk4/MjQyjui8Wi7H0F+LDWyMfPJHzhnbr79Z/lIZmDAo++3EYU9J9s0C+wJ6vXGK+gvC
7e5qGfT/0J0DwBfLbpeTdDELCa/LmfLWVPzZ9Q+9Fq0AjmW9YXFZ/+qT9xfY1v9XfztFRS
xR1iXJ42q6ff5NsAAAAeYnJlZXpld2lzaEBCcmVlemV3aXNoTUJQLmxvY2FsAQIDBAU=
-----END OPENSSH PRIVATE KEY-----
================================================
FILE: etc/manualTestEnv/_shared/vagrant_key.pub
================================================
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFuhnNi6ao2hU5D+EoqEhkfE2F/m2aeQtmvLyLpe6vgU8sOJHGiz/FVUPHTKdM87JBVVpe03FmcCZtHge40HNG82iSXBJdrO3liBZ6IoIe0+koW3c8l4TZyfoUmnoXqoUKEbQ1I9tnElZbG/iehfRTc8sqAc0h6FgrYW7QTqmWFJlrPMkRVZqnCj13toacCzNsEJ3lM1nmiCtef7dtIVx0JsB9Y7BiDnhr4/NNCXOC3omaGUSOkV8+GGkFb3alBfGZDZzXuI8JsDwb74WJoTADm157HyTX4fOYd/tiPKE+v4jrsTMSIi54mDb7Q9hszWnTpLyRVM0Nex/R4nHgOvyp
================================================
FILE: etc/manualTestEnv/complexCase1/README.md
================================================
# complexCase1
TiDB, PD, TiKV, TiFlash each in different hosts.
## Usage
1. Start the box:
```bash
VAGRANT_EXPERIMENTAL="disks" vagrant up
```
1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once):
```bash
tiup cluster deploy complexCase1 v4.0.8 topology.yaml -i ../_shared/vagrant_key -y --user vagrant
```
1. Start the cluster in the box:
```bash
tiup cluster start complexCase1
```
1. Start TiDB Dashboard server:
```bash
bin/tidb-dashboard --pd http://10.0.1.31:2379
```
## Cleanup
```bash
tiup cluster destroy complexCase1 -y
vagrant destroy --force
```
================================================
FILE: etc/manualTestEnv/complexCase1/Vagrantfile
================================================
load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
(1..5).each do |i|
config.vm.define "node#{i}" do |node|
node.vm.network "private_network", ip: "10.0.1.#{i+30}"
(1..4).each do |j|
node.vm.disk :disk, size: "10GB", name: "disk-#{i}-#{j}"
end
end
end
config.vm.provision "disk", type: "shell", privileged: false, inline: <<-SHELL
echo "Formatting disks"
sudo mkfs.ext4 -j -L hdd1 /dev/sdb
sudo mkfs.ext4 -j -L hdd2 /dev/sdc
sudo mkfs.ext4 -j -L hdd3 /dev/sdd
sudo mkfs.ext4 -j -L hdd4 /dev/sde
echo "Mounting directories"
sudo mkdir -p /pingcap/tidb-data
echo "/dev/sdb /pingcap/tidb-data ext4 defaults 0 0" | sudo tee -a /etc/fstab
sudo mount /pingcap/tidb-data
sudo mkdir -p /pingcap/tidb-deploy
sudo mkdir -p /pingcap/tidb-data/tikv-1
sudo mkdir -p /pingcap/tidb-data/tikv-2
echo "/dev/sdc /pingcap/tidb-deploy ext4 defaults 0 0" | sudo tee -a /etc/fstab
echo "/dev/sdd /pingcap/tidb-data/tikv-1 ext4 defaults 0 0" | sudo tee -a /etc/fstab
echo "/dev/sde /pingcap/tidb-data/tikv-2 ext4 defaults 0 0" | sudo tee -a /etc/fstab
sudo mount /pingcap/tidb-deploy
sudo mount /pingcap/tidb-data/tikv-1
sudo mount /pingcap/tidb-data/tikv-2
SHELL
end
================================================
FILE: etc/manualTestEnv/complexCase1/topology.yaml
================================================
global:
user: tidb
deploy_dir: /pingcap/tidb-deploy
data_dir: /pingcap/tidb-data
server_configs:
tikv:
server.grpc-concurrency: 1
raftstore.apply-pool-size: 1
raftstore.store-pool-size: 1
readpool.unified.max-thread-count: 1
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
storage.block-cache.capacity: 256MB
raftstore.capacity: 5GB
# Overview:
# 31: 1 PD, 1 TiDB, 2 TiKV
# 32: 1 TiDB, 2 TiKV
# 33: 1 PD, 1 TiFlash
# 34: 2 TiKV, 1 TiFlash
# 35: 1 TiFlash
pd_servers:
- host: 10.0.1.31
- host: 10.0.1.33
tikv_servers:
- host: 10.0.1.31
port: 20160
status_port: 20180
data_dir: /pingcap/tidb-data/tikv-1/tikv-20160
config:
server.labels: { host: "tikv1" }
- host: 10.0.1.31
port: 20161
status_port: 20181
data_dir: /pingcap/tidb-data/tikv-2/tikv-20161
config:
server.labels: { host: "tikv2" }
- host: 10.0.1.32
port: 20160
status_port: 20180
data_dir: /pingcap/tidb-data/tikv-1/tikv-20160
config:
server.labels: { host: "tikv1" }
- host: 10.0.1.32
port: 20161
status_port: 20181
data_dir: /pingcap/tidb-data/tikv-2/tikv-20161
config:
server.labels: { host: "tikv2" }
- host: 10.0.1.34
port: 20160
status_port: 20180
data_dir: /pingcap/tidb-data/tikv-1/tikv-20160
config:
server.labels: { host: "tikv1" }
- host: 10.0.1.34
port: 20161
status_port: 20181
data_dir: /pingcap/tidb-data/tikv-2/tikv-20161
config:
server.labels: { host: "tikv2" }
tiflash_servers:
- host: 10.0.1.33
data_dir: /pingcap/tidb-data/tikv-1/tiflash
- host: 10.0.1.34
data_dir: /pingcap/tidb-data/tikv-2/tiflash
- host: 10.0.1.35
data_dir: /pingcap/tidb-data/tikv-1/tiflash
tidb_servers:
- host: 10.0.1.31
- host: 10.0.1.32
grafana_servers:
- host: 10.0.1.31
monitoring_servers:
- host: 10.0.1.31
alertmanager_servers:
- host: 10.0.1.31
================================================
FILE: etc/manualTestEnv/multiHost/README.md
================================================
# multiHost
TiDB, PD, TiKV, TiFlash each in different hosts.
## Usage
1. Start the box:
```bash
vagrant up
```
1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once):
```bash
tiup cluster deploy multiHost v4.0.8 topology.yaml -i ../_shared/vagrant_key -y --user vagrant
```
1. Start the cluster in the box:
```bash
tiup cluster start multiHost
```
1. Start TiDB Dashboard server:
```bash
bin/tidb-dashboard --pd http://10.0.1.11:2379
```
## Cleanup
```bash
tiup cluster destroy multiHost -y
vagrant destroy --force
```
================================================
FILE: etc/manualTestEnv/multiHost/Vagrantfile
================================================
load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
(1..4).each do |i|
config.vm.define "node#{i}" do |node|
node.vm.network "private_network", ip: "10.0.1.#{i+10}"
end
end
end
================================================
FILE: etc/manualTestEnv/multiHost/topology.yaml
================================================
global:
user: tidb
deploy_dir: tidb-deploy
data_dir: tidb-data
server_configs:
tikv:
server.grpc-concurrency: 1
raftstore.apply-pool-size: 1
raftstore.store-pool-size: 1
readpool.unified.max-thread-count: 1
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
storage.block-cache.capacity: 256MB
raftstore.capacity: 10GB
pd:
replication.enable-placement-rules: true
pd_servers:
- host: 10.0.1.11
- host: 10.0.1.12
- host: 10.0.1.13
tikv_servers:
- host: 10.0.1.12
tidb_servers:
- host: 10.0.1.11
- host: 10.0.1.12
- host: 10.0.1.13
tiflash_servers:
- host: 10.0.1.14
grafana_servers:
- host: 10.0.1.11
monitoring_servers:
- host: 10.0.1.11
alertmanager_servers:
- host: 10.0.1.11
================================================
FILE: etc/manualTestEnv/multiReplica/README.md
================================================
# multiReplica
Multiple TiKV nodes in different labels.
## Usage
1. Start the box:
```bash
vagrant up
```
1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once):
```bash
tiup cluster deploy multiReplica v4.0.8 topology.yaml -i ../_shared/vagrant_key -y --user vagrant
```
1. Start the cluster in the box:
```bash
tiup cluster start multiReplica
```
1. Start TiDB Dashboard server:
```bash
bin/tidb-dashboard --pd http://10.0.1.20:2379
```
## Cleanup
```bash
tiup cluster destroy multiReplica -y
vagrant destroy --force
```
================================================
FILE: etc/manualTestEnv/multiReplica/Vagrantfile
================================================
load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 4 * 1024
v.cpus = 2
end
config.vm.network "private_network", ip: "10.0.1.20"
end
================================================
FILE: etc/manualTestEnv/multiReplica/topology.yaml
================================================
global:
user: tidb
deploy_dir: tidb-deploy
data_dir: tidb-data
server_configs:
tikv:
server.grpc-concurrency: 1
raftstore.apply-pool-size: 1
raftstore.store-pool-size: 1
readpool.unified.max-thread-count: 1
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
storage.block-cache.capacity: 256MB
raftstore.capacity: 10GB
pd:
replication.location-labels:
- zone
- rack
- host
pd_servers:
- host: 10.0.1.20
tikv_servers:
- host: 10.0.1.20
port: 20160
status_port: 20180
config:
server.labels: { host: tikv1, rack: rack1 }
- host: 10.0.1.20
port: 20161
status_port: 20181
config:
server.labels: { host: tikv1, rack: rack1 }
- host: 10.0.1.20
port: 20162
status_port: 20182
config:
server.labels: { host: tikv2, rack: rack1 }
- host: 10.0.1.20
port: 20163
status_port: 20183
config:
server.labels: { host: tikv2, rack: rack1 }
- host: 10.0.1.20
port: 20164
status_port: 20184
config:
server.labels: { host: tikv3, rack: rack2 }
- host: 10.0.1.20
port: 20165
status_port: 20185
config:
server.labels: { host: tikv3, rack: rack2 }
tidb_servers:
- host: 10.0.1.20
grafana_servers:
- host: 10.0.1.20
monitoring_servers:
- host: 10.0.1.20
================================================
FILE: etc/manualTestEnv/singleHost/README.md
================================================
# singleHost
TiDB, PD, TiKV, TiFlash in the same host.
## Usage
1. Start the box:
```bash
vagrant up
```
1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once):
```bash
tiup cluster deploy singleHost v4.0.8 topology.yaml -i ../_shared/vagrant_key -y --user vagrant
```
1. Start the cluster in the box:
```bash
tiup cluster start singleHost
```
1. Start TiDB Dashboard server:
```bash
bin/tidb-dashboard --pd http://10.0.1.2:2379
```
## Cleanup
```bash
tiup cluster destroy singleHost -y
vagrant destroy --force
```
================================================
FILE: etc/manualTestEnv/singleHost/Vagrantfile
================================================
load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 3 * 1024
v.cpus = 2
end
config.vm.network "private_network", ip: "10.0.1.2"
end
================================================
FILE: etc/manualTestEnv/singleHost/topology.yaml
================================================
global:
user: tidb
deploy_dir: tidb-deploy
data_dir: tidb-data
server_configs:
tikv:
server.grpc-concurrency: 1
raftstore.apply-pool-size: 1
raftstore.store-pool-size: 1
readpool.unified.max-thread-count: 1
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
storage.block-cache.capacity: 256MB
pd:
replication.enable-placement-rules: true
pd_servers:
- host: 10.0.1.2
tikv_servers:
- host: 10.0.1.2
tidb_servers:
- host: 10.0.1.2
tiflash_servers:
- host: 10.0.1.2
grafana_servers:
- host: 10.0.1.2
monitoring_servers:
- host: 10.0.1.2
alertmanager_servers:
- host: 10.0.1.2
================================================
FILE: etc/manualTestEnv/singleHostMultiDisk/.gitignore
================================================
data/
================================================
FILE: etc/manualTestEnv/singleHostMultiDisk/README.md
================================================
# singleHostMultiDisk
All instances in a single host, but on different disks.
## Usage
1. Start the box:
```bash
vagrant up
```
1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once):
```bash
tiup cluster deploy singleHostMultiDisk v4.0.8 topology.yaml -i ../_shared/vagrant_key -y --user vagrant
```
1. Start the cluster in the box:
```bash
tiup cluster start singleHostMultiDisk
```
1. Start TiDB Dashboard server:
```bash
bin/tidb-dashboard --pd http://10.0.1.3:2379
```
## Cleanup
```bash
tiup cluster destroy singleHostMultiDisk -y
vagrant destroy --force
```
================================================
FILE: etc/manualTestEnv/singleHostMultiDisk/Vagrantfile
================================================
load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 3 * 1024
v.cpus = 2
end
config.vm.network "private_network", ip: "10.0.1.3"
end
================================================
FILE: etc/manualTestEnv/singleHostMultiDisk/topology.yaml
================================================
global:
user: vagrant
deploy_dir: tidb-deploy
data_dir: tidb-data
server_configs:
tikv:
server.grpc-concurrency: 1
raftstore.apply-pool-size: 1
raftstore.store-pool-size: 1
readpool.unified.max-thread-count: 1
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
storage.block-cache.capacity: 256MB
pd:
replication.enable-placement-rules: true
pd_servers:
- host: 10.0.1.3
tikv_servers:
- host: 10.0.1.3
tidb_servers:
- host: 10.0.1.3
deploy_dir: /vagrant/data/tidb
log_dir: /vagrant/data/tidb/log
tiflash_servers:
- host: 10.0.1.3
grafana_servers:
- host: 10.0.1.3
monitoring_servers:
- host: 10.0.1.3
alertmanager_servers:
- host: 10.0.1.3
================================================
FILE: go.mod
================================================
module github.com/pingcap/tidb-dashboard
go 1.25.7
require (
github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/Masterminds/semver v1.5.0
github.com/ReneKroon/ttlcache/v2 v2.3.0
github.com/VividCortex/mysqlerr v1.0.0
github.com/Xeoncross/go-aesctr-with-hmac v0.0.0-20200623134604-12b17a7ff502
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/antonmedv/expr v1.9.0
github.com/appleboy/gin-jwt/v2 v2.10.3
github.com/bitly/go-simplejson v0.5.0
github.com/cenkalti/backoff/v4 v4.2.1
github.com/fatih/structtag v1.2.0
github.com/gin-contrib/gzip v0.0.1
github.com/gin-gonic/gin v1.11.0
github.com/go-resty/resty/v2 v2.6.0
github.com/go-sql-driver/mysql v1.7.0
github.com/goccy/go-graphviz v0.0.9
github.com/golang-jwt/jwt/v4 v4.5.2
github.com/golang/snappy v0.0.4
github.com/google/pprof v0.0.0-20211122183932-1daafda22083
github.com/google/uuid v1.6.0
github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69
github.com/henrylee2cn/ameda v1.4.10
github.com/jarcoal/httpmock v1.0.8
github.com/joho/godotenv v1.4.0
github.com/joomcode/errorx v1.0.1
github.com/json-iterator/go v1.1.12
github.com/minio/sio v0.3.0
github.com/oleiade/reflections v1.0.1
github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12
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-20210906054005-afc726e70354
github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e
github.com/rs/cors v1.7.0
github.com/samber/lo v1.37.0
github.com/shhdgit/testfixtures/v3 v3.6.2-0.20211219171712-c4f264d673d3
github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.11.1
github.com/swaggo/http-swagger v1.2.6
github.com/swaggo/swag v1.7.9
github.com/vmihailenco/msgpack/v5 v5.3.5
go.etcd.io/etcd/client/pkg/v3 v3.5.15
go.etcd.io/etcd/client/v3 v3.5.15
go.uber.org/atomic v1.9.0
go.uber.org/fx v1.12.0
go.uber.org/goleak v1.1.10
go.uber.org/zap v1.19.0
golang.org/x/oauth2 v0.30.0
golang.org/x/sync v0.18.0
google.golang.org/grpc v1.75.1
google.golang.org/protobuf v1.36.10
gorm.io/datatypes v1.1.0
gorm.io/driver/mysql v1.4.5
gorm.io/driver/sqlite v1.5.7
gorm.io/gorm v1.25.12
moul.io/zapgorm2 v1.1.0
)
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
github.com/bytedance/gopkg v0.1.3 // indirect
github.com/bytedance/sonic v1.14.1 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fogleman/gg v1.3.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.10 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.28.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/goccy/go-yaml v1.18.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.24 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.55.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
go.etcd.io/etcd/api/v3 v3.5.15 // indirect
go.uber.org/dig v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
golang.org/x/arch v0.22.0 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
golang.org/x/image v0.18.0 // indirect
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/tools v0.38.0 // indirect
golang.org/x/tools/godoc v0.1.0-deprecated // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/ReneKroon/ttlcache/v2 v2.3.0 h1:qZnUjRKIrbKHH6vF5T7Y9Izn5ObfTZfyYpGhvz2BKPo=
github.com/ReneKroon/ttlcache/v2 v2.3.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4=
github.com/VividCortex/mysqlerr v1.0.0 h1:5pZ2TZA+YnzPgzBfiUWGqWmKDVNBdrkf9g+DNe1Tiq8=
github.com/VividCortex/mysqlerr v1.0.0/go.mod h1:xERx8E4tBhLvpjzdUyQiSfUxeMcATEQrflDAfXsqcAE=
github.com/Xeoncross/go-aesctr-with-hmac v0.0.0-20200623134604-12b17a7ff502 h1:L8IbaI/W6h5Cwgh0n4zGeZpVK78r/jBf9ASurHo9+/o=
github.com/Xeoncross/go-aesctr-with-hmac v0.0.0-20200623134604-12b17a7ff502/go.mod h1:pmnBM9bxWSiHvC/gSWunUIyDvGn33EkP2CUjxFKtTTM=
github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs=
github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo=
github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
github.com/antonmedv/expr v1.9.0 h1:j4HI3NHEdgDnN9p6oI6Ndr0G5QryMY0FNxT4ONrFDGU=
github.com/antonmedv/expr v1.9.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8=
github.com/appleboy/gin-jwt/v2 v2.10.3 h1:KNcPC+XPRNpuoBh+j+rgs5bQxN+SwG/0tHbIqpRoBGc=
github.com/appleboy/gin-jwt/v2 v2.10.3/go.mod h1:LDUaQ8mF2W6LyXIbd5wqlV2SFebuyYs4RDwqMNgpsp8=
github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4=
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=
github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
github.com/bytedance/sonic v1.14.1 h1:FBMC0zVz5XUmE4z9wF4Jey0An5FueFvOsTKKKtwIl7w=
github.com/bytedance/sonic v1.14.1/go.mod h1:gi6uhQLMbTdeP0muCnrjHLeCUPyb70ujhnNlhOylAFc=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA=
github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0=
github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc=
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688=
github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU=
github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4=
github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ=
github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20211122183932-1daafda22083 h1:c8EUapQFi+kjzedr4c6WqbwMdmB95+oDBWZ5XFHFYxY=
github.com/google/pprof v0.0.0-20211122183932-1daafda22083/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69 h1:7xsUJsB2NrdcttQPa7JLEaGzvdbk7KvfrjgHZXOQRo0=
github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69/go.mod h1:YLEMZOtU+AZ7dhN9T/IpGhXVGly2bvkJQ+zxj3WeVQo=
github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=
github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d h1:uGg2frlt3IcT7kbV6LEp5ONv4vmoO2FW4qSO+my/aoM=
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik=
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o=
github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg=
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k=
github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/joomcode/errorx v1.0.1 h1:CalpDWz14ZHd68fIqluJasJosAewpz2TFaJALrUxjrk=
github.com/joomcode/errorx v1.0.1/go.mod h1:kgco15ekB6cs+4Xjzo7SPeXzx38PbJzBwbnu9qfVNHQ=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg=
github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ=
github.com/minio/sio v0.3.0 h1:syEFBewzOMOYVzSTFpp1MqpSZk8rUNbz8VIIc+PNzus=
github.com/minio/sio v0.3.0/go.mod h1:8b0yPp2avGThviy/+OCJBI6OMpvxoUuiLvE6F1lebhw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM=
github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60=
github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12 h1:rfD9v3+ppLPzoQBgZev0qYCpegrwyFx/BUpkApEiKdY=
github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
github.com/pingcap/errors v0.11.0/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/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-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ=
github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4=
github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e h1:FBaTXU8C3xgt/drM58VHxojHo/QoG1oPsgWTGvaSpO4=
github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk=
github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U=
github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/samber/lo v1.37.0 h1:XjVcB8g6tgUp8rsPsJ2CvhClfImrpL04YpQHXeHPhRw=
github.com/samber/lo v1.37.0/go.mod h1:9vaz2O4o8oOnK23pd2TrXufcbdbJIa3b6cstBWKpopA=
github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/shhdgit/testfixtures/v3 v3.6.2-0.20211219171712-c4f264d673d3 h1:qgLFG8/LS7dhYw6SF6yIx+Nfpf4Md9/oxtAYTjl9ayk=
github.com/shhdgit/testfixtures/v3 v3.6.2-0.20211219171712-c4f264d673d3/go.mod h1:Z0OLtuFJ7Y4yLsVijHK8uq95NjGFlYJy+I00ElAEtUQ=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 h1:mj/nMDAwTBiaCqMEs4cYCqF7pO6Np7vhy1D1wcQGz+E=
github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 h1:+iNTcqQJy0OZ5jk6a5NLib47eqXK8uYcPX+O4+cBpEM=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
github.com/swaggo/http-swagger v1.2.6 h1:ihTjChUoSRMpFMjWw+0AkL1Ti4r6v8pCgVYLmQVRlRw=
github.com/swaggo/http-swagger v1.2.6/go.mod h1:CcoICgY3yVDk2u1LQUCMHbAj0fjlxIX+873psXlIKNA=
github.com/swaggo/swag v1.7.9 h1:6vCG5mm43ebDzGlZPMGYrYI4zKFfOr5kicQX8qjeDwc=
github.com/swaggo/swag v1.7.9/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU=
github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U=
github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk=
go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM=
go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA=
go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU=
go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4=
go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/dig v1.9.0 h1:pJTDXKEhRqBI8W7rU7kwT5EgyRZuSMVSFcZolOvKK9U=
go.uber.org/dig v1.9.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw=
go.uber.org/fx v1.12.0 h1:+1+3Cz9M0dFMPy9SW9XUIUHye8bnPUm7q7DroNGWYG4=
go.uber.org/fx v1.12.0/go.mod h1:egT3Kyg1JFYQkvKLZ3EsykxkNrZxgXS+gKoKo7abERY=
go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
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.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE=
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI=
golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
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=
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
golang.org/x/tools/godoc v0.1.0-deprecated h1:o+aZ1BOj6Hsx/GBdJO/s815sqftjSnrZZwyYTHODvtk=
golang.org/x/tools/godoc v0.1.0-deprecated/go.mod h1:qM63CriJ961IHWmnWa9CjZnBndniPt4a3CK0PVB9bIg=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU=
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.1.0 h1:EVp1Z28N4ACpYFK1nHboEIJGIFfjY7vLeieDk8jSHJA=
gorm.io/datatypes v1.1.0/go.mod h1:SH2K9R+2RMjuX1CkCONrPwoe9JzVv2hkQvEu4bXGojE=
gorm.io/driver/mysql v1.4.5 h1:u1lytId4+o9dDaNcPCFzNv7h6wvmc92UjNk3z8enSBU=
gorm.io/driver/mysql v1.4.5/go.mod h1:SxzItlnT1cb6e1e4ZRpgJN2VYtcqJgqnHxWr4wsP8oc=
gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc=
gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg=
gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I=
gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0=
gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig=
gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
moul.io/zapgorm2 v1.1.0 h1:qwAlMBYf+qJkJ7PAzJl4oCe6eS6QGiKAXUPeis0+RBE=
moul.io/zapgorm2 v1.1.0/go.mod h1:emRfKjNqSzVj5lcgasBdovIXY1jSOwFz2GQZn1Rddks=
================================================
FILE: pkg/apiserver/apiserver.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package apiserver
import (
"context"
"io"
"net/http"
"sync"
"github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
cors "github.com/rs/cors/wrapper/gin"
"go.uber.org/fx"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/clusterinfo"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/configuration"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/conprof"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/deadlock"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/debugapi"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/diagnose"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/info"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/logsearch"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/metrics"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/profiling"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/queryeditor"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/topsql"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user/code"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user/code/codeauth"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user/sqlauth"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user/sso"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user/sso/ssoauth"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/visualplan"
"github.com/pingcap/tidb-dashboard/pkg/scheduling"
"github.com/pingcap/tidb-dashboard/pkg/ticdc"
"github.com/pingcap/tidb-dashboard/pkg/tiflash"
"github.com/pingcap/tidb-dashboard/pkg/tiproxy"
"github.com/pingcap/tidb-dashboard/pkg/tso"
"github.com/pingcap/tidb-dashboard/pkg/utils/version"
"github.com/pingcap/tidb-dashboard/util/client/httpclient"
"github.com/pingcap/tidb-dashboard/util/client/pdclient"
"github.com/pingcap/tidb-dashboard/util/client/schedulingclient"
"github.com/pingcap/tidb-dashboard/util/client/ticdcclient"
"github.com/pingcap/tidb-dashboard/util/client/tidbclient"
"github.com/pingcap/tidb-dashboard/util/client/tiflashclient"
"github.com/pingcap/tidb-dashboard/util/client/tikvclient"
"github.com/pingcap/tidb-dashboard/util/client/tiproxyclient"
"github.com/pingcap/tidb-dashboard/util/client/tsoclient"
"github.com/pingcap/tidb-dashboard/util/featureflag"
"github.com/pingcap/tidb-dashboard/util/rest"
// "github.com/pingcap/tidb-dashboard/pkg/apiserver/__APP_NAME__"
// NOTE: Don't remove above comment line, it is a placeholder for code generator.
resourcemanager "github.com/pingcap/tidb-dashboard/pkg/apiserver/resource_manager"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/slowquery"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/statement"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user"
apiutils "github.com/pingcap/tidb-dashboard/pkg/apiserver/utils"
"github.com/pingcap/tidb-dashboard/pkg/config"
"github.com/pingcap/tidb-dashboard/pkg/dbstore"
"github.com/pingcap/tidb-dashboard/pkg/httpc"
"github.com/pingcap/tidb-dashboard/pkg/keyvisual"
keyvisualregion "github.com/pingcap/tidb-dashboard/pkg/keyvisual/region"
"github.com/pingcap/tidb-dashboard/pkg/pd"
"github.com/pingcap/tidb-dashboard/pkg/tidb"
"github.com/pingcap/tidb-dashboard/pkg/tikv"
"github.com/pingcap/tidb-dashboard/pkg/utils"
)
func Handler(s *Service) http.Handler {
return s.NewStatusAwareHandler(http.HandlerFunc(s.handler), s.stoppedHandler)
}
var once sync.Once
type Service struct {
app *fx.App
status *utils.ServiceStatus
ctx context.Context
cancel context.CancelFunc
config *config.Config
customKeyVisualProvider *keyvisualregion.DataProvider
stoppedHandler http.Handler
uiAssetFS http.FileSystem
apiHandlerEngine *gin.Engine
}
func NewService(cfg *config.Config, stoppedHandler http.Handler, uiAssetFS http.FileSystem, customKeyVisualProvider *keyvisualregion.DataProvider) *Service {
once.Do(func() {
// These global modification will be effective only for the first invoke.
_ = godotenv.Load()
gin.SetMode(gin.ReleaseMode)
})
return &Service{
status: utils.NewServiceStatus(),
config: cfg,
customKeyVisualProvider: customKeyVisualProvider,
stoppedHandler: stoppedHandler,
uiAssetFS: uiAssetFS,
}
}
func (s *Service) IsRunning() bool {
return s.status.IsRunning()
}
var Modules = fx.Options(
fx.Provide(
newAPIHandlerEngine,
newClients,
dbstore.NewDBStore,
httpc.NewHTTPClient,
pd.NewEtcdClient,
pd.NewPDClient,
tso.NewTSOClient,
scheduling.NewSchedulingClient,
config.NewDynamicConfigManager,
tidb.NewTiDBClient,
tikv.NewTiKVClient,
tiflash.NewTiFlashClient,
ticdc.NewTiCDCClient,
tiproxy.NewTiProxyClient,
utils.ProvideSysSchema,
apiutils.NewNgmProxy,
info.NewService,
clusterinfo.NewService,
logsearch.NewService,
diagnose.NewService,
keyvisual.NewService,
metrics.NewService,
queryeditor.NewService,
configuration.NewService,
// __APP_NAME__.NewService,
// NOTE: Don't remove above comment line, it is a placeholder for code generator
),
user.Module,
codeauth.Module,
sqlauth.Module,
ssoauth.Module,
code.Module,
sso.Module,
profiling.Module,
conprof.Module,
statement.Module,
slowquery.Module,
debugapi.Module,
topsql.Module,
visualplan.Module,
deadlock.Module,
resourcemanager.Module,
)
func (s *Service) Start(ctx context.Context) error {
if s.IsRunning() {
return nil
}
s.ctx, s.cancel = context.WithCancel(ctx)
s.app = fx.New(
fx.Logger(utils.NewFxPrinter()),
fx.Supply(featureflag.NewRegistry(s.config.FeatureVersion)),
Modules,
fx.Provide(
s.provideLocals,
),
fx.Populate(&s.apiHandlerEngine),
fx.Invoke(
info.RegisterRouter,
clusterinfo.RegisterRouter,
profiling.RegisterRouter,
logsearch.RegisterRouter,
diagnose.RegisterRouter,
keyvisual.RegisterRouter,
metrics.RegisterRouter,
queryeditor.RegisterRouter,
configuration.RegisterRouter,
// __APP_NAME__.RegisterRouter,
// NOTE: Don't remove above comment line, it is a placeholder for code generator
// Must be at the end
s.status.Register,
),
)
if err := s.app.Start(s.ctx); err != nil {
s.cleanAfterError()
return err
}
version.Print()
return nil
}
// TODO: Find a better place to put these client bundles.
func newClients(lc fx.Lifecycle, config *config.Config) (
dbClient *tidbclient.StatusClient,
kvClient *tikvclient.StatusClient,
csClient *tiflashclient.StatusClient,
pdClient *pdclient.APIClient,
ticdcClient *ticdcclient.StatusClient,
tiproxyClient *tiproxyclient.StatusClient,
tsoClient *tsoclient.StatusClient,
schedulingClient *schedulingclient.StatusClient,
) {
httpConfig := httpclient.Config{
TLSConfig: config.ClusterTLSConfig,
}
dbClient = tidbclient.NewStatusClient(httpConfig)
kvClient = tikvclient.NewStatusClient(httpConfig)
csClient = tiflashclient.NewStatusClient(httpConfig)
pdClient = pdclient.NewAPIClient(httpConfig)
ticdcClient = ticdcclient.NewStatusClient(httpConfig)
tiproxyClient = tiproxyclient.NewStatusClient(httpConfig)
tsoClient = tsoclient.NewStatusClient(httpConfig)
schedulingClient = schedulingclient.NewStatusClient(httpConfig)
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
dbClient.SetDefaultCtx(ctx)
kvClient.SetDefaultCtx(ctx)
csClient.SetDefaultCtx(ctx)
pdClient.SetDefaultCtx(ctx)
return nil
},
})
return
}
func (s *Service) cleanAfterError() {
s.cancel()
// drop
s.app = nil
s.apiHandlerEngine = nil
s.ctx = nil
s.cancel = nil
}
func (s *Service) Stop(ctx context.Context) error {
if !s.IsRunning() || s.app == nil {
return nil
}
s.cancel()
err := s.app.Stop(ctx)
// drop
s.app = nil
s.apiHandlerEngine = nil
s.ctx = nil
s.cancel = nil
return err
}
func (s *Service) NewStatusAwareHandler(handler http.Handler, stoppedHandler http.Handler) http.Handler {
return s.status.NewStatusAwareHandler(handler, stoppedHandler)
}
func (s *Service) handler(w http.ResponseWriter, r *http.Request) {
s.apiHandlerEngine.ServeHTTP(w, r)
}
func (s *Service) provideLocals() (*config.Config, http.FileSystem, *keyvisualregion.DataProvider) {
return s.config, s.uiAssetFS, s.customKeyVisualProvider
}
func newAPIHandlerEngine() (apiHandlerEngine *gin.Engine, endpoint *gin.RouterGroup) {
apiHandlerEngine = gin.New()
apiHandlerEngine.Use(gin.Recovery())
apiHandlerEngine.Use(cors.AllowAll())
apiHandlerEngine.Use(gzip.Gzip(gzip.DefaultCompression))
apiHandlerEngine.Use(rest.ErrorHandlerFn())
endpoint = apiHandlerEngine.Group("/dashboard/api")
return
}
var StoppedHandler = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusNotFound)
_, _ = io.WriteString(w, "Dashboard is not started.\n")
})
================================================
FILE: pkg/apiserver/clusterinfo/host.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package clusterinfo
import (
"sort"
"strings"
"github.com/pingcap/log"
"github.com/samber/lo"
"go.uber.org/zap"
"gorm.io/gorm"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/clusterinfo/hostinfo"
"github.com/pingcap/tidb-dashboard/pkg/utils/topology"
)
// fetchAllInstanceHosts fetches all hosts in the cluster and return in ascending order.
func (s *Service) fetchAllInstanceHosts() ([]string, error) {
allHostsMap := make(map[string]struct{})
pdInfo, err := topology.FetchPDTopology(s.params.PDClient)
if err != nil {
return nil, err
}
for _, i := range pdInfo {
allHostsMap[i.IP] = struct{}{}
}
tikvInfo, tiFlashInfo, err := topology.FetchStoreTopology(s.params.PDClient)
if err != nil {
return nil, err
}
for _, i := range tikvInfo {
allHostsMap[i.IP] = struct{}{}
}
for _, i := range tiFlashInfo {
allHostsMap[i.IP] = struct{}{}
}
tidbInfo, err := topology.FetchTiDBTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range tidbInfo {
allHostsMap[i.IP] = struct{}{}
}
ticdcInfo, err := topology.FetchTiCDCTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range ticdcInfo {
allHostsMap[i.IP] = struct{}{}
}
tiproxyInfo, err := topology.FetchTiProxyTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range tiproxyInfo {
allHostsMap[i.IP] = struct{}{}
}
tsoInfo, err := topology.FetchTSOTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
if strings.Contains(err.Error(), "status code 404") {
tsoInfo = []topology.TSOInfo{}
} else {
return nil, err
}
}
for _, i := range tsoInfo {
allHostsMap[i.IP] = struct{}{}
}
schedulingInfo, err := topology.FetchSchedulingTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
if strings.Contains(err.Error(), "status code 404") {
schedulingInfo = []topology.SchedulingInfo{}
} else {
return nil, err
}
}
for _, i := range schedulingInfo {
allHostsMap[i.IP] = struct{}{}
}
allHosts := lo.Keys(allHostsMap)
sort.Strings(allHosts)
return allHosts, nil
}
// fetchAllHostsInfo fetches all hosts and their information.
// Note: The returned data and error may both exist.
func (s *Service) fetchAllHostsInfo(db *gorm.DB) ([]*hostinfo.Info, error) {
allHosts, err := s.fetchAllInstanceHosts()
if err != nil {
return nil, err
}
allHostsInfoMap := make(map[string]*hostinfo.Info)
if e := hostinfo.FillFromClusterLoadTable(db, allHostsInfoMap); e != nil {
log.Warn("Failed to read cluster_load table", zap.Error(e))
err = e
}
if e := hostinfo.FillFromClusterHardwareTable(db, allHostsInfoMap); e != nil && err == nil {
log.Warn("Failed to read cluster_hardware table", zap.Error(e))
err = e
}
if e := hostinfo.FillInstances(db, allHostsInfoMap); e != nil && err == nil {
log.Warn("Failed to fill instances for hosts", zap.Error(e))
err = e
}
r := make([]*hostinfo.Info, 0, len(allHosts))
for _, host := range allHosts {
if im, ok := allHostsInfoMap[host]; ok {
r = append(r, im)
} else {
// Missing item
r = append(r, hostinfo.NewHostInfo(host))
}
}
return r, err
}
================================================
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_config.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package hostinfo
import (
"encoding/json"
"strings"
"gorm.io/gorm"
"github.com/pingcap/tidb-dashboard/util/netutil"
)
type clusterConfigModel struct {
Type string `gorm:"column:TYPE"`
Instance string `gorm:"column:INSTANCE"`
Key string `gorm:"column:KEY"`
Value string `gorm:"column:VALUE"`
}
func FillInstances(db *gorm.DB, m InfoMap) error {
var rows []clusterConfigModel
if err := db.
Table("INFORMATION_SCHEMA.CLUSTER_CONFIG").
Where("(`TYPE` = 'tidb' AND `KEY` = 'log.file.filename') " +
"OR (`TYPE` = 'tikv' AND `KEY` = 'storage.data-dir') " +
"OR (`TYPE` = 'pd' AND `KEY` = 'data-dir') " +
"OR (`TYPE` = 'ticdc' AND `KEY` = 'data-dir')" +
"OR (`TYPE` = 'tiflash' AND (`KEY` = 'engine-store.path' " +
" OR `KEY` = 'engine-store.storage.main.dir' " +
" OR `KEY` = 'engine-store.storage.latest.dir'))").
Find(&rows).Error; err != nil {
return err
}
for _, row := range rows {
hostname, _, err := netutil.ParseHostAndPortFromAddress(row.Instance)
if err != nil {
continue
}
if _, ok := m[hostname]; !ok {
m[hostname] = NewHostInfo(hostname)
}
switch row.Type {
case "tiflash":
if ins, ok := m[hostname].Instances[row.Instance]; ok {
if ins.Type == row.Type && ins.PartitionPathL != "" {
continue
}
} else {
m[hostname].Instances[row.Instance] = &InstanceInfo{
Type: row.Type,
PartitionPathL: "",
}
}
var paths []string
switch row.Key {
case "engine-store.path":
items := strings.Split(row.Value, ",")
for _, path := range items {
paths = append(paths, strings.TrimSpace(path))
}
case "engine-store.storage.main.dir", "engine-store.storage.latest.dir":
if err := json.Unmarshal([]byte(row.Value), &paths); err != nil {
return err
}
default:
paths = []string{row.Value}
}
for _, path := range paths {
mountDir := locateInstanceMountPartition(path, m[hostname].Partitions)
if mountDir != "" {
m[hostname].Instances[row.Instance].PartitionPathL = strings.ToLower(mountDir)
break
}
}
default:
m[hostname].Instances[row.Instance] = &InstanceInfo{
Type: row.Type,
PartitionPathL: strings.ToLower(locateInstanceMountPartition(row.Value, m[hostname].Partitions)),
}
}
}
return nil
}
// Try to discover which partition this instance is running on.
// If discover failed, empty string will be returned.
func locateInstanceMountPartition(directoryOrFilePath string, partitions map[string]*PartitionInfo) string {
if len(directoryOrFilePath) == 0 {
return ""
}
maxMatchLen := 0
maxMatchPath := ""
directoryOrFilePathL := strings.ToLower(directoryOrFilePath)
for _, info := range partitions {
// FIXME: This may cause wrong result in case sensitive FS.
if !strings.HasPrefix(directoryOrFilePathL, strings.ToLower(info.Path)) {
continue
}
if len(info.Path) > maxMatchLen {
maxMatchLen = len(info.Path)
maxMatchPath = info.Path
}
}
return maxMatchPath
}
================================================
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_hardware.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package hostinfo
import (
"bytes"
"encoding/json"
"strings"
"gorm.io/gorm"
"github.com/pingcap/tidb-dashboard/util/netutil"
)
// Used to deserialize from JSON_VALUE.
type clusterHardwareCPUInfoModel struct {
Arch string `json:"cpu-arch"`
LogicalCores int `json:"cpu-logical-cores,string"`
PhysicalCores int `json:"cpu-physical-cores,string"`
}
// Used to deserialize from JSON_VALUE.
type clusterHardwareDiskModel struct {
Path string `json:"path"`
FSType string `json:"fstype"`
Free int `json:"free,string"`
Total int `json:"total,string"`
}
func FillFromClusterHardwareTable(db *gorm.DB, m InfoMap) error {
var rows []clusterTableModel
var sqlQuery bytes.Buffer
if err := clusterTableQueryTemplate.Execute(&sqlQuery, map[string]string{
"tableName": "INFORMATION_SCHEMA.CLUSTER_HARDWARE",
}); err != nil {
panic(err)
}
if err := db.
Raw(sqlQuery.String(), []string{"cpu", "disk"}).
Scan(&rows).Error; err != nil {
return err
}
for _, row := range rows {
hostname, _, err := netutil.ParseHostAndPortFromAddress(row.Instance)
if err != nil {
continue
}
if _, ok := m[hostname]; !ok {
m[hostname] = NewHostInfo(hostname)
}
switch {
case row.DeviceType == "cpu" && row.DeviceName == "cpu":
if m[hostname].CPUInfo != nil {
continue
}
var v clusterHardwareCPUInfoModel
err := json.Unmarshal([]byte(row.JSONValue), &v)
if err != nil {
continue
}
m[hostname].CPUInfo = &CPUInfo{
Arch: v.Arch,
LogicalCores: v.LogicalCores,
PhysicalCores: v.PhysicalCores,
}
case row.DeviceType == "disk":
if m[hostname].PartitionProviderType != "" && m[hostname].PartitionProviderType != row.Type {
// Another instance on the same host has already provided disk information, skip.
continue
}
var v clusterHardwareDiskModel
err := json.Unmarshal([]byte(row.JSONValue), &v)
if err != nil {
continue
}
if m[hostname].PartitionProviderType == "" {
m[hostname].PartitionProviderType = row.Type
}
m[hostname].Partitions[strings.ToLower(v.Path)] = &PartitionInfo{
Path: v.Path,
FSType: v.FSType,
Free: v.Free,
Total: v.Total,
}
}
}
return nil
}
================================================
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_load.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package hostinfo
import (
"bytes"
"encoding/json"
"gorm.io/gorm"
"github.com/pingcap/tidb-dashboard/util/netutil"
)
// Used to deserialize from JSON_VALUE.
type clusterLoadCPUUsageModel struct {
Idle float64 `json:"idle,string"`
System float64 `json:"system,string"`
}
// Used to deserialize from JSON_VALUE.
type clusterLoadMemoryVirtualModel struct {
Used int `json:"used,string"`
Total int `json:"total,string"`
}
func FillFromClusterLoadTable(db *gorm.DB, m InfoMap) error {
var rows []clusterTableModel
var sqlQuery bytes.Buffer
if err := clusterTableQueryTemplate.Execute(&sqlQuery, map[string]string{
"tableName": "INFORMATION_SCHEMA.CLUSTER_LOAD",
}); err != nil {
panic(err)
}
if err := db.
Raw(sqlQuery.String(), []string{"memory", "cpu"}).
Scan(&rows).Error; err != nil {
return err
}
for _, row := range rows {
hostname, _, err := netutil.ParseHostAndPortFromAddress(row.Instance)
if err != nil {
continue
}
if _, ok := m[hostname]; !ok {
m[hostname] = NewHostInfo(hostname)
}
switch {
case row.DeviceType == "memory" && row.DeviceName == "virtual":
if m[hostname].MemoryUsage != nil {
continue
}
var v clusterLoadMemoryVirtualModel
err := json.Unmarshal([]byte(row.JSONValue), &v)
if err != nil {
continue
}
m[hostname].MemoryUsage = &MemoryUsageInfo{
Used: v.Used,
Total: v.Total,
}
case row.DeviceType == "cpu" && row.DeviceName == "usage":
if m[hostname].CPUUsage != nil {
continue
}
var v clusterLoadCPUUsageModel
err := json.Unmarshal([]byte(row.JSONValue), &v)
if err != nil {
continue
}
m[hostname].CPUUsage = &CPUUsageInfo{
Idle: v.Idle,
System: v.System,
}
}
}
return nil
}
================================================
FILE: pkg/apiserver/clusterinfo/hostinfo/hostinfo.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package hostinfo
import "text/template"
type CPUUsageInfo struct {
Idle float64 `json:"idle"`
System float64 `json:"system"`
}
type MemoryUsageInfo struct {
Used int `json:"used"`
Total int `json:"total"`
}
type CPUInfo struct {
Arch string `json:"arch"`
LogicalCores int `json:"logical_cores"`
PhysicalCores int `json:"physical_cores"`
}
type PartitionInfo struct {
Path string `json:"path"`
FSType string `json:"fstype"`
Free int `json:"free"`
Total int `json:"total"`
}
type InstanceInfo struct {
Type string `json:"type"`
PartitionPathL string `json:"partition_path_lower"`
}
type Info struct {
Host string `json:"host"`
CPUInfo *CPUInfo `json:"cpu_info"`
CPUUsage *CPUUsageInfo `json:"cpu_usage"`
MemoryUsage *MemoryUsageInfo `json:"memory_usage"`
// Containing unused partitions. The key is path in lower case.
// Note: deviceName is not used as the key, since TiDB and TiKV may return different deviceName for the same device.
Partitions map[string]*PartitionInfo `json:"partitions"`
// The source instance type that provides the partition info.
PartitionProviderType string `json:"-"`
// Instances in the current host. The key is instance address
Instances map[string]*InstanceInfo `json:"instances"`
}
type InfoMap = map[string]*Info
var clusterTableQueryTemplate = template.Must(template.New("").Parse(`
SELECT
*,
FIELD(LOWER(A.TYPE), 'tiflash', 'tikv', 'pd', 'tidb', 'tiproxy', 'tso', 'scheduling') AS _ORDER
FROM (
SELECT
TYPE, INSTANCE, DEVICE_TYPE, DEVICE_NAME, JSON_OBJECTAGG(NAME, VALUE) AS JSON_VALUE
FROM
{{.tableName}}
WHERE
DEVICE_TYPE IN (?)
GROUP BY TYPE, INSTANCE, DEVICE_TYPE, DEVICE_NAME
) AS A
ORDER BY
_ORDER DESC, INSTANCE, DEVICE_TYPE, DEVICE_NAME
`))
type clusterTableModel struct {
Type string `gorm:"column:TYPE"` // Example: tidb, tikv
Instance string `gorm:"column:INSTANCE"` // Example: 127.0.0.1:4000
DeviceType string `gorm:"column:DEVICE_TYPE"` // Example: cpu
DeviceName string `gorm:"column:DEVICE_NAME"` // Example: usage
JSONValue string `gorm:"column:JSON_VALUE"` // Only exists by using `clusterTableQueryTemplate`.
}
func NewHostInfo(hostname string) *Info {
return &Info{
Host: hostname,
Partitions: make(map[string]*PartitionInfo),
Instances: make(map[string]*InstanceInfo),
}
}
================================================
FILE: pkg/apiserver/clusterinfo/service.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
// clusterinfo is a directory for ClusterInfoServer, which could load topology from pd
// using Etcd v3 interface and pd interface.
package clusterinfo
import (
"context"
"fmt"
"net/http"
"strings"
"sync"
"time"
"github.com/gin-gonic/gin"
clientv3 "go.etcd.io/etcd/client/v3"
"go.uber.org/fx"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/clusterinfo/hostinfo"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/user"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/utils"
"github.com/pingcap/tidb-dashboard/pkg/httpc"
"github.com/pingcap/tidb-dashboard/pkg/pd"
"github.com/pingcap/tidb-dashboard/pkg/tidb"
"github.com/pingcap/tidb-dashboard/pkg/utils/topology"
"github.com/pingcap/tidb-dashboard/util/rest"
)
type ServiceParams struct {
fx.In
PDClient *pd.Client
EtcdClient *clientv3.Client
HTTPClient *httpc.Client
TiDBClient *tidb.Client
}
type Service struct {
params ServiceParams
lifecycleCtx context.Context
}
func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
s := &Service{params: p}
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
s.lifecycleCtx = ctx
return nil
},
})
return s
}
func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Service) {
endpoint := r.Group("/topology")
endpoint.Use(auth.MWAuthRequired())
endpoint.GET("/tidb", s.getTiDBTopology)
endpoint.GET("/ticdc", s.getTiCDCTopology)
endpoint.GET("/tiproxy", s.getTiProxyTopology)
endpoint.DELETE("/tidb/:address", s.deleteTiDBTopology)
endpoint.GET("/store", s.getStoreTopology)
endpoint.GET("/pd", s.getPDTopology)
endpoint.GET("/tso", s.getTSOTopology)
endpoint.GET("/scheduling", s.getSchedulingTopology)
endpoint.GET("/alertmanager", s.getAlertManagerTopology)
endpoint.GET("/alertmanager/:address/count", s.getAlertManagerCounts)
endpoint.GET("/grafana", s.getGrafanaTopology)
endpoint.GET("/store_location", s.getStoreLocationTopology)
endpoint = r.Group("/host")
endpoint.Use(auth.MWAuthRequired())
endpoint.Use(utils.MWConnectTiDB(s.params.TiDBClient))
endpoint.GET("/all", s.getHostsInfo)
endpoint.GET("/statistics", s.getStatistics)
}
// @Summary Hide a TiDB instance
// @Param address path string true "ip:port"
// @Success 200 "delete ok"
// @Failure 401 {object} rest.ErrorResponse
// @Security JwtAuth
// @Router /topology/tidb/{address} [delete]
func (s *Service) deleteTiDBTopology(c *gin.Context) {
address := c.Param("address")
errorChannel := make(chan error, 2)
ttlKey := fmt.Sprintf("/topology/tidb/%v/ttl", address)
nonTTLKey := fmt.Sprintf("/topology/tidb/%v/info", address)
ctx, cancel := context.WithTimeout(s.lifecycleCtx, time.Second*5)
defer cancel()
var wg sync.WaitGroup
for _, key := range []string{ttlKey, nonTTLKey} {
wg.Add(1)
go func(toDel string) {
defer wg.Done()
if _, err := s.params.EtcdClient.Delete(ctx, toDel); err != nil {
errorChannel <- err
}
}(key)
}
wg.Wait()
var err error
select {
case err = <-errorChannel:
default:
}
close(errorChannel)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, nil)
}
// @ID getTiDBTopology
// @Summary Get all TiDB instances
// @Success 200 {array} topology.TiDBInfo
// @Router /topology/tidb [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getTiDBTopology(c *gin.Context) {
instances, err := topology.FetchTiDBTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instances)
}
// @ID getTiCDCTopology
// @Summary Get all TiCDC instances
// @Success 200 {array} topology.TiCDCInfo
// @Router /topology/ticdc [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getTiCDCTopology(c *gin.Context) {
instances, err := topology.FetchTiCDCTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instances)
}
// @ID getTiProxyTopology
// @Summary Get all TiProxy instances
// @Success 200 {array} topology.TiProxyInfo
// @Router /topology/tiproxy [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getTiProxyTopology(c *gin.Context) {
instances, err := topology.FetchTiProxyTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instances)
}
// @ID getTSOTopology
// @Summary Get all TSO instances
// @Success 200 {array} topology.TSOInfo
// @Router /topology/tso [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getTSOTopology(c *gin.Context) {
instances, err := topology.FetchTSOTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
// TODO: refine later
if strings.Contains(err.Error(), "status code 404") {
rest.Error(c, rest.ErrNotFound.Wrap(err, "api not found"))
} else {
rest.Error(c, err)
}
return
}
c.JSON(http.StatusOK, instances)
}
// @ID getSchedulingTopology
// @Summary Get all Scheduling instances
// @Success 200 {array} topology.SchedulingInfo
// @Router /topology/scheduling [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getSchedulingTopology(c *gin.Context) {
instances, err := topology.FetchSchedulingTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
// TODO: refine later
if strings.Contains(err.Error(), "status code 404") {
rest.Error(c, rest.ErrNotFound.Wrap(err, "api not found"))
} else {
rest.Error(c, err)
}
return
}
c.JSON(http.StatusOK, instances)
}
type StoreTopologyResponse struct {
TiKV []topology.StoreInfo `json:"tikv"`
TiFlash []topology.StoreInfo `json:"tiflash"`
}
// @ID getStoreTopology
// @Summary Get all TiKV / TiFlash instances
// @Success 200 {object} StoreTopologyResponse
// @Router /topology/store [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getStoreTopology(c *gin.Context) {
tikvInstances, tiFlashInstances, err := topology.FetchStoreTopology(s.params.PDClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, StoreTopologyResponse{
TiKV: tikvInstances,
TiFlash: tiFlashInstances,
})
}
// @ID getStoreLocationTopology
// @Summary Get location labels of all TiKV / TiFlash instances
// @Success 200 {object} topology.StoreLocation
// @Router /topology/store_location [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getStoreLocationTopology(c *gin.Context) {
storeLocation, err := topology.FetchStoreLocation(s.params.PDClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, storeLocation)
}
// @ID getPDTopology
// @Summary Get all PD instances
// @Success 200 {array} topology.PDInfo
// @Router /topology/pd [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getPDTopology(c *gin.Context) {
instances, err := topology.FetchPDTopology(s.params.PDClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instances)
}
// @ID getAlertManagerTopology
// @Summary Get AlertManager instance
// @Success 200 {object} topology.AlertManagerInfo
// @Router /topology/alertmanager [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getAlertManagerTopology(c *gin.Context) {
instance, err := topology.FetchAlertManagerTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instance)
}
// @ID getGrafanaTopology
// @Summary Get Grafana instance
// @Success 200 {object} topology.GrafanaInfo
// @Router /topology/grafana [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getGrafanaTopology(c *gin.Context) {
instance, err := topology.FetchGrafanaTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, instance)
}
// @ID getAlertManagerCounts
// @Summary Get current alert count from AlertManager
// @Success 200 {object} int
// @Param address path string true "ip:port"
// @Router /topology/alertmanager/{address}/count [get]
// @Security JwtAuth
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getAlertManagerCounts(c *gin.Context) {
address := c.Param("address")
if address == "" {
rest.Error(c, rest.ErrBadRequest.New("address is empty"))
return
}
info, err := topology.FetchAlertManagerTopology(c.Request.Context(), s.params.EtcdClient)
if err != nil {
rest.Error(c, err)
return
}
if info == nil {
rest.Error(c, rest.ErrBadRequest.New("alertmanager not found"))
return
}
if address != fmt.Sprintf("%s:%d", info.IP, info.Port) {
rest.Error(c, rest.ErrBadRequest.New("address not match"))
return
}
cnt, err := fetchAlertManagerCounts(s.lifecycleCtx, address, s.params.HTTPClient)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, cnt)
}
type GetHostsInfoResponse struct {
Hosts []*hostinfo.Info `json:"hosts"`
Warning rest.ErrorResponse `json:"warning"`
}
// @ID clusterInfoGetHostsInfo
// @Summary Get information of all hosts
// @Router /host/all [get]
// @Security JwtAuth
// @Success 200 {object} GetHostsInfoResponse
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getHostsInfo(c *gin.Context) {
db := utils.GetTiDBConnection(c)
info, err := s.fetchAllHostsInfo(db)
if err != nil && info == nil {
rest.Error(c, err)
return
}
var warning rest.ErrorResponse
if err != nil {
warning = rest.NewErrorResponse(err)
}
c.JSON(http.StatusOK, GetHostsInfoResponse{
Hosts: info,
Warning: warning,
})
}
// @ID clusterInfoGetStatistics
// @Summary Get cluster statistics
// @Router /host/statistics [get]
// @Security JwtAuth
// @Success 200 {object} ClusterStatistics
// @Failure 401 {object} rest.ErrorResponse
func (s *Service) getStatistics(c *gin.Context) {
db := utils.GetTiDBConnection(c)
stats, err := s.calculateStatistics(db)
if err != nil {
rest.Error(c, err)
return
}
c.JSON(http.StatusOK, stats)
}
================================================
FILE: pkg/apiserver/clusterinfo/statistics.go
================================================
// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.
package clusterinfo
import (
"net"
"sort"
"strconv"
"strings"
"github.com/samber/lo"
"gorm.io/gorm"
"github.com/pingcap/tidb-dashboard/pkg/apiserver/clusterinfo/hostinfo"
"github.com/pingcap/tidb-dashboard/pkg/utils/topology"
)
type ClusterStatisticsPartial struct {
NumberOfHosts int `json:"number_of_hosts"`
NumberOfInstances int `json:"number_of_instances"`
TotalMemoryCapacityBytes int `json:"total_memory_capacity_bytes"`
TotalPhysicalCores int `json:"total_physical_cores"`
TotalLogicalCores int `json:"total_logical_cores"`
}
type ClusterStatistics struct {
ProbeFailureHosts int `json:"probe_failure_hosts"`
Versions []string `json:"versions"`
TotalStats *ClusterStatisticsPartial `json:"total_stats"`
StatsByInstanceKind map[string]*ClusterStatisticsPartial `json:"stats_by_instance_kind"`
}
type instanceKindHostImmediateInfo struct {
memoryCapacity int
physicalCores int
logicalCores int
}
type instanceKindImmediateInfo struct {
instances map[string]struct{}
hosts map[string]*instanceKindHostImmediateInfo
}
func newInstanceKindImmediateInfo() *instanceKindImmediateInfo {
return &instanceKindImmediateInfo{
instances: make(map[string]struct{}),
hosts: make(map[string]*instanceKindHostImmediateInfo),
}
}
func sumInt(array []int) int {
result := 0
for _, v := range array {
result += v
}
return result
}
func (info *instanceKindImmediateInfo) ToResult() *ClusterStatisticsPartial {
return &ClusterStatisticsPartial{
NumberOfHosts: len(lo.Keys(info.hosts)),
NumberOfInstances: len(lo.Keys(info.instances)),
TotalMemoryCapacityBytes: sumInt(lo.Map(lo.Values(info.hosts), func(x *instanceKindHostImmediateInfo, _ int) int { return x.memoryCapacity })),
TotalPhysicalCores: sumInt(lo.Map(lo.Values(info.hosts), func(x *instanceKindHostImmediateInfo, _ int) int { return x.physicalCores })),
TotalLogicalCores: sumInt(lo.Map(lo.Values(info.hosts), func(x *instanceKindHostImmediateInfo, _ int) int { return x.logicalCores })),
}
}
func (s *Service) calculateStatistics(db *gorm.DB) (*ClusterStatistics, error) {
globalHostsSet := make(map[string]struct{})
globalFailureHostsSet := make(map[string]struct{})
globalVersionsSet := make(map[string]struct{})
globalInfo := newInstanceKindImmediateInfo()
infoByIk := make(map[string]*instanceKindImmediateInfo)
infoByIk["pd"] = newInstanceKindImmediateInfo()
infoByIk["tidb"] = newInstanceKindImmediateInfo()
infoByIk["tikv"] = newInstanceKindImmediateInfo()
infoByIk["tiflash"] = newInstanceKindImmediateInfo()
infoByIk["ticdc"] = newInstanceKindImmediateInfo()
infoByIk["tiproxy"] = newInstanceKindImmediateInfo()
infoByIk["tso"] = newInstanceKindImmediateInfo()
infoByIk["scheduling"] = newInstanceKindImmediateInfo()
// Fill from topology info
pdInfo, err := topology.FetchPDTopology(s.params.PDClient)
if err != nil {
return nil, err
}
for _, i := range pdInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["pd"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
tikvInfo, tiFlashInfo, err := topology.FetchStoreTopology(s.params.PDClient)
if err != nil {
return nil, err
}
for _, i := range tikvInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["tikv"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
for _, i := range tiFlashInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["tiflash"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
tidbInfo, err := topology.FetchTiDBTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range tidbInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["tidb"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
ticdcInfo, err := topology.FetchTiCDCTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range ticdcInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["ticdc"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
tiproxyInfo, err := topology.FetchTiProxyTopology(s.lifecycleCtx, s.params.EtcdClient)
if err != nil {
return nil, err
}
for _, i := range tiproxyInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["tiproxy"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
tsoInfo, err := topology.FetchTSOTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
if strings.Contains(err.Error(), "status code 404") {
tsoInfo = []topology.TSOInfo{}
} else {
return nil, err
}
}
for _, i := range tsoInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["tso"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
schedulingInfo, err := topology.FetchSchedulingTopology(s.lifecycleCtx, s.params.PDClient)
if err != nil {
if strings.Contains(err.Error(), "status code 404") {
schedulingInfo = []topology.SchedulingInfo{}
} else {
return nil, err
}
}
for _, i := range schedulingInfo {
globalHostsSet[i.IP] = struct{}{}
globalVersionsSet[i.Version] = struct{}{}
globalInfo.instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
infoByIk["scheduling"].instances[net.JoinHostPort(i.IP, strconv.Itoa(int(i.Port)))] = struct{}{}
}
// Fill from hardware info
allHostsInfoMap := make(map[string]*hostinfo.Info)
if e := hostinfo.FillFromClusterLoadTable(db, allHostsInfoMap); e != nil {
return nil, err
}
if e := hostinfo.FillFromClusterHardwareTable(db, allHostsInfoMap); e != nil {
return nil, err
}
for host, hi := range allHostsInfoMap {
if hi.MemoryUsage.Total > 0 && hi.CPUInfo.PhysicalCores > 0 && hi.CPUInfo.LogicalCores > 0 {
// Put success host info into `globalInfo.hosts`.
globalInfo.hosts[host] = &instanceKindHostImmediateInfo{
memoryCapacity: hi.MemoryUsage.Total,
physicalCores: hi.CPUInfo.PhysicalCores,
logicalCores: hi.CPUInfo.LogicalCores,
}
}
}
// Fill hosts in each instance kind according to the global hosts info
for _, i := range pdInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["pd"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range tikvInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["tikv"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range tiFlashInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["tiflash"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range tidbInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["tidb"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range ticdcInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["ticdc"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range tiproxyInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["tiproxy"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range tsoInfo {
if v, ok := globalInfo.hosts[i.IP]; ok {
infoByIk["tso"].hosts[i.IP] = v
} else {
globalFailureHostsSet[i.IP] = struct{}{}
}
}
for _, i := range schedulingInfo {
if v, ok
gitextract_tfv9ubrh/
├── .all-contributorsrc
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── feature-request.md
│ │ └── question.md
│ ├── autolabeler.yml
│ ├── codecov.yml
│ ├── stale.yml
│ └── workflows/
│ ├── build.yaml
│ ├── manual-create-pd-pr.yaml
│ ├── release.yaml
│ ├── test-docker-image.yaml
│ ├── test.yaml
│ └── upload-e2e-snapshots.yaml
├── .gitignore
├── .golangci.yml
├── .prettierrc
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY.md
├── cmd/
│ └── tidb-dashboard/
│ └── main.go
├── dockerfiles/
│ └── docker-compose.yml
├── etc/
│ ├── go.mod
│ └── manualTestEnv/
│ ├── .gitignore
│ ├── _shared/
│ │ ├── Vagrantfile.partial.pubKey.rb
│ │ ├── vagrant_key
│ │ └── vagrant_key.pub
│ ├── complexCase1/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── multiHost/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── multiReplica/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ ├── singleHost/
│ │ ├── README.md
│ │ ├── Vagrantfile
│ │ └── topology.yaml
│ └── singleHostMultiDisk/
│ ├── .gitignore
│ ├── README.md
│ ├── Vagrantfile
│ └── topology.yaml
├── go.mod
├── go.sum
├── pkg/
│ ├── apiserver/
│ │ ├── apiserver.go
│ │ ├── clusterinfo/
│ │ │ ├── host.go
│ │ │ ├── hostinfo/
│ │ │ │ ├── cluster_config.go
│ │ │ │ ├── cluster_hardware.go
│ │ │ │ ├── cluster_load.go
│ │ │ │ └── hostinfo.go
│ │ │ ├── service.go
│ │ │ ├── statistics.go
│ │ │ └── topology.go
│ │ ├── configuration/
│ │ │ ├── editable.go
│ │ │ ├── flatten.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── conprof/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── deadlock/
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── debugapi/
│ │ │ ├── apis.go
│ │ │ ├── endpoint/
│ │ │ │ ├── 1_main_test.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── models.go
│ │ │ │ ├── models_test.go
│ │ │ │ ├── payload.go
│ │ │ │ └── payload_test.go
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── diagnose/
│ │ │ ├── compare.go
│ │ │ ├── diagnose.go
│ │ │ ├── inspection.go
│ │ │ ├── model.go
│ │ │ ├── query.go
│ │ │ ├── report.go
│ │ │ └── report_test.go
│ │ ├── info/
│ │ │ └── info.go
│ │ ├── logsearch/
│ │ │ ├── models.go
│ │ │ ├── pack.go
│ │ │ ├── scheduler.go
│ │ │ ├── service.go
│ │ │ └── task.go
│ │ ├── metrics/
│ │ │ ├── prom_resolve.go
│ │ │ ├── prom_resolve_test.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── model/
│ │ │ └── common_models.go
│ │ ├── profiling/
│ │ │ ├── fetcher.go
│ │ │ ├── jeprof.in
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ ├── pprof.go
│ │ │ ├── profile.go
│ │ │ ├── protobuf_to_svg.go
│ │ │ ├── router.go
│ │ │ └── service.go
│ │ ├── queryeditor/
│ │ │ └── service.go
│ │ ├── resource_manager/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── slowquery/
│ │ │ ├── model.go
│ │ │ ├── module.go
│ │ │ ├── queries.go
│ │ │ ├── service.go
│ │ │ └── statement_gen.go
│ │ ├── statement/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── models.go
│ │ │ ├── module.go
│ │ │ ├── queries.go
│ │ │ ├── service.go
│ │ │ └── statement_gen.go
│ │ ├── topsql/
│ │ │ ├── module.go
│ │ │ └── service.go
│ │ ├── user/
│ │ │ ├── auth.go
│ │ │ ├── code/
│ │ │ │ ├── codeauth/
│ │ │ │ │ └── auth.go
│ │ │ │ ├── router.go
│ │ │ │ └── service.go
│ │ │ ├── module.go
│ │ │ ├── rsa_utils.go
│ │ │ ├── sqlauth/
│ │ │ │ └── sqlauth.go
│ │ │ ├── sso/
│ │ │ │ ├── models.go
│ │ │ │ ├── router.go
│ │ │ │ ├── service.go
│ │ │ │ └── ssoauth/
│ │ │ │ └── auth.go
│ │ │ ├── verify_sql_user.go
│ │ │ └── verify_sql_user_test.go
│ │ ├── utils/
│ │ │ ├── auth.go
│ │ │ ├── binary_plan.go
│ │ │ ├── binary_plan_test.go
│ │ │ ├── error.go
│ │ │ ├── export.go
│ │ │ ├── gorm.go
│ │ │ ├── gorm_test.go
│ │ │ ├── jwt.go
│ │ │ ├── mw_experimental.go
│ │ │ ├── ngm.go
│ │ │ ├── subset.go
│ │ │ └── tidb_conn.go
│ │ └── visualplan/
│ │ ├── module.go
│ │ └── service.go
│ ├── config/
│ │ ├── config.go
│ │ ├── dynamic_config.go
│ │ └── dynamic_config_manager.go
│ ├── dbstore/
│ │ └── dbstore.go
│ ├── httpc/
│ │ ├── client.go
│ │ └── client_test.go
│ ├── keyvisual/
│ │ ├── decorator/
│ │ │ ├── decorator.go
│ │ │ ├── decorator_test.go
│ │ │ ├── separator.go
│ │ │ ├── tidb.go
│ │ │ ├── tidb_requests.go
│ │ │ └── tidb_test.go
│ │ ├── input/
│ │ │ ├── api.go
│ │ │ ├── file.go
│ │ │ ├── input.go
│ │ │ └── periodic.go
│ │ ├── manager.go
│ │ ├── matrix/
│ │ │ ├── average.go
│ │ │ ├── average_test.go
│ │ │ ├── axis.go
│ │ │ ├── axis_test.go
│ │ │ ├── distance.go
│ │ │ ├── distance_test.go
│ │ │ ├── interface.go
│ │ │ ├── key.go
│ │ │ ├── key_test.go
│ │ │ ├── matrix.go
│ │ │ ├── matrix_test.go
│ │ │ ├── plane.go
│ │ │ ├── plane_test.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ ├── region/
│ │ │ ├── interface.go
│ │ │ ├── tag.go
│ │ │ └── utils.go
│ │ ├── service.go
│ │ ├── storage/
│ │ │ ├── model.go
│ │ │ ├── model_test.go
│ │ │ ├── region.go
│ │ │ ├── region_test.go
│ │ │ ├── stat.go
│ │ │ ├── stat_persist.go
│ │ │ └── stat_test.go
│ │ └── testdata/
│ │ └── dis.json.gzip
│ ├── pd/
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── etcd.go
│ │ └── pd.go
│ ├── scheduling/
│ │ ├── client.go
│ │ └── scheduling.go
│ ├── swaggerserver/
│ │ └── handler.go
│ ├── ticdc/
│ │ ├── client.go
│ │ └── ticdc.go
│ ├── tidb/
│ │ ├── client.go
│ │ ├── forwarder.go
│ │ ├── model/
│ │ │ ├── codec.go
│ │ │ ├── codec_test.go
│ │ │ └── model.go
│ │ ├── proxy.go
│ │ ├── proxy_test.go
│ │ └── tidb.go
│ ├── tiflash/
│ │ ├── client.go
│ │ └── tiflash.go
│ ├── tikv/
│ │ ├── client.go
│ │ └── tikv.go
│ ├── tiproxy/
│ │ ├── client.go
│ │ └── tiproxy.go
│ ├── tso/
│ │ ├── client.go
│ │ └── tso.go
│ ├── uiserver/
│ │ ├── .gitignore
│ │ ├── embedded_assets_rewriter.go
│ │ ├── empty_assets_handler.go
│ │ └── uiserver.go
│ └── utils/
│ ├── fx.go
│ ├── grpc.go
│ ├── service_status.go
│ ├── sys_schema.go
│ ├── topology/
│ │ ├── models.go
│ │ ├── monitor.go
│ │ ├── pd.go
│ │ ├── scheduling.go
│ │ ├── store.go
│ │ ├── ticdc.go
│ │ ├── tidb.go
│ │ ├── tiproxy.go
│ │ ├── topology.go
│ │ └── tso.go
│ └── version/
│ ├── fips.go
│ └── version.go
├── release-version
├── scripts/
│ ├── _inc/
│ │ ├── download_tools.sh
│ │ └── run_services.sh
│ ├── create_release_tag.js
│ ├── distro/
│ │ ├── write_strings.go
│ │ └── write_strings.sh
│ ├── embed_ui_assets.sh
│ ├── generate_assets.go
│ ├── generate_swagger_spec.sh
│ ├── go.mod
│ ├── go.sum
│ ├── install_go_tools.sh
│ ├── lint.sh
│ ├── pd_version_matrix.go
│ ├── start_tiup.sh
│ ├── tiup.config.toml
│ ├── tools.go
│ └── wait_tiup_playground.sh
├── swaggerspec/
│ ├── .gitignore
│ └── placeholder.go
├── tests/
│ ├── create_table.sh
│ ├── dump.sh
│ ├── fixtures/
│ │ └── CLUSTER_SLOW_QUERY.yml
│ ├── integration/
│ │ ├── diagnose_report_test.go
│ │ ├── info/
│ │ │ └── info_test.go
│ │ ├── slowquery/
│ │ │ ├── compatibility_test.go
│ │ │ └── mock_db_test.go
│ │ └── user/
│ │ └── user_test.go
│ ├── run.sh
│ ├── schema/
│ │ └── test.CLUSTER_SLOW_QUERY-schema.sql
│ └── util/
│ ├── compatibility.go
│ ├── dump/
│ │ └── dump.go
│ ├── fixtures.go
│ ├── gin_test_helper.go
│ ├── mock_app.go
│ └── tidb_version.go
├── ui/
│ ├── .editorconfig
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .husky/
│ │ └── pre-commit
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── OWNERS
│ ├── README.md
│ ├── go.mod
│ ├── less-vars.js
│ ├── netlify.toml
│ ├── package.json
│ ├── packages/
│ │ ├── clinic-client/
│ │ │ ├── gulpfile.js
│ │ │ ├── openapitools.json
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── client/
│ │ │ │ └── api/
│ │ │ │ ├── api.ts
│ │ │ │ ├── base.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── configuration.ts
│ │ │ │ └── index.ts
│ │ │ ├── swagger/
│ │ │ │ ├── .openapi_config.yaml
│ │ │ │ ├── gen_api.sh
│ │ │ │ └── spec.json
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-client/
│ │ │ ├── gulpfile.js
│ │ │ ├── openapitools.json
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── client/
│ │ │ │ └── api/
│ │ │ │ ├── api/
│ │ │ │ │ ├── default-api.ts
│ │ │ │ │ └── statement-api.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── base.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── configuration.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── models/
│ │ │ │ ├── clusterinfo-cluster-statistics-partial.ts
│ │ │ │ ├── clusterinfo-cluster-statistics.ts
│ │ │ │ ├── clusterinfo-get-hosts-info-response.ts
│ │ │ │ ├── clusterinfo-store-topology-response.ts
│ │ │ │ ├── code-share-request.ts
│ │ │ │ ├── code-share-response.ts
│ │ │ │ ├── config-key-visual-config.ts
│ │ │ │ ├── config-profiling-config.ts
│ │ │ │ ├── config-ssocore-config.ts
│ │ │ │ ├── configuration-all-config-items.ts
│ │ │ │ ├── configuration-edit-request.ts
│ │ │ │ ├── configuration-edit-response.ts
│ │ │ │ ├── configuration-item.ts
│ │ │ │ ├── conprof-component-num.ts
│ │ │ │ ├── conprof-component.ts
│ │ │ │ ├── conprof-continuous-profiling-config.ts
│ │ │ │ ├── conprof-estimate-size-res.ts
│ │ │ │ ├── conprof-group-profile-detail.ts
│ │ │ │ ├── conprof-group-profiles.ts
│ │ │ │ ├── conprof-ng-monitoring-config.ts
│ │ │ │ ├── conprof-profile-detail.ts
│ │ │ │ ├── conprof-target.ts
│ │ │ │ ├── deadlock-model.ts
│ │ │ │ ├── decorator-label-key.ts
│ │ │ │ ├── diagnose-gen-diagnosis-report-request.ts
│ │ │ │ ├── diagnose-generate-metrics-relation-request.ts
│ │ │ │ ├── diagnose-generate-report-request.ts
│ │ │ │ ├── diagnose-report.ts
│ │ │ │ ├── diagnose-table-def.ts
│ │ │ │ ├── diagnose-table-row-def.ts
│ │ │ │ ├── endpoint-apidefinition.ts
│ │ │ │ ├── endpoint-apiparam-definition.ts
│ │ │ │ ├── endpoint-request-payload.ts
│ │ │ │ ├── hostinfo-cpuinfo.ts
│ │ │ │ ├── hostinfo-cpuusage-info.ts
│ │ │ │ ├── hostinfo-info.ts
│ │ │ │ ├── hostinfo-instance-info.ts
│ │ │ │ ├── hostinfo-memory-usage-info.ts
│ │ │ │ ├── hostinfo-partition-info.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── info-info-response.ts
│ │ │ │ ├── info-table-schema.ts
│ │ │ │ ├── info-who-am-iresponse.ts
│ │ │ │ ├── logsearch-create-task-group-request.ts
│ │ │ │ ├── logsearch-preview-model.ts
│ │ │ │ ├── logsearch-search-log-request.ts
│ │ │ │ ├── logsearch-task-group-model.ts
│ │ │ │ ├── logsearch-task-group-response.ts
│ │ │ │ ├── logsearch-task-model.ts
│ │ │ │ ├── matrix-matrix.ts
│ │ │ │ ├── metrics-get-prom-address-config-response.ts
│ │ │ │ ├── metrics-put-custom-prom-address-request.ts
│ │ │ │ ├── metrics-put-custom-prom-address-response.ts
│ │ │ │ ├── metrics-query-response.ts
│ │ │ │ ├── model-request-target-node.ts
│ │ │ │ ├── model-request-target-statistics.ts
│ │ │ │ ├── profiling-group-detail-response.ts
│ │ │ │ ├── profiling-start-request.ts
│ │ │ │ ├── profiling-task-group-model.ts
│ │ │ │ ├── profiling-task-model.ts
│ │ │ │ ├── queryeditor-run-request.ts
│ │ │ │ ├── queryeditor-run-response.ts
│ │ │ │ ├── resourcemanager-calibrate-response.ts
│ │ │ │ ├── resourcemanager-get-config-response.ts
│ │ │ │ ├── resourcemanager-resource-info-row-def.ts
│ │ │ │ ├── rest-error-response.ts
│ │ │ │ ├── slowquery-get-list-request.ts
│ │ │ │ ├── slowquery-model.ts
│ │ │ │ ├── sso-create-impersonation-request.ts
│ │ │ │ ├── sso-set-config-request.ts
│ │ │ │ ├── sso-ssoimpersonation-model.ts
│ │ │ │ ├── statement-binding.ts
│ │ │ │ ├── statement-editable-config.ts
│ │ │ │ ├── statement-get-statements-request.ts
│ │ │ │ ├── statement-model.ts
│ │ │ │ ├── statement-time-range.ts
│ │ │ │ ├── topology-alert-manager-info.ts
│ │ │ │ ├── topology-grafana-info.ts
│ │ │ │ ├── topology-pdinfo.ts
│ │ │ │ ├── topology-scheduling-info.ts
│ │ │ │ ├── topology-store-info.ts
│ │ │ │ ├── topology-store-labels.ts
│ │ │ │ ├── topology-store-location.ts
│ │ │ │ ├── topology-ti-cdcinfo.ts
│ │ │ │ ├── topology-ti-dbinfo.ts
│ │ │ │ ├── topology-ti-proxy-info.ts
│ │ │ │ ├── topology-tsoinfo.ts
│ │ │ │ ├── topsql-editable-config.ts
│ │ │ │ ├── topsql-instance-item.ts
│ │ │ │ ├── topsql-instance-response.ts
│ │ │ │ ├── topsql-summary-by-item.ts
│ │ │ │ ├── topsql-summary-item.ts
│ │ │ │ ├── topsql-summary-plan-item.ts
│ │ │ │ ├── topsql-summary-response.ts
│ │ │ │ ├── topsql-tikv-network-io-collection-config.ts
│ │ │ │ ├── topsql-update-tikv-network-io-collection-response.ts
│ │ │ │ ├── user-authenticate-form.ts
│ │ │ │ ├── user-get-login-info-response.ts
│ │ │ │ ├── user-sign-out-info.ts
│ │ │ │ ├── user-token-response.ts
│ │ │ │ └── version-info.ts
│ │ │ ├── swagger/
│ │ │ │ ├── .openapi_config.yaml
│ │ │ │ ├── gen_api.sh
│ │ │ │ └── spec.json
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-clinic-cloud/
│ │ │ ├── .gitignore
│ │ │ ├── builder.js
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ ├── diagnose-report/
│ │ │ │ │ └── index.html
│ │ │ │ ├── graphvizlib.wasm
│ │ │ │ ├── index.html
│ │ │ │ └── ngm.html
│ │ │ ├── src/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── ClusterInfo/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Deadlock/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── DebugAPI/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Diagnose/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── KeyViz/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Monitoring/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── QueryEditor/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ResourceManager/
│ │ │ │ │ │ ├── context-impl.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SearchLogs/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SlowQuery/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Statement/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SystemReport/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSQL/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSlowQuery/
│ │ │ │ │ │ ├── context-provider.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ └── slowqueries.json
│ │ │ │ │ └── UserProfile/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── meta.ts
│ │ │ │ ├── client/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── dashboardApp/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── Sider/
│ │ │ │ │ │ │ │ ├── Banner.module.less
│ │ │ │ │ │ │ │ ├── Banner.tsx
│ │ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── nprogress.less
│ │ │ │ ├── diagnoseReportApp/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiagnosisReport.tsx
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── index.css
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── react-app-env.d.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── types.ts
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ ├── styles/
│ │ │ │ │ ├── override.less
│ │ │ │ │ └── style.less
│ │ │ │ └── utils/
│ │ │ │ ├── distro/
│ │ │ │ │ ├── assetsRes.ts
│ │ │ │ │ ├── stringsRes.ts
│ │ │ │ │ └── strings_res.json
│ │ │ │ ├── globalConfig.ts
│ │ │ │ ├── publicPathPrefix.ts
│ │ │ │ ├── registry.ts
│ │ │ │ └── store.ts
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-clinic-op/
│ │ │ ├── README.md
│ │ │ ├── builder.js
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ ├── src/
│ │ │ │ ├── App.tsx
│ │ │ │ ├── apps/
│ │ │ │ │ └── SlowQuery/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── client/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── index.tsx
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ └── styles/
│ │ │ │ ├── override.less
│ │ │ │ └── style.less
│ │ │ └── tsconfig.json
│ │ ├── tidb-dashboard-for-op/
│ │ │ ├── builder.js
│ │ │ ├── cypress/
│ │ │ │ ├── .eslintrc.json
│ │ │ │ ├── README.md
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── topsql_instance:end=1641934800&start=1641916800.json
│ │ │ │ │ ├── topsql_summary:end=1641934800&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641916800&top=5&window=123s.json
│ │ │ │ │ ├── topsql_summary_large_timerange:end=1641916800&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641484800&top=5&window=2929s.json
│ │ │ │ │ ├── topsql_summary_small_timerange:end=1641920460&instance=127.0.0.1%3A10080&instance_type=tidb&start=1641920400&top=5&window=1s.json
│ │ │ │ │ └── uri.json
│ │ │ │ ├── integration/
│ │ │ │ │ ├── components.js
│ │ │ │ │ ├── login/
│ │ │ │ │ │ ├── login_session.spec.js
│ │ │ │ │ │ ├── user_login.compat_spec.js
│ │ │ │ │ │ └── user_login.spec.js
│ │ │ │ │ ├── slow_query/
│ │ │ │ │ │ ├── 01-list.spec.js
│ │ │ │ │ │ ├── 02-detail.spec.js
│ │ │ │ │ │ └── list.compat_spec.js
│ │ │ │ │ ├── statement/
│ │ │ │ │ │ ├── 01-list.spec.js
│ │ │ │ │ │ ├── 02-detail.spec.js
│ │ │ │ │ │ └── list.compat_spec.js
│ │ │ │ │ ├── topsql/
│ │ │ │ │ │ ├── topsql.spec.ts
│ │ │ │ │ │ ├── topsql.without_ngm_spec.js
│ │ │ │ │ │ └── topsql_security.spec.js
│ │ │ │ │ └── utils.js
│ │ │ │ ├── plugins/
│ │ │ │ │ └── index.js
│ │ │ │ ├── support/
│ │ │ │ │ ├── commands.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── types/
│ │ │ │ ├── global.d.ts
│ │ │ │ └── mocha.d.ts
│ │ │ ├── cypress.json
│ │ │ ├── gulpfile.js
│ │ │ ├── package.json
│ │ │ ├── process-shim.js
│ │ │ ├── public/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── diagnoseReport.html
│ │ │ │ ├── graphvizlib.wasm
│ │ │ │ ├── index.html
│ │ │ │ └── test-portal/
│ │ │ │ └── index.html
│ │ │ ├── src/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── ClusterInfo/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Deadlock/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── DebugAPI/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Diagnose/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── KeyViz/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Monitoring/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ └── metricsQueries.ts
│ │ │ │ │ ├── QueryEditor/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── ResourceManager/
│ │ │ │ │ │ ├── context-impl.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SearchLogs/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SlowQuery/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── Statement/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── SystemReport/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ ├── TopSQL/
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── meta.ts
│ │ │ │ │ └── UserProfile/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── meta.ts
│ │ │ │ ├── client/
│ │ │ │ │ ├── apiBasePath.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── dashboardApp/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── Sider/
│ │ │ │ │ │ │ │ ├── Banner.module.less
│ │ │ │ │ │ │ │ ├── Banner.tsx
│ │ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── signin/
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── nprogress.less
│ │ │ │ ├── diagnoseReportApp/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiagnosisReport.tsx
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── index.css
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── react-app-env.d.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── types.ts
│ │ │ │ ├── react-app-env.d.ts
│ │ │ │ ├── styles/
│ │ │ │ │ ├── override.less
│ │ │ │ │ └── style.less
│ │ │ │ └── utils/
│ │ │ │ ├── appOptions.ts
│ │ │ │ ├── auth.ts
│ │ │ │ ├── authSSO.ts
│ │ │ │ ├── distro/
│ │ │ │ │ ├── assetsRes.ts
│ │ │ │ │ ├── stringsRes.ts
│ │ │ │ │ └── strings_res.json
│ │ │ │ ├── publicPathPrefix.ts
│ │ │ │ ├── registry.ts
│ │ │ │ └── store.ts
│ │ │ └── tsconfig.json
│ │ └── tidb-dashboard-lib/
│ │ ├── builder.js
│ │ ├── gulpfile.js
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── apps/
│ │ │ │ ├── ClusterInfo/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DiskTable.tsx
│ │ │ │ │ │ ├── HostTable.tsx
│ │ │ │ │ │ ├── InstanceTable.tsx
│ │ │ │ │ │ ├── Statistics.module.less
│ │ │ │ │ │ ├── Statistics.tsx
│ │ │ │ │ │ ├── StoreLocation.tsx
│ │ │ │ │ │ └── StoreLocationTree/
│ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ └── List.tsx
│ │ │ │ │ ├── status/
│ │ │ │ │ │ └── status.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Configuration/
│ │ │ │ │ ├── InlineEditor.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── ContinuousProfiling/
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ConProfSettingForm.tsx
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── Deadlock/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── DeadlockChainGraph.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── DebugAPI/
│ │ │ │ │ ├── apilist/
│ │ │ │ │ │ ├── ApiForm.tsx
│ │ │ │ │ │ ├── ApiList.module.less
│ │ │ │ │ │ ├── ApiList.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ ├── Database.tsx
│ │ │ │ │ │ ├── Enum.tsx
│ │ │ │ │ │ ├── Host.tsx
│ │ │ │ │ │ ├── Table.tsx
│ │ │ │ │ │ ├── TableID.tsx
│ │ │ │ │ │ ├── Text.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── useLimitSelection.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Diagnose/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── DiagnosisTable.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── DiagnoseGenerator.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── tableColumns.tsx
│ │ │ │ ├── InstanceProfiling/
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── combineTargetStats.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── KeyViz/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── KeyViz.less
│ │ │ │ │ │ ├── KeyViz.tsx
│ │ │ │ │ │ ├── KeyVizSettingForm.tsx
│ │ │ │ │ │ └── KeyVizToolbar.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── heatmap/
│ │ │ │ │ │ ├── axis/
│ │ │ │ │ │ │ ├── histogram.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── label-axis.ts
│ │ │ │ │ │ ├── buffer.ts
│ │ │ │ │ │ ├── chart.ts
│ │ │ │ │ │ ├── color.ts
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── legend.ts
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── api.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── Monitoring/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── Monitoring.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── OptimizerTrace/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── LogicalOperatorTree.tsx
│ │ │ │ │ │ ├── OperatorTree.module.less
│ │ │ │ │ │ ├── PhysicalCostTree.tsx
│ │ │ │ │ │ └── PhysicalOperatorTree.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── examples/
│ │ │ │ │ │ ├── new-format.json
│ │ │ │ │ │ └── old-format.json
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── Overview/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Instances.tsx
│ │ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ │ ├── MonitorAlert.tsx
│ │ │ │ │ │ └── Styles.module.less
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── telemetry.ts
│ │ │ │ ├── QueryEditor/
│ │ │ │ │ ├── Editor.module.less
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── ResultTable.module.less
│ │ │ │ │ ├── ResultTable.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── editorThemes/
│ │ │ │ │ │ ├── oneHalfDark.js
│ │ │ │ │ │ └── oneHalfLight.js
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── ResourceManager/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Configuration.tsx
│ │ │ │ │ │ ├── EstimateCapacity.tsx
│ │ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── uilts/
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── metricQueries.ts
│ │ │ │ │ └── url-state.ts
│ │ │ │ ├── SQLAdvisor/
│ │ │ │ │ ├── component/
│ │ │ │ │ │ ├── IndexInsightList.tsx
│ │ │ │ │ │ ├── IndexInsightListWithRegister.module.less
│ │ │ │ │ │ ├── IndexInsightListWithRegister.tsx
│ │ │ │ │ │ ├── IndexInsightTable.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── index.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ ├── types/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── dbaasSecuritySetting.ts
│ │ │ │ │ └── suggestedCommandMaps.tsx
│ │ │ │ ├── SearchLogs/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Icon.tsx
│ │ │ │ │ │ ├── LogRow.module.less
│ │ │ │ │ │ ├── LogRow.tsx
│ │ │ │ │ │ ├── SearchHeader.tsx
│ │ │ │ │ │ ├── SearchProgress.tsx
│ │ │ │ │ │ ├── SearchResult.tsx
│ │ │ │ │ │ ├── Styles.module.less
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── LogSearch.tsx
│ │ │ │ │ │ ├── LogSearchDetail.tsx
│ │ │ │ │ │ ├── LogSearchHistory.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── SlowQuery/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── LimitTimeRange.tsx
│ │ │ │ │ │ ├── SlowQueriesTable.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DetailTabBasic.tsx
│ │ │ │ │ │ │ ├── DetailTabCopr.tsx
│ │ │ │ │ │ │ ├── DetailTabRuV2.tsx
│ │ │ │ │ │ │ ├── DetailTabTime.tsx
│ │ │ │ │ │ │ ├── DetailTabTxn.tsx
│ │ │ │ │ │ │ ├── DetailTabs.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── DownloadDBFileModal.tsx
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ ├── tableColumns.tsx
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ ├── useSchemaColumns.ts
│ │ │ │ │ └── useSlowQueryTableController.ts
│ │ │ │ ├── Statement/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── StatementsTable.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── PlanBind.module.less
│ │ │ │ │ │ │ ├── PlanBind.tsx
│ │ │ │ │ │ │ ├── PlanDetail.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabBasic.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabCopr.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabTime.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabTxn.tsx
│ │ │ │ │ │ │ ├── PlanDetailTabs.tsx
│ │ │ │ │ │ │ ├── SlowQueryTab.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ │ ├── StatementSettingForm.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── tableColumns.tsx
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ ├── useSchemaColumns.ts
│ │ │ │ │ └── useStatementTableController.ts
│ │ │ │ ├── SystemReport/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── ReportHistory.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ReportGenerator.tsx
│ │ │ │ │ │ ├── ReportStatus.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ ├── TopSQL/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── Filter/
│ │ │ │ │ │ ├── InstanceSelect.tsx
│ │ │ │ │ │ ├── common.module.less
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ ├── ListChart.tsx
│ │ │ │ │ │ ├── ListDetail/
│ │ │ │ │ │ │ ├── ListDetail.tsx
│ │ │ │ │ │ │ ├── ListDetailContent.tsx
│ │ │ │ │ │ │ ├── ListDetailTable.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── ListTable.tsx
│ │ │ │ │ │ ├── SettingsForm.module.less
│ │ │ │ │ │ ├── SettingsForm.tsx
│ │ │ │ │ │ └── legendAction.ts
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── specialRecord.ts
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ └── useRecordSelection.ts
│ │ │ │ ├── TopSlowQuery/
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── CountChart.tsx
│ │ │ │ │ │ ├── List.module.less
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── ListTable.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── uilts/
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── telemetry.ts
│ │ │ │ │ └── url-state.ts
│ │ │ │ ├── UserProfile/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Form.Language.tsx
│ │ │ │ │ │ ├── Form.PrometheusAddr.tsx
│ │ │ │ │ │ ├── Form.SSO.tsx
│ │ │ │ │ │ ├── Form.Session.tsx
│ │ │ │ │ │ ├── Form.Version.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── translations/
│ │ │ │ │ │ ├── en.yaml
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.yaml
│ │ │ │ │ └── utils/
│ │ │ │ │ └── helper.ts
│ │ │ │ └── index.ts
│ │ │ ├── client/
│ │ │ │ ├── clinic-extensions.d.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── models.ts
│ │ │ ├── components/
│ │ │ │ ├── AnimatedSkeleton/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── AppearAnimate/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── AutoRefreshButton/
│ │ │ │ │ ├── AutoRefreshButton.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Bar/
│ │ │ │ │ ├── Bar.module.less
│ │ │ │ │ ├── Bar.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── BaseSelect/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── BinaryPlanTable/
│ │ │ │ │ ├── BinaryPlanColsSelector.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── sample-data/
│ │ │ │ │ ├── binary-plan.json
│ │ │ │ │ └── detail-res.json
│ │ │ │ ├── Blink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Card/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CardTable/
│ │ │ │ │ ├── GroupHeader.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CardTabs/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ColumnsSelector/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CopyLink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DatePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DateTime/
│ │ │ │ │ ├── Calendar.tsx
│ │ │ │ │ ├── Long.tsx
│ │ │ │ │ ├── calendarPlugin.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Descriptions/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DrawerFooter/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ErrorBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Expand/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Head/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── HighlightSQL/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── InstanceSelect/
│ │ │ │ │ ├── DropOverlay.tsx
│ │ │ │ │ ├── TableWithFilter.module.less
│ │ │ │ │ ├── TableWithFilter.tsx
│ │ │ │ │ ├── ValueDisplay.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── InstanceStatusBadge/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LanguageDropdown/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LimitTimeRange/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MultiSelect/
│ │ │ │ │ ├── DropOverlay.tsx
│ │ │ │ │ ├── Plain.tsx
│ │ │ │ │ ├── index.stories.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Ngm/
│ │ │ │ │ ├── NgmNotStarted.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── ParamsPageWrapper/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── PlanText/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Pre/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Root/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TextWithInfo/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TextWrap/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TimePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TimeRangeSelector/
│ │ │ │ │ ├── WithZoomOut.tsx
│ │ │ │ │ ├── hook.tsx
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Toolbar/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TxtDownloadLink/
│ │ │ │ │ ├── index.module.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ValueWithTooltip/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── VisualPlan/
│ │ │ │ │ ├── DetailDrawer.tsx
│ │ │ │ │ ├── VisualPlan.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── translations/
│ │ │ │ │ ├── en.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh.yaml
│ │ │ │ └── index.ts
│ │ │ ├── hooks/
│ │ │ │ ├── useLocationChange.ts
│ │ │ │ ├── useQueryParams.ts
│ │ │ │ └── useURLTimeRange.ts
│ │ │ ├── index.ts
│ │ │ ├── react-app-env.d.ts
│ │ │ ├── types/
│ │ │ │ ├── index.ts
│ │ │ │ └── reqConfig.ts
│ │ │ └── utils/
│ │ │ ├── charts.ts
│ │ │ ├── distro.ts
│ │ │ ├── format.ts
│ │ │ ├── i18n.ts
│ │ │ ├── index.ts
│ │ │ ├── instanceTable.ts
│ │ │ ├── local-download.ts
│ │ │ ├── openLink.ts
│ │ │ ├── prometheus/
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── query.ts
│ │ │ ├── routing.ts
│ │ │ ├── selectionWithFilter.ts
│ │ │ ├── sqlFormatter/
│ │ │ │ └── index.ts
│ │ │ ├── store.ts
│ │ │ ├── tableColumnFactory.tsx
│ │ │ ├── tableColumns.tsx
│ │ │ ├── telemetry.ts
│ │ │ ├── timezone.ts
│ │ │ ├── useCache.ts
│ │ │ ├── useCacheItemIndex.ts
│ │ │ ├── useChange.ts
│ │ │ ├── useClientRequest.ts
│ │ │ ├── useOrderState.ts
│ │ │ ├── useQueryParams.ts
│ │ │ ├── useVersionedLocalStorageState.ts
│ │ │ └── wdyr.ts
│ │ └── tsconfig.json
│ ├── pnpm-workspace.yaml
│ └── tsconfig.json
├── ui-v2/
│ ├── .changeset/
│ │ ├── README.md
│ │ └── config.json
│ ├── .gitignore
│ ├── .husky/
│ │ └── pre-commit
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── README.md
│ ├── api-specs/
│ │ └── azores.json
│ ├── eslint.config.js
│ ├── orval.config.ts
│ ├── package.json
│ ├── packages/
│ │ ├── api/
│ │ │ ├── client/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── http/
│ │ │ │ │ │ └── client.ts
│ │ │ │ │ └── index.ts
│ │ │ │ └── tsconfig.json
│ │ │ └── server/
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── azores/
│ │ │ │ ├── handlers/
│ │ │ │ │ ├── apiKeyServiceCreateApiKey.ts
│ │ │ │ │ ├── apiKeyServiceDeleteApiKey.ts
│ │ │ │ │ ├── apiKeyServiceGetApiKey.ts
│ │ │ │ │ ├── apiKeyServiceGetTemErrorDetail.ts
│ │ │ │ │ ├── apiKeyServiceListApiKeys.ts
│ │ │ │ │ ├── apiKeyServiceResetSecretKey.ts
│ │ │ │ │ ├── apiKeyServiceUpdateApiKey.ts
│ │ │ │ │ ├── clusterBRServiceCreateBackupTask.ts
│ │ │ │ │ ├── clusterBRServiceCreateRestoreTask.ts
│ │ │ │ │ ├── clusterBRServiceDetectCluster.ts
│ │ │ │ │ ├── clusterBRServiceGetClusterBackupPolicy.ts
│ │ │ │ │ ├── clusterBRServiceListClusterBRTasks.ts
│ │ │ │ │ ├── clusterBRServiceListClusterBackupRecords.ts
│ │ │ │ │ ├── clusterServiceDeleteProcess.ts
│ │ │ │ │ ├── clusterServiceGetProcessList.ts
│ │ │ │ │ ├── credentialServiceCreateCredential.ts
│ │ │ │ │ ├── credentialServiceDeleteCredential.ts
│ │ │ │ │ ├── credentialServiceDownloadRSAKey.ts
│ │ │ │ │ ├── credentialServiceGenerateRSAKey.ts
│ │ │ │ │ ├── credentialServiceGetCredential.ts
│ │ │ │ │ ├── credentialServiceListCredentials.ts
│ │ │ │ │ ├── credentialServiceUpdateCredential.ts
│ │ │ │ │ ├── credentialServiceValidateConnection.ts
│ │ │ │ │ ├── diagnosisServiceAddSqlLimit.ts
│ │ │ │ │ ├── diagnosisServiceBindSqlPlan.ts
│ │ │ │ │ ├── diagnosisServiceCheckSqlLimitSupport.ts
│ │ │ │ │ ├── diagnosisServiceCheckSqlPlanSupport.ts
│ │ │ │ │ ├── diagnosisServiceDownloadSlowQueryList.ts
│ │ │ │ │ ├── diagnosisServiceGetResourceGroupList.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableAdvancedFilterInfo.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableAdvancedFilters.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryAvailableFields.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryDetail.ts
│ │ │ │ │ ├── diagnosisServiceGetSlowQueryList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlLimitList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlPlanBindingList.ts
│ │ │ │ │ ├── diagnosisServiceGetSqlPlanList.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableAdvancedFilterInfo.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableAdvancedFilters.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlAvailableFields.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlConfigs.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlDetail.ts
│ │ │ │ │ ├── diagnosisServiceGetTopSqlList.ts
│ │ │ │ │ ├── diagnosisServiceRemoveSqlLimit.ts
│ │ │ │ │ ├── diagnosisServiceUnbindSqlPlan.ts
│ │ │ │ │ ├── diagnosisServiceUpdateTopSqlConfigs.ts
│ │ │ │ │ ├── globalBRServiceCreateBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceDeleteBRTask.ts
│ │ │ │ │ ├── globalBRServiceDeleteBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceGetBRSummary.ts
│ │ │ │ │ ├── globalBRServiceGetBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceListBRTasks.ts
│ │ │ │ │ ├── globalBRServiceListBackupPolicies.ts
│ │ │ │ │ ├── globalBRServicePreCheckBackupPolicy.ts
│ │ │ │ │ ├── globalBRServiceStartBRTask.ts
│ │ │ │ │ ├── globalBRServiceStopBRTask.ts
│ │ │ │ │ ├── globalBRServiceUpdateBackupPolicy.ts
│ │ │ │ │ ├── hostServiceBatchDelete.ts
│ │ │ │ │ ├── hostServiceCheck.ts
│ │ │ │ │ ├── hostServiceCreateHosts.ts
│ │ │ │ │ ├── hostServiceDelete.ts
│ │ │ │ │ ├── hostServiceDownloadHostTemplate.ts
│ │ │ │ │ ├── hostServiceDownloadListHosts.ts
│ │ │ │ │ ├── hostServiceFix.ts
│ │ │ │ │ ├── hostServiceGetDisks.ts
│ │ │ │ │ ├── hostServiceGetHost.ts
│ │ │ │ │ ├── hostServiceGetTiDBProcesses.ts
│ │ │ │ │ ├── hostServiceHostConfirm.ts
│ │ │ │ │ ├── hostServiceImport.ts
│ │ │ │ │ ├── hostServiceImportTask.ts
│ │ │ │ │ ├── hostServiceListHosts.ts
│ │ │ │ │ ├── hostServiceReport.ts
│ │ │ │ │ ├── hostServiceUpdateHost.ts
│ │ │ │ │ ├── labelServiceBatchCreateLabels.ts
│ │ │ │ │ ├── labelServiceBindLabel.ts
│ │ │ │ │ ├── labelServiceBindResource.ts
│ │ │ │ │ ├── labelServiceCreateLabel.ts
│ │ │ │ │ ├── labelServiceDeleteLabel.ts
│ │ │ │ │ ├── labelServiceGetLabel.ts
│ │ │ │ │ ├── labelServiceGetLabelWithBindings.ts
│ │ │ │ │ ├── labelServiceListLabelKeys.ts
│ │ │ │ │ ├── labelServiceListLabels.ts
│ │ │ │ │ ├── labelServiceListLabelsByResourceType.ts
│ │ │ │ │ ├── labelServiceListLabelsWithBindings.ts
│ │ │ │ │ ├── labelServiceUpdateLabel.ts
│ │ │ │ │ ├── licenseServiceActivateFreeLicense.ts
│ │ │ │ │ ├── licenseServiceActivateLicense.ts
│ │ │ │ │ ├── licenseServiceGetDeviceCode.ts
│ │ │ │ │ ├── licenseServiceGetLicense.ts
│ │ │ │ │ ├── locationServiceCreateLocations.ts
│ │ │ │ │ ├── locationServiceDeleteLocation.ts
│ │ │ │ │ ├── locationServiceGetLocations.ts
│ │ │ │ │ ├── locationServiceListLocations.ts
│ │ │ │ │ ├── locationServiceUpdateLocations.ts
│ │ │ │ │ ├── metricsServiceGetClusterMetricData.ts
│ │ │ │ │ ├── metricsServiceGetClusterMetricInstance.ts
│ │ │ │ │ ├── metricsServiceGetHostMetricData.ts
│ │ │ │ │ ├── metricsServiceGetMetrics.ts
│ │ │ │ │ ├── metricsServiceGetOverviewStatus.ts
│ │ │ │ │ ├── metricsServiceGetTopMetricConfig.ts
│ │ │ │ │ ├── metricsServiceGetTopMetricData.ts
│ │ │ │ │ ├── roleServiceCreateRole.ts
│ │ │ │ │ ├── roleServiceDeleteRole.ts
│ │ │ │ │ ├── roleServiceListRoles.ts
│ │ │ │ │ ├── roleServiceUpdateRole.ts
│ │ │ │ │ ├── tagServiceBatchCreateTags.ts
│ │ │ │ │ ├── tagServiceBindResource.ts
│ │ │ │ │ ├── tagServiceBindTag.ts
│ │ │ │ │ ├── tagServiceCreateTag.ts
│ │ │ │ │ ├── tagServiceDeleteTag.ts
│ │ │ │ │ ├── tagServiceGetTag.ts
│ │ │ │ │ ├── tagServiceGetTagWithBindings.ts
│ │ │ │ │ ├── tagServiceListTagKeys.ts
│ │ │ │ │ ├── tagServiceListTags.ts
│ │ │ │ │ ├── tagServiceListTagsByResourceType.ts
│ │ │ │ │ ├── tagServiceListTagsWithBindings.ts
│ │ │ │ │ ├── tagServiceUpdateTag.ts
│ │ │ │ │ ├── tiupsServiceCreateTiups.ts
│ │ │ │ │ ├── tiupsServiceDeleteTiups.ts
│ │ │ │ │ ├── tiupsServiceGetTiups.ts
│ │ │ │ │ ├── tiupsServiceGetTiupsCluster.ts
│ │ │ │ │ ├── tiupsServiceListTiups.ts
│ │ │ │ │ ├── tiupsServiceUpdateTiups.ts
│ │ │ │ │ ├── userServiceChangePassword.ts
│ │ │ │ │ ├── userServiceCreateUser.ts
│ │ │ │ │ ├── userServiceDeleteUser.ts
│ │ │ │ │ ├── userServiceGetUser.ts
│ │ │ │ │ ├── userServiceGetUserProfile.ts
│ │ │ │ │ ├── userServiceListUserRoles.ts
│ │ │ │ │ ├── userServiceListUsers.ts
│ │ │ │ │ ├── userServiceLogin.ts
│ │ │ │ │ ├── userServiceLogout.ts
│ │ │ │ │ ├── userServiceResetPassword.ts
│ │ │ │ │ ├── userServiceUpdateUser.ts
│ │ │ │ │ └── userServiceValidateSession.ts
│ │ │ │ ├── index.context.ts
│ │ │ │ ├── index.schemas.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── index.validator.ts
│ │ │ │ ├── index.zod.ts
│ │ │ │ └── sample-res/
│ │ │ │ ├── metrics-config-cluster-overview.json
│ │ │ │ ├── metrics-config-cluster.json
│ │ │ │ ├── metrics-config-host.json
│ │ │ │ ├── metrics-config-overview.json
│ │ │ │ ├── metrics-data-cpu-usage.json
│ │ │ │ ├── slow-query-detail.json
│ │ │ │ ├── slow-query-list.json
│ │ │ │ ├── statement-list.json
│ │ │ │ ├── statement-plans-detail.json
│ │ │ │ ├── statement-plans-list.json
│ │ │ │ └── statement-slow-query-list.json
│ │ │ ├── tsconfig.json
│ │ │ └── wrangler.toml
│ │ ├── libs/
│ │ │ ├── 1-charts/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── chart-theme-switch.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── sample-data.ts
│ │ │ │ │ ├── series-chart.tsx
│ │ │ │ │ ├── series-render.tsx
│ │ │ │ │ ├── style.scss
│ │ │ │ │ └── type.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── 1-icons/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── 1-utils/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── delay.ts
│ │ │ │ │ ├── env.d.ts
│ │ │ │ │ ├── format.ts
│ │ │ │ │ ├── i18n.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── memory-state/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── reset-filters-state.ts
│ │ │ │ │ ├── prom.ts
│ │ │ │ │ ├── time-range.ts
│ │ │ │ │ └── url-state/
│ │ │ │ │ ├── advanced-filters-url-state.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── pagination-url-state.ts
│ │ │ │ │ ├── pro-table-pagination-state.ts
│ │ │ │ │ ├── pro-table-sort-state.ts
│ │ │ │ │ ├── search-url-state.ts
│ │ │ │ │ ├── sort-url-state.ts
│ │ │ │ │ ├── timerange-url-state.ts
│ │ │ │ │ └── use-url-state.tsx
│ │ │ │ └── tsconfig.json
│ │ │ ├── 2-primitive-ui/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── uikit-theme-provider.tsx
│ │ │ │ └── tsconfig.json
│ │ │ ├── 3-biz-ui/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── package.json
│ │ │ │ ├── rollup.config.js
│ │ │ │ ├── src/
│ │ │ │ │ ├── action-drawer.tsx
│ │ │ │ │ ├── advanced-filters/
│ │ │ │ │ │ ├── filter-setting.tsx
│ │ │ │ │ │ ├── filters-modal.tsx
│ │ │ │ │ │ ├── filters-setting.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── locales.ts
│ │ │ │ │ ├── auto-refresh-button/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── progress.tsx
│ │ │ │ │ ├── charts-multi-select.tsx
│ │ │ │ │ ├── cols-multi-select.tsx
│ │ │ │ │ ├── custom-json-view.tsx
│ │ │ │ │ ├── filter-multi-select.tsx
│ │ │ │ │ ├── highlight-sql.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── info-table.tsx
│ │ │ │ │ ├── loading-skeleton.tsx
│ │ │ │ │ ├── plan-table/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── parser.ts
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ ├── plan-v1-1.txt
│ │ │ │ │ │ ├── plan-v1-2.txt
│ │ │ │ │ │ ├── plan-v2-1.txt
│ │ │ │ │ │ └── slow-query-detail.json
│ │ │ │ │ ├── sql-with-hover.tsx
│ │ │ │ │ ├── status-indicator.tsx
│ │ │ │ │ └── time-range-picker/
│ │ │ │ │ ├── custom.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── tsconfig.json
│ │ │ └── 4-apps/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── package.json
│ │ │ ├── rollup.config.js
│ │ │ ├── src/
│ │ │ │ ├── _re-exports/
│ │ │ │ │ ├── biz-ui.ts
│ │ │ │ │ ├── charts-css.ts
│ │ │ │ │ ├── charts.ts
│ │ │ │ │ ├── primitive-ui.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── _shared/
│ │ │ │ │ ├── cols-factory.tsx
│ │ │ │ │ ├── sql-history/
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── chart.tsx
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── time-range-clip-alert.tsx
│ │ │ │ │ │ ├── ctx/
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── locales/
│ │ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── zh.json
│ │ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── use-data.ts
│ │ │ │ │ ├── sql-limit/
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── setting.tsx
│ │ │ │ │ │ │ └── table.tsx
│ │ │ │ │ │ ├── ctx/
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── locales/
│ │ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── zh.json
│ │ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── use-data.ts
│ │ │ │ │ └── state-filters.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── metric/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── chart-actions-menu.tsx
│ │ │ │ │ │ ├── chart-body.tsx
│ │ │ │ │ │ ├── chart-header.tsx
│ │ │ │ │ │ ├── charts-select.tsx
│ │ │ │ │ │ └── loading-card.tsx
│ │ │ │ │ ├── ctx/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── zh.json
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── azores-cluster/
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-cluster-overview/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-host/
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ ├── azores-metric-detail/
│ │ │ │ │ │ │ ├── body.tsx
│ │ │ │ │ │ │ ├── drawer.tsx
│ │ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ │ └── modal.tsx
│ │ │ │ │ │ ├── azores-overview/
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ │ └── normal/
│ │ │ │ │ │ ├── chart-card.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── panel.tsx
│ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ ├── memory-state.ts
│ │ │ │ │ │ └── url-state.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── use-data.ts
│ │ │ │ ├── slow-query/
│ │ │ │ │ ├── ctx/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ ├── en.json
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── preset.ts
│ │ │ │ │ │ └── zh.json
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── advanced-filter-info-model.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── slowquery-model.ts
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── detail/
│ │ │ │ │ │ │ ├── detail-basic.tsx
│ │ │ │ │ │ │ ├── detail-copr.tsx
│ │ │ │ │ │ │ ├── detail-tabs.tsx
│ │ │ │ │ │ │ ├── detail-time.tsx
│ │ │ │ │ │ │ ├── detail-txn.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── plan.tsx
│ │ │ │ │ │ │ ├── query.tsx
│ │ │ │ │ │ │ ├── related-statement-button.tsx
│ │ │ │ │ │ │ ├── related-statement-link.tsx
│ │ │ │ │ │ │ ├── sql-history.tsx
│ │ │ │ │ │ │ └── sql-limit.tsx
│ │ │ │ │ │ └── list/
│ │ │ │ │ │ ├── advanced-filters-modal.tsx
│ │ │ │ │ │ ├── cols-select.tsx
│ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ ├── filters-with-advanced.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── refresh-button.tsx
│ │ │ │ │ │ ├── table.tsx
│ │ │ │ │ │ └── time-range-clip-alert.tsx
│ │ │ │ │ ├── shared-state/
│ │ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ │ └── memory-state.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ └── use-data.ts
│ │ │ │ └── statement/
│ │ │ │ ├── ctx/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── locales/
│ │ │ │ │ ├── en.json
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── preset.ts
│ │ │ │ │ └── zh.json
│ │ │ │ ├── models/
│ │ │ │ │ ├── advanced-filter-info-model.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── statement-config-model.ts
│ │ │ │ │ └── statement-model.ts
│ │ │ │ ├── pages/
│ │ │ │ │ ├── detail/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── plan-detail/
│ │ │ │ │ │ │ ├── detail-basic.tsx
│ │ │ │ │ │ │ ├── detail-copr.tsx
│ │ │ │ │ │ │ ├── detail-tabs.tsx
│ │ │ │ │ │ │ ├── detail-time.tsx
│ │ │ │ │ │ │ ├── detail-txn.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── plan.tsx
│ │ │ │ │ │ ├── plans-list/
│ │ │ │ │ │ │ ├── bind-sql-cell.tsx
│ │ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── plan-check-cell.tsx
│ │ │ │ │ │ │ ├── slow-query-cell.tsx
│ │ │ │ │ │ │ └── table.tsx
│ │ │ │ │ │ ├── sql-history.tsx
│ │ │ │ │ │ ├── sql-limit.tsx
│ │ │ │ │ │ ├── stmt-basic.tsx
│ │ │ │ │ │ └── stmt-sql.tsx
│ │ │ │ │ ├── list/
│ │ │ │ │ │ ├── advanced-filters-modal.tsx
│ │ │ │ │ │ ├── cols-select.tsx
│ │ │ │ │ │ ├── cols.tsx
│ │ │ │ │ │ ├── disabled-status.tsx
│ │ │ │ │ │ ├── filters-with-advanced.tsx
│ │ │ │ │ │ ├── filters.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── refresh-button.tsx
│ │ │ │ │ │ ├── stmt-setting-button.tsx
│ │ │ │ │ │ ├── table.tsx
│ │ │ │ │ │ └── time-range-fix-alert.tsx
│ │ │ │ │ └── setting/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── shared-state/
│ │ │ │ │ ├── detail-url-state.ts
│ │ │ │ │ ├── list-url-state.ts
│ │ │ │ │ └── memory-state.ts
│ │ │ │ └── utils/
│ │ │ │ ├── constants.ts
│ │ │ │ └── use-data.ts
│ │ │ └── tsconfig.json
│ │ ├── portals/
│ │ │ └── test/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── public/
│ │ │ │ └── swagger.index-advisor.json
│ │ │ ├── src/
│ │ │ │ ├── App.css
│ │ │ │ ├── App.tsx
│ │ │ │ ├── apps/
│ │ │ │ │ ├── metric/
│ │ │ │ │ │ ├── mock-api-app-provider.tsx
│ │ │ │ │ │ └── sample-data/
│ │ │ │ │ │ ├── normal-configs.ts
│ │ │ │ │ │ └── qps-type.json
│ │ │ │ │ ├── slow-query/
│ │ │ │ │ │ └── mock-api-app-provider.tsx
│ │ │ │ │ └── statement/
│ │ │ │ │ ├── mock-api-app-provider.tsx
│ │ │ │ │ └── stmt-types.ts
│ │ │ │ ├── index.css
│ │ │ │ ├── main.tsx
│ │ │ │ ├── providers/
│ │ │ │ │ ├── react-query-provider.tsx
│ │ │ │ │ └── url-state-provider.tsx
│ │ │ │ ├── router/
│ │ │ │ │ ├── devtools.tsx
│ │ │ │ │ ├── provider.tsx
│ │ │ │ │ └── router.ts
│ │ │ │ ├── routes/
│ │ │ │ │ ├── __root.tsx
│ │ │ │ │ ├── _apps-layout/
│ │ │ │ │ │ ├── metrics/
│ │ │ │ │ │ │ ├── azores-cluster-overview.lazy.tsx
│ │ │ │ │ │ │ ├── azores-cluster.lazy.tsx
│ │ │ │ │ │ │ ├── azores-host.lazy.tsx
│ │ │ │ │ │ │ ├── azores-overview.lazy.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── normal.lazy.tsx
│ │ │ │ │ │ ├── metrics.lazy.tsx
│ │ │ │ │ │ ├── slow-query/
│ │ │ │ │ │ │ ├── detail.lazy.tsx
│ │ │ │ │ │ │ └── index.lazy.tsx
│ │ │ │ │ │ ├── slow-query.lazy.tsx
│ │ │ │ │ │ ├── statement/
│ │ │ │ │ │ │ ├── detail.lazy.tsx
│ │ │ │ │ │ │ └── index.lazy.tsx
│ │ │ │ │ │ └── statement.lazy.tsx
│ │ │ │ │ ├── _apps-layout.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── login.lazy.tsx
│ │ │ │ └── vite-env.d.ts
│ │ │ ├── tsconfig.json
│ │ │ └── vite.config.ts
│ │ └── tsconfig.app.json
│ ├── pnpm-workspace.yaml
│ └── scripts/
│ ├── gen-locales.ts
│ └── gogocode-test/
│ ├── 1.js
│ └── 2.js
└── util/
├── assertutil/
│ ├── 1_main_test.go
│ ├── json.go
│ ├── json_test.go
│ └── mock.go
├── client/
│ ├── httpclient/
│ │ ├── 1_main_test.go
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── info.go
│ │ ├── request.go
│ │ ├── request_resty.go
│ │ ├── response.go
│ │ └── response_test.go
│ ├── pdclient/
│ │ ├── 1_main_test.go
│ │ ├── etcd_client.go
│ │ ├── fixture/
│ │ │ └── pd_server.go
│ │ ├── pd_api.go
│ │ ├── pd_api_client.go
│ │ ├── pd_api_highlevel.go
│ │ ├── pd_api_highlevel_test.go
│ │ └── pd_api_test.go
│ ├── schedulingclient/
│ │ └── status_client.go
│ ├── ticdcclient/
│ │ └── status_client.go
│ ├── tidbclient/
│ │ ├── sql_client.go
│ │ ├── status_client.go
│ │ ├── tidbproto/
│ │ │ ├── 1_main_test.go
│ │ │ ├── codec.go
│ │ │ ├── codec_test.go
│ │ │ └── model.go
│ │ └── tidbproxy/
│ │ └── proxy.go
│ ├── tiflashclient/
│ │ └── status_client.go
│ ├── tikvclient/
│ │ └── status_client.go
│ ├── tiproxyclient/
│ │ └── status_client.go
│ └── tsoclient/
│ └── status_client.go
├── csvutil/
│ ├── 1_main_test.go
│ ├── writer.go
│ └── writer_test.go
├── distro/
│ ├── 1_main_test.go
│ ├── distro.go
│ └── distro_test.go
├── featureflag/
│ ├── 1_main_test.go
│ ├── featureflag.go
│ ├── featureflag_test.go
│ ├── registry.go
│ └── registry_test.go
├── fxprinter/
│ └── fxprinter.go
├── gormutil/
│ ├── datatype/
│ │ ├── 1_main_test.go
│ │ ├── int.go
│ │ ├── int_test.go
│ │ ├── int_withdb_test.go
│ │ ├── nullable/
│ │ │ └── nullable.go
│ │ ├── timestamp.go
│ │ ├── timestamp_test.go
│ │ └── timestamp_withdb_test.go
│ └── virtualview/
│ ├── 1_main_test.go
│ ├── schema.go
│ ├── schema_test.go
│ ├── virtualview.go
│ └── virtualview_test.go
├── israce/
│ ├── no_race.go
│ └── race.go
├── jsonserde/
│ ├── 1_main_test.go
│ ├── convert.go
│ ├── default.go
│ ├── default_test.go
│ └── ginadapter/
│ ├── 1_main_test.go
│ ├── binding.go
│ ├── binding_test.go
│ ├── render.go
│ └── render_test.go
├── lifecyclectx/
│ ├── fx.go
│ └── lifecyclectxtest/
│ └── test.go
├── netutil/
│ ├── 1_main_test.go
│ ├── parse.go
│ └── parse_test.go
├── nocopy/
│ └── nocopy.go
├── proxy/
│ ├── 1_main_test.go
│ ├── proxy.go
│ ├── proxy_test.go
│ └── upstream.go
├── reflectutil/
│ ├── 1_main_test.go
│ ├── field.go
│ ├── field_test.go
│ ├── tag.go
│ └── tag_test.go
├── rest/
│ ├── 1_main_test.go
│ ├── context_helpers.go
│ ├── context_helpers_test.go
│ ├── empty_resp.go
│ ├── error.go
│ ├── error_resp.go
│ ├── error_resp_test.go
│ ├── error_test.go
│ └── fileswap/
│ ├── 1_main_test.go
│ ├── server.go
│ └── server_test.go
├── sqlitestore/
│ └── sqlitestore.go
├── testutil/
│ ├── db.go
│ ├── gintest/
│ │ └── context.go
│ ├── http_server.go
│ ├── httpmockutil/
│ │ └── responder.go
│ └── testdefault/
│ └── main.go
├── timeutil/
│ ├── 1_main_test.go
│ ├── format.go
│ └── format_test.go
├── tlsutil/
│ ├── 1_main_test.go
│ ├── config_ext.go
│ └── config_ext_test.go
├── topo/
│ ├── 1_main_test.go
│ ├── mock_TopologyProvider.go
│ ├── model.go
│ ├── model_desc.go
│ ├── model_info.go
│ ├── pdtopo/
│ │ ├── 1_main_test.go
│ │ ├── monitor.go
│ │ ├── pd.go
│ │ ├── pd_test.go
│ │ ├── provider_pd.go
│ │ ├── std_comp.go
│ │ ├── store.go
│ │ ├── store_test.go
│ │ └── tidb.go
│ ├── provider.go
│ ├── provider_cached.go
│ └── provider_cached_test.go
└── ziputil/
└── zip_writer.go
Showing preview only (482K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4904 symbols across 926 files)
FILE: cmd/tidb-dashboard/main.go
type DashboardCLIConfig (line 47) | type DashboardCLIConfig struct
function NewCLIConfig (line 58) | func NewCLIConfig() *DashboardCLIConfig {
function getContext (line 142) | func getContext() context.Context {
function buildTLSConfig (line 157) | func buildTLSConfig(tlsInfo *transport.TLSInfo, allowedNames *string) *t...
constant distroResFolderName (line 212) | distroResFolderName string = "distro-res"
constant distroStringsResFileName (line 213) | distroStringsResFileName string = "strings.json"
function loadDistroStringsRes (line 216) | func loadDistroStringsRes() {
function main (line 231) | func main() {
FILE: pkg/apiserver/apiserver.go
function Handler (line 71) | func Handler(s *Service) http.Handler {
type Service (line 77) | type Service struct
method IsRunning (line 108) | func (s *Service) IsRunning() bool {
method Start (line 158) | func (s *Service) Start(ctx context.Context) error {
method cleanAfterError (line 234) | func (s *Service) cleanAfterError() {
method Stop (line 244) | func (s *Service) Stop(ctx context.Context) error {
method NewStatusAwareHandler (line 261) | func (s *Service) NewStatusAwareHandler(handler http.Handler, stoppedH...
method handler (line 265) | func (s *Service) handler(w http.ResponseWriter, r *http.Request) {
method provideLocals (line 269) | func (s *Service) provideLocals() (*config.Config, http.FileSystem, *k...
function NewService (line 92) | func NewService(cfg *config.Config, stoppedHandler http.Handler, uiAsset...
function newClients (line 201) | func newClients(lc fx.Lifecycle, config *config.Config) (
function newAPIHandlerEngine (line 273) | func newAPIHandlerEngine() (apiHandlerEngine *gin.Engine, endpoint *gin....
FILE: pkg/apiserver/clusterinfo/host.go
method fetchAllInstanceHosts (line 19) | func (s *Service) fetchAllInstanceHosts() ([]string, error) {
method fetchAllHostsInfo (line 96) | func (s *Service) fetchAllHostsInfo(db *gorm.DB) ([]*hostinfo.Info, erro...
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_config.go
type clusterConfigModel (line 14) | type clusterConfigModel struct
function FillInstances (line 21) | func FillInstances(db *gorm.DB, m InfoMap) error {
function locateInstanceMountPartition (line 89) | func locateInstanceMountPartition(directoryOrFilePath string, partitions...
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_hardware.go
type clusterHardwareCPUInfoModel (line 16) | type clusterHardwareCPUInfoModel struct
type clusterHardwareDiskModel (line 23) | type clusterHardwareDiskModel struct
function FillFromClusterHardwareTable (line 30) | func FillFromClusterHardwareTable(db *gorm.DB, m InfoMap) error {
FILE: pkg/apiserver/clusterinfo/hostinfo/cluster_load.go
type clusterLoadCPUUsageModel (line 15) | type clusterLoadCPUUsageModel struct
type clusterLoadMemoryVirtualModel (line 21) | type clusterLoadMemoryVirtualModel struct
function FillFromClusterLoadTable (line 26) | func FillFromClusterLoadTable(db *gorm.DB, m InfoMap) error {
FILE: pkg/apiserver/clusterinfo/hostinfo/hostinfo.go
type CPUUsageInfo (line 7) | type CPUUsageInfo struct
type MemoryUsageInfo (line 12) | type MemoryUsageInfo struct
type CPUInfo (line 17) | type CPUInfo struct
type PartitionInfo (line 23) | type PartitionInfo struct
type InstanceInfo (line 30) | type InstanceInfo struct
type Info (line 35) | type Info struct
type clusterTableModel (line 70) | type clusterTableModel struct
function NewHostInfo (line 78) | func NewHostInfo(hostname string) *Info {
FILE: pkg/apiserver/clusterinfo/service.go
type ServiceParams (line 30) | type ServiceParams struct
type Service (line 38) | type Service struct
method deleteTiDBTopology (line 84) | func (s *Service) deleteTiDBTopology(c *gin.Context) {
method getTiDBTopology (line 123) | func (s *Service) getTiDBTopology(c *gin.Context) {
method getTiCDCTopology (line 138) | func (s *Service) getTiCDCTopology(c *gin.Context) {
method getTiProxyTopology (line 153) | func (s *Service) getTiProxyTopology(c *gin.Context) {
method getTSOTopology (line 168) | func (s *Service) getTSOTopology(c *gin.Context) {
method getSchedulingTopology (line 188) | func (s *Service) getSchedulingTopology(c *gin.Context) {
method getStoreTopology (line 213) | func (s *Service) getStoreTopology(c *gin.Context) {
method getStoreLocationTopology (line 231) | func (s *Service) getStoreLocationTopology(c *gin.Context) {
method getPDTopology (line 246) | func (s *Service) getPDTopology(c *gin.Context) {
method getAlertManagerTopology (line 261) | func (s *Service) getAlertManagerTopology(c *gin.Context) {
method getGrafanaTopology (line 276) | func (s *Service) getGrafanaTopology(c *gin.Context) {
method getAlertManagerCounts (line 292) | func (s *Service) getAlertManagerCounts(c *gin.Context) {
method getHostsInfo (line 330) | func (s *Service) getHostsInfo(c *gin.Context) {
method getStatistics (line 356) | func (s *Service) getStatistics(c *gin.Context) {
function NewService (line 43) | func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
function RegisterRouter (line 54) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type StoreTopologyResponse (line 202) | type StoreTopologyResponse struct
type GetHostsInfoResponse (line 319) | type GetHostsInfoResponse struct
FILE: pkg/apiserver/clusterinfo/statistics.go
type ClusterStatisticsPartial (line 18) | type ClusterStatisticsPartial struct
type ClusterStatistics (line 26) | type ClusterStatistics struct
type instanceKindHostImmediateInfo (line 33) | type instanceKindHostImmediateInfo struct
type instanceKindImmediateInfo (line 39) | type instanceKindImmediateInfo struct
method ToResult (line 59) | func (info *instanceKindImmediateInfo) ToResult() *ClusterStatisticsPa...
function newInstanceKindImmediateInfo (line 44) | func newInstanceKindImmediateInfo() *instanceKindImmediateInfo {
function sumInt (line 51) | func sumInt(array []int) int {
method calculateStatistics (line 69) | func (s *Service) calculateStatistics(db *gorm.DB) (*ClusterStatistics, ...
FILE: pkg/apiserver/clusterinfo/topology.go
function fetchAlertManagerCounts (line 15) | func fetchAlertManagerCounts(ctx context.Context, alertManagerAddr strin...
FILE: pkg/apiserver/configuration/editable.go
function init (line 589) | func init() {
function isConfigItemEditable (line 599) | func isConfigItemEditable(kind ItemKind, key string) bool {
FILE: pkg/apiserver/configuration/flatten.go
function flattenRecursive (line 12) | func flattenRecursive(nestedConfig map[string]interface{}) map[string]in...
function flatten (line 18) | func flatten(flatMap map[string]interface{}, nested interface{}, prefix ...
FILE: pkg/apiserver/configuration/router.go
function RegisterRouter (line 15) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
method getHandler (line 32) | func (s *Service) getHandler(c *gin.Context) {
type EditRequest (line 42) | type EditRequest struct
type EditResponse (line 48) | type EditResponse struct
method editHandler (line 62) | func (s *Service) editHandler(c *gin.Context) {
FILE: pkg/apiserver/configuration/service.go
type ServiceParams (line 36) | type ServiceParams struct
type Service (line 45) | type Service struct
method getConfigItemsFromPDToChannel (line 88) | func (s *Service) getConfigItemsFromPDToChannel(ch chan<- channelItem) {
method getConfigItemsFromPD (line 101) | func (s *Service) getConfigItemsFromPD() (map[string]interface{}, erro...
method getConfigItemsFromTiDBToChannel (line 109) | func (s *Service) getConfigItemsFromTiDBToChannel(tidb *topology.TiDBI...
method getConfigItemsFromTiDB (line 125) | func (s *Service) getConfigItemsFromTiDB(host string, statusPort int) ...
method getConfigItemsFromTiKVToChannel (line 133) | func (s *Service) getConfigItemsFromTiKVToChannel(tikv *topology.Store...
method getConfigItemsFromTiKV (line 149) | func (s *Service) getConfigItemsFromTiKV(host string, statusPort int) ...
method getGlobalVariablesFromTiDBToChannel (line 162) | func (s *Service) getGlobalVariablesFromTiDBToChannel(db *gorm.DB, ch ...
method getGlobalVariablesFromTiDB (line 175) | func (s *Service) getGlobalVariablesFromTiDB(db *gorm.DB) (map[string]...
method getAllConfigItems (line 199) | func (s *Service) getAllConfigItems(db *gorm.DB) (*AllConfigItems, err...
method editConfig (line 313) | func (s *Service) editConfig(db *gorm.DB, kind ItemKind, id string, ne...
function NewService (line 50) | func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
type ItemKind (line 62) | type ItemKind
constant ItemKindTiKVConfig (line 65) | ItemKindTiKVConfig ItemKind = "tikv_config"
constant ItemKindPDConfig (line 66) | ItemKindPDConfig ItemKind = "pd_config"
constant ItemKindTiDBConfig (line 67) | ItemKindTiDBConfig ItemKind = "tidb_config"
constant ItemKindTiDBVariable (line 68) | ItemKindTiDBVariable ItemKind = "tidb_variable"
type channelItem (line 71) | type channelItem struct
function processNestedConfigAPIResponse (line 78) | func processNestedConfigAPIResponse(data []byte) (map[string]interface{}...
type ShowVariableItem (line 157) | type ShowVariableItem struct
type Item (line 187) | type Item struct
type AllConfigItems (line 194) | type AllConfigItems struct
FILE: pkg/apiserver/conprof/service.go
type ServiceParams (line 21) | type ServiceParams struct
type Service (line 30) | type Service struct
method ConprofConfig (line 90) | func (s *Service) ConprofConfig(_ *gin.Context) {
method UpdateConprofConfig (line 101) | func (s *Service) UpdateConprofConfig(_ *gin.Context) {
method ConprofComponents (line 118) | func (s *Service) ConprofComponents(_ *gin.Context) {
method EstimateSize (line 133) | func (s *Service) EstimateSize(_ *gin.Context) {
method ConprofGroupProfiles (line 183) | func (s *Service) ConprofGroupProfiles(_ *gin.Context) {
method ConprofGroupProfileDetail (line 194) | func (s *Service) ConprofGroupProfileDetail(_ *gin.Context) {
method GenConprofActionToken (line 205) | func (s *Service) GenConprofActionToken(c *gin.Context) {
method ConprofDownload (line 222) | func (s *Service) ConprofDownload(_ *gin.Context) {
method parseJWTToken (line 226) | func (s *Service) parseJWTToken(c *gin.Context) {
method ConprofViewProfile (line 251) | func (s *Service) ConprofViewProfile(_ *gin.Context) {
function newService (line 37) | func newService(lc fx.Lifecycle, p ServiceParams) *Service {
function registerRouter (line 54) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type ContinuousProfilingConfig (line 72) | type ContinuousProfilingConfig struct
type NgMonitoringConfig (line 80) | type NgMonitoringConfig struct
type Component (line 105) | type Component struct
type EstimateSizeRes (line 122) | type EstimateSizeRes struct
type GetGroupProfileReq (line 137) | type GetGroupProfileReq struct
type ComponentNum (line 142) | type ComponentNum struct
type GroupProfiles (line 150) | type GroupProfiles struct
type GroupProfileDetail (line 157) | type GroupProfileDetail struct
type ProfileDetail (line 164) | type ProfileDetail struct
type Target (line 171) | type Target struct
type ViewSingleProfileReq (line 237) | type ViewSingleProfileReq struct
FILE: pkg/apiserver/deadlock/model.go
type Model (line 7) | type Model struct
FILE: pkg/apiserver/deadlock/service.go
constant DeadlockTable (line 19) | DeadlockTable = "INFORMATION_SCHEMA.CLUSTER_DEADLOCKS"
type ServiceParams (line 22) | type ServiceParams struct
type Service (line 28) | type Service struct
method getList (line 53) | func (s *Service) getList(c *gin.Context) {
function newService (line 32) | func newService(p ServiceParams) *Service {
function registerRouter (line 36) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
FILE: pkg/apiserver/debugapi/endpoint/1_main_test.go
function TestMain (line 11) | func TestMain(m *testing.M) {
FILE: pkg/apiserver/debugapi/endpoint/models.go
type APIDefinition (line 16) | type APIDefinition struct
type APIParamResolveFn (line 27) | type APIParamResolveFn
type APIParamDefinition (line 31) | type APIParamDefinition struct
method Resolve (line 39) | func (d *APIParamDefinition) Resolve(value string) ([]string, error) {
type UIComponentTextProps (line 47) | type UIComponentTextProps struct
function APIParamText (line 52) | func APIParamText(name string, required bool) APIParamDefinition {
function APIParamInt (line 60) | func APIParamInt(name string, required bool) APIParamDefinition {
function APIParamIntWithDefaultVal (line 64) | func APIParamIntWithDefaultVal(name string, required bool, defVal string...
function APIParamDBName (line 86) | func APIParamDBName(name string, required bool) APIParamDefinition {
function APIParamTableName (line 94) | func APIParamTableName(name string, required bool) APIParamDefinition {
function APIParamTableID (line 102) | func APIParamTableID(name string, required bool) APIParamDefinition {
type UIComponentDropdownProps (line 111) | type UIComponentDropdownProps struct
type EnumItemDefinition (line 115) | type EnumItemDefinition struct
function APIParamEnum (line 120) | func APIParamEnum(name string, required bool, items []EnumItemDefinition...
function APIParamPDKey (line 139) | func APIParamPDKey(name string, required bool) APIParamDefinition {
FILE: pkg/apiserver/debugapi/endpoint/models_test.go
function TestAPIParamPDKey (line 11) | func TestAPIParamPDKey(t *testing.T) {
function TestAPIParamEnum (line 31) | func TestAPIParamEnum(t *testing.T) {
function TestAPIParamInt (line 59) | func TestAPIParamInt(t *testing.T) {
FILE: pkg/apiserver/debugapi/endpoint/payload.go
type RequestPayload (line 35) | type RequestPayload struct
type HTTPClients (line 42) | type HTTPClients struct
method GetHTTPClientByNodeKind (line 53) | func (c HTTPClients) GetHTTPClientByNodeKind(kind topo.Kind) *httpclie...
type RequestPayloadResolver (line 95) | type RequestPayloadResolver struct
method ListAPIs (line 121) | func (r *RequestPayloadResolver) ListAPIs() []APIDefinition {
method ResolvePayload (line 127) | func (r *RequestPayloadResolver) ResolvePayload(payload RequestPayload...
function NewRequestPayloadResolver (line 100) | func NewRequestPayloadResolver(apis []APIDefinition, acceptedClients HTT...
type ResolvedRequestPayload (line 189) | type ResolvedRequestPayload struct
method SendRequestAndPipe (line 197) | func (p *ResolvedRequestPayload) SendRequestAndPipe(
method verifyEndpoint (line 227) | func (p *ResolvedRequestPayload) verifyEndpoint(ctx context.Context, e...
FILE: pkg/apiserver/debugapi/endpoint/payload_test.go
function TestRequestPayloadResolver (line 24) | func TestRequestPayloadResolver(t *testing.T) {
function TestResolvedRequestPayload (line 261) | func TestResolvedRequestPayload(t *testing.T) {
FILE: pkg/apiserver/debugapi/service.go
function registerRouter (line 30) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type ServiceParams (line 40) | type ServiceParams struct
type Service (line 54) | type Service struct
method RequestEndpoint (line 115) | func (s *Service) RequestEndpoint(c *gin.Context) {
method Download (line 161) | func (s *Service) Download(c *gin.Context) {
method GetEndpoints (line 171) | func (s *Service) GetEndpoints(c *gin.Context) {
function newService (line 62) | func newService(p ServiceParams) *Service {
function getExtFromContentTypeHeader (line 82) | func getExtFromContentTypeHeader(contentType string) string {
FILE: pkg/apiserver/diagnose/compare.go
function GetCompareReportTablesForDisplay (line 22) | func GetCompareReportTablesForDisplay(startTime1, endTime1, startTime2, ...
function CompareTables (line 105) | func CompareTables(tables1, tables2 []*TableDef) ([]*TableDef, []TableRo...
function GenerateDiffTable (line 126) | func GenerateDiffTable(dr diffRows) *TableDef {
function compareTable (line 208) | func compareTable(table1, table2 *TableDef, dr *diffRows) (_ *TableDef, ...
function compareTableWithNonUniqueKey (line 294) | func compareTableWithNonUniqueKey(table1, table2 *TableDef, dr *diffRows...
function getTableLablesMapWithNonUniqueJoinKey (line 420) | func getTableLablesMapWithNonUniqueJoinKey(table *TableDef) (map[string]...
function joinRow (line 432) | func joinRow(row1, row2 *TableRowDef, table *TableDef, dr *diffRows) (*T...
type diffRow (line 525) | type diffRow struct
type diffRows (line 536) | type diffRows
method Len (line 538) | func (r diffRows) Len() int { return len(r) }
method Less (line 539) | func (r diffRows) Less(i, j int) bool { return math.Abs(r[i].ratio) < ...
method Swap (line 540) | func (r diffRows) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
method Push (line 542) | func (r *diffRows) Push(x interface{}) {
method Pop (line 546) | func (r *diffRows) Pop() interface{} {
method addRow (line 554) | func (r *diffRows) addRow(table *TableDef, label string, ratio float64...
method appendRow (line 586) | func (r *diffRows) appendRow(row diffRow) {
type newJoinRow (line 593) | type newJoinRow struct
method genNewRow (line 600) | func (r *newJoinRow) genNewRow(table *TableDef) []string {
function calculateDiffRatio (line 648) | func calculateDiffRatio(row1, row2 []string, table *TableDef) (float64, ...
function parseFloat (line 701) | func parseFloat(s string) (float64, error) {
function checkIn (line 732) | func checkIn(idx int, idxs []int) bool {
function genRowLabel (line 736) | func genRowLabel(row []string, joinColumns []int) string {
function genRowsLablesMap (line 747) | func genRowsLablesMap(table *TableDef, rows [][]string) (map[string][]st...
function getTableLablesMap (line 760) | func getTableLablesMap(table *TableDef) (map[string]*TableRowDef, error) {
function getCompareTables (line 776) | func getCompareTables(startTime, endTime string, db *gorm.DB, sqliteDB *...
function GetReportHeaderTables (line 831) | func GetReportHeaderTables(startTime, endTime string, db *gorm.DB, sqlit...
function GetReportEndTables (line 841) | func GetReportEndTables(startTime, endTime string, db *gorm.DB, sqliteDB...
function GetCompareHeaderTimeTable (line 851) | func GetCompareHeaderTimeTable(startTime1, endTime1, startTime2, endTime...
function GetReportTablesIn2Range (line 863) | func GetReportTablesIn2Range(startTime1, endTime1, startTime2, endTime2 ...
function appendErrorRow (line 915) | func appendErrorRow(tbl TableDef, err error, errRows []TableRowDef) []Ta...
function getTiDBAbnormalSlowQueryOnly (line 927) | func getTiDBAbnormalSlowQueryOnly(startTime1, endTime1, startTime2, endT...
function useSubRowForLongColumnValue (line 967) | func useSubRowForLongColumnValue(rows []TableRowDef, colIdx int) []Table...
FILE: pkg/apiserver/diagnose/diagnose.go
constant timeLayout (line 30) | timeLayout = "2006-01-02 15:04:05"
type Service (line 35) | type Service struct
method generateMetricsRelation (line 81) | func (s *Service) generateMetricsRelation(startTime, endTime time.Time...
method metricsRelationHandler (line 130) | func (s *Service) metricsRelationHandler(c *gin.Context) {
method metricsRelationViewHandler (line 162) | func (s *Service) metricsRelationViewHandler(c *gin.Context) {
method reportsHandler (line 195) | func (s *Service) reportsHandler(c *gin.Context) {
method genReportHandler (line 212) | func (s *Service) genReportHandler(c *gin.Context) {
method reportStatusHandler (line 266) | func (s *Service) reportStatusHandler(c *gin.Context) {
method reportHTMLHandler (line 282) | func (s *Service) reportHTMLHandler(c *gin.Context) {
method reportDataHandler (line 297) | func (s *Service) reportDataHandler(c *gin.Context) {
method genDiagnosisHandler (line 323) | func (s *Service) genDiagnosisHandler(c *gin.Context) {
function NewService (line 43) | func NewService(config *config.Config, tidbClient *tidb.Client, db *dbst...
function RegisterRouter (line 57) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type GenerateMetricsRelationRequest (line 117) | type GenerateMetricsRelationRequest struct
type GenerateReportRequest (line 182) | type GenerateReportRequest struct
type GenDiagnosisReportRequest (line 309) | type GenDiagnosisReportRequest struct
FILE: pkg/apiserver/diagnose/inspection.go
type clusterInspection (line 14) | type clusterInspection struct
method inspectForAffectByBigQuery (line 58) | func (c *clusterInspection) inspectForAffectByBigQuery() ([]string, er...
method compareMetric (line 192) | func (c *clusterInspection) compareMetric(query metricQuery) error {
method queryBigQueryInSlowLog (line 429) | func (c *clusterInspection) queryBigQueryInSlowLog() (string, error) {
method queryExpensiveQueryInTiDBLog (line 485) | func (c *clusterInspection) queryExpensiveQueryInTiDBLog() (string, er...
function CompareDiagnose (line 22) | func CompareDiagnose(referStartTime, referEndTime, startTime, endTime st...
type metricQuery (line 213) | type metricQuery interface
type baseQuery (line 222) | type baseQuery struct
method genCondition (line 228) | func (b *baseQuery) genCondition(arg *queryArg) string {
type avgMaxMin (line 236) | type avgMaxMin struct
type queryQPS (line 242) | type queryQPS struct
method init (line 250) | func (s *queryQPS) init() {
method setRefer (line 254) | func (s *queryQPS) setRefer() {
method setCurrent (line 259) | func (s *queryQPS) setCurrent() {
method compare (line 264) | func (s *queryQPS) compare() []metricDiff {
method generateSQL (line 274) | func (s *queryQPS) generateSQL(arg *queryArg) string {
method appendRow (line 290) | func (s *queryQPS) appendRow(row []string) error {
function queryMetric (line 305) | func queryMetric(query metricQuery, arg *queryArg, db *gorm.DB) error {
type queryQuantile (line 321) | type queryQuantile struct
method init (line 333) | func (s *queryQuantile) init() {
method setRefer (line 337) | func (s *queryQuantile) setRefer() {
method setCurrent (line 342) | func (s *queryQuantile) setCurrent() {
method compare (line 347) | func (s *queryQuantile) compare() []metricDiff {
method generateSQL (line 357) | func (s *queryQuantile) generateSQL(arg *queryArg) string {
method appendRow (line 365) | func (s *queryQuantile) appendRow(row []string) error {
type durationValue (line 328) | type durationValue struct
type queryTotal (line 379) | type queryTotal struct
method init (line 386) | func (s *queryTotal) init() {
method setRefer (line 390) | func (s *queryTotal) setRefer() {
method setCurrent (line 395) | func (s *queryTotal) setCurrent() {
method compare (line 400) | func (s *queryTotal) compare() []metricDiff {
method generateSQL (line 410) | func (s *queryTotal) generateSQL(arg *queryArg) string {
method appendRow (line 418) | func (s *queryTotal) appendRow(row []string) error {
function batchAtof (line 506) | func batchAtof(ss []string) ([]float64, error) {
function batchAtoi (line 518) | func batchAtoi(ss []string) ([]int, error) {
function calculateDiff (line 530) | func calculateDiff(refer float64, check float64) float64 {
type metricDiff (line 537) | type metricDiff struct
method String (line 555) | func (d metricDiff) String() string {
function newMetricDiff (line 545) | func newMetricDiff(tp, label string, refer, check float64) metricDiff {
type compareType (line 562) | type compareType
constant compareLT (line 565) | compareLT compareType = false
constant compareGT (line 566) | compareGT compareType = true
function checkDiffs (line 569) | func checkDiffs(diffs []metricDiff, tp compareType, threshold float64) [...
function genMetricDiffsString (line 586) | func genMetricDiffsString(diffs []metricDiff) []string {
FILE: pkg/apiserver/diagnose/model.go
type Report (line 13) | type Report struct
method TableName (line 24) | func (Report) TableName() string {
function autoMigrate (line 28) | func autoMigrate(db *dbstore.DB) error {
function NewReport (line 32) | func NewReport(db *dbstore.DB, startTime, endTime time.Time, compareStar...
function GetReports (line 48) | func GetReports(db *dbstore.DB) ([]Report, error) {
function GetReport (line 57) | func GetReport(db *dbstore.DB, reportID string) (*Report, error) {
function UpdateReportProgress (line 63) | func UpdateReportProgress(db *dbstore.DB, reportID string, progress int)...
function SaveReportContent (line 69) | func SaveReportContent(db *dbstore.DB, reportID string, content string) ...
FILE: pkg/apiserver/diagnose/query.go
type rowQuery (line 15) | type rowQuery interface
type queryArg (line 19) | type queryArg struct
function newQueryArg (line 26) | func newQueryArg(startTime, endTime string) *queryArg {
type AvgMaxMinTableDef (line 34) | type AvgMaxMinTableDef struct
method queryRow (line 44) | func (t AvgMaxMinTableDef) queryRow(arg *queryArg, db *gorm.DB) (*Tabl...
method genRow (line 81) | func (t AvgMaxMinTableDef) genRow(values []string, subValues [][]strin...
type sumValueQuery (line 104) | type sumValueQuery struct
method queryRow (line 114) | func (t sumValueQuery) queryRow(arg *queryArg, db *gorm.DB) (*TableRow...
method genRow (line 151) | func (t sumValueQuery) genRow(values []string, subValues [][]string) *...
type totalTimeByLabelsTableDef (line 171) | type totalTimeByLabelsTableDef struct
method queryRow (line 180) | func (t totalTimeByLabelsTableDef) queryRow(arg *queryArg, db *gorm.DB...
method genRow (line 217) | func (t totalTimeByLabelsTableDef) genRow(values []string, subValues [...
method genSumarySQLs (line 256) | func (t totalTimeByLabelsTableDef) genSumarySQLs(totalTime float64, st...
method genDetailSQLs (line 282) | func (t totalTimeByLabelsTableDef) genDetailSQLs(totalTime float64, st...
type totalValueAndTotalCountTableDef (line 321) | type totalValueAndTotalCountTableDef struct
method queryRow (line 332) | func (t totalValueAndTotalCountTableDef) queryRow(arg *queryArg, db *g...
method genRow (line 360) | func (t totalValueAndTotalCountTableDef) genRow(values []string, subVa...
method genSumarySQLs (line 383) | func (t totalValueAndTotalCountTableDef) genSumarySQLs(startTime, endT...
method genDetailSQLs (line 409) | func (t totalValueAndTotalCountTableDef) genDetailSQLs(startTime, endT...
function querySQL (line 447) | func querySQL(db *gorm.DB, sql string) ([][]string, error) {
function convertFloatToInt (line 494) | func convertFloatToInt(s string) string {
function convertFloatToSize (line 503) | func convertFloatToSize(s string) string {
function convertFloatToDuration (line 521) | func convertFloatToDuration(s string, ratio float64) string {
function convertFloatToSizeByRows (line 540) | func convertFloatToSizeByRows(rows []TableRowDef, idx int) {
function convertFloatToSizeByRow (line 546) | func convertFloatToSizeByRow(row *TableRowDef, idx int) {
function RoundFloatString (line 559) | func RoundFloatString(s string) string {
function convertFloatToString (line 567) | func convertFloatToString(f float64) string {
function genComment (line 602) | func genComment(comment string, labels []string) string {
function sortRowsByIndex (line 612) | func sortRowsByIndex(resultRows []TableRowDef, idx int) {
FILE: pkg/apiserver/diagnose/report.go
type TableDef (line 20) | type TableDef struct
method ColumnWidth (line 37) | func (t TableDef) ColumnWidth() []int {
type TableRowDef (line 30) | type TableRowDef struct
constant CategoryHeader (line 66) | CategoryHeader = "header"
constant CategoryDiagnose (line 67) | CategoryDiagnose = "diagnose"
constant CategoryLoad (line 68) | CategoryLoad = "load"
constant CategoryOverview (line 69) | CategoryOverview = "overview"
constant CategoryTiDB (line 70) | CategoryTiDB = "TiDB"
constant CategoryPD (line 71) | CategoryPD = "PD"
constant CategoryTiKV (line 72) | CategoryTiKV = "TiKV"
constant CategoryConfig (line 73) | CategoryConfig = "config"
constant CategoryError (line 74) | CategoryError = "error"
function GetReportTablesForDisplay (line 77) | func GetReportTablesForDisplay(startTime, endTime string, db *gorm.DB, s...
function checkBeforeReport (line 99) | func checkBeforeReport(db *gorm.DB) (errRows []TableRowDef) {
function GetReportTables (line 123) | func GetReportTables(startTime, endTime string, db *gorm.DB, sqliteDB *d...
function getTablesParallel (line 196) | func getTablesParallel(startTime, endTime string, db *gorm.DB, funcs []g...
type tblAndErr (line 236) | type tblAndErr struct
function doGetTable (line 245) | func doGetTable(taskChan chan *task, resChan chan *tblAndErr, wg *sync.W...
type task (line 277) | type task struct
function func2task (line 283) | func func2task(funcs []getTableFunc) chan *task {
function GenerateReportError (line 292) | func GenerateReportError(errRows []TableRowDef) *TableDef {
function GetHeaderTimeTable (line 302) | func GetHeaderTimeTable(startTime, endTime string, _ *gorm.DB) (TableDef...
function GetAllDiagnoseReport (line 314) | func GetAllDiagnoseReport(startTime, endTime string, db *gorm.DB) (Table...
function GetDiagnoseReport (line 318) | func GetDiagnoseReport(startTime, endTime string, db *gorm.DB, rules []s...
function GetTotalTimeConsumeTable (line 353) | func GetTotalTimeConsumeTable(startTime, endTime string, db *gorm.DB) (T...
function GetTotalErrorTable (line 466) | func GetTotalErrorTable(startTime, endTime string, db *gorm.DB) (TableDe...
function GetTiDBTimeConsumeTable (line 504) | func GetTiDBTimeConsumeTable(startTime, endTime string, db *gorm.DB) (Ta...
function GetTiDBTxnTableData (line 580) | func GetTiDBTxnTableData(startTime, endTime string, db *gorm.DB) (TableD...
function GetTiDBConnectionCountTable (line 653) | func GetTiDBConnectionCountTable(startTime, endTime string, db *gorm.DB)...
function GetTiDBStatisticsInfo (line 672) | func GetTiDBStatisticsInfo(startTime, endTime string, db *gorm.DB) (Tabl...
function GetTiDBDDLOwner (line 697) | func GetTiDBDDLOwner(startTime, endTime string, db *gorm.DB) (TableDef, ...
function GetPDConfigInfo (line 716) | func GetPDConfigInfo(startTime, _ string, db *gorm.DB) (TableDef, error) {
function GetPDConfigChangeInfo (line 739) | func GetPDConfigChangeInfo(startTime, endTime string, db *gorm.DB) (Tabl...
function GetTiDBGCConfigInfo (line 761) | func GetTiDBGCConfigInfo(startTime, _ string, db *gorm.DB) (TableDef, er...
function GetTiDBGCConfigChangeInfo (line 782) | func GetTiDBGCConfigChangeInfo(startTime, endTime string, db *gorm.DB) (...
function GetTiKVRocksDBConfigInfo (line 804) | func GetTiKVRocksDBConfigInfo(startTime, _ string, db *gorm.DB) (TableDe...
function GetTiKVRocksDBConfigChangeInfo (line 863) | func GetTiKVRocksDBConfigChangeInfo(startTime, endTime string, db *gorm....
function GetTiKVRaftStoreConfigInfo (line 885) | func GetTiKVRaftStoreConfigInfo(startTime, _ string, db *gorm.DB) (Table...
function GetTiKVRaftStoreConfigChangeInfo (line 945) | func GetTiKVRaftStoreConfigChangeInfo(startTime, endTime string, db *gor...
function GetPDTimeConsumeTable (line 967) | func GetPDTimeConsumeTable(startTime, endTime string, db *gorm.DB) (Tabl...
function GetPDSchedulerInfo (line 1009) | func GetPDSchedulerInfo(startTime, endTime string, db *gorm.DB) (TableDe...
function GetTiKVRegionSizeInfo (line 1034) | func GetTiKVRegionSizeInfo(startTime, endTime string, db *gorm.DB) (Tabl...
function GetTiKVStoreInfo (line 1091) | func GetTiKVStoreInfo(startTime, endTime string, db *gorm.DB) (TableDef,...
function GetTiKVTotalTimeConsumeTable (line 1112) | func GetTiKVTotalTimeConsumeTable(startTime, endTime string, db *gorm.DB...
function GetTiKVSchedulerInfo (line 1182) | func GetTiKVSchedulerInfo(startTime, endTime string, db *gorm.DB) (Table...
function GetTiKVGCInfo (line 1233) | func GetTiKVGCInfo(startTime, endTime string, db *gorm.DB) (TableDef, er...
function GetTiKVTaskInfo (line 1255) | func GetTiKVTaskInfo(startTime, endTime string, db *gorm.DB) (TableDef, ...
function getSumValueTableData (line 1279) | func getSumValueTableData(defs1 []sumValueQuery, startTime, endTime stri...
function GetTiKVSnapshotInfo (line 1309) | func GetTiKVSnapshotInfo(startTime, endTime string, db *gorm.DB) (TableD...
function GetTiKVCopInfo (line 1358) | func GetTiKVCopInfo(startTime, endTime string, db *gorm.DB) (TableDef, e...
function GetTiKVRaftInfo (line 1393) | func GetTiKVRaftInfo(startTime, endTime string, db *gorm.DB) (TableDef, ...
function GetTiKVErrorTable (line 1426) | func GetTiKVErrorTable(startTime, endTime string, db *gorm.DB) (TableDef...
function GetTiDBCurrentConfig (line 1479) | func GetTiDBCurrentConfig(_, _ string, db *gorm.DB) (TableDef, error) {
function GetPDCurrentConfig (line 1495) | func GetPDCurrentConfig(_, _ string, db *gorm.DB) (TableDef, error) {
function GetTiKVCurrentConfig (line 1511) | func GetTiKVCurrentConfig(_, _ string, db *gorm.DB) (TableDef, error) {
function getSQLRows (line 1527) | func getSQLRows(db *gorm.DB, sql string) ([]TableRowDef, error) {
function getSQLRoundRows (line 1539) | func getSQLRoundRows(db *gorm.DB, sql string, nums []int, comment string...
function getTableRows (line 1556) | func getTableRows(defs []rowQuery, arg *queryArg, db *gorm.DB, appendRow...
function NewTableRowDef (line 1571) | func NewTableRowDef(values []string, subValues [][]string) TableRowDef {
function getAvgValueTableData (line 1578) | func getAvgValueTableData(defs1 []AvgMaxMinTableDef, startTime, endTime ...
function GetLoadTable (line 1596) | func GetLoadTable(startTime, endTime string, db *gorm.DB) (TableDef, err...
function getAvgMaxMinCPUUsage (line 1669) | func getAvgMaxMinCPUUsage(startTime, endTime string, db *gorm.DB) (*Tabl...
function getAvgMaxMinMemoryUsage (line 1705) | func getAvgMaxMinMemoryUsage(startTime, endTime string, db *gorm.DB) (*T...
function GetCPUUsageTable (line 1745) | func GetCPUUsageTable(startTime, endTime string, db *gorm.DB) (TableDef,...
function GetProcessMemUsageTable (line 1780) | func GetProcessMemUsageTable(startTime, endTime string, db *gorm.DB) (Ta...
function GetGoroutinesCountTable (line 1811) | func GetGoroutinesCountTable(startTime, endTime string, db *gorm.DB) (Ta...
function GetTiKVThreadCPUTable (line 1830) | func GetTiKVThreadCPUTable(startTime, endTime string, db *gorm.DB) (Tabl...
function GetStoreStatusTable (line 1960) | func GetStoreStatusTable(startTime, endTime string, db *gorm.DB) (TableD...
function GetPDClusterStatusTable (line 1985) | func GetPDClusterStatusTable(startTime, endTime string, db *gorm.DB) (Ta...
function GetPDEtcdStatusTable (line 2019) | func GetPDEtcdStatusTable(startTime, endTime string, db *gorm.DB) (Table...
function GetClusterInfoTable (line 2038) | func GetClusterInfoTable(_, _ string, db *gorm.DB) (TableDef, error) {
function GetTiKVCacheHitTable (line 2055) | func GetTiKVCacheHitTable(startTime, endTime string, db *gorm.DB) (Table...
type hardWare (line 2100) | type hardWare struct
function GetClusterHardwareInfoTable (line 2109) | func GetClusterHardwareInfoTable(startTime, endTime string, db *gorm.DB)...
function GetTiKVRocksDBTimeConsumeTable (line 2213) | func GetTiKVRocksDBTimeConsumeTable(startTime, endTime string, db *gorm....
function GetTiDBTopNSlowQuery (line 2346) | func GetTiDBTopNSlowQuery(startTime, endTime string, db *gorm.DB) (Table...
function GetTiDBTopNSlowQueryGroupByDigest (line 2364) | func GetTiDBTopNSlowQueryGroupByDigest(startTime, endTime string, db *go...
function GetTiDBSlowQueryWithDiffPlan (line 2392) | func GetTiDBSlowQueryWithDiffPlan(startTime, endTime string, db *gorm.DB...
FILE: pkg/apiserver/diagnose/report_test.go
function TestT (line 11) | func TestT(t *testing.T) {
type testReportSuite (line 18) | type testReportSuite struct
method TestCompareTable (line 20) | func (t *testReportSuite) TestCompareTable(c *check.C) {
method TestRoundFloatString (line 104) | func (t *testReportSuite) TestRoundFloatString(c *check.C) {
FILE: pkg/apiserver/info/info.go
type ServiceParams (line 28) | type ServiceParams struct
type Service (line 37) | type Service struct
method infoHandler (line 80) | func (s *Service) infoHandler(c *gin.Context) {
method WhoamiHandler (line 126) | func (s *Service) WhoamiHandler(c *gin.Context) {
method databasesHandler (line 142) | func (s *Service) databasesHandler(c *gin.Context) {
method tablesHandler (line 173) | func (s *Service) tablesHandler(c *gin.Context) {
function NewService (line 42) | func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
function RegisterRouter (line 55) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type InfoResponse (line 66) | type InfoResponse struct
type WhoAmIResponse (line 114) | type WhoAmIResponse struct
type tableSchema (line 161) | type tableSchema struct
FILE: pkg/apiserver/logsearch/models.go
type TaskState (line 16) | type TaskState
constant TaskStateRunning (line 19) | TaskStateRunning TaskState = 1
constant TaskStateFinished (line 20) | TaskStateFinished TaskState = 2
constant TaskStateError (line 21) | TaskStateError TaskState = 3
type TaskGroupState (line 24) | type TaskGroupState
constant TaskGroupStateRunning (line 27) | TaskGroupStateRunning TaskGroupState = 1
constant TaskGroupStateFinished (line 28) | TaskGroupStateFinished TaskGroupState = 2
type LogLevel (line 31) | type LogLevel
constant LogLevelUnknown (line 34) | LogLevelUnknown LogLevel = 0
constant LogLevelDebug (line 35) | LogLevelDebug LogLevel = 1
constant LogLevelInfo (line 36) | LogLevelInfo LogLevel = 2
constant LogLevelWarn (line 37) | LogLevelWarn LogLevel = 3
constant LogLevelTrace (line 38) | LogLevelTrace LogLevel = 4
constant LogLevelCritical (line 39) | LogLevelCritical LogLevel = 5
constant LogLevelError (line 40) | LogLevelError LogLevel = 6
type SearchLogRequest (line 53) | type SearchLogRequest struct
method ConvertToPB (line 63) | func (r *SearchLogRequest) ConvertToPB(target diagnosticspb.SearchLogR...
method Scan (line 74) | func (r *SearchLogRequest) Scan(src interface{}) error {
method Value (line 78) | func (r *SearchLogRequest) Value() (driver.Value, error) {
type TaskModel (line 83) | type TaskModel struct
method TableName (line 94) | func (TaskModel) TableName() string {
method RemoveDataAndPreview (line 99) | func (task *TaskModel) RemoveDataAndPreview(db *dbstore.DB) {
type TaskGroupModel (line 107) | type TaskGroupModel struct
method TableName (line 115) | func (TaskGroupModel) TableName() string {
method Delete (line 119) | func (tg *TaskGroupModel) Delete(db *dbstore.DB) {
type PreviewModel (line 128) | type PreviewModel struct
method TableName (line 137) | func (PreviewModel) TableName() string {
function autoMigrate (line 141) | func autoMigrate(db *dbstore.DB) error {
function cleanupAllTasks (line 145) | func cleanupAllTasks(db *dbstore.DB) {
FILE: pkg/apiserver/logsearch/pack.go
function serveTaskForDownload (line 16) | func serveTaskForDownload(task *TaskModel, c *gin.Context) {
function serveMultipleTaskForDownload (line 28) | func serveMultipleTaskForDownload(tasks []*TaskModel, c *gin.Context) {
FILE: pkg/apiserver/logsearch/scheduler.go
constant TaskMaxPreviewLines (line 13) | TaskMaxPreviewLines = 500
constant TaskGroupMaxPreviewLines (line 14) | TaskGroupMaxPreviewLines = 5000
type Scheduler (line 17) | type Scheduler struct
method AsyncStart (line 29) | func (s *Scheduler) AsyncStart(taskGroupModel *TaskGroupModel, tasksMo...
method AsyncAbort (line 59) | func (s *Scheduler) AsyncAbort(taskGroupID uint) bool {
function NewScheduler (line 22) | func NewScheduler(service *Service) *Scheduler {
FILE: pkg/apiserver/logsearch/service.go
type Service (line 25) | type Service struct
method CreateTaskGroup (line 105) | func (s *Service) CreateTaskGroup(c *gin.Context) {
method GetAllTaskGroups (line 153) | func (s *Service) GetAllTaskGroups(c *gin.Context) {
method GetTaskGroup (line 171) | func (s *Service) GetTaskGroup(c *gin.Context) {
method GetTaskGroupPreview (line 199) | func (s *Service) GetTaskGroupPreview(c *gin.Context) {
method RetryTask (line 222) | func (s *Service) RetryTask(c *gin.Context) {
method CancelTask (line 270) | func (s *Service) CancelTask(c *gin.Context) {
method DeleteTaskGroup (line 297) | func (s *Service) DeleteTaskGroup(c *gin.Context) {
method GetDownloadToken (line 317) | func (s *Service) GetDownloadToken(c *gin.Context) {
method DownloadLogs (line 335) | func (s *Service) DownloadLogs(c *gin.Context) {
function NewService (line 35) | func NewService(lc fx.Lifecycle, config *config.Config, db *dbstore.DB) ...
function RegisterRouter (line 69) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type CreateTaskGroupRequest (line 87) | type CreateTaskGroupRequest struct
type TaskGroupResponse (line 92) | type TaskGroupResponse struct
FILE: pkg/apiserver/logsearch/task.go
type TaskGroup (line 35) | type TaskGroup struct
method InitTasks (line 43) | func (tg *TaskGroup) InitTasks(ctx context.Context, taskModels []*Task...
method SyncRun (line 63) | func (tg *TaskGroup) SyncRun() {
method AbortAll (line 90) | func (tg *TaskGroup) AbortAll() {
type Task (line 101) | type Task struct
method String (line 108) | func (t *Task) String() string {
method Abort (line 113) | func (t *Task) Abort() {
method setError (line 121) | func (t *Task) setError(err error) {
method accumulateLogSize (line 126) | func (t *Task) accumulateLogSize(path *string) {
method SyncRun (line 141) | func (t *Task) SyncRun() {
method searchLog (line 191) | func (t *Task) searchLog(client diagnosticspb.DiagnosticsClient, targe...
function logMessageToString (line 274) | func logMessageToString(msg *diagnosticspb.LogMessage) string {
FILE: pkg/apiserver/metrics/prom_resolve.go
constant promCacheTTL (line 19) | promCacheTTL = time.Second * 5
type promAddressCacheEntity (line 22) | type promAddressCacheEntity struct
type pdServerConfig (line 27) | type pdServerConfig struct
type pdConfig (line 31) | type pdConfig struct
function normalizeCustomizedPromAddress (line 36) | func normalizeCustomizedPromAddress(addr string) (string, error) {
method resolveCustomizedPromAddress (line 54) | func (s *Service) resolveCustomizedPromAddress(acceptInvalidAddr bool) (...
method resolveDeployedPromAddress (line 81) | func (s *Service) resolveDeployedPromAddress() (string, error) {
method resolveFinalPromAddress (line 95) | func (s *Service) resolveFinalPromAddress() (string, error) {
method getPromAddressFromCache (line 115) | func (s *Service) getPromAddressFromCache() (string, error) {
method setCustomPromAddress (line 150) | func (s *Service) setCustomPromAddress(addr string) (string, error) {
FILE: pkg/apiserver/metrics/prom_resolve_test.go
function Test_normalizeCustomizedPromAddress (line 12) | func Test_normalizeCustomizedPromAddress(t *testing.T) {
FILE: pkg/apiserver/metrics/router.go
type QueryRequest (line 18) | type QueryRequest struct
type QueryResponse (line 25) | type QueryResponse struct
function RegisterRouter (line 30) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
method queryMetrics (line 45) | func (s *Service) queryMetrics(c *gin.Context) {
type GetPromAddressConfigResponse (line 96) | type GetPromAddressConfigResponse struct
method getPromAddressConfig (line 107) | func (s *Service) getPromAddressConfig(c *gin.Context) {
type PutCustomPromAddressRequest (line 124) | type PutCustomPromAddressRequest struct
type PutCustomPromAddressResponse (line 128) | type PutCustomPromAddressResponse struct
method putCustomPromAddress (line 139) | func (s *Service) putCustomPromAddress(c *gin.Context) {
FILE: pkg/apiserver/metrics/service.go
constant defaultPromQueryTimeout (line 28) | defaultPromQueryTimeout = time.Second * 30
type ServiceParams (line 31) | type ServiceParams struct
type Service (line 39) | type Service struct
function NewService (line 47) | func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
FILE: pkg/apiserver/model/common_models.go
type NodeKind (line 10) | type NodeKind
constant NodeKindTiDB (line 13) | NodeKindTiDB NodeKind = "tidb"
constant NodeKindTiKV (line 14) | NodeKindTiKV NodeKind = "tikv"
constant NodeKindPD (line 15) | NodeKindPD NodeKind = "pd"
constant NodeKindTiFlash (line 16) | NodeKindTiFlash NodeKind = "tiflash"
constant NodeKindTiCDC (line 17) | NodeKindTiCDC NodeKind = "ticdc"
constant NodeKindTiProxy (line 18) | NodeKindTiProxy NodeKind = "tiproxy"
constant NodeKindTSO (line 19) | NodeKindTSO NodeKind = "tso"
constant NodeKindScheduling (line 20) | NodeKindScheduling NodeKind = "scheduling"
type RequestTargetNode (line 23) | type RequestTargetNode struct
method String (line 30) | func (n *RequestTargetNode) String() string {
method FileName (line 34) | func (n *RequestTargetNode) FileName() string {
type RequestTargetStatistics (line 39) | type RequestTargetStatistics struct
function NewRequestTargetStatisticsFromArray (line 50) | func NewRequestTargetStatisticsFromArray(arr *[]RequestTargetNode) Reque...
FILE: pkg/apiserver/profiling/fetcher.go
constant maxProfilingTimeout (line 30) | maxProfilingTimeout = time.Minute * 5
type fetchOptions (line 33) | type fetchOptions struct
type profileFetcher (line 39) | type profileFetcher interface
type fetchers (line 43) | type fetchers struct
type tikvFetcher (line 94) | type tikvFetcher struct
method fetch (line 101) | func (f *tikvFetcher) fetch(op *fetchOptions) ([]byte, error) {
type tiflashFetcher (line 144) | type tiflashFetcher struct
method fetch (line 148) | func (f *tiflashFetcher) fetch(op *fetchOptions) ([]byte, error) {
type tidbFetcher (line 183) | type tidbFetcher struct
method fetch (line 187) | func (f *tidbFetcher) fetch(op *fetchOptions) ([]byte, error) {
type pdFetcher (line 191) | type pdFetcher struct
method fetch (line 196) | func (f *pdFetcher) fetch(op *fetchOptions) ([]byte, error) {
type ticdcFecther (line 205) | type ticdcFecther struct
method fetch (line 209) | func (f *ticdcFecther) fetch(op *fetchOptions) ([]byte, error) {
type tiproxyFecther (line 213) | type tiproxyFecther struct
method fetch (line 217) | func (f *tiproxyFecther) fetch(op *fetchOptions) ([]byte, error) {
type tsoFetcher (line 221) | type tsoFetcher struct
method fetch (line 225) | func (f *tsoFetcher) fetch(op *fetchOptions) ([]byte, error) {
type schedulingFetcher (line 229) | type schedulingFetcher struct
method fetch (line 233) | func (f *schedulingFetcher) fetch(op *fetchOptions) ([]byte, error) {
FILE: pkg/apiserver/profiling/model.go
type TaskState (line 19) | type TaskState
constant TaskStateError (line 23) | TaskStateError TaskState = iota
constant TaskStateRunning (line 24) | TaskStateRunning
constant TaskStateFinish (line 25) | TaskStateFinish
constant TaskStatePartialFinish (line 26) | TaskStatePartialFinish
constant TaskStateSkipped (line 27) | TaskStateSkipped
type TaskRawDataType (line 30) | type TaskRawDataType
constant RawDataTypeJeprof (line 33) | RawDataTypeJeprof TaskRawDataType = "jeprof"
constant RawDataTypeProtobuf (line 34) | RawDataTypeProtobuf TaskRawDataType = "protobuf"
constant RawDataTypeText (line 35) | RawDataTypeText TaskRawDataType = "text"
type TaskProfilingType (line 39) | type TaskProfilingType
type TaskProfilingTypeList (line 40) | type TaskProfilingTypeList
method Scan (line 43) | func (r *TaskProfilingTypeList) Scan(src interface{}) error {
method Value (line 47) | func (r TaskProfilingTypeList) Value() (driver.Value, error) {
constant ProfilingTypeCPU (line 53) | ProfilingTypeCPU TaskProfilingType = "cpu"
constant ProfilingTypeHeap (line 54) | ProfilingTypeHeap TaskProfilingType = "heap"
constant ProfilingTypeGoroutine (line 55) | ProfilingTypeGoroutine TaskProfilingType = "goroutine"
constant ProfilingTypeMutex (line 56) | ProfilingTypeMutex TaskProfilingType = "mutex"
type TaskModel (line 66) | type TaskModel struct
method TableName (line 78) | func (TaskModel) TableName() string {
type TaskGroupModel (line 82) | type TaskGroupModel struct
method TableName (line 91) | func (TaskGroupModel) TableName() string {
function autoMigrate (line 95) | func autoMigrate(db *dbstore.DB) error {
type Task (line 100) | type Task struct
method run (line 126) | func (t *Task) run() {
method stop (line 145) | func (t *Task) stop() {
function NewTask (line 109) | func NewTask(ctx context.Context, taskGroup *TaskGroup, target model.Req...
type TaskGroup (line 150) | type TaskGroup struct
function NewTaskGroup (line 156) | func NewTaskGroup(db *dbstore.DB, profileDurationSecs uint, stats model....
FILE: pkg/apiserver/profiling/pprof.go
type pprofOptions (line 13) | type pprofOptions struct
function fetchPprof (line 22) | func fetchPprof(op *pprofOptions) (string, TaskRawDataType, error) {
type fetcher (line 32) | type fetcher struct
method FetchAndWriteToFile (line 37) | func (f *fetcher) FetchAndWriteToFile(duration uint, fileNameWithoutEx...
FILE: pkg/apiserver/profiling/profile.go
function profileAndWritePprof (line 11) | func profileAndWritePprof(_ context.Context, fts *fetchers, target *mode...
FILE: pkg/apiserver/profiling/protobuf_to_svg.go
function convertProtobufToSVG (line 17) | func convertProtobufToSVG(content []byte, task TaskModel) ([]byte, error) {
function convertProtobufToDot (line 30) | func convertProtobufToDot(content []byte, _ TaskModel) ([]byte, error) {
function convertDotToSVG (line 59) | func convertDotToSVG(dotContent []byte) ([]byte, error) {
type protobufToDotWriter (line 74) | type protobufToDotWriter struct
method Open (line 78) | func (w *protobufToDotWriter) Open(_ string) (io.WriteCloser, error) {
type writeCloser (line 83) | type writeCloser struct
method Write (line 87) | func (wc *writeCloser) Write(p []byte) (n int, err error) {
method Close (line 93) | func (wc *writeCloser) Close() error {
type dotFetcher (line 97) | type dotFetcher struct
method Fetch (line 101) | func (f *dotFetcher) Fetch(_ string, _, _ time.Duration) (*profile.Pro...
type flagSet (line 106) | type flagSet struct
method StringList (line 111) | func (f *flagSet) StringList(o, d, c string) *[]*string {
method ExtraUsage (line 115) | func (f *flagSet) ExtraUsage() string {
method Parse (line 119) | func (f *flagSet) Parse(usage func()) []string {
method AddExtraUsage (line 125) | func (f *flagSet) AddExtraUsage(_ string) {}
type blankPprofUI (line 128) | type blankPprofUI struct
method ReadLine (line 130) | func (b blankPprofUI) ReadLine(_ string) (string, error) {
method Print (line 134) | func (b blankPprofUI) Print(_ ...interface{}) {
method PrintErr (line 137) | func (b blankPprofUI) PrintErr(_ ...interface{}) {
method IsTerminal (line 140) | func (b blankPprofUI) IsTerminal() bool {
method WantBrowser (line 144) | func (b blankPprofUI) WantBrowser() bool {
method SetAutoComplete (line 148) | func (b blankPprofUI) SetAutoComplete(_ func(string) string) {
FILE: pkg/apiserver/profiling/router.go
function RegisterRouter (line 26) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
method handleStartGroup (line 53) | func (s *Service) handleStartGroup(c *gin.Context) {
method getGroupList (line 95) | func (s *Service) getGroupList(c *gin.Context) {
type GroupDetailResponse (line 105) | type GroupDetailResponse struct
method getGroupDetail (line 120) | func (s *Service) getGroupDetail(c *gin.Context) {
method handleCancelGroup (line 156) | func (s *Service) handleCancelGroup(c *gin.Context) {
method getActionToken (line 181) | func (s *Service) getActionToken(c *gin.Context) {
method downloadGroup (line 202) | func (s *Service) downloadGroup(c *gin.Context) {
method downloadSingle (line 257) | func (s *Service) downloadSingle(c *gin.Context) {
function writeZipFromFiles (line 298) | func writeZipFromFiles(zw *zip.Writer, files []string, compress bool) er...
function writeZipFromFile (line 308) | func writeZipFromFile(zw *zip.Writer, file string, compress bool) error {
function zipREADME (line 343) | func zipREADME(zw *zip.Writer) error {
type ViewOutputType (line 367) | type ViewOutputType
constant ViewOutputTypeProtobuf (line 370) | ViewOutputTypeProtobuf ViewOutputType = "protobuf"
constant ViewOutputTypeGraph (line 371) | ViewOutputTypeGraph ViewOutputType = "graph"
constant ViewOutputTypeText (line 372) | ViewOutputTypeText ViewOutputType = "text"
method viewSingle (line 385) | func (s *Service) viewSingle(c *gin.Context) {
method deleteGroup (line 489) | func (s *Service) deleteGroup(c *gin.Context) {
method getDynamicConfig (line 517) | func (s *Service) getDynamicConfig(c *gin.Context) {
method setDynamicConfig (line 534) | func (s *Service) setDynamicConfig(c *gin.Context) {
FILE: pkg/apiserver/profiling/service.go
constant Timeout (line 23) | Timeout = 5 * time.Second
type StartRequest (line 34) | type StartRequest struct
type StartRequestSession (line 40) | type StartRequestSession struct
type ServiceParams (line 47) | type ServiceParams struct
type Service (line 56) | type Service struct
method serviceLoop (line 89) | func (s *Service) serviceLoop(ctx context.Context) {
method handleRequest (line 131) | func (s *Service) handleRequest(ctx context.Context, session *StartReq...
method exclusiveExecute (line 141) | func (s *Service) exclusiveExecute(ctx context.Context, req *StartRequ...
method startGroup (line 151) | func (s *Service) startGroup(ctx context.Context, req *StartRequest) (...
method cancelGroup (line 210) | func (s *Service) cancelGroup(taskGroupID uint) error {
FILE: pkg/apiserver/queryeditor/service.go
type ServiceParams (line 23) | type ServiceParams struct
type Service (line 29) | type Service struct
method runHandler (line 123) | func (s *Service) runHandler(c *gin.Context) {
function NewService (line 34) | func NewService(lc fx.Lifecycle, p ServiceParams) *Service {
function RegisterRouter (line 46) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type RunRequest (line 54) | type RunRequest struct
type RunResponse (line 59) | type RunResponse struct
function executeStatements (line 67) | func executeStatements(context context.Context, db *sql.DB, statements s...
FILE: pkg/apiserver/resource_manager/service.go
type ServiceParams (line 26) | type ServiceParams struct
type Service (line 31) | type Service struct
method GetConfig (line 67) | func (s *Service) GetConfig(c *gin.Context) {
method GetInformation (line 91) | func (s *Service) GetInformation(c *gin.Context) {
method resourceGroupNamesHandler (line 107) | func (s *Service) resourceGroupNamesHandler(c *gin.Context) {
method GetCalibrateByHardware (line 137) | func (s *Service) GetCalibrateByHardware(c *gin.Context) {
method GetCalibrateByActual (line 170) | func (s *Service) GetCalibrateByActual(c *gin.Context) {
function newService (line 37) | func newService(p ServiceParams, ff *featureflag.Registry) *Service {
function registerRouter (line 41) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type GetConfigResponse (line 57) | type GetConfigResponse struct
type ResourceInfoRowDef (line 78) | type ResourceInfoRowDef struct
type CalibrateResponse (line 126) | type CalibrateResponse struct
type GetCalibrateByActualRequest (line 158) | type GetCalibrateByActualRequest struct
FILE: pkg/apiserver/slowquery/model.go
type Model (line 14) | type Model struct
type Field (line 125) | type Field struct
function getFieldsAndTags (line 133) | func getFieldsAndTags() (slowQueryFields []Field) {
function filterFieldsByColumns (line 153) | func filterFieldsByColumns(fields []Field, columns []string) []Field {
FILE: pkg/apiserver/slowquery/queries.go
constant SlowQueryTable (line 14) | SlowQueryTable = "INFORMATION_SCHEMA.CLUSTER_SLOW_QUERY"
type GetListRequest (line 17) | type GetListRequest struct
type GetDetailRequest (line 34) | type GetDetailRequest struct
function QuerySlowLogList (line 41) | func QuerySlowLogList(req *GetListRequest, sysSchema *utils.SysSchema, d...
function QuerySlowLogDetail (line 124) | func QuerySlowLogDetail(req *GetDetailRequest, sysSchema *utils.SysSchem...
function GetAvailableFields (line 146) | func GetAvailableFields(sysSchema *utils.SysSchema, db *gorm.DB) ([]stri...
FILE: pkg/apiserver/slowquery/service.go
type ServiceParams (line 27) | type ServiceParams struct
type Service (line 33) | type Service struct
method getList (line 66) | func (s *Service) getList(c *gin.Context) {
method getDetails (line 89) | func (s *Service) getDetails(c *gin.Context) {
method downloadTokenHandler (line 134) | func (s *Service) downloadTokenHandler(c *gin.Context) {
method downloadHandler (line 184) | func (s *Service) downloadHandler(c *gin.Context) {
method getAvailableFields (line 196) | func (s *Service) getAvailableFields(c *gin.Context) {
function newService (line 37) | func newService(p ServiceParams) *Service {
function registerRouter (line 41) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
FILE: pkg/apiserver/slowquery/statement_gen.go
function genSelectStmt (line 16) | func genSelectStmt(tableColumns []string, reqJSONColumns []string) (stri...
function genOrderStmt (line 54) | func genOrderStmt(tableColumns []string, orderBy string, isDesc bool) (s...
FILE: pkg/apiserver/statement/config.go
function buildGlobalConfigProjectionSelectSQL (line 18) | func buildGlobalConfigProjectionSelectSQL(config interface{}) string {
function buildGlobalConfigNamedArgsUpdateSQL (line 33) | func buildGlobalConfigNamedArgsUpdateSQL(config interface{}, allowedFiel...
function buildStringByStructField (line 50) | func buildStringByStructField(i interface{}, buildFunc func(f reflect.St...
FILE: pkg/apiserver/statement/config_test.go
function TestT (line 11) | func TestT(t *testing.T) {
type testConfigSuite (line 18) | type testConfigSuite struct
method Test_buildGlobalConfigProjectionSelectSQL_struct_success (line 25) | func (t *testConfigSuite) Test_buildGlobalConfigProjectionSelectSQL_st...
method Test_buildGlobalConfigProjectionSelectSQL_ptr_success (line 30) | func (t *testConfigSuite) Test_buildGlobalConfigProjectionSelectSQL_pt...
method Test_buildGlobalConfigProjectionSelectSQL_without_gorm_tag (line 40) | func (t *testConfigSuite) Test_buildGlobalConfigProjectionSelectSQL_wi...
method Test_buildGlobalConfigNamedArgsUpdateSQL_struct_success (line 45) | func (t *testConfigSuite) Test_buildGlobalConfigNamedArgsUpdateSQL_str...
method Test_buildGlobalConfigNamedArgsUpdateSQL_ptr_success (line 50) | func (t *testConfigSuite) Test_buildGlobalConfigNamedArgsUpdateSQL_ptr...
method Test_buildGlobalConfigNamedArgsUpdateSQL_without_gorm_tag (line 55) | func (t *testConfigSuite) Test_buildGlobalConfigNamedArgsUpdateSQL_wit...
method Test_buildGlobalConfigNamedArgsUpdateSQL_extract_fields (line 60) | func (t *testConfigSuite) Test_buildGlobalConfigNamedArgsUpdateSQL_ext...
type testConfig (line 20) | type testConfig struct
type testConfig2 (line 35) | type testConfig2 struct
FILE: pkg/apiserver/statement/models.go
type Model (line 16) | type Model struct
method checkSupportPlanBinding (line 157) | func (m *Model) checkSupportPlanBinding() bool {
method AfterFind (line 167) | func (m *Model) AfterFind(_ *gorm.DB) error {
function extractSchemasFromTableNames (line 140) | func extractSchemasFromTableNames(tableNames string) string {
type Field (line 175) | type Field struct
function getFieldsAndTags (line 185) | func getFieldsAndTags() (stmtFields []Field) {
function filterFieldsByColumns (line 206) | func filterFieldsByColumns(fields []Field, columns []string) []Field {
type Binding (line 225) | type Binding struct
FILE: pkg/apiserver/statement/queries.go
constant statementsTable (line 17) | statementsTable = "INFORMATION_SCHEMA.CLUSTER_STATEMENTS_SUMMARY_HISTORY"
function queryStmtTypes (line 22) | func queryStmtTypes(db *gorm.DB) (result []string, err error) {
method queryStatements (line 39) | func (s *Service) queryStatements(
method queryPlans (line 108) | func (s *Service) queryPlans(
method queryPlanDetail (line 158) | func (s *Service) queryPlanDetail(
method queryPlanBinding (line 196) | func (s *Service) queryPlanBinding(db *gorm.DB, sqlDigest string, beginT...
method createPlanBinding (line 223) | func (s *Service) createPlanBinding(db *gorm.DB, planDigest string) (err...
method dropPlanBinding (line 235) | func (s *Service) dropPlanBinding(db *gorm.DB, sqlDigest string) (err er...
FILE: pkg/apiserver/statement/service.go
type ServiceParams (line 30) | type ServiceParams struct
type Service (line 36) | type Service struct
method configHandler (line 88) | func (s *Service) configHandler(c *gin.Context) {
method modifyConfigHandler (line 105) | func (s *Service) modifyConfigHandler(c *gin.Context) {
method stmtTypesHandler (line 133) | func (s *Service) stmtTypesHandler(c *gin.Context) {
method listHandler (line 160) | func (s *Service) listHandler(c *gin.Context) {
method plansHandler (line 199) | func (s *Service) plansHandler(c *gin.Context) {
method planDetailHandler (line 225) | func (s *Service) planDetailHandler(c *gin.Context) {
method getPlanBindingHandler (line 262) | func (s *Service) getPlanBindingHandler(c *gin.Context) {
method createPlanBindingHandler (line 304) | func (s *Service) createPlanBindingHandler(c *gin.Context) {
method dropPlanBindingHandler (line 327) | func (s *Service) dropPlanBindingHandler(c *gin.Context) {
method downloadTokenHandler (line 352) | func (s *Service) downloadTokenHandler(c *gin.Context) {
method downloadHandler (line 409) | func (s *Service) downloadHandler(c *gin.Context) {
method getAvailableFields (line 420) | func (s *Service) getAvailableFields(c *gin.Context) {
function newService (line 41) | func newService(p ServiceParams, ff *featureflag.Registry) *Service {
function registerRouter (line 45) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type EditableConfig (line 75) | type EditableConfig struct
type GetStatementsRequest (line 143) | type GetStatementsRequest struct
type GetPlansRequest (line 186) | type GetPlansRequest struct
type GetPlanDetailRequest (line 214) | type GetPlanDetailRequest struct
FILE: pkg/apiserver/statement/statement_gen.go
method genSelectStmt (line 17) | func (s *Service) genSelectStmt(tableColumns []string, reqJSONColumns []...
FILE: pkg/apiserver/topsql/service.go
type ServiceParams (line 32) | type ServiceParams struct
type Service (line 40) | type Service struct
method GetInstance (line 93) | func (s *Service) GetInstance(_ *gin.Context) {
method GetSummary (line 159) | func (s *Service) GetSummary(_ *gin.Context) {
method GetConfig (line 173) | func (s *Service) GetConfig(c *gin.Context) {
method UpdateConfig (line 191) | func (s *Service) UpdateConfig(c *gin.Context) {
method GetTiKVNetworkIOCollection (line 231) | func (s *Service) GetTiKVNetworkIOCollection(c *gin.Context) {
method UpdateTiKVNetworkIOCollection (line 331) | func (s *Service) UpdateTiKVNetworkIOCollection(c *gin.Context) {
function newService (line 46) | func newService(p ServiceParams, ff *featureflag.Registry) *Service {
function registerRouter (line 50) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type GetInstancesRequest (line 71) | type GetInstancesRequest struct
type InstanceResponse (line 77) | type InstanceResponse struct
type InstanceItem (line 81) | type InstanceItem struct
type GetSummaryRequest (line 97) | type GetSummaryRequest struct
type SummaryResponse (line 109) | type SummaryResponse struct
type SummaryItem (line 114) | type SummaryItem struct
type SummaryByItem (line 128) | type SummaryByItem struct
type SummaryPlanItem (line 139) | type SummaryPlanItem struct
type EditableConfig (line 163) | type EditableConfig struct
constant tikvNetworkIoCollectionKey (line 209) | tikvNetworkIoCollectionKey = "resource-metering.enable-network-io-collec...
constant tikvNetworkIoCollectionNodeTimeout (line 211) | tikvNetworkIoCollectionNodeTimeout = 3 * time.Second
constant tikvNetworkIoCollectionMaxConcurrency (line 212) | tikvNetworkIoCollectionMaxConcurrency = 10
type TikvNetworkIoCollectionConfig (line 215) | type TikvNetworkIoCollectionConfig struct
type UpdateTikvNetworkIoCollectionResponse (line 220) | type UpdateTikvNetworkIoCollectionResponse struct
function getTiKVNetworkIoCollectionConcurrency (line 421) | func getTiKVNetworkIoCollectionConcurrency(tikvCount int) int {
function parseNestedBoolByDotPath (line 429) | func parseNestedBoolByDotPath(data []byte, dotPath string) (value bool, ...
function splitDotPath (line 464) | func splitDotPath(dotPath string) []string {
FILE: pkg/apiserver/user/auth.go
type AuthService (line 34) | type AuthService struct
method authForm (line 234) | func (s *AuthService) authForm(f AuthenticateForm) (*utils.SessionUser...
method MWAuthRequired (line 257) | func (s *AuthService) MWAuthRequired() gin.HandlerFunc {
method MWRequireSharePriv (line 262) | func (s *AuthService) MWRequireSharePriv() gin.HandlerFunc {
method MWRequireWritePriv (line 279) | func (s *AuthService) MWRequireWritePriv() gin.HandlerFunc {
method RegisterAuthenticator (line 297) | func (s *AuthService) RegisterAuthenticator(typeID utils.AuthType, a A...
method GetLoginInfoHandler (line 310) | func (s *AuthService) GetLoginInfoHandler(c *gin.Context) {
method LoginHandler (line 343) | func (s *AuthService) LoginHandler(c *gin.Context) {
method getSignOutInfoHandler (line 359) | func (s *AuthService) getSignOutInfoHandler(c *gin.Context) {
type AuthenticateForm (line 44) | type AuthenticateForm struct
type TokenResponse (line 51) | type TokenResponse struct
type SignOutInfo (line 56) | type SignOutInfo struct
type Authenticator (line 60) | type Authenticator interface
type BaseAuthenticator (line 67) | type BaseAuthenticator struct
method IsEnabled (line 69) | func (a BaseAuthenticator) IsEnabled() (bool, error) {
method ProcessSession (line 73) | func (a BaseAuthenticator) ProcessSession(_ *utils.SessionUser) bool {
method SignOutInfo (line 77) | func (a BaseAuthenticator) SignOutInfo(_ *utils.SessionUser, _ string)...
function NewAuthService (line 81) | func NewAuthService(featureFlags *featureflag.Registry) *AuthService {
function registerRouter (line 247) | func registerRouter(r *gin.RouterGroup, s *AuthService) {
type GetLoginInfoResponse (line 301) | type GetLoginInfoResponse struct
type GetSignOutInfoRequest (line 347) | type GetSignOutInfoRequest struct
FILE: pkg/apiserver/user/code/codeauth/auth.go
constant typeID (line 15) | typeID utils.AuthType = 1
type Authenticator (line 19) | type Authenticator struct
method Authenticate (line 39) | func (a *Authenticator) Authenticate(f user.AuthenticateForm) (*utils....
method ProcessSession (line 47) | func (a *Authenticator) ProcessSession(user *utils.SessionUser) bool {
function newAuthenticator (line 24) | func newAuthenticator(sharingCodeService *code.Service) *Authenticator {
function registerAuthenticator (line 30) | func registerAuthenticator(a *Authenticator, authService *user.AuthServi...
FILE: pkg/apiserver/user/code/router.go
function registerRouter (line 16) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type ShareRequest (line 23) | type ShareRequest struct
type ShareResponse (line 28) | type ShareResponse struct
method ShareHandler (line 38) | func (s *Service) ShareHandler(c *gin.Context) {
method RevokeHandler (line 74) | func (s *Service) RevokeHandler(c *gin.Context) {
FILE: pkg/apiserver/user/code/service.go
type Service (line 33) | type Service struct
method NewSessionFromSharingCode (line 54) | func (s *Service) NewSessionFromSharingCode(codeInHex string) *utils.S...
method SharingCodeFromSession (line 84) | func (s *Service) SharingCodeFromSession(session *utils.SessionUser, e...
method ResetEncryptionKey (line 120) | func (s *Service) ResetEncryptionKey() {
method loadShareingSecret (line 125) | func (s *Service) loadShareingSecret() *[32]byte {
type sharedSession (line 37) | type sharedSession struct
function NewService (line 43) | func NewService() *Service {
FILE: pkg/apiserver/user/rsa_utils.go
function GenerateKey (line 14) | func GenerateKey() (*rsa.PrivateKey, *rsa.PublicKey, error) {
function ExportPublicKeyAsString (line 35) | func ExportPublicKeyAsString(publicKey *rsa.PublicKey) (string, error) {
function DumpPublicKeyBase64 (line 58) | func DumpPublicKeyBase64(publicKey *rsa.PublicKey) (string, error) {
function DumpPrivateKeyBase64 (line 75) | func DumpPrivateKeyBase64(privatekey *rsa.PrivateKey) (string, error) {
function Encrypt (line 83) | func Encrypt(plainText string, publicKey *rsa.PublicKey) (string, error) {
function Decrypt (line 95) | func Decrypt(cipherText string, privateKey *rsa.PrivateKey) (string, err...
FILE: pkg/apiserver/user/sqlauth/sqlauth.go
constant typeID (line 14) | typeID utils.AuthType = 0
type Authenticator (line 16) | type Authenticator struct
method Authenticate (line 38) | func (a *Authenticator) Authenticate(f user.AuthenticateForm) (*utils....
function NewAuthenticator (line 22) | func NewAuthenticator(tidbClient *tidb.Client) *Authenticator {
function registerAuthenticator (line 28) | func registerAuthenticator(a *Authenticator, authService *user.AuthServi...
FILE: pkg/apiserver/user/sso/models.go
type ImpersonateStatus (line 9) | type ImpersonateStatus
constant ImpersonateStatusSuccess (line 12) | ImpersonateStatusSuccess ImpersonateStatus = "success"
constant ImpersonateStatusAuthFail (line 13) | ImpersonateStatusAuthFail ImpersonateStatus = "auth_fail"
constant ImpersonateStatusInsufficientPrivs (line 14) | ImpersonateStatusInsufficientPrivs ImpersonateStatus = "insufficient_pri...
type SSOImpersonationModel (line 17) | type SSOImpersonationModel struct
method TableName (line 24) | func (SSOImpersonationModel) TableName() string {
function autoMigrate (line 28) | func autoMigrate(db *dbstore.DB) error {
FILE: pkg/apiserver/user/sso/router.go
function registerRouter (line 16) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type GetAuthURLRequest (line 27) | type GetAuthURLRequest struct
method getAuthURLHandler (line 38) | func (s *Service) getAuthURLHandler(c *gin.Context) {
method listImpersonationHandler (line 58) | func (s *Service) listImpersonationHandler(c *gin.Context) {
type CreateImpersonationRequest (line 68) | type CreateImpersonationRequest struct
method createImpersonationHandler (line 82) | func (s *Service) createImpersonationHandler(c *gin.Context) {
method getConfig (line 108) | func (s *Service) getConfig(c *gin.Context) {
type SetConfigRequest (line 119) | type SetConfigRequest struct
method setConfig (line 132) | func (s *Service) setConfig(c *gin.Context) {
FILE: pkg/apiserver/user/sso/service.go
constant discoveryTimeout (line 43) | discoveryTimeout = time.Second * 30
constant exchangeTimeout (line 44) | exchangeTimeout = time.Second * 30
constant userInfoTimeout (line 45) | userInfoTimeout = time.Second * 30
type ServiceParams (line 48) | type ServiceParams struct
type Service (line 55) | type Service struct
method getMasterEncKey (line 91) | func (s *Service) getMasterEncKey() (*[32]byte, error) {
method getOrCreateMasterEncKey (line 111) | func (s *Service) getOrCreateMasterEncKey() (*[32]byte, error) {
method getAndDecryptImpersonation (line 131) | func (s *Service) getAndDecryptImpersonation() (string, string, error) {
method updateImpersonationStatus (line 156) | func (s *Service) updateImpersonationStatus(user string, status Impers...
method newSessionFromImpersonation (line 165) | func (s *Service) newSessionFromImpersonation(userInfo *oAuthUserInfo,...
method createImpersonation (line 203) | func (s *Service) createImpersonation(userName string, password string...
method revokeAllImpersonations (line 247) | func (s *Service) revokeAllImpersonations() error {
method discoverOIDC (line 266) | func (s *Service) discoverOIDC(issuer string) (*oidcWellKnownConfig, e...
method IsEnabled (line 312) | func (s *Service) IsEnabled() (bool, error) {
method buildOAuth2Config (line 320) | func (s *Service) buildOAuth2Config(redirectURL string) (*oauth2.Confi...
method buildOAuthURL (line 355) | func (s *Service) buildOAuthURL(redirectURL string, state string, code...
method exchangeOAuthCode (line 372) | func (s *Service) exchangeOAuthCode(redirectURL string, code string, c...
method oAuthGetUserInfo (line 398) | func (s *Service) oAuthGetUserInfo(accessToken string) (*oAuthUserInfo...
method NewSessionFromOAuthExchange (line 421) | func (s *Service) NewSessionFromOAuthExchange(redirectURL string, code...
method BuildEndSessionURL (line 442) | func (s *Service) BuildEndSessionURL(user *utils.SessionUser, redirect...
function NewService (line 66) | func NewService(p ServiceParams, lc fx.Lifecycle, config *config.Config)...
type oidcWellKnownConfig (line 254) | type oidcWellKnownConfig struct
type oAuthUserInfo (line 393) | type oAuthUserInfo struct
FILE: pkg/apiserver/user/sso/ssoauth/auth.go
constant typeID (line 16) | typeID utils.AuthType = 2
type Authenticator (line 18) | type Authenticator struct
method Authenticate (line 44) | func (a *Authenticator) Authenticate(f user.AuthenticateForm) (*utils....
method IsEnabled (line 57) | func (a *Authenticator) IsEnabled() (bool, error) {
method SignOutInfo (line 61) | func (a *Authenticator) SignOutInfo(u *utils.SessionUser, redirectURL ...
function newAuthenticator (line 23) | func newAuthenticator(ssoService *sso.Service) *Authenticator {
function registerAuthenticator (line 29) | func registerAuthenticator(a *Authenticator, authService *user.AuthServi...
type SSOExtra (line 38) | type SSOExtra struct
FILE: pkg/apiserver/user/verify_sql_user.go
type tidbSecurityConfig (line 23) | type tidbSecurityConfig struct
type tidbSEMConfig (line 27) | type tidbSEMConfig struct
function VerifySQLUser (line 32) | func VerifySQLUser(tidbClient *tidb.Client, userName, password string) (...
function parseUserGrants (line 81) | func parseUserGrants(grantRows []string) map[string]struct{} {
function checkDashboardPriv (line 108) | func checkDashboardPriv(privs map[string]struct{}, enableSEM bool) bool {
function checkWriteablePriv (line 147) | func checkWriteablePriv(privs map[string]struct{}) bool {
function hasPriv (line 160) | func hasPriv(priv string, privs map[string]struct{}) bool {
FILE: pkg/apiserver/user/verify_sql_user_test.go
function TestT (line 11) | func TestT(t *testing.T) {
type testVerifySQLUserSuite (line 18) | type testVerifySQLUserSuite struct
method Test_parseUserGrants (line 20) | func (t *testVerifySQLUserSuite) Test_parseUserGrants(c *check.C) {
method Test_checkDashboardPriv (line 77) | func (t *testVerifySQLUserSuite) Test_checkDashboardPriv(c *check.C) {
method Test_checkWriteablePriv (line 165) | func (t *testVerifySQLUserSuite) Test_checkWriteablePriv(c *check.C) {
FILE: pkg/apiserver/utils/auth.go
type AuthType (line 11) | type AuthType
constant SessionVersion (line 13) | SessionVersion = 2
type SessionUser (line 17) | type SessionUser struct
constant SessionUserKey (line 43) | SessionUserKey = "user"
function GetSession (line 46) | func GetSession(c *gin.Context) *SessionUser {
FILE: pkg/apiserver/utils/binary_plan.go
constant MainTree (line 22) | MainTree = "main"
constant CteTrees (line 23) | CteTrees = "ctes"
constant Children (line 24) | Children = "children"
constant Duration (line 25) | Duration = "duration"
constant Time (line 26) | Time = "time"
constant Diagnosis (line 27) | Diagnosis = "diagnosis"
constant RootGroupExecInfo (line 28) | RootGroupExecInfo = "rootGroupExecInfo"
constant RootBasicExecInfo (line 29) | RootBasicExecInfo = "rootBasicExecInfo"
constant OperatorInfo (line 30) | OperatorInfo = "operatorInfo"
constant OperatorName (line 31) | OperatorName = "name"
constant CopExecInfo (line 32) | CopExecInfo = "copExecInfo"
constant CacheHitRatio (line 33) | CacheHitRatio = "cacheHitRatio"
constant TaskType (line 34) | TaskType = "taskType"
constant StoreType (line 35) | StoreType = "storeType"
constant DiskBytes (line 36) | DiskBytes = "diskBytes"
constant MemoryBytes (line 37) | MemoryBytes = "memoryBytes"
constant ActRows (line 38) | ActRows = "actRows"
constant EstRows (line 39) | EstRows = "estRows"
constant AccessObjects (line 40) | AccessObjects = "accessObjects"
constant ScanObject (line 41) | ScanObject = "scanObject"
constant DynamicpartitionObjects (line 42) | DynamicpartitionObjects = "dynamicpartitionObjects"
constant OtherObject (line 43) | OtherObject = "otherObject"
constant DiscardedDueToTooLong (line 44) | DiscardedDueToTooLong = "discardedDueToTooLong"
constant BuildSide (line 45) | BuildSide = "buildSide"
constant ProbeSide (line 46) | ProbeSide = "probeSide"
constant JoinTaskThreshold (line 48) | JoinTaskThreshold = 10000
constant returnTableThreshold (line 49) | returnTableThreshold = 0.7
constant HighEstError (line 52) | HighEstError = "high_est_error"
constant DiskSpill (line 53) | DiskSpill = "disk_spill"
constant PseudoEst (line 54) | PseudoEst = "pseudo_est"
constant GoodFilterOnTableFullScan (line 55) | GoodFilterOnTableFullScan = "good_filter_on_table_fullscan"
constant BadIndexForIndexLookUp (line 56) | BadIndexForIndexLookUp = "bad_index_for_index_lookup"
constant IndexJoinBuildSideTooLarge (line 57) | IndexJoinBuildSideTooLarge = "index_join_build_side_too_large"
constant TiKVHugeTableScan (line 58) | TiKVHugeTableScan = "tikv_huge_table_scan"
type operator (line 62) | type operator
constant Default (line 65) | Default operator = iota
constant IndexJoin (line 66) | IndexJoin
constant IndexMergeJoin (line 67) | IndexMergeJoin
constant IndexHashJoin (line 68) | IndexHashJoin
constant Apply (line 69) | Apply
constant Shuffle (line 70) | Shuffle
constant ShuffleReceiver (line 71) | ShuffleReceiver
constant IndexLookUpReader (line 72) | IndexLookUpReader
constant IndexMergeReader (line 73) | IndexMergeReader
constant IndexFullScan (line 74) | IndexFullScan
constant IndexRangeScan (line 75) | IndexRangeScan
constant TableFullScan (line 76) | TableFullScan
constant TableRangeScan (line 77) | TableRangeScan
constant TableRowIDScan (line 78) | TableRowIDScan
constant Selection (line 79) | Selection
type concurrency (line 82) | type concurrency struct
type diagnosticOperation (line 90) | type diagnosticOperation struct
function newConcurrency (line 111) | func newConcurrency() concurrency {
function newDiagnosticOperation (line 121) | func newDiagnosticOperation() diagnosticOperation {
function GenerateBinaryPlan (line 126) | func GenerateBinaryPlan(v string) (*tipb.ExplainData, error) {
function GenerateBinaryPlanJSON (line 152) | func GenerateBinaryPlanJSON(b string) (string, error) {
function diagnosticOperator (line 185) | func diagnosticOperator(bp []byte) ([]byte, error) {
function diagnosticOperatorNode (line 211) | func diagnosticOperatorNode(node *simplejson.Json, diagOp diagnosticOper...
function diagnosticOperatorNodes (line 334) | func diagnosticOperatorNodes(nodes *simplejson.Json, diagOp diagnosticOp...
function cut (line 359) | func cut(s, sep string) (before, after string, found bool) {
function getScanDatabase (line 366) | func getScanDatabase(node *simplejson.Json) string {
function useComparisonOperator (line 394) | func useComparisonOperator(operatorInfo string) bool {
function analyzeDuration (line 472) | func analyzeDuration(bp []byte) ([]byte, error) {
function analyzeDurationNode (line 503) | func analyzeDurationNode(node *simplejson.Json, concurrency concurrency)...
function analyzeDurationNodes (line 538) | func analyzeDurationNodes(nodes *simplejson.Json, operator operator, con...
function isProbeSide (line 652) | func isProbeSide(node *simplejson.Json) bool {
function isBuildSide (line 656) | func isBuildSide(node *simplejson.Json) bool {
function labelsContains (line 660) | func labelsContains(node *simplejson.Json, label string) bool {
function getOperatorType (line 676) | func getOperatorType(node *simplejson.Json) operator {
function getBuildChildrenWithDriverSide (line 713) | func getBuildChildrenWithDriverSide(node *simplejson.Json) *simplejson.J...
function getConcurrency (line 731) | func getConcurrency(node *simplejson.Json, operator operator, concurrenc...
function getCopTaskDuration (line 796) | func getCopTaskDuration(node *simplejson.Json, concurrency concurrency) ...
function getOperatorDuration (line 846) | func getOperatorDuration(ts string, concurrency concurrency) string {
function formatBinaryPlanJSON (line 857) | func formatBinaryPlanJSON(bp []byte) ([]byte, error) {
function formatNode (line 889) | func formatNode(node *simplejson.Json) error {
function formatChildrenNodes (line 947) | func formatChildrenNodes(nodes *simplejson.Json) error {
function formatJSON (line 966) | func formatJSON(s string) (*simplejson.Json, error) {
function GenerateBinaryPlanText (line 982) | func GenerateBinaryPlanText(db *gorm.DB, b string) (string, error) {
FILE: pkg/apiserver/utils/binary_plan_test.go
function TestGenerateBinaryPlan (line 16) | func TestGenerateBinaryPlan(t *testing.T) {
function TestGenerateBinaryPlanJson (line 23) | func TestGenerateBinaryPlanJson(t *testing.T) {
function TestUseComparisonOperator (line 30) | func TestUseComparisonOperator(t *testing.T) {
function TestFormatJSON (line 50) | func TestFormatJSON(t *testing.T) {
function TestTooLong (line 56) | func TestTooLong(t *testing.T) {
function TestBinaryPlanIsNil (line 66) | func TestBinaryPlanIsNil(t *testing.T) {
function TestHighEstError (line 72) | func TestHighEstError(t *testing.T) {
function TestDiskSpill (line 78) | func TestDiskSpill(t *testing.T) {
function TestGoodFilterOnTableFullScan (line 84) | func TestGoodFilterOnTableFullScan(t *testing.T) {
function TestBadIndexForIndexLookUp (line 90) | func TestBadIndexForIndexLookUp(t *testing.T) {
function TestIndexJoinBuildSideTooLarge (line 96) | func TestIndexJoinBuildSideTooLarge(t *testing.T) {
function TestPseudoEst (line 102) | func TestPseudoEst(t *testing.T) {
function TestTiKVHugeTableScan (line 108) | func TestTiKVHugeTableScan(t *testing.T) {
function TestCopTasksDuration (line 116) | func TestCopTasksDuration(t *testing.T) {
function TestIndexJoinAndLookUPDuration (line 122) | func TestIndexJoinAndLookUPDuration(t *testing.T) {
function TestApplyAndLookUPDuration (line 129) | func TestApplyAndLookUPDuration(t *testing.T) {
function TestShuffleDuration (line 136) | func TestShuffleDuration(t *testing.T) {
FILE: pkg/apiserver/utils/export.go
function GenerateCSVFromRaw (line 27) | func GenerateCSVFromRaw(rawData []interface{}, fields []string, timeFiel...
function ExportCSV (line 76) | func ExportCSV(data [][]string, filename, tokenNamespace string) (token ...
function DownloadByToken (line 104) | func DownloadByToken(token, tokenNamespace string, c *gin.Context) {
FILE: pkg/apiserver/utils/gorm.go
function GetGormColumnName (line 7) | func GetGormColumnName(gormStr string) string {
FILE: pkg/apiserver/utils/gorm_test.go
function TestT (line 11) | func TestT(t *testing.T) {
type testGormSuite (line 18) | type testGormSuite struct
method Test_GetGormColumnName (line 20) | func (t *testGormSuite) Test_GetGormColumnName(c *check.C) {
FILE: pkg/apiserver/utils/jwt.go
type Claims (line 16) | type Claims struct
function newClaims (line 21) | func newClaims(issuer string, data string, expireIn time.Duration) *Clai...
function NewJWTString (line 32) | func NewJWTString(issuer string, data string) (string, error) {
function NewJWTStringWithExpire (line 36) | func NewJWTStringWithExpire(issuer string, data string, expireIn time.Du...
function ParseJWTString (line 47) | func ParseJWTString(requiredIssuer string, tokenStr string) (string, err...
FILE: pkg/apiserver/utils/mw_experimental.go
function MWForbidByExperimentalFlag (line 13) | func MWForbidByExperimentalFlag(enableExp bool) gin.HandlerFunc {
FILE: pkg/apiserver/utils/ngm.go
type NgmState (line 31) | type NgmState
constant NgmStateNotSupported (line 34) | NgmStateNotSupported NgmState = "not_supported"
constant NgmStateNotStarted (line 35) | NgmStateNotStarted NgmState = "not_started"
constant NgmStateStarted (line 36) | NgmStateStarted NgmState = "started"
constant ngmCacheTTL (line 40) | ngmCacheTTL = time.Second * 5
type ngmAddrCacheEntity (line 43) | type ngmAddrCacheEntity struct
type NgmProxy (line 49) | type NgmProxy struct
method Route (line 72) | func (n *NgmProxy) Route(targetPath string) gin.HandlerFunc {
method getNgmAddrFromCache (line 100) | func (n *NgmProxy) getNgmAddrFromCache() (string, error) {
method resolveNgmAddress (line 127) | func (n *NgmProxy) resolveNgmAddress() (string, error) {
function NewNgmProxy (line 57) | func NewNgmProxy(lc fx.Lifecycle, etcdClient *clientv3.Client, config *c...
function defaultTransportDialContext (line 135) | func defaultTransportDialContext(dialer *net.Dialer) func(context.Contex...
FILE: pkg/apiserver/utils/subset.go
function IsSubsetICaseInsensitive (line 11) | func IsSubsetICaseInsensitive(a []string, b []string) bool {
FILE: pkg/apiserver/utils/tidb_conn.go
constant tiDBConnectionKey (line 16) | tiDBConnectionKey = "tidb"
function MWConnectTiDB (line 24) | func MWConnectTiDB(tidbClient *tidb.Client) gin.HandlerFunc {
function TakeTiDBConnection (line 75) | func TakeTiDBConnection(c *gin.Context) *gorm.DB {
function CloseTiDBConnection (line 81) | func CloseTiDBConnection(db *gorm.DB) error {
function GetTiDBConnection (line 93) | func GetTiDBConnection(c *gin.Context) *gorm.DB {
FILE: pkg/apiserver/visualplan/service.go
type ServiceParams (line 20) | type ServiceParams struct
type Service (line 24) | type Service struct
method GenerateVisualPlan (line 55) | func (s *Service) GenerateVisualPlan(c *gin.Context) {
function newService (line 29) | func newService(p ServiceParams, ff *featureflag.Registry) *Service {
function registerRouter (line 33) | func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
type GenerateVisualPlanRequest (line 44) | type GenerateVisualPlanRequest struct
FILE: pkg/config/config.go
constant defaultPublicPathPrefix (line 16) | defaultPublicPathPrefix = "/dashboard"
constant UIPathPrefix (line 18) | UIPathPrefix = "/dashboard/"
constant APIPathPrefix (line 19) | APIPathPrefix = "/dashboard/api/"
constant SwaggerPathPrefix (line 20) | SwaggerPathPrefix = "/dashboard/api/swagger/"
type Config (line 23) | type Config struct
method GetClusterHTTPScheme (line 60) | func (c *Config) GetClusterHTTPScheme() string {
method NormalizePDEndPoint (line 67) | func (c *Config) NormalizePDEndPoint() error {
method NormalizePublicPathPrefix (line 82) | func (c *Config) NormalizePublicPathPrefix() {
function Default (line 42) | func Default() *Config {
FILE: pkg/config/dynamic_config.go
constant KeyVisualDBPolicy (line 12) | KeyVisualDBPolicy = "db"
constant KeyVisualKVPolicy (line 13) | KeyVisualKVPolicy = "kv"
constant DefaultKeyVisualPolicy (line 15) | DefaultKeyVisualPolicy = KeyVisualDBPolicy
constant DefaultProfilingAutoCollectionDurationSecs (line 17) | DefaultProfilingAutoCollectionDurationSecs = 30
constant MaxProfilingAutoCollectionDurationSecs (line 18) | MaxProfilingAutoCollectionDurationSecs = 120
constant DefaultProfilingAutoCollectionIntervalSecs (line 19) | DefaultProfilingAutoCollectionIntervalSecs = 3600
type KeyVisualConfig (line 28) | type KeyVisualConfig struct
method validatePolicy (line 34) | func (c *KeyVisualConfig) validatePolicy() error {
type ProfilingConfig (line 41) | type ProfilingConfig struct
type SSOCoreConfig (line 47) | type SSOCoreConfig struct
type SSOConfig (line 56) | type SSOConfig struct
type DynamicConfig (line 64) | type DynamicConfig struct
method Clone (line 70) | func (c *DynamicConfig) Clone() *DynamicConfig {
method Validate (line 77) | func (c *DynamicConfig) Validate() error {
method Adjust (line 107) | func (c *DynamicConfig) Adjust() {
FILE: pkg/config/dynamic_config_manager.go
constant DynamicConfigPath (line 20) | DynamicConfigPath = "/dashboard/dynamic_config"
constant Timeout (line 21) | Timeout = time.Second
constant MaxCheckInterval (line 22) | MaxCheckInterval = 30 * time.Second
constant MaxElapsedTime (line 23) | MaxElapsedTime = 0
type DynamicConfigOption (line 32) | type DynamicConfigOption
type DynamicConfigManager (line 34) | type DynamicConfigManager struct
method Start (line 57) | func (m *DynamicConfigManager) Start(ctx context.Context) error {
method Stop (line 90) | func (m *DynamicConfigManager) Stop(_ context.Context) error {
method NewPushChannel (line 99) | func (m *DynamicConfigManager) NewPushChannel() <-chan *DynamicConfig {
method Get (line 113) | func (m *DynamicConfigManager) Get() (*DynamicConfig, error) {
method Set (line 122) | func (m *DynamicConfigManager) Set(newDc *DynamicConfig) error {
method Modify (line 139) | func (m *DynamicConfigManager) Modify(opts ...DynamicConfigOption) err...
method load (line 155) | func (m *DynamicConfigManager) load() (*DynamicConfig, error) {
method store (line 181) | func (m *DynamicConfigManager) store(dc *DynamicConfig) error {
function NewDynamicConfigManager (line 45) | func NewDynamicConfigManager(lc fx.Lifecycle, config *Config, etcdClient...
FILE: pkg/dbstore/dbstore.go
type DB (line 21) | type DB struct
function NewDBStore (line 25) | func NewDBStore(lc fx.Lifecycle, config *config.Config) (*DB, error) {
FILE: pkg/httpc/client.go
constant defaultTimeout (line 22) | defaultTimeout = time.Second * 10
type Client (line 25) | type Client struct
method Clone (line 57) | func (c *Client) Clone() *Client {
method WithTimeout (line 64) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method CloneAndAddRequestHeader (line 69) | func (c *Client) CloneAndAddRequestHeader(key, value string) *Client {
method SendRequest (line 79) | func (c *Client) SendRequest(
method Send (line 95) | func (c *Client) Send(
function NewHTTPClient (line 31) | func NewHTTPClient(lc fx.Lifecycle, config *config.Config) *Client {
type Response (line 129) | type Response struct
method Body (line 133) | func (r *Response) Body() ([]byte, error) {
FILE: pkg/httpc/client_test.go
function newTestClient (line 17) | func newTestClient(t *testing.T) *Client {
function Test_Clone (line 23) | func Test_Clone(t *testing.T) {
function Test_CloneAndAddRequestHeader (line 33) | func Test_CloneAndAddRequestHeader(t *testing.T) {
function Test_Send_withHeader (line 47) | func Test_Send_withHeader(t *testing.T) {
FILE: pkg/keyvisual/decorator/decorator.go
type LabelKey (line 13) | type LabelKey struct
type LabelStrategy (line 20) | type LabelStrategy interface
type Labeler (line 26) | type Labeler interface
function NaiveLabelStrategy (line 34) | func NaiveLabelStrategy() LabelStrategy {
type naiveLabelStrategy (line 38) | type naiveLabelStrategy struct
method ReloadConfig (line 42) | func (s naiveLabelStrategy) ReloadConfig(_ *config.KeyVisualConfig) {}
method NewLabeler (line 44) | func (s naiveLabelStrategy) NewLabeler() Labeler {
type naiveLabeler (line 40) | type naiveLabeler struct
method CrossBorder (line 49) | func (e naiveLabeler) CrossBorder(_, _ string) bool {
method Label (line 54) | func (e naiveLabeler) Label(keys []string) []LabelKey {
FILE: pkg/keyvisual/decorator/decorator_test.go
function TestDecorator (line 11) | func TestDecorator(t *testing.T) {
FILE: pkg/keyvisual/decorator/separator.go
function SeparatorLabelStrategy (line 16) | func SeparatorLabelStrategy(cfg *config.KeyVisualConfig) LabelStrategy {
type separatorLabelStrategy (line 22) | type separatorLabelStrategy struct
method ReloadConfig (line 31) | func (s *separatorLabelStrategy) ReloadConfig(cfg *config.KeyVisualCon...
method NewLabeler (line 36) | func (s *separatorLabelStrategy) NewLabeler() Labeler {
type separatorLabeler (line 26) | type separatorLabeler struct
method CrossBorder (line 43) | func (e *separatorLabeler) CrossBorder(_, _ string) bool {
method Label (line 48) | func (e *separatorLabeler) Label(keys []string) []LabelKey {
FILE: pkg/keyvisual/decorator/tidb.go
function TiDBLabelStrategy (line 22) | func TiDBLabelStrategy(lc fx.Lifecycle, wg *sync.WaitGroup, etcdClient *...
type tableDetail (line 41) | type tableDetail struct
type tidbLabelStrategy (line 48) | type tidbLabelStrategy struct
method ReloadConfig (line 63) | func (s *tidbLabelStrategy) ReloadConfig(_ *config.KeyVisualConfig) {}
method Background (line 65) | func (s *tidbLabelStrategy) Background(ctx context.Context) {
method NewLabeler (line 78) | func (s *tidbLabelStrategy) NewLabeler() Labeler {
type tidbLabeler (line 58) | type tidbLabeler struct
method CrossBorder (line 85) | func (e *tidbLabeler) CrossBorder(startKey, endKey string) bool {
method Label (line 104) | func (e *tidbLabeler) Label(keys []string) []LabelKey {
method label (line 121) | func (e *tidbLabeler) label(key string) (label LabelKey) {
FILE: pkg/keyvisual/decorator/tidb_requests.go
constant schemaVersionPath (line 23) | schemaVersionPath = "/tidb/ddl/global_schema_version"
constant etcdGetTimeout (line 24) | etcdGetTimeout = time.Second
constant tableInfosBatchSize (line 25) | tableInfosBatchSize = 512
method updateMap (line 34) | func (s *tidbLabelStrategy) updateMap(ctx context.Context) {
method updateTableMap (line 135) | func (s *tidbLabelStrategy) updateTableMap(dbname string, tableInfos []*...
method request (line 165) | func (s *tidbLabelStrategy) request(path string, v interface{}) error {
FILE: pkg/keyvisual/decorator/tidb_test.go
type testTiDBSuite (line 11) | type testTiDBSuite struct
FILE: pkg/keyvisual/input/api.go
constant ScanRegionsLimit (line 19) | ScanRegionsLimit = 51200
type RegionInfo (line 28) | type RegionInfo struct
type RegionsInfo (line 41) | type RegionsInfo struct
method Len (line 46) | func (rs *RegionsInfo) Len() int {
method GetKeys (line 50) | func (rs *RegionsInfo) GetKeys() []string {
method GetValues (line 60) | func (rs *RegionsInfo) GetValues(tag regionpkg.StatTag) []uint64 {
function read (line 89) | func read(data []byte) (*RegionsInfo, error) {
function NewAPIPeriodicGetter (line 115) | func NewAPIPeriodicGetter(pdClient *pd.Client) regionpkg.RegionsInfoGene...
function scanRegions (line 148) | func scanRegions(pdclient *pd.Client, key, endKey string, limit int) (*R...
FILE: pkg/keyvisual/input/file.go
type fileInput (line 19) | type fileInput struct
method GetStartTime (line 34) | func (input *fileInput) GetStartTime() time.Time {
method Background (line 38) | func (input *fileInput) Background(_ context.Context, stat *storage.St...
function FileInput (line 26) | func FileInput(startTime, endTime time.Time) StatInput {
function readFile (line 51) | func readFile(fileTime time.Time) (*RegionsInfo, error) {
FILE: pkg/keyvisual/input/input.go
type StatInput (line 17) | type StatInput interface
function NewStatInput (line 22) | func NewStatInput(provider *region.DataProvider) StatInput {
FILE: pkg/keyvisual/input/periodic.go
type periodicInput (line 16) | type periodicInput struct
method GetStartTime (line 26) | func (input *periodicInput) GetStartTime() time.Time {
method Background (line 30) | func (input *periodicInput) Background(ctx context.Context, stat *stor...
function PeriodicInput (line 20) | func PeriodicInput(periodicGetter region.RegionsInfoGenerator) StatInput {
FILE: pkg/keyvisual/manager.go
method managerHook (line 19) | func (s *Service) managerHook() fx.Hook {
method managerLoop (line 35) | func (s *Service) managerLoop(ctx context.Context) {
method resetKeyVisualConfig (line 52) | func (s *Service) resetKeyVisualConfig(ctx context.Context, cfg *config....
method startService (line 65) | func (s *Service) startService(ctx context.Context) {
method stopService (line 76) | func (s *Service) stopService() {
method getDynamicConfig (line 93) | func (s *Service) getDynamicConfig(c *gin.Context) {
method setDynamicConfig (line 110) | func (s *Service) setDynamicConfig(c *gin.Context) {
FILE: pkg/keyvisual/matrix/average.go
function AverageSplitStrategy (line 6) | func AverageSplitStrategy() SplitStrategy {
type averageSplitStrategy (line 10) | type averageSplitStrategy struct
method NewSplitter (line 14) | func (averageSplitStrategy) NewSplitter(_ []chunk, _ []string) Splitter {
type averageSplitter (line 12) | type averageSplitter struct
method Split (line 18) | func (averageSplitter) Split(dst, src chunk, tag splitTag, _ int) {
FILE: pkg/keyvisual/matrix/average_test.go
type testAverageSuite (line 11) | type testAverageSuite struct
FILE: pkg/keyvisual/matrix/axis.go
type Axis (line 12) | type Axis struct
method Shrink (line 49) | func (axis *Axis) Shrink(ratio uint64) {
method Range (line 58) | func (axis *Axis) Range(startKey string, endKey string) Axis {
method Focus (line 73) | func (axis *Axis) Focus(labeler decorator.Labeler, threshold uint64, r...
method Divide (line 92) | func (axis *Axis) Divide(labeler decorator.Labeler, target int) Axis {
function CreateAxis (line 18) | func CreateAxis(keys []string, valuesList [][]uint64) Axis {
function CreateEmptyAxis (line 38) | func CreateEmptyAxis(startKey, endKey string, valuesListLen int) Axis {
type FocusMode (line 109) | type FocusMode
constant NotMergeLogicalRange (line 112) | NotMergeLogicalRange FocusMode = iota
constant MergeColdLogicalRange (line 113) | MergeColdLogicalRange
type chunk (line 116) | type chunk struct
method SetValues (line 144) | func (c *chunk) SetValues(values []uint64) {
method SetZeroValues (line 151) | func (c *chunk) SetZeroValues() {
method Clear (line 157) | func (c *chunk) Clear() {
method Reduce (line 164) | func (c *chunk) Reduce(newKeys []string) chunk {
method GetFocusRows (line 187) | func (c *chunk) GetFocusRows(threshold uint64) (count int) {
method Focus (line 212) | func (c *chunk) Focus(labeler decorator.Labeler, threshold uint64, rat...
method MergeColdLogicalRange (line 246) | func (c *chunk) MergeColdLogicalRange(labeler decorator.Labeler, thres...
method Divide (line 298) | func (c *chunk) Divide(labeler decorator.Labeler, target int, mode Foc...
function createChunk (line 122) | func createChunk(keys []string, values []uint64) chunk {
function createZeroChunk (line 136) | func createZeroChunk(keys []string) chunk {
FILE: pkg/keyvisual/matrix/axis_test.go
type testAxisSuite (line 11) | type testAxisSuite struct
method TestChunkReduce (line 13) | func (s *testAxisSuite) TestChunkReduce(c *check.C) {
FILE: pkg/keyvisual/matrix/distance.go
function DistanceSplitStrategy (line 19) | func DistanceSplitStrategy(lc fx.Lifecycle, wg *sync.WaitGroup, ratio fl...
type distanceSplitStrategy (line 45) | type distanceSplitStrategy struct
method NewSplitter (line 59) | func (s *distanceSplitStrategy) NewSplitter(chunks []chunk, compactKey...
method StartWorkers (line 156) | func (s *distanceSplitStrategy) StartWorkers(ctx context.Context, wg *...
method StopWorkers (line 167) | func (s *distanceSplitStrategy) StopWorkers() {
method GenerateScale (line 171) | func (s *distanceSplitStrategy) GenerateScale(chunks []chunk, compactK...
method GenerateScaleColumnWork (line 189) | func (s *distanceSplitStrategy) GenerateScaleColumnWork(ctx context.Co...
type distanceSplitter (line 55) | type distanceSplitter struct
method Split (line 90) | func (e *distanceSplitter) Split(dst, src chunk, tag splitTag, axesInd...
function init (line 144) | func init() {
type scaleTask (line 148) | type scaleTask struct
function updateLeftDis (line 273) | func updateLeftDis(dis, leftDis []int, keys, compactKeys []string) {
function updateRightDis (line 287) | func updateRightDis(dis, rightDis []int, keys, compactKeys []string) {
function toBucketDis (line 300) | func toBucketDis(dis []int) ([]int, int) {
FILE: pkg/keyvisual/matrix/distance_test.go
type testDistanceSuite (line 21) | type testDistanceSuite struct
type testDisData (line 23) | type testDisData struct
function BenchmarkGenerateScale (line 29) | func BenchmarkGenerateScale(b *testing.B) {
FILE: pkg/keyvisual/matrix/interface.go
type splitTag (line 9) | type splitTag
constant splitTo (line 12) | splitTo splitTag = iota
constant splitAdd (line 13) | splitAdd
type SplitStrategy (line 17) | type SplitStrategy interface
type Splitter (line 21) | type Splitter interface
type Strategy (line 27) | type Strategy struct
FILE: pkg/keyvisual/matrix/key.go
type KeyMap (line 10) | type KeyMap struct
method SaveKey (line 16) | func (km *KeyMap) SaveKey(key *string) {
method SaveKeys (line 22) | func (km *KeyMap) SaveKeys(keys []string) {
function equal (line 29) | func equal(keyA, keyB string) bool {
FILE: pkg/keyvisual/matrix/key_test.go
type testKeySuite (line 11) | type testKeySuite struct
FILE: pkg/keyvisual/matrix/matrix.go
type Matrix (line 13) | type Matrix struct
method Range (line 39) | func (mx *Matrix) Range(startKey, endKey string) {
function CreateMatrix (line 21) | func CreateMatrix(labeler decorator.Labeler, times []time.Time, keys []s...
FILE: pkg/keyvisual/matrix/matrix_test.go
function TestMatrix (line 11) | func TestMatrix(t *testing.T) {
type testMatrixSuite (line 17) | type testMatrixSuite struct
FILE: pkg/keyvisual/matrix/plane.go
type Plane (line 13) | type Plane struct
method Compact (line 35) | func (plane *Plane) Compact(strategy SplitStrategy) Axis {
method Pixel (line 56) | func (plane *Plane) Pixel(strategy *Strategy, target int, displayTags ...
function CreatePlane (line 19) | func CreatePlane(times []time.Time, axes []Axis) Plane {
function CreateEmptyPlane (line 30) | func CreateEmptyPlane(startTime, endTime time.Time, startKey, endKey str...
function compact (line 96) | func compact(strategy SplitStrategy, chunks []chunk) (compactChunk chunk...
FILE: pkg/keyvisual/matrix/plane_test.go
type testPlaneSuite (line 11) | type testPlaneSuite struct
FILE: pkg/keyvisual/matrix/util.go
function MemsetUint64 (line 10) | func MemsetUint64(slice []uint64, v uint64) {
function MemsetInt (line 22) | func MemsetInt(slice []int, v int) {
function GetLastKey (line 34) | func GetLastKey(keys []string) string {
function CheckPartOf (line 39) | func CheckPartOf(src, part []string) {
function CheckReduceOf (line 52) | func CheckReduceOf(src, part []string) {
function MakeKeys (line 59) | func MakeKeys(keySet map[string]struct{}) []string {
function MakeKeysWithUnlimitedEnd (line 73) | func MakeKeysWithUnlimitedEnd(keySet map[string]struct{}) []string {
function KeysRange (line 79) | func KeysRange(keys []string, startKey string, endKey string) (start, en...
function Max (line 122) | func Max(a, b int) int {
function Min (line 130) | func Min(a, b int) int {
FILE: pkg/keyvisual/matrix/util_test.go
type testUtilSuite (line 11) | type testUtilSuite struct
method TestMemset (line 13) | func (s *testUtilSuite) TestMemset(c *check.C) {
FILE: pkg/keyvisual/region/interface.go
type RegionsInfo (line 5) | type RegionsInfo interface
type RegionsInfoGenerator (line 11) | type RegionsInfoGenerator
type DataProvider (line 13) | type DataProvider struct
FILE: pkg/keyvisual/region/tag.go
type StatTag (line 6) | type StatTag
method String (line 41) | func (tag StatTag) String() string {
constant Integration (line 10) | Integration StatTag = iota
constant WrittenBytes (line 12) | WrittenBytes
constant ReadBytes (line 14) | ReadBytes
constant WrittenKeys (line 16) | WrittenKeys
constant ReadKeys (line 18) | ReadKeys
function IntoTag (line 22) | func IntoTag(typ string) StatTag {
function GetDisplayTags (line 65) | func GetDisplayTags(baseTag StatTag) []string {
FILE: pkg/keyvisual/region/utils.go
function String (line 10) | func String(b []byte) string {
function Bytes (line 18) | func Bytes(s string) []byte {
FILE: pkg/keyvisual/service.go
constant heatmapsMaxDisplayY (line 35) | heatmapsMaxDisplayY = 1536
constant distanceStrategyRatio (line 37) | distanceStrategyRatio = 1.0 / math.Phi
constant distanceStrategyLevel (line 38) | distanceStrategyLevel = 15
constant distanceStrategyCount (line 39) | distanceStrategyCount = 50
type Service (line 57) | type Service struct
method IsRunning (line 116) | func (s *Service) IsRunning() bool {
method Start (line 120) | func (s *Service) Start(ctx context.Context) error {
method newLabelStrategy (line 153) | func (s *Service) newLabelStrategy(
method newProvider (line 172) | func (s *Service) newProvider(pdClient *pd.Client) *region.DataProvider {
method reloadKeyVisualConfig (line 181) | func (s *Service) reloadKeyVisualConfig(cfg *config.KeyVisualConfig) {
method cleanAfterError (line 188) | func (s *Service) cleanAfterError() {
method Stop (line 200) | func (s *Service) Stop(ctx context.Context) error {
method heatmaps (line 230) | func (s *Service) heatmaps(c *gin.Context) {
method provideLocals (line 294) | func (s *Service) provideLocals() (*config.Config, *clientv3.Client, *...
function NewService (line 79) | func NewService(
function RegisterRouter (line 105) | func RegisterRouter(r *gin.RouterGroup, auth *user.AuthService, s *Servi...
function newWaitGroup (line 298) | func newWaitGroup(lc fx.Lifecycle) *sync.WaitGroup {
function newStrategy (line 309) | func newStrategy(lc fx.Lifecycle, wg *sync.WaitGroup, labelStrategy deco...
function newStat (line 321) | func newStat(
function stoppedHandler (line 343) | func stoppedHandler(c *gin.Context) {
FILE: pkg/keyvisual/storage/model.go
constant tableAxisModelName (line 16) | tableAxisModelName = "keyviz_axis"
type AxisModel (line 18) | type AxisModel struct
method TableName (line 24) | func (AxisModel) TableName() string {
method UnmarshalAxis (line 42) | func (a *AxisModel) UnmarshalAxis() (matrix.Axis, error) {
method Insert (line 50) | func (a *AxisModel) Insert(db *dbstore.DB) error {
method Delete (line 54) | func (a *AxisModel) Delete(db *dbstore.DB) error {
function NewAxisModel (line 28) | func NewAxisModel(layerNum uint8, time time.Time, axis matrix.Axis) (*Ax...
function CreateTableAxisModelIfNotExists (line 63) | func CreateTableAxisModelIfNotExists(db *dbstore.DB) (bool, error) {
function ClearTableAxisModel (line 70) | func ClearTableAxisModel(db *dbstore.DB) error {
function FindAxisModelsOrderByTime (line 76) | func FindAxisModelsOrderByTime(db *dbstore.DB, layerNum uint8) ([]*AxisM...
function DeleteAxisModelsByLayerNum (line 86) | func DeleteAxisModelsByLayerNum(db *dbstore.DB, layerNum uint8) error {
FILE: pkg/keyvisual/storage/model_test.go
function TestDbstore (line 18) | func TestDbstore(t *testing.T) {
type testDbstoreSuite (line 24) | type testDbstoreSuite struct
method SetUpTest (line 29) | func (t *testDbstoreSuite) SetUpTest(c *check.C) {
method TestCreateTableAxisModelIfNotExists (line 38) | func (t *testDbstoreSuite) TestCreateTableAxisModelIfNotExists(c *chec...
method TestClearTableAxisModel (line 47) | func (t *testDbstoreSuite) TestClearTableAxisModel(c *check.C) {
method TestAxisModelFunc (line 78) | func (t *testDbstoreSuite) TestAxisModelFunc(c *check.C) {
method TestAxisModelsFindAndDelete (line 121) | func (t *testDbstoreSuite) TestAxisModelsFindAndDelete(c *check.C) {
function axisModelsDeepEqual (line 170) | func axisModelsDeepEqual(obtainedAxisModels []*AxisModel, expectedAxisMo...
function axisModelDeepEqual (line 177) | func axisModelDeepEqual(obtainedAxisModel *AxisModel, expectedAxisModel ...
FILE: pkg/keyvisual/storage/region.go
constant preTarget (line 18) | preTarget = 3072
constant dirtyWrittenBytes (line 20) | dirtyWrittenBytes uint64 = 1 << 32
function CreateStorageAxis (line 24) | func CreateStorageAxis(regions region.RegionsInfo, labeler decorator.Lab...
function IntoStorageAxis (line 45) | func IntoStorageAxis(responseAxis matrix.Axis, labeler decorator.Labeler...
function IntoResponseAxis (line 54) | func IntoResponseAxis(storageAxis matrix.Axis, baseTag region.StatTag) m...
function wash (line 76) | func wash(axis *matrix.Axis) {
FILE: pkg/keyvisual/storage/region_test.go
function TestRegion (line 11) | func TestRegion(t *testing.T) {
type testRegionSuite (line 17) | type testRegionSuite struct
FILE: pkg/keyvisual/storage/stat.go
type LayerConfig (line 21) | type LayerConfig struct
type layerStat (line 28) | type layerStat struct
method Reduce (line 72) | func (s *layerStat) Reduce(labeler decorator.Labeler) {
method Append (line 105) | func (s *layerStat) Append(axis matrix.Axis, endTime time.Time, labele...
method Range (line 120) | func (s *layerStat) Range(startTime, endTime time.Time) (times []time....
function newLayerStat (line 47) | func newLayerStat(
type StatConfig (line 170) | type StatConfig struct
type Stat (line 175) | type Stat struct
method rebuildKeyMap (line 222) | func (s *Stat) rebuildKeyMap() {
method rebuildRegularly (line 239) | func (s *Stat) rebuildRegularly(ctx context.Context) {
method Append (line 253) | func (s *Stat) Append(regions region.RegionsInfo, endTime time.Time) {
method rangeRoot (line 269) | func (s *Stat) rangeRoot(startTime, endTime time.Time) ([]time.Time, [...
method Range (line 276) | func (s *Stat) Range(startTime, endTime time.Time, startKey, endKey st...
function NewStat (line 186) | func NewStat(
FILE: pkg/keyvisual/storage/stat_persist.go
method InsertLastAxisToDb (line 14) | func (s *layerStat) InsertLastAxisToDb(axis matrix.Axis, endTime time.Ti...
method DeleteFirstAxisFromDb (line 23) | func (s *layerStat) DeleteFirstAxisFromDb() error {
method Restore (line 33) | func (s *Stat) Restore() error {
FILE: pkg/keyvisual/storage/stat_test.go
function TestStat (line 11) | func TestStat(t *testing.T) {
type testStatSuite (line 17) | type testStatSuite struct
FILE: pkg/pd/client.go
constant defaultPDTimeout (line 24) | defaultPDTimeout = time.Second * 10
type Client (line 27) | type Client struct
method WithBaseURL (line 55) | func (c Client) WithBaseURL(baseURL string) *Client {
method WithAddress (line 60) | func (c Client) WithAddress(host string, port int) *Client {
method WithTimeout (line 65) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method WithoutPrefix (line 70) | func (c Client) WithoutPrefix() *Client {
method getPrefix (line 75) | func (c Client) getPrefix() string {
method AddRequestHeader (line 82) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 87) | func (c *Client) Get(relativeURI string) (*httpc.Response, error) {
method SendGetRequest (line 92) | func (c *Client) SendGetRequest(relativeURI string) ([]byte, error) {
method SendPostRequest (line 100) | func (c *Client) SendPostRequest(relativeURI string, body io.Reader) (...
function NewPDClient (line 36) | func NewPDClient(lc fx.Lifecycle, httpClient *httpc.Client, config *conf...
FILE: pkg/pd/client_test.go
function newTestClient (line 18) | func newTestClient(t *testing.T) *Client {
function Test_AddRequestHeader_returnDifferentHTTPClient (line 26) | func Test_AddRequestHeader_returnDifferentHTTPClient(t *testing.T) {
function Test_Get_withHeader (line 33) | func Test_Get_withHeader(t *testing.T) {
FILE: pkg/pd/etcd.go
function NewEtcdClient (line 18) | func NewEtcdClient(lc fx.Lifecycle, config *config.Config) (*clientv3.Cl...
FILE: pkg/scheduling/client.go
constant defaultSchedulingStatusAPITimeout (line 24) | defaultSchedulingStatusAPITimeout = time.Second * 10
type Client (line 27) | type Client struct
method WithTimeout (line 52) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 57) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 62) | func (c *Client) Get(host string, port int, relativeURI string) (*http...
method SendGetRequest (line 67) | func (c *Client) SendGetRequest(host string, port int, relativeURI str...
method SendPostRequest (line 75) | func (c *Client) SendPostRequest(host string, port int, relativeURI st...
function NewSchedulingClient (line 34) | func NewSchedulingClient(lc fx.Lifecycle, httpClient *httpc.Client, conf...
FILE: pkg/swaggerserver/handler.go
function Handler (line 13) | func Handler() http.Handler {
FILE: pkg/ticdc/client.go
constant defaultTiCDCStatusAPITimeout (line 24) | defaultTiCDCStatusAPITimeout = time.Second * 10
type Client (line 27) | type Client struct
method WithTimeout (line 52) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 57) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 62) | func (c *Client) Get(host string, statusPort int, relativeURI string) ...
method SendGetRequest (line 67) | func (c *Client) SendGetRequest(host string, statusPort int, relativeU...
method SendPostRequest (line 75) | func (c *Client) SendPostRequest(host string, statusPort int, relative...
function NewTiCDCClient (line 34) | func NewTiCDCClient(lc fx.Lifecycle, httpClient *httpc.Client, config *c...
FILE: pkg/tidb/client.go
constant defaultTiDBStatusAPITimeout (line 37) | defaultTiDBStatusAPITimeout = time.Second * 10
constant defaultTiDBSQLExecutionTimeoutMs (line 38) | defaultTiDBSQLExecutionTimeoutMs = 600000
constant tidbOverrideSQLEndpointEnvVar (line 42) | tidbOverrideSQLEndpointEnvVar = "TIDB_OVERRIDE_ENDPOINT"
constant tidbOverrideStatusEndpointEnvVar (line 45) | tidbOverrideStatusEndpointEnvVar = "TIDB_OVERRIDE_STATUS_ENDPOINT"
type Client (line 48) | type Client struct
method WithStatusAPITimeout (line 89) | func (c Client) WithStatusAPITimeout(timeout time.Duration) *Client {
method WithStatusAPIAddress (line 94) | func (c Client) WithStatusAPIAddress(host string, statusPort int) *Cli...
method WithEnforcedStatusAPIAddress (line 99) | func (c Client) WithEnforcedStatusAPIAddress(host string, statusPort i...
method WithSQLAPIAddress (line 105) | func (c Client) WithSQLAPIAddress(host string, sqlPort int) *Client {
method OpenSQLConn (line 110) | func (c *Client) OpenSQLConn(user string, pass string) (*gorm.DB, erro...
method Get (line 177) | func (c *Client) Get(relativeURI string) (*httpc.Response, error) {
method SendGetRequest (line 213) | func (c *Client) SendGetRequest(relativeURI string) ([]byte, error) {
function NewTiDBClient (line 60) | func NewTiDBClient(lc fx.Lifecycle, config *config.Config, etcdClient *c...
FILE: pkg/tidb/forwarder.go
type forwarderConfig (line 23) | type forwarderConfig struct
type Forwarder (line 30) | type Forwarder struct
method Start (line 42) | func (f *Forwarder) Start(ctx context.Context) error {
method createProxy (line 63) | func (f *Forwarder) createProxy() (*proxy, error) {
method pollingForTiDB (line 72) | func (f *Forwarder) pollingForTiDB() {
method getEndpointAddr (line 105) | func (f *Forwarder) getEndpointAddr(port int) (string, error) {
function newForwarder (line 113) | func newForwarder(lc fx.Lifecycle, etcdClient *clientv3.Client) *Forward...
FILE: pkg/tidb/model/codec.go
constant signMask (line 19) | signMask uint64 = 0x8000000000000000
constant encGroupSize (line 21) | encGroupSize = 8
constant encMarker (line 22) | encMarker = byte(0xFF)
constant encPad (line 23) | encPad = byte(0x0)
type Key (line 27) | type Key
type KeyInfoBuffer (line 31) | type KeyInfoBuffer
method DecodeKey (line 34) | func (buf *KeyInfoBuffer) DecodeKey(key Key) (KeyInfoBuffer, error) {
method MetaOrTable (line 49) | func (buf KeyInfoBuffer) MetaOrTable() (isMeta bool, tableID int64) {
method RowInfo (line 61) | func (buf KeyInfoBuffer) RowInfo() (isCommonHandle bool, rowID int64) {
method IndexInfo (line 73) | func (buf KeyInfoBuffer) IndexInfo() (indexID int64) {
method GenerateKey (line 82) | func (buf *KeyInfoBuffer) GenerateKey(tableID, rowID int64) Key {
function decodeBytes (line 114) | func decodeBytes(b []byte, buf []byte) (rest []byte, result []byte, err ...
function encodeBytes (line 168) | func encodeBytes(data []byte) []byte {
function decodeInt (line 193) | func decodeInt(b []byte) ([]byte, int64, error) {
function encodeInt (line 206) | func encodeInt(b []byte, v int64) []byte {
function decodeCmpUintToInt (line 213) | func decodeCmpUintToInt(u uint64) int64 {
function encodeIntToCmpUint (line 217) | func encodeIntToCmpUint(v int64) uint64 {
FILE: pkg/tidb/model/codec_test.go
function TestTable (line 11) | func TestTable(t *testing.T) {
type testCodecSuite (line 17) | type testCodecSuite struct
method TestDecodeBytes (line 19) | func (s *testCodecSuite) TestDecodeBytes(c *check.C) {
method TestTiDBInfo (line 28) | func (s *testCodecSuite) TestTiDBInfo(c *check.C) {
FILE: pkg/tidb/model/model.go
type SchemaState (line 6) | type SchemaState
constant StateNone (line 10) | StateNone SchemaState = iota
constant StateDeleteOnly (line 12) | StateDeleteOnly
constant StateWriteOnly (line 15) | StateWriteOnly
constant StateWriteReorganization (line 17) | StateWriteReorganization
constant StateDeleteReorganization (line 19) | StateDeleteReorganization
constant StatePublic (line 21) | StatePublic
type CIStr (line 25) | type CIStr struct
type DBInfo (line 31) | type DBInfo struct
type IndexInfo (line 40) | type IndexInfo struct
type PartitionDefinition (line 46) | type PartitionDefinition struct
type PartitionInfo (line 52) | type PartitionInfo struct
type TableInfo (line 61) | type TableInfo struct
method GetPartitionInfo (line 70) | func (t *TableInfo) GetPartitionInfo() *PartitionInfo {
FILE: pkg/tidb/proxy.go
type remote (line 17) | type remote struct
method isActive (line 22) | func (r *remote) isActive() bool {
method becomeInactive (line 26) | func (r *remote) becomeInactive() {
method checkAlive (line 31) | func (r *remote) checkAlive(timeout time.Duration) error {
type proxy (line 41) | type proxy struct
method port (line 72) | func (p *proxy) port() int {
method updateRemotes (line 76) | func (p *proxy) updateRemotes(remotes map[string]struct{}) {
method serve (line 107) | func (p *proxy) serve(in net.Conn) {
method pickActiveConn (line 141) | func (p *proxy) pickActiveConn() (out net.Conn) {
method pick (line 164) | func (p *proxy) pick() *remote {
method doCheck (line 193) | func (p *proxy) doCheck(ctx context.Context) {
method run (line 218) | func (p *proxy) run(ctx context.Context) {
function newProxy (line 51) | func newProxy(l net.Listener, endpoints map[string]string, checkInterval...
FILE: pkg/tidb/proxy_test.go
function TestProxy (line 20) | func TestProxy(t *testing.T) {
function TestProxyPick (line 55) | func TestProxyPick(t *testing.T) {
function assertRespData (line 132) | func assertRespData(t *testing.T, client *http.Client, expect string, ta...
FILE: pkg/tiflash/client.go
constant defaultTiFlashStatusAPITimeout (line 24) | defaultTiFlashStatusAPITimeout = time.Second * 10
type Client (line 27) | type Client struct
method GetHTTPScheme (line 52) | func (c Client) GetHTTPScheme() string {
method WithTimeout (line 56) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 61) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 66) | func (c *Client) Get(host string, statusPort int, relativeURI string) ...
method SendGetRequest (line 71) | func (c *Client) SendGetRequest(host string, statusPort int, relativeU...
method SendPostRequest (line 79) | func (c *Client) SendPostRequest(host string, statusPort int, relative...
function NewTiFlashClient (line 34) | func NewTiFlashClient(lc fx.Lifecycle, httpClient *httpc.Client, config ...
FILE: pkg/tikv/client.go
constant defaultTiKVStatusAPITimeout (line 25) | defaultTiKVStatusAPITimeout = time.Second * 10
type Client (line 28) | type Client struct
method WithTimeout (line 55) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 60) | func (c Client) AddRequestHeader(key, value string) *Client {
method GetHTTPScheme (line 65) | func (c *Client) GetHTTPScheme() string {
method GetTLSInfo (line 69) | func (c *Client) GetTLSInfo() *transport.TLSInfo {
method Get (line 73) | func (c *Client) Get(host string, statusPort int, relativeURI string) ...
method SendGetRequest (line 78) | func (c *Client) SendGetRequest(host string, statusPort int, relativeU...
method SendPostRequest (line 86) | func (c *Client) SendPostRequest(host string, statusPort int, relative...
function NewTiKVClient (line 36) | func NewTiKVClient(lc fx.Lifecycle, httpClient *httpc.Client, config *co...
FILE: pkg/tiproxy/client.go
constant defaultTiProxyStatusAPITimeout (line 24) | defaultTiProxyStatusAPITimeout = time.Second * 10
type Client (line 27) | type Client struct
method WithTimeout (line 52) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 57) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 62) | func (c *Client) Get(host string, statusPort int, relativeURI string) ...
method SendGetRequest (line 67) | func (c *Client) SendGetRequest(host string, statusPort int, relativeU...
method SendPostRequest (line 75) | func (c *Client) SendPostRequest(host string, statusPort int, relative...
function NewTiProxyClient (line 34) | func NewTiProxyClient(lc fx.Lifecycle, httpClient *httpc.Client, config ...
FILE: pkg/tso/client.go
constant defaultTSOStatusAPITimeout (line 24) | defaultTSOStatusAPITimeout = time.Second * 10
type Client (line 27) | type Client struct
method WithTimeout (line 52) | func (c Client) WithTimeout(timeout time.Duration) *Client {
method AddRequestHeader (line 57) | func (c Client) AddRequestHeader(key, value string) *Client {
method Get (line 62) | func (c *Client) Get(host string, port int, relativeURI string) (*http...
method SendGetRequest (line 67) | func (c *Client) SendGetRequest(host string, port int, relativeURI str...
method SendPostRequest (line 75) | func (c *Client) SendPostRequest(host string, port int, relativeURI st...
function NewTSOClient (line 34) | func NewTSOClient(lc fx.Lifecycle, httpClient *httpc.Client, config *con...
FILE: pkg/uiserver/embedded_assets_rewriter.go
function Assets (line 22) | func Assets(cfg *config.Config) http.FileSystem {
FILE: pkg/uiserver/empty_assets_handler.go
function Assets (line 13) | func Assets(*config.Config) http.FileSystem {
FILE: pkg/uiserver/uiserver.go
constant distroResFolderName (line 30) | distroResFolderName = "distro-res"
type UpdateContentFunc (line 33) | type UpdateContentFunc
function RewriteAssets (line 35) | func RewriteAssets(fs http.FileSystem, cfg *config.Config, distroResFold...
function overrideDistroAssetsRes (line 78) | func overrideDistroAssetsRes(fs http.FileSystem, distroResFolderPath str...
function overrideSingleDistroAsset (line 101) | func overrideSingleDistroAsset(fs http.FileSystem, distroResFolderPath, ...
function Handler (line 135) | func Handler(root http.FileSystem) http.Handler {
FILE: pkg/utils/fx.go
type FxPrinter (line 10) | type FxPrinter
method Printf (line 12) | func (p FxPrinter) Printf(format string, args ...interface{}) {
function NewFxPrinter (line 16) | func NewFxPrinter() fx.Printer {
FILE: pkg/utils/service_status.go
type ServiceStatus (line 14) | type ServiceStatus
method IsRunning (line 20) | func (s *ServiceStatus) IsRunning() bool {
method Start (line 24) | func (s *ServiceStatus) Start() {
method Stop (line 28) | func (s *ServiceStatus) Stop() {
method Register (line 32) | func (s *ServiceStatus) Register(lc fx.Lifecycle) {
method MWHandleStopped (line 50) | func (s *ServiceStatus) MWHandleStopped(stoppedHandler gin.HandlerFunc...
method NewStatusAwareHandler (line 61) | func (s *ServiceStatus) NewStatusAwareHandler(handler http.Handler, st...
function NewServiceStatus (line 16) | func NewServiceStatus() *ServiceStatus {
FILE: pkg/utils/sys_schema.go
constant cacheTTL (line 16) | cacheTTL = 1 * time.Minute
type SysSchema (line 19) | type SysSchema struct
method Close (line 43) | func (c *SysSchema) Close() error {
method GetTableColumnNames (line 47) | func (c *SysSchema) GetTableColumnNames(db *gorm.DB, tableName string)...
function ProvideSysSchema (line 23) | func ProvideSysSchema(lc fx.Lifecycle) *SysSchema {
function NewSysSchema (line 35) | func NewSysSchema() *SysSchema {
type columnInfo (line 71) | type columnInfo struct
function fetchTableSchema (line 75) | func fetchTableSchema(db *gorm.DB, table string) ([]columnInfo, error) {
FILE: pkg/utils/topology/models.go
type ComponentStatus (line 5) | type ComponentStatus
constant ComponentStatusUnreachable (line 8) | ComponentStatusUnreachable ComponentStatus = 0
constant ComponentStatusUp (line 9) | ComponentStatusUp ComponentStatus = 1
constant ComponentStatusTombstone (line 10) | ComponentStatusTombstone ComponentStatus = 2
constant ComponentStatusOffline (line 11) | ComponentStatusOffline ComponentStatus = 3
constant ComponentStatusDown (line 12) | ComponentStatusDown ComponentStatus = 4
type PDInfo (line 15) | type PDInfo struct
type TiDBInfo (line 25) | type TiDBInfo struct
type TiCDCInfo (line 36) | type TiCDCInfo struct
type TiProxyInfo (line 48) | type TiProxyInfo struct
type TSOInfo (line 59) | type TSOInfo struct
type SchedulingInfo (line 69) | type SchedulingInfo struct
type StoreInfo (line 80) | type StoreInfo struct
type StoreLabels (line 92) | type StoreLabels struct
type StoreLocation (line 97) | type StoreLocation struct
type StandardComponentInfo (line 102) | type StandardComponentInfo struct
type AlertManagerInfo (line 107) | type AlertManagerInfo struct
type GrafanaInfo (line 111) | type GrafanaInfo struct
type PrometheusInfo (line 115) | type PrometheusInfo struct
FILE: pkg/utils/topology/monitor.go
function FetchAlertManagerTopology (line 18) | func FetchAlertManagerTopology(ctx context.Context, etcdClient *clientv3...
function FetchGrafanaTopology (line 29) | func FetchGrafanaTopology(ctx context.Context, etcdClient *clientv3.Clie...
function FetchPrometheusTopology (line 40) | func FetchPrometheusTopology(ctx context.Context, etcdClient *clientv3.C...
constant ngMonitoringKeyPrefix (line 51) | ngMonitoringKeyPrefix = "/topology/ng-monitoring/"
function FetchNgMonitoringTopology (line 53) | func FetchNgMonitoringTopology(ctx context.Context, etcdClient *clientv3...
function parseNgMontioringAliveness (line 97) | func parseNgMontioringAliveness(value []byte) (bool, error) {
FILE: pkg/utils/topology/pd.go
function FetchPDTopology (line 19) | func FetchPDTopology(pdClient *pd.Client) ([]PDInfo, error) {
function fetchPDStartTimestamp (line 90) | func fetchPDStartTimestamp(pdClient *pd.Client) (int64, error) {
function fetchPDHealth (line 107) | func fetchPDHealth(pdClient *pd.Client) (map[uint64]struct{}, error) {
function fetchLocationLabels (line 132) | func fetchLocationLabels(pdClient *pd.Client) ([]string, error) {
FILE: pkg/utils/topology/scheduling.go
function FetchSchedulingTopology (line 15) | func FetchSchedulingTopology(_ context.Context, pdClient *pd.Client) ([]...
FILE: pkg/utils/topology/store.go
function FetchStoreTopology (line 19) | func FetchStoreTopology(pdClient *pd.Client) ([]StoreInfo, []StoreInfo, ...
function FetchStoreLocation (line 44) | func FetchStoreLocation(pdClient *pd.Client) (*StoreLocation, error) {
function buildStoreTopology (line 75) | func buildStoreTopology(stores []store) []StoreInfo {
type store (line 114) | type store struct
function fetchStores (line 129) | func fetchStores(pdClient *pd.Client) ([]store, error) {
function parseStoreState (line 158) | func parseStoreState(state string) ComponentStatus {
FILE: pkg/utils/topology/ticdc.go
constant ticdcTopologyKeyPrefix (line 22) | ticdcTopologyKeyPrefix = "/topology/ticdc/"
function FetchTiCDCTopology (line 25) | func FetchTiCDCTopology(ctx context.Context, etcdClient *clientv3.Client...
function parseTiCDCInfo (line 70) | func parseTiCDCInfo(clusterName string, value []byte) (*TiCDCInfo, error) {
FILE: pkg/utils/topology/tidb.go
constant tidbTopologyKeyPrefix (line 23) | tidbTopologyKeyPrefix = "/topology/tidb/"
constant keyspaceNameKeyPrefix (line 24) | keyspaceNameKeyPrefix = "/keyspaces/tidb"
function getAliveNodesAndInfos (line 27) | func getAliveNodesAndInfos(ctx context.Context, etcdClient *clientv3.Cli...
function getAliveNodesAndInfoWithPrefix (line 83) | func getAliveNodesAndInfoWithPrefix(ctx context.Context, etcdClient *cli...
function FetchTiDBTopology (line 142) | func FetchTiDBTopology(ctx context.Context, etcdClient *clientv3.Client)...
function parseTiDBInfo (line 175) | func parseTiDBInfo(address string, value []byte) (*TiDBInfo, error) {
function parseTiDBAliveness (line 205) | func parseTiDBAliveness(value []byte) (bool, error) {
FILE: pkg/utils/topology/tiproxy.go
constant tiproxyTopologyKeyPrefix (line 20) | tiproxyTopologyKeyPrefix = "/topology/tiproxy/"
function FetchTiProxyTopology (line 22) | func FetchTiProxyTopology(ctx context.Context, etcdClient *clientv3.Clie...
function parseTiProxyInfo (line 98) | func parseTiProxyInfo(_ string, value []byte) (*TiProxyInfo, error) {
FILE: pkg/utils/topology/topology.go
constant defaultFetchTimeout (line 25) | defaultFetchTimeout = 2 * time.Second
function fetchStandardComponentTopology (line 27) | func fetchStandardComponentTopology(ctx context.Context, componentName s...
FILE: pkg/utils/topology/tso.go
function FetchTSOTopology (line 15) | func FetchTSOTopology(_ context.Context, pdClient *pd.Client) ([]TSOInfo...
FILE: pkg/utils/version/version.go
type Info (line 15) | type Info struct
function Print (line 32) | func Print() {
function GetInfo (line 41) | func GetInfo() *Info {
function PrintStandaloneModeInfo (line 51) | func PrintStandaloneModeInfo() {
FILE: scripts/create_release_tag.js
function getGitBranch (line 20) | function getGitBranch() {
function getGitShortSha (line 25) | function getGitShortSha() {
function getGitLatestTag (line 30) | function getGitLatestTag() {
function question (line 36) | function question(nextTag) {
function createReleaseTag (line 49) | function createReleaseTag() {
function createMasterTag (line 82) | function createMasterTag() {
function createTag (line 98) | function createTag() {
FILE: scripts/distro/write_strings.go
function main (line 16) | func main() {
FILE: scripts/generate_assets.go
function main (line 14) | func main() {
FILE: scripts/pd_version_matrix.go
function mustSuccess (line 27) | func mustSuccess(err error) {
function listPDTags (line 33) | func listPDTags() []string {
function lookupDashboardCommit (line 50) | func lookupDashboardCommit(pdTag string) string {
function lookupDashboardRelease (line 74) | func lookupDashboardRelease(gitCommit string) string {
function lookupPDTagUpdateTime (line 95) | func lookupPDTagUpdateTime(pdTag string) string {
function main (line 107) | func main() {
FILE: tests/integration/diagnose_report_test.go
function TestT (line 11) | func TestT(t *testing.T) {
type testReportSuite (line 18) | type testReportSuite struct
FILE: tests/integration/info/info_test.go
type testInfoSuite (line 22) | type testInfoSuite struct
method TestWithNotLoginUser (line 57) | func (s *testInfoSuite) TestWithNotLoginUser() {
method TestWithSQLLoginUser (line 65) | func (s *testInfoSuite) TestWithSQLLoginUser() {
method TestWithShareCodeLoginUser (line 73) | func (s *testInfoSuite) TestWithShareCodeLoginUser() {
method TestWithShareCodeAndWritePrivLoginUser (line 84) | func (s *testInfoSuite) TestWithShareCodeAndWritePrivLoginUser() {
method getTokenBySQLRoot (line 95) | func (s *testInfoSuite) getTokenBySQLRoot() string {
method getTokenByShareCode (line 118) | func (s *testInfoSuite) getTokenByShareCode(shareCode string) string {
method shareCode (line 139) | func (s *testInfoSuite) shareCode(token string, grantWritePriv bool) s...
method requestWhoami (line 162) | func (s *testInfoSuite) requestWhoami(token string) info.WhoAmIResponse {
function TestInfoSuite (line 30) | func TestInfoSuite(t *testing.T) {
FILE: tests/integration/slowquery/compatibility_test.go
type testCompatibilitySuite (line 19) | type testCompatibilitySuite struct
method SetupSuite (line 35) | func (s *testCompatibilitySuite) SetupSuite() {
method TearDownSuite (line 49) | func (s *testCompatibilitySuite) TearDownSuite() {
method dbSession (line 54) | func (s *testCompatibilitySuite) dbSession() *gorm.DB {
method mockDBSession (line 58) | func (s *testCompatibilitySuite) mockDBSession() *gorm.DB {
method mustQuerySlowLogListWithMockDB (line 62) | func (s *testCompatibilitySuite) mustQuerySlowLogListWithMockDB(req *s...
method TestFieldsCompatibility (line 68) | func (s *testCompatibilitySuite) TestFieldsCompatibility() {
method TestQueryTableColumns (line 106) | func (s *testCompatibilitySuite) TestQueryTableColumns() {
method TestAllAvailableFields (line 128) | func (s *testCompatibilitySuite) TestAllAvailableFields() {
function TestCompatibilitySuite (line 25) | func TestCompatibilitySuite(t *testing.T) {
FILE: tests/integration/slowquery/mock_db_test.go
constant TestSlowQueryTableName (line 19) | TestSlowQueryTableName = "test.CLUSTER_SLOW_QUERY"
type testMockDBSuite (line 22) | type testMockDBSuite struct
method SetupSuite (line 38) | func (s *testMockDBSuite) SetupSuite() {
method TearDownSuite (line 42) | func (s *testMockDBSuite) TearDownSuite() {
method mustQuerySlowLogList (line 48) | func (s *testMockDBSuite) mustQuerySlowLogList(req *slowquery.GetListR...
method mustQuerySlowLogDetail (line 54) | func (s *testMockDBSuite) mustQuerySlowLogDetail(req *slowquery.GetDet...
method mockDBSession (line 59) | func (s *testMockDBSuite) mockDBSession() *gorm.DB {
method TestGetListDefaultRequest (line 63) | func (s *testMockDBSuite) TestGetListDefaultRequest() {
method TestGetListSpecificFieldsRequest (line 81) | func (s *testMockDBSuite) TestGetListSpecificFieldsRequest() {
method TestGetListAllFieldsRequest (line 93) | func (s *testMockDBSuite) TestGetListAllFieldsRequest() {
method TestGetListTimeRangeRequest (line 145) | func (s *testMockDBSuite) TestGetListTimeRangeRequest() {
method TestGetListLimitRequest (line 153) | func (s *testMockDBSuite) TestGetListLimitRequest() {
method TestGetListSearchRequest (line 159) | func (s *testMockDBSuite) TestGetListSearchRequest() {
method TestGetListMultiKeywordsSearchRequest (line 185) | func (s *testMockDBSuite) TestGetListMultiKeywordsSearchRequest() {
method TestGetListUseDBRequest (line 195) | func (s *testMockDBSuite) TestGetListUseDBRequest() {
method TestGetListOrderRequest (line 203) | func (s *testMockDBSuite) TestGetListOrderRequest() {
method TestGetListPlansRequest (line 221) | func (s *testMockDBSuite) TestGetListPlansRequest() {
method TestGetListAllRequest (line 229) | func (s *testMockDBSuite) TestGetListAllRequest() {
method TestGetDetailRequest (line 265) | func (s *testMockDBSuite) TestGetDetailRequest() {
function TestMockDBSuite (line 28) | func TestMockDBSuite(t *testing.T) {
FILE: tests/integration/user/user_test.go
type testUserSuite (line 24) | type testUserSuite struct
method supportNonRootLogin (line 55) | func (s *testUserSuite) supportNonRootLogin() bool {
method SetupSuite (line 59) | func (s *testUserSuite) SetupSuite() {
method TearDownSuite (line 78) | func (s *testUserSuite) TearDownSuite() {
method TestLoginWithEmpty (line 83) | func (s *testUserSuite) TestLoginWithEmpty() {
method TestLoginWithNotExistUser (line 92) | func (s *testUserSuite) TestLoginWithNotExistUser() {
method TestLoginWithWrongPassword (line 109) | func (s *testUserSuite) TestLoginWithWrongPassword() {
method TestLoginWithInsufficientPrivs (line 126) | func (s *testUserSuite) TestLoginWithInsufficientPrivs() {
method TestLoginWithSufficientPrivs (line 143) | func (s *testUserSuite) TestLoginWithSufficientPrivs() {
method TestLoginWithWrongPasswordForRoot (line 180) | func (s *testUserSuite) TestLoginWithWrongPasswordForRoot() {
method TestLoginWithCorrectPasswordForRoot (line 197) | func (s *testUserSuite) TestLoginWithCorrectPasswordForRoot() {
method TestLoginInfo (line 246) | func (s *testUserSuite) TestLoginInfo() {
function TestUserSuite (line 31) | func TestUserSuite(t *testing.T) {
FILE: tests/schema/test.CLUSTER_SLOW_QUERY-schema.sql
type `CLUSTER_SLOW_QUERY` (line 3) | CREATE TABLE `CLUSTER_SLOW_QUERY` (`INSTANCE` varchar(64) DEFAULT NULL, ...
FILE: tests/util/compatibility.go
function CheckTiDBVersion (line 14) | func CheckTiDBVersion(r *require.Assertions, constraint string) bool {
FILE: tests/util/dump/dump.go
function main (line 16) | func main() {
FILE: tests/util/fixtures.go
function LoadFixtures (line 14) | func LoadFixtures(t *testing.T, testDB *testutil.TestDB, dir string) {
FILE: tests/util/gin_test_helper.go
function TestReqWithHandlers (line 12) | func TestReqWithHandlers(req *http.Request, handlers ...gin.HandlerFunc)...
FILE: tests/util/mock_app.go
type App (line 17) | type App struct
method RequireStart (line 42) | func (app *App) RequireStart() *App {
method RequireStop (line 52) | func (app *App) RequireStop() {
function NewMockApp (line 23) | func NewMockApp(tb fxtest.TB, tidbVersion string, c *config.Config, opts...
FILE: tests/util/tidb_version.go
function GetTiDBVersion (line 14) | func GetTiDBVersion(t *testing.T, testDB *testutil.TestDB) string {
FILE: ui-v2/packages/api/client/src/http/client.ts
type AxiosRequestConfig (line 4) | interface AxiosRequestConfig {
constant DEFAULT_TIMEOUT (line 9) | const DEFAULT_TIMEOUT = 30 * 1000
FILE: ui-v2/packages/api/server/src/azores/index.context.ts
type IfEquals (line 11) | type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) e...
type WritableKeys (line 17) | type WritableKeys<T> = {
type UnionToIntersection (line 25) | type UnionToIntersection<U> =
type DistributeReadOnlyOverUnions (line 27) | type DistributeReadOnlyOverUnions<T> = T extends any ? NonReadonly<T> : ...
type Writable (line 29) | type Writable<T> = Pick<T, WritableKeys<T>>;
type NonReadonly (line 30) | type NonReadonly<T> = [T] extends [UnionToIntersection<T>] ? {
type ApiKeyServiceListApiKeysContext (line 104) | type ApiKeyServiceListApiKeysContext<E extends Env = any> = Context<E, '...
type ApiKeyServiceCreateApiKeyContext (line 105) | type ApiKeyServiceCreateApiKeyContext<E extends Env = any> = Context<E, ...
type ApiKeyServiceGetApiKeyContext (line 106) | type ApiKeyServiceGetApiKeyContext<E extends Env = any> = Context<E, '/a...
type ApiKeyServiceDeleteApiKeyContext (line 111) | type ApiKeyServiceDeleteApiKeyContext<E extends Env = any> = Context<E, ...
type ApiKeyServiceUpdateApiKeyContext (line 116) | type ApiKeyServiceUpdateApiKeyContext<E extends Env = any> = Context<E, ...
type ApiKeyServiceResetSecretKeyContext (line 121) | type ApiKeyServiceResetSecretKeyContext<E extends Env = any> = Context<E...
type GlobalBRServiceListBackupPoliciesContext (line 126) | type GlobalBRServiceListBackupPoliciesContext<E extends Env = any> = Con...
type GlobalBRServiceCreateBackupPolicyContext (line 127) | type GlobalBRServiceCreateBackupPolicyContext<E extends Env = any> = Con...
type GlobalBRServicePreCheckBackupPolicyContext (line 128) | type GlobalBRServicePreCheckBackupPolicyContext<E extends Env = any> = C...
type GlobalBRServiceGetBackupPolicyContext (line 129) | type GlobalBRServiceGetBackupPolicyContext<E extends Env = any> = Contex...
type GlobalBRServiceDeleteBackupPolicyContext (line 134) | type GlobalBRServiceDeleteBackupPolicyContext<E extends Env = any> = Con...
type GlobalBRServiceUpdateBackupPolicyContext (line 139) | type GlobalBRServiceUpdateBackupPolicyContext<E extends Env = any> = Con...
type GlobalBRServiceGetBRSummaryContext (line 144) | type GlobalBRServiceGetBRSummaryContext<E extends Env = any> = Context<E...
type GlobalBRServiceListBRTasksContext (line 145) | type GlobalBRServiceListBRTasksContext<E extends Env = any> = Context<E,...
type GlobalBRServiceDeleteBRTaskContext (line 146) | type GlobalBRServiceDeleteBRTaskContext<E extends Env = any> = Context<E...
type GlobalBRServiceStartBRTaskContext (line 151) | type GlobalBRServiceStartBRTaskContext<E extends Env = any> = Context<E,...
type GlobalBRServiceStopBRTaskContext (line 156) | type GlobalBRServiceStopBRTaskContext<E extends Env = any> = Context<E, ...
type ClusterBRServiceCreateBackupTaskContext (line 161) | type ClusterBRServiceCreateBackupTaskContext<E extends Env = any> = Cont...
type ClusterBRServiceGetClusterBackupPolicyContext (line 166) | type ClusterBRServiceGetClusterBackupPolicyContext<E extends Env = any> ...
type ClusterBRServiceListClusterBackupRecordsContext (line 171) | type ClusterBRServiceListClusterBackupRecordsContext<E extends Env = any...
type ClusterBRServiceCreateRestoreTaskContext (line 176) | type ClusterBRServiceCreateRestoreTaskContext<E extends Env = any> = Con...
type ClusterBRServiceListClusterBRTasksContext (line 181) | type ClusterBRServiceListClusterBRTasksContext<E extends Env = any> = Co...
type ClusterBRServiceDetectClusterContext (line 186) | type ClusterBRServiceDetectClusterContext<E extends Env = any> = Context...
type MetricsServiceGetClusterMetricDataContext (line 191) | type MetricsServiceGetClusterMetricDataContext<E extends Env = any> = Co...
type MetricsServiceGetClusterMetricInstanceContext (line 198) | type MetricsServiceGetClusterMetricInstanceContext<E extends Env = any> ...
type DiagnosisServiceGetResourceGroupListContext (line 205) | type DiagnosisServiceGetResourceGroupListContext<E extends Env = any> = ...
type ClusterServiceGetProcessListContext (line 210) | type ClusterServiceGetProcessListContext<E extends Env = any> = Context<...
type ClusterServiceDeleteProcessContext (line 215) | type ClusterServiceDeleteProcessContext<E extends Env = any> = Context<E...
type DiagnosisServiceGetSlowQueryListContext (line 222) | type DiagnosisServiceGetSlowQueryListContext<E extends Env = any> = Cont...
type DiagnosisServiceGetSlowQueryAvailableAdvancedFiltersContext (line 227) | type DiagnosisServiceGetSlowQueryAvailableAdvancedFiltersContext<E exten...
type DiagnosisServiceGetSlowQueryAvailableAdvancedFilterInfoContext (line 232) | type DiagnosisServiceGetSlowQueryAvailableAdvancedFilterInfoContext<E ex...
type DiagnosisServiceDownloadSlowQueryListContext (line 239) | type DiagnosisServiceDownloadSlowQueryListContext<E extends Env = any> =...
type DiagnosisServiceGetSlowQueryAvailableFieldsContext (line 244) | type DiagnosisServiceGetSlowQueryAvailableFieldsContext<E extends Env = ...
type DiagnosisServiceGetSlowQueryDetailContext (line 249) | type DiagnosisServiceGetSlowQueryDetailContext<E extends Env = any> = Co...
type DiagnosisServiceAddSqlLimitContext (line 256) | type DiagnosisServiceAddSqlLimitContext<E extends Env = any> = Context<E...
type DiagnosisServiceCheckSqlLimitSupportContext (line 261) | type DiagnosisServiceCheckSqlLimitSupportContext<E extends Env = any> = ...
type DiagnosisServiceRemoveSqlLimitContext (line 266) | type DiagnosisServiceRemoveSqlLimitContext<E extends Env = any> = Contex...
type DiagnosisServiceGetSqlLimitListContext (line 271) | type DiagnosisServiceGetSqlLimitListContext<E extends Env = any> = Conte...
type DiagnosisServiceGetSqlPlanListContext (line 276) | type DiagnosisServiceGetSqlPlanListContext<E extends Env = any> = Contex...
type DiagnosisServiceBindSqlPlanContext (line 281) | type DiagnosisServiceBindSqlPlanContext<E extends Env = any> = Context<E...
type DiagnosisServiceCheckSqlPlanSupportContext (line 288) | type DiagnosisServiceCheckSqlPlanSupportContext<E extends Env = any> = C...
type DiagnosisServiceGetSqlPlanBindingListContext (line 293) | type DiagnosisServiceGetSqlPlanBindingListContext<E extends Env = any> =...
type DiagnosisServiceUnbindSqlPlanContext (line 298) | type DiagnosisServiceUnbindSqlPlanContext<E extends Env = any> = Context...
type DiagnosisServiceGetTopSqlListContext (line 303) | type DiagnosisServiceGetTopSqlListContext<E extends Env = any> = Context...
type DiagnosisServiceGetTopSqlAvailableAdvancedFiltersContext (line 308) | type DiagnosisServiceGetTopSqlAvailableAdvancedFiltersContext<E extends ...
type DiagnosisServiceGetTopSqlAvailableAdvancedFilterInfoContext (line 313) | type DiagnosisServiceGetTopSqlAvailableAdvancedFilterInfoContext<E exten...
type DiagnosisServiceGetTopSqlConfigsContext (line 320) | type DiagnosisServiceGetTopSqlConfigsContext<E extends Env = any> = Cont...
type DiagnosisServiceUpdateTopSqlConfigsContext (line 325) | type DiagnosisServiceUpdateTopSqlConfigsContext<E extends Env = any> = C...
type DiagnosisServiceGetTopSqlAvailableFieldsContext (line 330) | type DiagnosisServiceGetTopSqlAvailableFieldsContext<E extends Env = any...
type DiagnosisServiceGetTopSqlDetailContext (line 335) | type DiagnosisServiceGetTopSqlDetailContext<E extends Env = any> = Conte...
type CredentialServiceListCredentialsContext (line 342) | type CredentialServiceListCredentialsContext<E extends Env = any> = Cont...
type CredentialServiceCreateCredentialContext (line 343) | type CredentialServiceCreateCredentialContext<E extends Env = any> = Con...
type CredentialServiceGetCredentialContext (line 344) | type CredentialServiceGetCredentialContext<E extends Env = any> = Contex...
type CredentialServiceDeleteCredentialContext (line 349) | type CredentialServiceDeleteCredentialContext<E extends Env = any> = Con...
type CredentialServiceUpdateCredentialContext (line 354) | type CredentialServiceUpdateCredentialContext<E extends Env = any> = Con...
type CredentialServiceDownloadRSAKeyContext (line 359) | type CredentialServiceDownloadRSAKeyContext<E extends Env = any> = Conte...
type CredentialServiceGenerateRSAKeyContext (line 364) | type CredentialServiceGenerateRSAKeyContext<E extends Env = any> = Conte...
type CredentialServiceValidateConnectionContext (line 365) | type CredentialServiceValidateConnectionContext<E extends Env = any> = C...
type HostServiceListHostsContext (line 366) | type HostServiceListHostsContext<E extends Env = any> = Context<E, '/api...
type HostServiceCreateHostsContext (line 367) | type HostServiceCreateHostsContext<E extends Env = any> = Context<E, '/a...
type HostServiceImportContext (line 368) | type HostServiceImportContext<E extends Env = any> = Context<E, '/api/v2...
type HostServiceImportTaskContext (line 369) | type HostServiceImportTaskContext<E extends Env = any> = Context<E, '/ap...
type HostServiceHostConfirmContext (line 374) | type HostServiceHostConfirmContext<E extends Env = any> = Context<E, '/a...
type HostServiceGetHostContext (line 379) | type HostServiceGetHostContext<E extends Env = any> = Context<E, '/api/v...
type HostServiceDeleteContext (line 384) | type HostServiceDeleteContext<E extends Env = any> = Context<E, '/api/v2...
type HostServiceUpdateHostContext (line 389) | type HostServiceUpdateHostContext<E extends Env = any> = Context<E, '/ap...
type HostServiceGetDisksContext (line 394) | type HostServiceGetDisksContext<E extends Env = any> = Context<E, '/api/...
type MetricsServiceGetHostMetricDataContext (line 399) | type MetricsServiceGetHostMetricDataContext<E extends Env = any> = Conte...
type HostServiceReportContext (line 406) | type HostServiceReportContext<E extends Env = any> = Context<E, '/api/v2...
type HostServiceGetTiDBProcessesContext (line 413) | type HostServiceGetTiDBProcessesContext<E extends Env = any> = Context<E...
type HostServiceFixContext (line 418) | type HostServiceFixContext<E extends Env = any> = Context<E, '/api/v2/ho...
type HostServiceCheckContext (line 423) | type HostServiceCheckContext<E extends Env = any> = Context<E, '/api/v2/...
type HostServiceBatchDeleteContext (line 428) | type HostServiceBatchDeleteContext<E extends Env = any> = Context<E, '/a...
type HostServiceDownloadListHostsContext (line 429) | type HostServiceDownloadListHostsContext<E extends Env = any> = Context<...
type HostServiceDownloadHostTemplateContext (line 430) | type HostServiceDownloadHostTemplateContext<E extends Env = any> = Conte...
type LicenseServiceGetLicenseContext (line 431) | type LicenseServiceGetLicenseContext<E extends Env = any> = Context<E, '...
type LicenseServiceGetDeviceCodeContext (line 432) | type LicenseServiceGetDeviceCodeContext<E extends Env = any> = Context<E...
type LicenseServiceActivateLicenseContext (line 433) | type LicenseServiceActivateLicenseContext<E extends Env = any> = Context...
type LicenseServiceActivateFreeLicenseContext (line 434) | type LicenseServiceActivateFreeLicenseContext<E extends Env = any> = Con...
type LocationServiceListLocationsContext (line 435) | type LocationServiceListLocationsContext<E extends Env = any> = Context<...
type LocationServiceCreateLocationsContext (line 436) | type LocationServiceCreateLocationsContext<E extends Env = any> = Contex...
type LocationServiceGetLocationsContext (line 437) | type LocationServiceGetLocationsContext<E extends Env = any> = Context<E...
type LocationServiceDeleteLocationContext (line 442) | type LocationServiceDeleteLocationContext<E extends Env = any> = Context...
type LocationServiceUpdateLocationsContext (line 447) | type LocationServiceUpdateLocationsContext<E extends Env = any> = Contex...
type UserServiceLoginContext (line 452) | type UserServiceLoginContext<E extends Env = any> = Context<E, '/api/v2/...
type UserServiceLogoutContext (line 453) | type UserServiceLogoutContext<E extends Env = any> = Context<E, '/api/v2...
type MetricsServiceGetMetricsContext (line 454) | type MetricsServiceGetMetricsContext<E extends Env = any> = Context<E, '...
type MetricsServiceGetTopMetricConfigContext (line 455) | type MetricsServiceGetTopMetricConfigContext<E extends Env = any> = Cont...
type MetricsServiceGetTopMetricDataContext (line 456) | type MetricsServiceGetTopMetricDataContext<E extends Env = any> = Contex...
type MetricsServiceGetOverviewStatusContext (line 461) | type MetricsServiceGetOverviewStatusContext<E extends Env = any> = Conte...
type RoleServiceListRolesContext (line 462) | type RoleServiceListRolesContext<E extends Env = any> = Context<E, '/api...
type RoleServiceCreateRoleContext (line 463) | type RoleServiceCreateRoleContext<E extends Env = any> = Context<E, '/ap...
type RoleServiceDeleteRoleContext (line 464) | type RoleServiceDeleteRoleContext<E extends Env = any> = Context<E, '/ap...
type RoleServiceUpdateRoleContext (line 469) | type RoleServiceUpdateRoleContext<E extends Env = any> = Context<E, '/ap...
type TagServiceListTagsContext (line 474) | type TagServiceListTagsContext<E extends Env = any> = Context<E, '/api/v...
type TagServiceCreateTagContext (line 475) | type TagServiceCreateTagContext<E extends Env = any> = Context<E, '/api/...
type TagServiceGetTagContext (line 476) | type TagServiceGetTagContext<E extends Env = any> = Context<E, '/api/v2/...
type TagServiceDeleteTagContext (line 481) | type TagServiceDeleteTagContext<E extends Env = any> = Context<E, '/api/...
type TagServiceUpdateTagContext (line 486) | type TagServiceUpdateTagContext<E extends Env = any> = Context<E, '/api/...
type TagServiceGetTagWithBindingsContext (line 491) | type TagServiceGetTagWithBindingsContext<E extends Env = any> = Context<...
type TagServiceBatchCreateTagsContext (line 496) | type TagServiceBatchCreateTagsContext<E extends Env = any> = Context<E, ...
type TagServiceBindResourceContext (line 497) | type TagServiceBindResourceContext<E extends Env = any> = Context<E, '/a...
type TagServiceBindTagContext (line 498) | type TagServiceBindTagContext<E extends Env = any> = Context<E, '/api/v2...
type TagServiceListTagsByResourceTypeContext (line 499) | type TagServiceListTagsByResourceTypeContext<E extends Env = any> = Cont...
type TagServiceListTagKeysContext (line 500) | type TagServiceListTagKeysContext<E extends Env = any> = Context<E, '/ap...
type TagServiceListTagsWithBindingsContext (line 501) | type TagServiceListTagsWithBindingsContext<E extends Env = any> = Contex...
type TiupsServiceListTiupsContext (line 502) | type TiupsServiceListTiupsContext<E extends Env = any> = Context<E, '/ap...
type TiupsServiceCreateTiupsContext (line 503) | type TiupsServiceCreateTiupsContext<E extends Env = any> = Context<E, '/...
type TiupsServiceGetTiupsContext (line 504) | type TiupsServiceGetTiupsContext<E extends Env = any> = Context<E, '/api...
type TiupsServiceDeleteTiupsContext (line 509) | type TiupsServiceDeleteTiupsContext<E extends Env = any> = Context<E, '/...
type TiupsServiceUpdateTiupsContext (line 514) | type TiupsServiceUpdateTiupsContext<E extends Env = any> = Context<E, '/...
type TiupsServiceGetTiupsClusterContext (line 519) | type TiupsServiceGetTiupsClusterContext<E extends Env = any> = Context<E...
type UserServiceListUsersContext (line 524) | type UserServiceListUsersContext<E extends Env = any> = Context<E, '/api...
type UserServiceCreateUserContext (line 525) | type UserServiceCreateUserContext<E extends Env = any> = Context<E, '/ap...
type UserServiceGetUserProfileContext (line 526) | type UserServiceGetUserProfileContext<E extends Env = any> = Context<E, ...
type UserServiceGetUserContext (line 527) | type UserServiceGetUserContext<E extends Env = any> = Context<E, '/api/v...
type UserServiceDeleteUserContext (line 532) | type UserServiceDeleteUserContext<E extends Env = any> = Context<E, '/ap...
type UserServiceUpdateUserContext (line 537) | type UserServiceUpdateUserContext<E extends Env = any> = Context<E, '/ap...
type UserServiceResetPasswordContext (line 542) | type UserServiceResetPasswordContext<E extends Env = any> = Context<E, '...
type UserServiceChangePasswordContext (line 547) | type UserServiceChangePasswordContext<E extends Env = any> = Context<E, ...
type UserServiceValidateSessionContext (line 548) | type UserServiceValidateSessionContext<E extends Env = any> = Context<E,...
type ApiKeyServiceGetTemErrorDetailContext (line 549) | type ApiKeyServiceGetTemErrorDetailContext<E extends Env = any> = Contex...
FILE: ui-v2/packages/api/server/src/azores/index.schemas.ts
type UserServiceChangePassword200 (line 7) | type UserServiceChangePassword200 = { [key: string]: unknown };
type UserServiceResetPassword200 (line 9) | type UserServiceResetPassword200 = { [key: string]: unknown };
type UserServiceDeleteUser200 (line 11) | type UserServiceDeleteUser200 = { [key: string]: unknown };
type UserServiceListUsersParams (line 13) | type UserServiceListUsersParams = {
type TiupsServiceDeleteTiups200 (line 44) | type TiupsServiceDeleteTiups200 = { [key: string]: unknown };
type TiupsServiceListTiupsParams (line 46) | type TiupsServiceListTiupsParams = {
type TagServiceListTagsWithBindingsParams (line 77) | type TagServiceListTagsWithBindingsParams = {
type TagServiceListTagKeysResourceType (line 104) | type TagServiceListTagKeysResourceType = typeof TagServiceListTagKeysRes...
type TagServiceListTagKeysParams (line 115) | type TagServiceListTagKeysParams = {
type TagServiceListTagsByResourceTypeResourceType (line 143) | type TagServiceListTagsByResourceTypeResourceType = typeof TagServiceLis...
type TagServiceListTagsByResourceTypeParams (line 154) | type TagServiceListTagsByResourceTypeParams = {
type TagServiceDeleteTag200 (line 186) | type TagServiceDeleteTag200 = { [key: string]: unknown };
type TagServiceListTagsParams (line 188) | type TagServiceListTagsParams = {
type RoleServiceDeleteRole200 (line 207) | type RoleServiceDeleteRole200 = { [key: string]: unknown };
type RoleServiceListRolesParams (line 209) | type RoleServiceListRolesParams = {
type MetricsServiceGetOverviewStatusParams (line 236) | type MetricsServiceGetOverviewStatusParams = {
type MetricsServiceGetTopMetricDataParams (line 247) | type MetricsServiceGetTopMetricDataParams = {
type MetricsServiceGetMetricsGroup (line 266) | type MetricsServiceGetMetricsGroup = typeof MetricsServiceGetMetricsGrou...
type MetricsServiceGetMetricsClass (line 280) | type MetricsServiceGetMetricsClass = typeof MetricsServiceGetMetricsClas...
type MetricsServiceGetMetricsParams (line 291) | type MetricsServiceGetMetricsParams = {
type UserServiceLogout200 (line 323) | type UserServiceLogout200 = { [key: string]: unknown };
type UserServiceLogin200 (line 325) | type UserServiceLogin200 = { [key: string]: unknown };
type LocationServiceDeleteLocation200 (line 327) | type LocationServiceDeleteLocation200 = { [key: string]: unknown };
type LocationServiceListLocationsLocationKey (line 329) | type LocationServiceListLocationsLocationKey = typeof LocationServiceLis...
type LocationServiceListLocationsParams (line 339) | type LocationServiceListLocationsParams = {
type LicenseServiceActivateLicenseBody (line 370) | type LicenseServiceActivateLicenseBody = {
type HostServiceDownloadListHostsParams (line 377) | type HostServiceDownloadListHostsParams = {
type HostServiceBatchDelete200 (line 408) | type HostServiceBatchDelete200 = { [key: string]: unknown };
type MetricsServiceGetHostMetricDataParams (line 410) | type MetricsServiceGetHostMetricDataParams = {
type HostServiceDelete200 (line 433) | type HostServiceDelete200 = { [key: string]: unknown };
type HostServiceImportBody (line 435) | type HostServiceImportBody = {
type HostServiceListHostsParams (line 442) | type HostServiceListHostsParams = {
type CredentialServiceDeleteCredential200 (line 473) | type CredentialServiceDeleteCredential200 = { [key: string]: unknown };
type CredentialServiceListCredentialsCredentialType (line 475) | type CredentialServiceListCredentialsCredentialType = typeof CredentialS...
type CredentialServiceListCredentialsParams (line 485) | type CredentialServiceListCredentialsParams = {
type DiagnosisServiceGetTopSqlDetailParams (line 516) | type DiagnosisServiceGetTopSqlDetailParams = {
type DiagnosisServiceGetTopSqlListParams (line 531) | type DiagnosisServiceGetTopSqlListParams = {
type DiagnosisServiceUnbindSqlPlan200 (line 582) | type DiagnosisServiceUnbindSqlPlan200 = { [key: string]: unknown };
type DiagnosisServiceUnbindSqlPlanParams (line 584) | type DiagnosisServiceUnbindSqlPlanParams = {
type DiagnosisServiceGetSqlPlanBindingListParams (line 591) | type DiagnosisServiceGetSqlPlanBindingListParams = {
type DiagnosisServiceBindSqlPlan200 (line 606) | type DiagnosisServiceBindSqlPlan200 = { [key: string]: unknown };
type DiagnosisServiceGetSqlPlanListParams (line 608) | type DiagnosisServiceGetSqlPlanListParams = {
type DiagnosisServiceGetSqlLimitListParams (line 627) | type DiagnosisServiceGetSqlLimitListParams = {
type DiagnosisServiceRemoveSqlLimit200 (line 634) | type DiagnosisServiceRemoveSqlLimit200 = { [key: string]: unknown };
type DiagnosisServiceAddSqlLimit200 (line 636) | type DiagnosisServiceAddSqlLimit200 = { [key: string]: unknown };
type DiagnosisServiceGetSlowQueryDetailParams (line 638) | type DiagnosisServiceGetSlowQueryDetailParams = {
type DiagnosisServiceDownloadSlowQueryListParams (line 649) | type DiagnosisServiceDownloadSlowQueryListParams = {
type DiagnosisServiceGetSlowQueryListParams (line 696) | type DiagnosisServiceGetSlowQueryListParams = {
type ClusterServiceDeleteProcess200 (line 743) | type ClusterServiceDeleteProcess200 = { [key: string]: unknown };
type MetricsServiceGetClusterMetricDataParams (line 745) | type MetricsServiceGetClusterMetricDataParams = {
type ClusterBRServiceListClusterBRTasksStatus (line 768) | type ClusterBRServiceListClusterBRTasksStatus = typeof ClusterBRServiceL...
type ClusterBRServiceListClusterBRTasksType (line 779) | type ClusterBRServiceListClusterBRTasksType = typeof ClusterBRServiceLis...
type ClusterBRServiceListClusterBRTasksParams (line 792) | type ClusterBRServiceListClusterBRTasksParams = {
type ClusterBRServiceListClusterBackupRecordsParams (line 839) | type ClusterBRServiceListClusterBackupRecordsParams = {
type GlobalBRServiceStopBRTask200 (line 858) | type GlobalBRServiceStopBRTask200 = { [key: string]: unknown };
type GlobalBRServiceStartBRTask200 (line 860) | type GlobalBRServiceStartBRTask200 = { [key: string]: unknown };
type GlobalBRServiceDeleteBRTask200 (line 862) | type GlobalBRServiceDeleteBRTask200 = { [key: string]: unknown };
type GlobalBRServiceDeleteBRTaskParams (line 864) | type GlobalBRServiceDeleteBRTaskParams = {
type GlobalBRServiceListBRTasksStatus (line 871) | type GlobalBRServiceListBRTasksStatus = typeof GlobalBRServiceListBRTask...
type GlobalBRServiceListBRTasksType (line 883) | type GlobalBRServiceListBRTasksType = typeof GlobalBRServiceListBRTasksT...
type GlobalBRServiceListBRTasksParams (line 897) | type GlobalBRServiceListBRTasksParams = {
type GlobalBRServiceGetBRSummaryParams (line 950) | type GlobalBRServiceGetBRSummaryParams = {
type GlobalBRServiceDeleteBackupPolicy200 (line 957) | type GlobalBRServiceDeleteBackupPolicy200 = { [key: string]: unknown };
type GlobalBRServiceListBackupPoliciesParams (line 959) | type GlobalBRServiceListBackupPoliciesParams = {
type ApiKeyServiceDeleteApiKey200 (line 978) | type ApiKeyServiceDeleteApiKey200 = { [key: string]: unknown };
type ApiKeyServiceListApiKeysParams (line 980) | type ApiKeyServiceListApiKeysParams = {
type V2BackupPolicyBody (line 1011) | type V2BackupPolicyBody = V2BackupPolicy;
type V2ValidateSessionResponse (line 1013) | interface V2ValidateSessionResponse {
type V2ValidateConnectionResponse (line 1017) | interface V2ValidateConnectionResponse {
type V2ValidateConnectionRequest (line 1022) | interface V2ValidateConnectionRequest {
type V2UserRole (line 1026) | interface V2UserRole {
type V2UserProfile (line 1034) | interface V2UserProfile {
type V2User (line 1050) | interface V2User {
type V2TypeEnumData (line 1084) | type V2TypeEnumData = typeof V2TypeEnumData[keyof typeof V2TypeEnumData];
type V2TriggerTypeEnumData (line 1102) | type V2TriggerTypeEnumData = typeof V2TriggerTypeEnumData[keyof typeof V...
type V2TopSqlDetail (line 1111) | interface V2TopSqlDetail {
type V2TopSqlList (line 1205) | interface V2TopSqlList {
type V2TopSqlConfigs (line 1211) | interface V2TopSqlConfigs {
type V2TopSqlAvailableFields (line 1219) | interface V2TopSqlAvailableFields {
type V2TopSqlAvailableAdvancedFilters (line 1223) | interface V2TopSqlAvailableAdvancedFilters {
type V2TopSqlAvailableAdvancedFilterInfo (line 1227) | interface V2TopSqlAvailableAdvancedFilterInfo {
type V2TopMetricData (line 1234) | interface V2TopMetricData {
type V2TopMetricConfig (line 1239) | interface V2TopMetricConfig {
type V2TiupsServiceUpdateTiupsBody (line 1243) | interface V2TiupsServiceUpdateTiupsBody {
type V2TiupsClusters (line 1247) | interface V2TiupsClusters {
type V2TiupsClustersResponse (line 1257) | interface V2TiupsClustersResponse {
type V2TiupTags (line 1261) | interface V2TiupTags {
type V2Tiups (line 1267) | interface V2Tiups {
type V2TiupHostHostType (line 1279) | type V2TiupHostHostType = typeof V2TiupHostHostType[keyof typeof V2TiupH...
type V2TiupCredential (line 1288) | interface V2TiupCredential {
type V2TiupHost (line 1295) | interface V2TiupHost {
type V2TiDBProcesses (line 1312) | interface V2TiDBProcesses {
type V2TiDBCredentialObject (line 1321) | interface V2TiDBCredentialObject {
type V2Tags (line 1327) | interface V2Tags {
type V2TagWithBindObject (line 1333) | interface V2TagWithBindObject {
type V2TagBindResourceType (line 1344) | type V2TagBindResourceType = typeof V2TagBindResourceType[keyof typeof V...
type V2StatusEnumData (line 1362) | type V2StatusEnumData = typeof V2StatusEnumData[keyof typeof V2StatusEnu...
type V2StatusCount (line 1374) | interface V2StatusCount {
type V2SqlPlanList (line 1379) | interface V2SqlPlanList {
type V2SqlPlanBindingList (line 1383) | interface V2SqlPlanBindingList {
type V2SqlPlanBindingDetailStatus (line 1387) | type V2SqlPlanBindingDetailStatus = typeof V2SqlPlanBindingDetailStatus[...
type V2SqlPlanBindingDetailSource (line 1401) | type V2SqlPlanBindingDetailSource = typeof V2SqlPlanBindingDetailSource[...
type V2SqlPlanBindingDetail (line 1412) | interface V2SqlPlanBindingDetail {
type V2SqlLimitAction (line 1419) | type V2SqlLimitAction = typeof V2SqlLimitAction[keyof typeof V2SqlLimitA...
type V2SqlLimit (line 1429) | interface V2SqlLimit {
type V2SqlLimitList (line 1440) | interface V2SqlLimitList {
type V2SlowQueryDownloadResponse (line 1444) | interface V2SlowQueryDownloadResponse {
type V2SlowQueryDetail (line 1449) | interface V2SlowQueryDetail {
type V2SlowQueryList (line 1535) | interface V2SlowQueryList {
type V2SlowQueryAvailableFields (line 1541) | interface V2SlowQueryAvailableFields {
type V2SlowQueryAvailableAdvancedFilters (line 1545) | interface V2SlowQueryAvailableAdvancedFilters {
type V2SlowQueryAvailableAdvancedFilterInfo (line 1549) | interface V2SlowQueryAvailableAdvancedFilterInfo {
type V2Role (line 1556) | interface V2Role {
type V2ResourceObject (line 1567) | interface V2ResourceObject {
type V2ResourceGroup (line 1572) | interface V2ResourceGroup {
type V2ResourceGroupList (line 1579) | interface V2ResourceGroupList {
type V2ResetSecretKeyResponse (line 1583) | interface V2ResetSecretKeyResponse {
type V2ReportResponseTaskState (line 1588) | type V2ReportResponseTaskState = typeof V2ReportResponseTaskState[keyof ...
type V2ReportResponse (line 1599) | interface V2ReportResponse {
type V2QueryMetric (line 1605) | interface V2QueryMetric {
type V2QueryResult (line 1620) | interface V2QueryResult {
type V2ProcessList (line 1625) | interface V2ProcessList {
type V2PreCheckBackupPolicyResponse (line 1632) | interface V2PreCheckBackupPolicyResponse {
type V2OverviewStatus (line 1636) | interface V2OverviewStatus {
type V2Metrics (line 1646) | interface V2Metrics {
type V2MetricWithExpressions (line 1650) | interface V2MetricWithExpressions {
type V2LoginRequest (line 1660) | interface V2LoginRequest {
type V2LocationsLocationKey (line 1665) | type V2LocationsLocationKey = typeof V2LocationsLocationKey[keyof typeof...
type V2Locations (line 1675) | interface V2Locations {
type V2LocationMappings (line 1682) | interface V2LocationMappings {
type V2ListUsersResponse (line 1692) | interface V2ListUsersResponse {
type V2ListTiupsResponse (line 1701) | interface V2ListTiupsResponse {
type V2ListTagsWithBindingsResponse (line 1707) | interface V2ListTagsWithBindingsResponse {
type V2ListTagsResponse (line 1713) | interface V2ListTagsResponse {
type V2ListTagsByResourceTypeResponse (line 1719) | interface V2ListTagsByResourceTypeResponse {
type V2ListTagKeysResponse (line 1725) | interface V2ListTagKeysResponse {
type V2ListRolesResponse (line 1731) | interface V2ListRolesResponse {
type V2ListLocationsResponse (line 1737) | interface V2ListLocationsResponse {
type V2ListHostsResponse (line 1743) | interface V2ListHostsResponse {
type V2ListCredentialsResponse (line 1749) | interface V2ListCredentialsResponse {
type V2ListClusterBackupRecordsResponse (line 1755) | interface V2ListClusterBackupRecordsResponse {
type V2ListClusterBRTasksResponse (line 1761) | interface V2ListClusterBRTasksResponse {
type V2ListBackupPoliciesResponse (line 1767) | interface V2ListBackupPoliciesResponse {
type V2ListBRTasksResponse (line 1773) | interface V2ListBRTasksResponse {
type V2ListApiKeysResponse (line 1779) | interface V2ListApiKeysResponse {
type V2LicenseTypeEnumData (line 1789) | type V2LicenseTypeEnumData = typeof V2LicenseTypeEnumData[keyof typeof V...
type V2LicenseStatusEnumData (line 1805) | type V2LicenseStatusEnumData = typeof V2LicenseStatusEnumData[keyof type...
type V2ImportRequestHeaders (line 1817) | type V2ImportRequestHeaders = {[key: string]: string};
type V2ImportRequest (line 1819) | interface V2ImportRequest {
type V2HostTiDBProcessesResponse (line 1827) | interface V2HostTiDBProcessesResponse {
type V2HostTaskStatus (line 1831) | type V2HostTaskStatus = typeof V2HostTaskStatus[keyof typeof V2HostTaskS...
type V2HostTask (line 1842) | interface V2HostTask {
type V2ImportTaskResponse (line 1859) | interface V2ImportTaskResponse {
type V2HostServiceUpdateHostBody (line 1864) | interface V2HostServiceUpdateHostBody {
type V2HostFixResponse (line 1868) | interface V2HostFixResponse {
type V2HostDiskResponse (line 1874) | interface V2HostDiskResponse {
type V2HostCredentialObject (line 1878) | interface V2HostCredentialObject {
type V2HostCreateResponse (line 1885) | interface V2HostCreateResponse {
type V2HostCheckResponse (line 1889) | interface V2HostCheckResponse {
type V2HostStatus (line 1895) | type V2HostStatus = typeof V2HostStatus[keyof typeof V2HostStatus];
type V2HostHostType (line 1907) | type V2HostHostType = typeof V2HostHostType[keyof typeof V2HostHostType];
type V2HostConnectionStatus (line 1916) | type V2HostConnectionStatus = typeof V2HostConnectionStatus[keyof typeof...
type V2HostCheckStatus (line 1925) | type V2HostCheckStatus = typeof V2HostCheckStatus[keyof typeof V2HostChe...
type V2Host (line 1936) | interface V2Host {
type V2GroupEnumData (line 1993) | type V2GroupEnumData = typeof V2GroupEnumData[keyof typeof V2GroupEnumDa...
type V2GetTagWithBindingsResponse (line 2007) | interface V2GetTagWithBindingsResponse {
type V2GenerateRSAKeyResponse (line 2011) | interface V2GenerateRSAKeyResponse {
type V2GenerateRSAKeyRequest (line 2016) | interface V2GenerateRSAKeyRequest { [key: string]: unknown }
type V2ExpressionWithLegend (line 2018) | interface V2ExpressionWithLegend {
type V2ExprQueryData (line 2029) | interface V2ExprQueryData {
type V2HostMetricData (line 2035) | interface V2HostMetricData {
type V2ErrorDetail (line 2040) | interface V2ErrorDetail {
type V2DownloadRSAKeyResponse (line 2046) | interface V2DownloadRSAKeyResponse {
type V2DownloadListHostResponse (line 2050) | interface V2DownloadListHostResponse {
type V2DownloadHostTemplateResponse (line 2054) | interface V2DownloadHostTemplateResponse {
type V2DiskDiskType (line 2058) | type V2DiskDiskType = typeof V2DiskDiskType[keyof typeof V2DiskDiskType];
type V2Disk (line 2067) | interface V2Disk {
type V2DeviceCode (line 2076) | interface V2DeviceCode {
type V2DetectClusterResponse (line 2080) | interface V2DetectClusterResponse {
type V2CycleEnumData (line 2090) | type V2CycleEnumData = typeof V2CycleEnumData[keyof typeof V2CycleEnumDa...
type V2CredentialValidateType (line 2104) | type V2CredentialValidateType = typeof V2CredentialValidateType[keyof ty...
type V2CredentialType (line 2119) | type V2CredentialType = typeof V2CredentialType[keyof typeof V2Credentia...
type V2Credential (line 2129) | interface V2Credential {
type V2CreateHost (line 2140) | interface V2CreateHost {
type V2CreateApiKeyRequest (line 2149) | interface V2CreateApiKeyRequest {
type V2ConfirmResponse (line 2153) | interface V2ConfirmResponse {
type V2ClusterWithoutBRPolicy (line 2157) | interface V2ClusterWithoutBRPolicy {
type V2ClusterWithBRSize (line 2164) | interface V2ClusterWithBRSize {
type V2ClusterWithBRAlert (line 2171) | interface V2ClusterWithBRAlert {
type V2ClusterProcessCommand (line 2177) | type V2ClusterProcessCommand = typeof V2ClusterProcessCommand[keyof type...
type V2ClusterProcess (line 2215) | interface V2ClusterProcess {
type V2ClusterMetricInstance (line 2236) | interface V2ClusterMetricInstance {
type V2ClusterMetricData (line 2241) | interface V2ClusterMetricData {
type V2ClusterBackupPolicy (line 2246) | interface V2ClusterBackupPolicy {
type V2ClusterBRTypeEnumData (line 2276) | type V2ClusterBRTypeEnumData = typeof V2ClusterBRTypeEnumData[keyof type...
type V2ClusterBRTriggerTypeEnumData (line 2293) | type V2ClusterBRTriggerTypeEnumData = typeof V2ClusterBRTriggerTypeEnumD...
type V2ClusterBRStatusEnumData (line 2308) | type V2ClusterBRStatusEnumData = typeof V2ClusterBRStatusEnumData[keyof ...
type V2ClusterBRTask (line 2319) | interface V2ClusterBRTask {
type V2Cluster (line 2345) | interface V2Cluster {
type V2ClassEnumData (line 2356) | type V2ClassEnumData = typeof V2ClassEnumData[keyof typeof V2ClassEnumDa...
type V2CheckSupportResponse (line 2367) | interface V2CheckSupportResponse {
type V2ChangePasswordRequest (line 2371) | interface V2ChangePasswordRequest {
type V2CategoryMetricDetail (line 2377) | interface V2CategoryMetricDetail {
type V2BindTagResponse (line 2388) | interface V2BindTagResponse {
type V2BindResourceResponse (line 2392) | interface V2BindResourceResponse {
type V2BindResourceRequest (line 2396) | interface V2BindResourceRequest {
type V2BindObject (line 2402) | interface V2BindObject {
type V2BindTagRequest (line 2407) | interface V2BindTagRequest {
type V2BatchDeleteRequest (line 2412) | interface V2BatchDeleteRequest {
type V2BatchCreateTagsResponse (line 2416) | interface V2BatchCreateTagsResponse {
type V2BatchCreateTagsRequest (line 2420) | interface V2BatchCreateTagsRequest {
type V2BasicClusterInfo (line 2424) | interface V2BasicClusterInfo {
type V2BackupPolicy (line 2429) | interface V2BackupPolicy {
type V2BackupCycleEnumData (line 2453) | type V2BackupCycleEnumData = typeof V2BackupCycleEnumData[keyof typeof V...
type V2BRTask (line 2462) | interface V2BRTask {
type V2BRSummary (line 2488) | interface V2BRSummary {
type V2AssociatedClusters (line 2494) | interface V2AssociatedClusters {
type V2ApiKeyStatus (line 2499) | type V2ApiKeyStatus = typeof V2ApiKeyStatus[keyof typeof V2ApiKeyStatus];
type V2ApiKey (line 2508) | interface V2ApiKey {
type V2ActivateLicenseRequestHeaders (line 2518) | type V2ActivateLicenseRequestHeaders = {[key: string]: string};
type V2ActivateLicenseRequest (line 2520) | interface V2ActivateLicenseRequest {
type Tiupv2UpdateTiups (line 2527) | interface Tiupv2UpdateTiups {
type Tiupv2CreateTiups (line 2533) | interface Tiupv2CreateTiups {
type Tagv2Tag (line 2541) | interface Tagv2Tag {
type RpcStatusError (line 2547) | type RpcStatusError = {
type RpcStatus (line 2554) | interface RpcStatus {
type ProtobufAny (line 2645) | interface ProtobufAny {
type Metricsv2Value (line 2678) | interface Metricsv2Value {
type Licensev2License (line 2683) | interface Licensev2License {
type Hostv2UpdateHost (line 2700) | interface Hostv2UpdateHost {
type Hostv2ReportCheckResult (line 2709) | type Hostv2ReportCheckResult = typeof Hostv2ReportCheckResult[keyof type...
type Hostv2Report (line 2719) | interface Hostv2Report {
type UserServiceUpdateUserBody (line 2732) | interface UserServiceUpdateUserBody {
type UserServiceResetPasswordBody (line 2745) | interface UserServiceResetPasswordBody {
type TagServiceUpdateTagBody (line 2749) | interface TagServiceUpdateTagBody {
type RoleServiceUpdateRoleBody (line 2754) | interface RoleServiceUpdateRoleBody {
type LocationServiceUpdateLocationsBody (line 2761) | interface LocationServiceUpdateLocationsBody {
type HostServiceHostConfirmBody (line 2765) | interface HostServiceHostConfirmBody { [key: string]: unknown }
type GlobalBRServiceUpdateBackupPolicyBody (line 2767) | interface GlobalBRServiceUpdateBackupPolicyBody {
type DiagnosisServiceUpdateTopSqlConfigsBody (line 2784) | interface DiagnosisServiceUpdateTopSqlConfigsBody {
type DiagnosisServiceRemoveSqlLimitBody (line 2792) | interface DiagnosisServiceRemoveSqlLimitBody {
type DiagnosisServiceAddSqlLimitBodyAction (line 2797) | type DiagnosisServiceAddSqlLimitBodyAction = typeof DiagnosisServiceAddS...
type DiagnosisServiceAddSqlLimitBody (line 2807) | interface DiagnosisServiceAddSqlLimitBody {
type CredentialServiceUpdateCredentialBody (line 2813) | interface CredentialServiceUpdateCredentialBody {
type ClusterBRServiceCreateRestoreTaskBody (line 2824) | interface ClusterBRServiceCreateRestoreTaskBody {
type ClusterBRServiceCreateBackupTaskBody (line 2837) | interface ClusterBRServiceCreateBackupTaskBody {
type ApiKeyServiceUpdateApiKeyBodyStatus (line 2848) | type ApiKeyServiceUpdateApiKeyBodyStatus = typeof ApiKeyServiceUpdateApi...
type ApiKeyServiceUpdateApiKeyBody (line 2857) | interface ApiKeyServiceUpdateApiKeyBody {
FILE: ui-v2/packages/api/server/src/azores/index.validator.ts
type HasUndefined (line 19) | type HasUndefined<T> = undefined extends T ? true : false;
type Hook (line 21) | type Hook<T, E extends Env, P extends string, O = {}> = (
type ValidationTargetsWithResponse (line 34) | type ValidationTargetsWithResponse = ValidationTargets & { response: any };
FILE: ui-v2/packages/libs/1-charts/src/chart-theme-switch.tsx
constant LIGHT_TOKEN (line 3) | const LIGHT_TOKEN = "charts-light-theme"
constant DARK_TOKEN (line 4) | const DARK_TOKEN = "charts-dark-theme"
function useChartTheme (line 6) | function useChartTheme(theme: "light" | "dark") {
function ChartThemeSwitch (line 18) | function ChartThemeSwitch({ value }: { value: "light" | "dark" }) {
FILE: ui-v2/packages/libs/1-charts/src/series-chart.tsx
function formatNumByUnit (line 22) | function formatNumByUnit(value: number, unit: string) {
function niceTimeFormat (line 30) | function niceTimeFormat(seconds: number) {
function alignRange (line 41) | function alignRange(
type TimeRangeValue (line 57) | type TimeRangeValue = [number, number]
type SeriesChartProps (line 59) | type SeriesChartProps = {
function SeriesChart (line 68) | function SeriesChart({
FILE: ui-v2/packages/libs/1-charts/src/series-render.tsx
function renderSeriesData (line 5) | function renderSeriesData(sd: SeriesData) {
function renderLine (line 18) | function renderLine(sd: SeriesData) {
function renderStackedBar (line 43) | function renderStackedBar(sd: SeriesData) {
function renderAreaStack (line 60) | function renderAreaStack(sd: SeriesData) {
function renderArea (line 77) | function renderArea(sd: SeriesData) {
FILE: ui-v2/packages/libs/1-charts/src/type.ts
type SeriesDataType (line 3) | type SeriesDataType = "line" | "area" | "bar_stacked" | "area_stack"
type DataPoint (line 5) | type DataPoint = [msTimestamp: number, value: number | null]
type SeriesData (line 7) | type SeriesData = {
FILE: ui-v2/packages/libs/1-icons/src/index.ts
function icons (line 4) | function icons() {
FILE: ui-v2/packages/libs/1-utils/src/delay.ts
function delay (line 1) | function delay(ms: number) {
FILE: ui-v2/packages/libs/1-utils/src/format.ts
function formatTime (line 6) | function formatTime(
function formatDuration (line 13) | function formatDuration(seconds: number, short = false) {
function formatNumByUnit (line 21) | function formatNumByUnit(
function formatSql (line 39) | function formatSql(sql: string, compact: boolean = false): string {
function simpleMinifySql (line 53) | function simpleMinifySql(str: string) {
FILE: ui-v2/packages/libs/1-utils/src/i18n.ts
constant DEF_DISTRO (line 9) | const DEF_DISTRO = {
function initI18n (line 17) | function initI18n() {
function changeLang (line 34) | function changeLang(lang: string) {
function addResourceBundles (line 38) | function addResourceBundles(langsLocales: Resource) {
function addLangsLocales (line 49) | function addLangsLocales(langsLocales: Resource) {
function useTn (line 59) | function useTn(ns: string) {
function useHotkeyChangeLang (line 96) | function useHotkeyChangeLang(hotkey: string = "mod+L") {
FILE: ui-v2/packages/libs/1-utils/src/memory-state/reset-filters-state.ts
type ResetFiltersState (line 3) | interface ResetFiltersState {
FILE: ui-v2/packages/libs/1-utils/src/prom.ts
type TransformNullValue (line 3) | enum TransformNullValue {
type PromResultItem (line 8) | type PromResultItem = {
type PromSeriesItem (line 13) | type PromSeriesItem = {
constant POSITIVE_INFINITY_SAMPLE_VALUE (line 20) | const POSITIVE_INFINITY_SAMPLE_VALUE = "+Inf"
constant NEGATIVE_INFINITY_SAMPLE_VALUE (line 21) | const NEGATIVE_INFINITY_SAMPLE_VALUE = "-Inf"
function parseStrVal (line 23) | function parseStrVal(value: string): number {
function transformStrVal (line 34) | function transformStrVal(value: string, nullValue?: TransformNullValue) {
function transformPromResultItem (line 46) | function transformPromResultItem(
constant DEF_SCRAPE_INTERVAL (line 75) | const DEF_SCRAPE_INTERVAL = 30
function resolvePromQLTemplate (line 77) | function resolvePromQLTemplate(
function calcPromQueryStep (line 88) | function calcPromQueryStep(
FILE: ui-v2/packages/libs/1-utils/src/time-range.ts
type TimeRangeValue (line 5) | type TimeRangeValue = [from: number, to: number]
type RelativeTimeRange (line 7) | interface RelativeTimeRange {
type AbsoluteTimeRange (line 13) | interface AbsoluteTimeRange {
type TimeRange (line 18) | type TimeRange = RelativeTimeRange | AbsoluteTimeRange
function fromTimeRangeValue (line 37) | function fromTimeRangeValue(v: TimeRangeValue): AbsoluteTimeRange {
type URLTimeRange (line 46) | type URLTimeRange = { from: string; to: string }
FILE: ui-v2/packages/libs/1-utils/src/url-state/advanced-filters-url-state.ts
type AdvancedFilterItem (line 6) | type AdvancedFilterItem = {
type AdvancedFiltersUrlState (line 12) | type AdvancedFiltersUrlState = Partial<Record<"af", string>>
function useAdvancedFiltersUrlState (line 14) | function useAdvancedFiltersUrlState() {
FILE: ui-v2/packages/libs/1-utils/src/url-state/pagination-url-state.ts
type Pagination (line 5) | type Pagination = {
type PaginationUrlState (line 10) | type PaginationUrlState = Partial<
function usePaginationUrlState (line 14) | function usePaginationUrlState(defPageSize: number = 15) {
FILE: ui-v2/packages/libs/1-utils/src/url-state/pro-table-pagination-state.ts
type onPaginationChangeFn (line 6) | type onPaginationChangeFn = Required<ProTableOptions>["onPaginationChange"]
function useProTablePaginationState (line 8) | function useProTablePaginationState(
FILE: ui-v2/packages/libs/1-utils/src/url-state/pro-table-sort-state.ts
type onSortChangeFn (line 6) | type onSortChangeFn = Required<ProTableOptions>["onSortingChange"]
function useProTableSortState (line 8) | function useProTableSortState(
FILE: ui-v2/packages/libs/1-utils/src/url-state/search-url-state.ts
type SearchUrlState (line 6) | type SearchUrlState = Partial<Record<"term", string>>
function useSearchUrlState (line 8) | function useSearchUrlState() {
FILE: ui-v2/packages/libs/1-utils/src/url-state/sort-url-state.ts
type SortRule (line 6) | type SortRule = {
type SortUrlState (line 11) | type SortUrlState = Partial<Record<"orderBy" | "desc", string>>
function useSortUrlState (line 13) | function useSortUrlState(defOrderBy: string = "") {
FILE: ui-v2/packages/libs/1-utils/src/url-state/timerange-url-state.ts
type TimeRangeUrlState (line 8) | type TimeRangeUrlState = Partial<Record<"from" | "to", string>>
constant DEF_TIME_RANGE (line 10) | const DEF_TIME_RANGE: TimeRange = {
function useTimeRangeUrlState (line 15) | function useTimeRangeUrlState(defTimeRange?: TimeRange) {
FILE: ui-v2/packages/libs/1-utils/src/url-state/use-url-state.tsx
type UrlStateCtxValue (line 9) | type UrlStateCtxValue = {
function defCtxVal (line 26) | function defCtxVal(): UrlStateCtxValue {
function UrlStateProvider (line 36) | function UrlStateProvider(props: {
type UrlState (line 74) | type UrlState = Partial<Record<string, string>>
type UrlStateObj (line 75) | type UrlStateObj<T extends UrlState = UrlState> = {
function useUrlState (line 79) | function useUrlState<T extends UrlState = UrlState>(): [
FILE: ui-v2/packages/libs/3-biz-ui/src/advanced-filters/filter-setting.tsx
type AdvancedFilterSettingItem (line 20) | type AdvancedFilterSettingItem = AdvancedFilterItem & {
type AdvancedFilterInfo (line 26) | type AdvancedFilterInfo = {
function AdvancedFilterSetting (line 33) | function AdvancedFilterSetting({
FILE: ui-v2/packages/libs/3-biz-ui/src/advanced-filters/filters-modal.tsx
function AdvancedFiltersModal (line 14) | function AdvancedFiltersModal({
FILE: ui-v2/packages/libs/3-biz-ui/src/advanced-filters/filters-setting.tsx
function newFilterSettingItem (line 10) | function newFilterSettingItem(): AdvancedFilterSettingItem {
function AdvancedFiltersSetting (line 20) | function AdvancedFiltersSetting({
FILE: ui-v2/packages/libs/3-biz-ui/src/advanced-filters/locales.ts
type I18nLocaleKeys (line 4) | type I18nLocaleKeys =
type I18nLocale (line 12) | type I18nLocale = {
function updateI18nLocales (line 26) | function updateI18nLocales(locales: { [ln: string]: I18nLocale }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/auto-refresh-button/index.tsx
type AutoRefreshButtonProps (line 12) | interface AutoRefreshButtonProps {
type AutoRefreshButtonRef (line 21) | interface AutoRefreshButtonRef {
constant AUTO_REFRESH_SECONDS_OPTIONS (line 25) | const AUTO_REFRESH_SECONDS_OPTIONS = [
constant DEFAULT_AUTO_REFRESH_SECONDS (line 35) | const DEFAULT_AUTO_REFRESH_SECONDS = 60
FILE: ui-v2/packages/libs/3-biz-ui/src/auto-refresh-button/progress.tsx
function RefreshProgress (line 3) | function RefreshProgress({ value }: { value: number }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/charts-multi-select.tsx
type ChartsSelectData (line 17) | type ChartsSelectData = {
type ChartMultiSelectProps (line 23) | type ChartMultiSelectProps = {
function ChartMultiSelect (line 32) | function ChartMultiSelect({
type I18nLocaleKeys (line 194) | type I18nLocaleKeys =
type I18nLocale (line 202) | type I18nLocale = {
function updateI18nLocales (line 216) | function updateI18nLocales(locales: { [ln: string]: I18nLocale }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/cols-multi-select.tsx
type ColumnMultiSelectProps (line 18) | type ColumnMultiSelectProps = {
function ColumnMultiSelect (line 25) | function ColumnMultiSelect({
type I18nLocaleKeys (line 180) | type I18nLocaleKeys =
type I18nLocale (line 188) | type I18nLocale = {
function updateI18nLocales (line 202) | function updateI18nLocales(locales: { [ln: string]: I18nLocale }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/custom-json-view.tsx
function CustomJsonView (line 33) | function CustomJsonView({ data }: JsonViewProps) {
FILE: ui-v2/packages/libs/3-biz-ui/src/filter-multi-select.tsx
type FilterMultiSelectProps (line 13) | type FilterMultiSelectProps = {
function FilterMultiSelect (line 26) | function FilterMultiSelect({
FILE: ui-v2/packages/libs/3-biz-ui/src/highlight-sql.tsx
function InlineHighlightSQL (line 5) | function InlineHighlightSQL({ sql }: { sql: string }) {
function HighlightSQL (line 40) | function HighlightSQL({ sql }: { sql: string }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/info-table.tsx
type InfoModel (line 8) | type InfoModel = {
function InfoTable (line 15) | function InfoTable({ data }: { data: InfoModel[] }) {
type I18nLocaleKeys (line 63) | type I18nLocaleKeys = "Description" | "Name" | "Value"
type I18nLocale (line 64) | type I18nLocale = {
function updateI18nLocales (line 74) | function updateI18nLocales(locales: { [ln: string]: I18nLocale }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/loading-skeleton.tsx
function LoadingSkeleton (line 3) | function LoadingSkeleton() {
FILE: ui-v2/packages/libs/3-biz-ui/src/plan-table/index.tsx
function PlanTable (line 133) | function PlanTable({ plan }: { plan: string }) {
FILE: ui-v2/packages/libs/3-biz-ui/src/plan-table/parser.ts
type PLAN_COLUMN_KEYS_UNION (line 13) | type PLAN_COLUMN_KEYS_UNION = (typeof _PLAN_COLUMN_KEYS)[number]
type PlanFiledPosition (line 14) | type PlanFiledPosition = Record<
type PlanItem (line 21) | type PlanItem = Record<PLAN_COLUMN_KEYS_UNION, string>
function parsePlanV1TextToArray (line 27) | function parsePlanV1TextToArray(planV1Text: string): PlanItem[] {
function parsePlanV2TextToArray (line 134) | function parsePlanV2TextToArray(planV2Text: string): PlanItem[] {
function parsePlanTextToArray (line 292) | function parsePlanTextToArray(plan: string): PlanItem[] {
function getPlanTextType (line 302) | function getPlanTextType(plan: string): "v1" | "v2" | "unknown" {
FILE: ui-v2/packages/libs/3-biz-ui/src/sql-with-hover.tsx
function SQLWithHover (line 6) | function SQLWithHover({
function EvictedSQL (line 40) | function EvictedSQL() {
FILE: ui-v2/packages/libs/3-biz-ui/src/time-range-picker/custom.tsx
type CustomTimeRangePickerProps (line 24) | interface CustomTimeRangePickerProps {
FILE: ui-v2/packages/libs/3-biz-ui/src/time-range-picker/index.tsx
constant DEFAULT_QUICK_RANGES (line 25) | const DEFAULT_QUICK_RANGES = [
type TimeRangePickerProps (line 37) | interface TimeRangePickerProps extends ButtonProps {
type I18nLocaleKeys (line 244) | type I18nLocaleKeys =
type I18nLocale (line 257) | type I18nLocale = {
function updateI18nLocales (line 280) | function updateI18nLocales(locales: { [ln: string]: I18nLocale }) {
FILE: ui-v2/packages/libs/4-apps/src/_shared/cols-factory.tsx
class ColConfig (line 8) | class ColConfig<T extends MRT_RowData> {
method constructor (line 9) | constructor(private col: MRT_ColumnDef<T>) {}
method getConfig (line 11) | getConfig(): MRT_ColumnDef<T> {
method setConfig (line 14) | setConfig(config: MRT_ColumnDef<T>) {
method patchConfig (line 18) | patchConfig(config: Partial<MRT_ColumnDef<T>>) {
class TableColsFactory (line 24) | class TableColsFactory<T extends MRT_RowData> {
method constructor (line 25) | constructor(private tk: (key: string) => string) {}
method columns (line 27) | columns(colConfigs: ColConfig<T>[]): MRT_ColumnDef<T>[] {
method defCol (line 31) | defCol(filedName: keyof T): ColConfig<T> {
method number (line 41) | number(filedName: keyof T, unit: string): ColConfig<T> {
method timestamp (line 47) | timestamp(filedName: keyof T): ColConfig<T> {
method text (line 53) | text(filedName: keyof T): ColConfig<T> {
method textWithTooltip (line 63) | textWithTooltip(filedName: keyof T): ColConfig<T> {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/components/chart.tsx
function SqlHistoryChart (line 15) | function SqlHistoryChart() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/components/filters.tsx
constant QUICK_RANGES (line 11) | const QUICK_RANGES: number[] = [
function MetricSelect (line 24) | function MetricSelect() {
function TimeRangeSelect (line 59) | function TimeRangeSelect() {
function Filters (line 85) | function Filters() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/components/index.tsx
function SqlHistoryCard (line 11) | function SqlHistoryCard() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/components/time-range-clip-alert.tsx
function TimeRangeClipAlert (line 6) | function TimeRangeClipAlert() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/ctx/index.tsx
type HistoryMetricItem (line 6) | type HistoryMetricItem = {
type AppApi (line 11) | type AppApi = {
type AppConfig (line 21) | type AppConfig = {
type AppCtxValue (line 28) | type AppCtxValue = {
function AppProvider (line 50) | function AppProvider(props: {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/shared-state/memory-state.ts
type SqlHistoryState (line 9) | interface SqlHistoryState {
type TimeRangeValueState (line 33) | interface TimeRangeValueState {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-history/utils/use-data.ts
function useSqlHistoryMetricNamesData (line 10) | function useSqlHistoryMetricNamesData() {
function useSqlHistoryMetricData (line 18) | function useSqlHistoryMetricData() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/components/index.tsx
function SqlLimitCard (line 9) | function SqlLimitCard() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/components/setting.tsx
function SqlLimitSettingBody (line 16) | function SqlLimitSettingBody() {
function SqlLimitSettingModal (line 82) | function SqlLimitSettingModal() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/components/table.tsx
function SqlLimitTable (line 9) | function SqlLimitTable() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/ctx/index.tsx
type SqlLimitStatusItem (line 4) | type SqlLimitStatusItem = {
type AppApi (line 11) | type AppApi = {
type AppCtxValue (line 26) | type AppCtxValue = {
function AppProvider (line 49) | function AppProvider(props: {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/shared-state/memory-state.ts
type SettingModalState (line 3) | interface SettingModalState {
FILE: ui-v2/packages/libs/4-apps/src/_shared/sql-limit/utils/use-data.ts
function useRuGroupsData (line 5) | function useRuGroupsData() {
function useSqlLimitSupportData (line 13) | function useSqlLimitSupportData() {
function useSqlLimitStatusData (line 21) | function useSqlLimitStatusData() {
function useCreateSqlLimitData (line 29) | function useCreateSqlLimitData() {
function useDeleteSqlLimitData (line 44) | function useDeleteSqlLimitData() {
FILE: ui-v2/packages/libs/4-apps/src/_shared/state-filters.tsx
constant QUICK_RANGES (line 14) | const QUICK_RANGES: number[] = [
function UrlStateTimeRangePicker (line 27) | function UrlStateTimeRangePicker() {
function UrlStateSearchInput (line 50) | function UrlStateSearchInput({
function MemoryStateResetButton (line 102) | function MemoryStateResetButton({ text }: { text: string }) {
FILE: ui-v2/packages/libs/4-apps/src/index.ts
function hello (line 2) | function hello() {
FILE: ui-v2/packages/libs/4-apps/src/metric/components/chart-actions-menu.tsx
function ChartActionsMenu (line 9) | function ChartActionsMenu({
FILE: ui-v2/packages/libs/4-apps/src/metric/components/chart-body.tsx
function transformData (line 29) | function transformData(
function ChartBody (line 45) | function ChartBody({
FILE: ui-v2/packages/libs/4-apps/src/metric/components/chart-header.tsx
function ChartHeader (line 14) | function ChartHeader({
FILE: ui-v2/packages/libs/4-apps/src/metric/components/charts-select.tsx
function ChartsSelect (line 11) | function ChartsSelect() {
FILE: ui-v2/packages/libs/4-apps/src/metric/components/loading-card.tsx
function LoadingCard (line 3) | function LoadingCard() {
FILE: ui-v2/packages/libs/4-apps/src/metric/ctx/index.tsx
type MetricDataByNameResultItem (line 8) | type MetricDataByNameResultItem = {
type AppApi (line 15) | type AppApi = {
type AppConfig (line 43) | type AppConfig = {
type AppActions (line 48) | type AppActions = {
type AppCtxValue (line 53) | type AppCtxValue = {
function AppProvider (line 76) | function AppProvider(props: {
FILE: ui-v2/packages/libs/4-apps/src/metric/pages/azores-cluster-overview/index.tsx
function AzoresClusterOverviewMetricsPage (line 8) | function AzoresClusterOverviewMetricsPage() {
FILE: ui-v2/packages/libs/4-apps/src/metric/pages/azores-cluster-overview/panel.tsx
function AzoresClusterOverviewMetricsPanel (line 19) | function AzoresClusterOverviewMetricsPanel({
FILE: ui-v2/packages/libs/4-apps/src/metric/pages/azores-cluster/filters.tsx
constant GROUPS (line 21) | const GROUPS = ["basic", "advanced"]
function useLocales (line 25) | function useLocales() {
function Filters (line 33) | function Filters() {
FILE: ui-v2/packages/libs/4-apps/src/metric/pages/azores-cluster/index.tsx
function AzoresClusterMetricsPage (line 11) | function AzoresClusterMetricsPage() {
FILE: ui-v2/packages/libs/4-apps/src/metric/pages/azores-cluster/panel.tsx
function useLocales (line 16) | function useLocales() {
function useTroubleShootingLinks (line 55) | function useTroubleShootingLinks(): {
function AzoresClusterMetricsPanel (line 107) | function Azor
Condensed preview — 1662 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,982K chars).
[
{
"path": ".all-contributorsrc",
"chars": 3821,
"preview": "{\n \"files\": [\n \"README.md\"\n ],\n \"imageSize\": 50,\n \"commit\": false,\n \"contributors\": [\n {\n \"login\": \"Full"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 511,
"preview": "---\nname: \"\\U0001F41B Bug Report\"\nabout: Something isn't working as expected\ntitle: \"\"\nlabels: type/bug\nassignees: \"\"\n--"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request.md",
"chars": 815,
"preview": "---\nname: \"\\U0001F680 Feature Request\"\nabout: I have a suggestion\ntitle: \"\"\nlabels: status/discussion, type/feature-requ"
},
{
"path": ".github/ISSUE_TEMPLATE/question.md",
"chars": 670,
"preview": "---\nname: \"\\U0001F914 Question\"\nabout: I have a question\nlabel: \"type/question\"\n---\n\n## Question\n\n<!--\n\nThanks for using"
},
{
"path": ".github/autolabeler.yml",
"chars": 46,
"preview": "area/frontend:\n - /ui\narea/backend:\n - *.go\n"
},
{
"path": ".github/codecov.yml",
"chars": 39,
"preview": "comment:\n layout: \"diff,flags,footer\"\n"
},
{
"path": ".github/stale.yml",
"chars": 115,
"preview": "daysUntilStale: 60\ndaysUntilClose: 7\nexemptLabels:\n - type/feature-request\n - type/pinned\nstaleLabel: type/stale\n"
},
{
"path": ".github/workflows/build.yaml",
"chars": 2189,
"preview": "name: Build\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n - release-*\n\njo"
},
{
"path": ".github/workflows/manual-create-pd-pr.yaml",
"chars": 3130,
"preview": "name: Create PD PR Manually\n\non:\n workflow_dispatch:\n inputs:\n release_version:\n description: 'Release v"
},
{
"path": ".github/workflows/release.yaml",
"chars": 2900,
"preview": "name: Release\n\non:\n push:\n tags:\n - \"v*\"\n - \"!v*-alpha\"\n\njobs:\n release:\n name: Release\n runs-on: u"
},
{
"path": ".github/workflows/test-docker-image.yaml",
"chars": 1354,
"preview": "name: Test Docker Image\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\nconcurrenc"
},
{
"path": ".github/workflows/test.yaml",
"chars": 6220,
"preview": "name: Test\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n - release-*\n\njob"
},
{
"path": ".github/workflows/upload-e2e-snapshots.yaml",
"chars": 4065,
"preview": "# Copyright 2024 PingCAP, Inc. Licensed under Apache-2.0.\nname: Upload E2E Snapshots\n\non:\n workflow_dispatch:\n input"
},
{
"path": ".gitignore",
"chars": 999,
"preview": ".env\n/bin\n\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*"
},
{
"path": ".golangci.yml",
"chars": 1570,
"preview": "version: \"2\"\nlinters:\n enable:\n - asciicheck\n - dogsled\n - durationcheck\n - errorlint\n - exhaustive\n "
},
{
"path": ".prettierrc",
"chars": 70,
"preview": "{\n \"semi\": false,\n \"trailingComma\": \"none\",\n \"singleQuote\": true\n}\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 8983,
"preview": "# Contributing to TiDB Dashboard\n\nThanks for your interest in contributing to TiDB Dashboard! This document outlines som"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 4323,
"preview": "DASHBOARD_PKG := github.com/pingcap/tidb-dashboard\n\nBUILD_TAGS ?=\n\nPNPM_INSTALL_TAGS ?=\n\nLDFLAGS ?=\n\nFEATURE_VERSION ?= "
},
{
"path": "OWNERS",
"chars": 332,
"preview": "# See the OWNERS docs at https://go.k8s.io/owners\napprovers:\n - baurine\n - breezewish\n - crazycs520\n - Deardrops\n -"
},
{
"path": "README.md",
"chars": 4860,
"preview": "# TiDB Dashboard\n\n[](ht"
},
{
"path": "SECURITY.md",
"chars": 1525,
"preview": "# Security Vulnerability Disclosure and Response Process\n\nTiDB is a fast-growing open source database. To ensure its sec"
},
{
"path": "cmd/tidb-dashboard/main.go",
"chars": 11212,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// @title Dashboard API\n// @version 1.0\n// @license.name Apa"
},
{
"path": "dockerfiles/docker-compose.yml",
"chars": 1775,
"preview": "version: '2'\n\nservices:\n tidb-dashboard:\n image: pingcap/tidb-dashboard:nightly\n ports:\n - \"12333:12333\"\n "
},
{
"path": "etc/go.mod",
"chars": 77,
"preview": "module ignore_etc // a hack to ignore this directory in go commands\n\ngo 1.13\n"
},
{
"path": "etc/manualTestEnv/.gitignore",
"chars": 29,
"preview": ".vagrant/\ntiup-cluster-*.log\n"
},
{
"path": "etc/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb",
"chars": 1101,
"preview": "Vagrant.configure(\"2\") do |config|\n ssh_pub_key = File.readlines(\"#{File.dirname(__FILE__)}/vagrant_key.pub\").first.str"
},
{
"path": "etc/manualTestEnv/_shared/vagrant_key",
"chars": 1843,
"preview": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQA"
},
{
"path": "etc/manualTestEnv/_shared/vagrant_key.pub",
"chars": 381,
"preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFuhnNi6ao2hU5D+EoqEhkfE2F/m2aeQtmvLyLpe6vgU8sOJHGiz/FVUPHTKdM87JBVVpe03FmcCZtHge4"
},
{
"path": "etc/manualTestEnv/complexCase1/README.md",
"chars": 644,
"preview": "# complexCase1\n\nTiDB, PD, TiKV, TiFlash each in different hosts.\n\n## Usage\n\n1. Start the box:\n\n ```bash\n VAGRANT_EXP"
},
{
"path": "etc/manualTestEnv/complexCase1/Vagrantfile",
"chars": 1404,
"preview": "load \"#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb\"\n\nVagrant.configure(\"2\") do |config|\n config.v"
},
{
"path": "etc/manualTestEnv/complexCase1/topology.yaml",
"chars": 2035,
"preview": "global:\n user: tidb\n deploy_dir: /pingcap/tidb-deploy\n data_dir: /pingcap/tidb-data\n\nserver_configs:\n tikv:\n serv"
},
{
"path": "etc/manualTestEnv/multiHost/README.md",
"chars": 603,
"preview": "# multiHost\n\nTiDB, PD, TiKV, TiFlash each in different hosts.\n\n## Usage\n\n1. Start the box:\n\n ```bash\n vagrant up\n "
},
{
"path": "etc/manualTestEnv/multiHost/Vagrantfile",
"chars": 336,
"preview": "load \"#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb\"\n\nVagrant.configure(\"2\") do |config|\n config.v"
},
{
"path": "etc/manualTestEnv/multiHost/topology.yaml",
"chars": 788,
"preview": "global:\n user: tidb\n deploy_dir: tidb-deploy\n data_dir: tidb-data\n\nserver_configs:\n tikv:\n server.grpc-concurrenc"
},
{
"path": "etc/manualTestEnv/multiReplica/README.md",
"chars": 607,
"preview": "# multiReplica\n\nMultiple TiKV nodes in different labels.\n\n## Usage\n\n1. Start the box:\n\n ```bash\n vagrant up\n ```\n\n"
},
{
"path": "etc/manualTestEnv/multiReplica/Vagrantfile",
"chars": 256,
"preview": "load \"#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb\"\n\nVagrant.configure(\"2\") do |config|\n config.v"
},
{
"path": "etc/manualTestEnv/multiReplica/topology.yaml",
"chars": 1360,
"preview": "global:\n user: tidb\n deploy_dir: tidb-deploy\n data_dir: tidb-data\n\nserver_configs:\n tikv:\n server.grpc-concurrenc"
},
{
"path": "etc/manualTestEnv/singleHost/README.md",
"chars": 599,
"preview": "# singleHost\n\nTiDB, PD, TiKV, TiFlash in the same host.\n\n## Usage\n\n1. Start the box:\n\n ```bash\n vagrant up\n ```\n\n1"
},
{
"path": "etc/manualTestEnv/singleHost/Vagrantfile",
"chars": 255,
"preview": "load \"#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb\"\n\nVagrant.configure(\"2\") do |config|\n config.v"
},
{
"path": "etc/manualTestEnv/singleHost/topology.yaml",
"chars": 672,
"preview": "global:\n user: tidb\n deploy_dir: tidb-deploy\n data_dir: tidb-data\n\nserver_configs:\n tikv:\n server.grpc-concurrenc"
},
{
"path": "etc/manualTestEnv/singleHostMultiDisk/.gitignore",
"chars": 6,
"preview": "data/\n"
},
{
"path": "etc/manualTestEnv/singleHostMultiDisk/README.md",
"chars": 649,
"preview": "# singleHostMultiDisk\n\nAll instances in a single host, but on different disks.\n\n## Usage\n\n1. Start the box:\n\n ```bash\n"
},
{
"path": "etc/manualTestEnv/singleHostMultiDisk/Vagrantfile",
"chars": 255,
"preview": "load \"#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb\"\n\nVagrant.configure(\"2\") do |config|\n config.v"
},
{
"path": "etc/manualTestEnv/singleHostMultiDisk/topology.yaml",
"chars": 746,
"preview": "global:\n user: vagrant\n deploy_dir: tidb-deploy\n data_dir: tidb-data\n\nserver_configs:\n tikv:\n server.grpc-concurr"
},
{
"path": "go.mod",
"chars": 5846,
"preview": "module github.com/pingcap/tidb-dashboard\n\ngo 1.25.7\n\nrequire (\n\tgithub.com/DATA-DOG/go-sqlmock v1.5.0\n\tgithub.com/Master"
},
{
"path": "go.sum",
"chars": 58814,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1 h1:"
},
{
"path": "pkg/apiserver/apiserver.go",
"chars": 8765,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage apiserver\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"s"
},
{
"path": "pkg/apiserver/clusterinfo/host.go",
"chars": 3253,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage clusterinfo\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.c"
},
{
"path": "pkg/apiserver/clusterinfo/hostinfo/cluster_config.go",
"chars": 3077,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage hostinfo\n\nimport (\n\t\"encoding/json\"\n\t\"strings\"\n\n\t\"go"
},
{
"path": "pkg/apiserver/clusterinfo/hostinfo/cluster_hardware.go",
"chars": 2289,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage hostinfo\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"strin"
},
{
"path": "pkg/apiserver/clusterinfo/hostinfo/cluster_load.go",
"chars": 1804,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage hostinfo\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\n\t\"gorm"
},
{
"path": "pkg/apiserver/clusterinfo/hostinfo/hostinfo.go",
"chars": 2451,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage hostinfo\n\nimport \"text/template\"\n\ntype CPUUsageInfo "
},
{
"path": "pkg/apiserver/clusterinfo/service.go",
"chars": 10127,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// clusterinfo is a directory for ClusterInfoServer, which c"
},
{
"path": "pkg/apiserver/clusterinfo/statistics.go",
"chars": 8980,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage clusterinfo\n\nimport (\n\t\"net\"\n\t\"sort\"\n\t\"strconv\"\n\t\"st"
},
{
"path": "pkg/apiserver/clusterinfo/topology.go",
"chars": 927,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage clusterinfo\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\""
},
{
"path": "pkg/apiserver/configuration/editable.go",
"chars": 16019,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage configuration\n\nimport \"strings\"\n\n// Hard coded items"
},
{
"path": "pkg/apiserver/configuration/flatten.go",
"chars": 976,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage configuration\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.c"
},
{
"path": "pkg/apiserver/configuration/router.go",
"chars": 2205,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage configuration\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gi"
},
{
"path": "pkg/apiserver/configuration/service.go",
"chars": 10677,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage configuration\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encodi"
},
{
"path": "pkg/apiserver/conprof/module.go",
"chars": 187,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage conprof\n\nimport (\n\t\"go.uber.org/fx\"\n)\n\nvar Module = "
},
{
"path": "pkg/apiserver/conprof/service.go",
"chars": 7844,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// conprof is short for continuous profiling\npackage conprof"
},
{
"path": "pkg/apiserver/deadlock/model.go",
"chars": 759,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage deadlock\n\nimport \"time\"\n\ntype Model struct {\n\tInstan"
},
{
"path": "pkg/apiserver/deadlock/module.go",
"chars": 183,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage deadlock\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx.O"
},
{
"path": "pkg/apiserver/deadlock/service.go",
"chars": 1425,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage deadlock\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gon"
},
{
"path": "pkg/apiserver/debugapi/apis.go",
"chars": 12219,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage debugapi\n\nimport (\n\t\"github.com/go-resty/resty/v2\"\n\n"
},
{
"path": "pkg/apiserver/debugapi/endpoint/1_main_test.go",
"chars": 222,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/"
},
{
"path": "pkg/apiserver/debugapi/endpoint/errors.go",
"chars": 308,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"github.com/joomcode/errorx\"\n)\n\n"
},
{
"path": "pkg/apiserver/debugapi/endpoint/models.go",
"chars": 4706,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\""
},
{
"path": "pkg/apiserver/debugapi/endpoint/models_test.go",
"chars": 1836,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr"
},
{
"path": "pkg/apiserver/debugapi/endpoint/payload.go",
"chars": 10174,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\""
},
{
"path": "pkg/apiserver/debugapi/endpoint/payload_test.go",
"chars": 7941,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage endpoint\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"net\""
},
{
"path": "pkg/apiserver/debugapi/module.go",
"chars": 183,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage debugapi\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx.O"
},
{
"path": "pkg/apiserver/debugapi/service.go",
"chars": 5100,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage debugapi\n\nimport (\n\t\"fmt\"\n\t\"mime\"\n\t\"net/http\"\n\t\"time"
},
{
"path": "pkg/apiserver/diagnose/compare.go",
"chars": 27580,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"container/heap\"\n\t\"fmt\"\n\t\"math\"\n"
},
{
"path": "pkg/apiserver/diagnose/diagnose.go",
"chars": 10025,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/htt"
},
{
"path": "pkg/apiserver/diagnose/inspection.go",
"chars": 13694,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strconv\"\n\t\"strin"
},
{
"path": "pkg/apiserver/diagnose/model.go",
"chars": 2013,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid"
},
{
"path": "pkg/apiserver/diagnose/query.go",
"chars": 16944,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"sort\"\n\t\"strconv\""
},
{
"path": "pkg/apiserver/diagnose/report.go",
"chars": 90203,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"sort"
},
{
"path": "pkg/apiserver/diagnose/report_test.go",
"chars": 2774,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage diagnose\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/"
},
{
"path": "pkg/apiserver/info/info.go",
"chars": 5401,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage info\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"sort\"\n\t\"stri"
},
{
"path": "pkg/apiserver/logsearch/models.go",
"chars": 4739,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage logsearch\n\nimport (\n\t\"database/sql/driver\"\n\t\"encodin"
},
{
"path": "pkg/apiserver/logsearch/pack.go",
"chars": 1275,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage logsearch\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gin-gonic/g"
},
{
"path": "pkg/apiserver/logsearch/scheduler.go",
"chars": 1915,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage logsearch\n\nimport (\n\t\"sync\"\n\n\t\"github.com/pingcap/lo"
},
{
"path": "pkg/apiserver/logsearch/service.go",
"chars": 10246,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage logsearch\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"os\"\n\t\"s"
},
{
"path": "pkg/apiserver/logsearch/task.go",
"chars": 7267,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage logsearch\n\nimport (\n\t\"archive/zip\"\n\t\"bufio\"\n\t\"contex"
},
{
"path": "pkg/apiserver/metrics/prom_resolve.go",
"chars": 4855,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage metrics\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t"
},
{
"path": "pkg/apiserver/metrics/prom_resolve_test.go",
"chars": 908,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage metrics\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/"
},
{
"path": "pkg/apiserver/metrics/router.go",
"chars": 4591,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage metrics\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url"
},
{
"path": "pkg/apiserver/metrics/service.go",
"chars": 1249,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage metrics\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/j"
},
{
"path": "pkg/apiserver/model/common_models.go",
"chars": 2045,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage model\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype NodeKind s"
},
{
"path": "pkg/apiserver/profiling/fetcher.go",
"chars": 5813,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t_ \"embed\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t"
},
{
"path": "pkg/apiserver/profiling/jeprof.in",
"chars": 182604,
"preview": "#! /usr/bin/env perl\n\n# Copyright (c) 1998-2007, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source"
},
{
"path": "pkg/apiserver/profiling/model.go",
"chars": 4985,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"context\"\n\t\"database/sql/driver"
},
{
"path": "pkg/apiserver/profiling/module.go",
"chars": 153,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx."
},
{
"path": "pkg/apiserver/profiling/pprof.go",
"chars": 2569,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"githu"
},
{
"path": "pkg/apiserver/profiling/profile.go",
"chars": 2489,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"context\"\n\n\t\"github.com/pingcap"
},
{
"path": "pkg/apiserver/profiling/protobuf_to_svg.go",
"chars": 3196,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n"
},
{
"path": "pkg/apiserver/profiling/router.go",
"chars": 15827,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"archive/zip\"\n\t\"fmt\"\n\t\"io\"\n\t\"ne"
},
{
"path": "pkg/apiserver/profiling/service.go",
"chars": 6427,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage profiling\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gi"
},
{
"path": "pkg/apiserver/queryeditor/service.go",
"chars": 4020,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage queryeditor\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"n"
},
{
"path": "pkg/apiserver/resource_manager/module.go",
"chars": 190,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage resourcemanager\n\nimport \"go.uber.org/fx\"\n\nvar Module"
},
{
"path": "pkg/apiserver/resource_manager/service.go",
"chars": 5576,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage resourcemanager\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/htt"
},
{
"path": "pkg/apiserver/slowquery/model.go",
"chars": 8708,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage slowquery\n\nimport (\n\t\"strings\"\n\n\t\"gorm.io/datatypes\""
},
{
"path": "pkg/apiserver/slowquery/module.go",
"chars": 184,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage slowquery\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx."
},
{
"path": "pkg/apiserver/slowquery/queries.go",
"chars": 4338,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage slowquery\n\nimport (\n\t\"strings\"\n\n\t\"gorm.io/gorm\"\n\n\t\"g"
},
{
"path": "pkg/apiserver/slowquery/service.go",
"chars": 5652,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage slowquery\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\""
},
{
"path": "pkg/apiserver/slowquery/statement_gen.go",
"chars": 3112,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage slowquery\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/"
},
{
"path": "pkg/apiserver/statement/config.go",
"chars": 2007,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\""
},
{
"path": "pkg/apiserver/statement/config_test.go",
"chars": 2970,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap"
},
{
"path": "pkg/apiserver/statement/models.go",
"chars": 16425,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"strings\"\n\n\t\"github.com/samber/"
},
{
"path": "pkg/apiserver/statement/module.go",
"chars": 184,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx."
},
{
"path": "pkg/apiserver/statement/queries.go",
"chars": 7107,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"st"
},
{
"path": "pkg/apiserver/statement/service.go",
"chars": 12924,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\""
},
{
"path": "pkg/apiserver/statement/statement_gen.go",
"chars": 1774,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage statement\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/"
},
{
"path": "pkg/apiserver/topsql/module.go",
"chars": 181,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage topsql\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx.Opt"
},
{
"path": "pkg/apiserver/topsql/service.go",
"chars": 13160,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage topsql\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"net\"\n\t\""
},
{
"path": "pkg/apiserver/user/auth.go",
"chars": 10432,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage user\n\nimport (\n\t\"crypto/rsa\"\n\t\"encoding/base64\"\n\t\"en"
},
{
"path": "pkg/apiserver/user/code/codeauth/auth.go",
"chars": 1263,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage codeauth\n\nimport (\n\t\"time\"\n\n\t\"go.uber.org/fx\"\n\n\t\"git"
},
{
"path": "pkg/apiserver/user/code/router.go",
"chars": 2104,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage code\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gin"
},
{
"path": "pkg/apiserver/user/code/service.go",
"chars": 3057,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage code\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"sync/atomic\""
},
{
"path": "pkg/apiserver/user/module.go",
"chars": 188,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage user\n\nimport (\n\t\"go.uber.org/fx\"\n)\n\nvar Module = fx."
},
{
"path": "pkg/apiserver/user/rsa_utils.go",
"chars": 3043,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage user\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto"
},
{
"path": "pkg/apiserver/user/sqlauth/sqlauth.go",
"chars": 1660,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage sqlauth\n\nimport (\n\t\"github.com/joomcode/errorx\"\n\t\"go"
},
{
"path": "pkg/apiserver/user/sso/models.go",
"chars": 953,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage sso\n\nimport (\n\t\"github.com/pingcap/tidb-dashboard/pk"
},
{
"path": "pkg/apiserver/user/sso/router.go",
"chars": 4904,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage sso\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gi"
},
{
"path": "pkg/apiserver/user/sso/service.go",
"chars": 14379,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage sso\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding"
},
{
"path": "pkg/apiserver/user/sso/ssoauth/auth.go",
"chars": 1712,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage ssoauth\n\nimport (\n\t\"encoding/json\"\n\n\t\"go.uber.org/fx"
},
{
"path": "pkg/apiserver/user/verify_sql_user.go",
"chars": 4212,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage user\n\nimport (\n\t\"encoding/json\"\n\t\"regexp\"\n\t\"strings\""
},
{
"path": "pkg/apiserver/user/verify_sql_user_test.go",
"chars": 5017,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage user\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/chec"
},
{
"path": "pkg/apiserver/utils/auth.go",
"chars": 1171,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\""
},
{
"path": "pkg/apiserver/utils/binary_plan.go",
"chars": 25697,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"sort\"\n\t\""
},
{
"path": "pkg/apiserver/utils/binary_plan_test.go",
"chars": 21892,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gith"
},
{
"path": "pkg/apiserver/utils/error.go",
"chars": 236,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"github.com/joomcode/errorx\"\n)\n\nvar"
},
{
"path": "pkg/apiserver/utils/export.go",
"chars": 3570,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/csv\"\n\t"
},
{
"path": "pkg/apiserver/utils/gorm.go",
"chars": 351,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport \"gorm.io/gorm/schema\"\n\nfunc GetGormCol"
},
{
"path": "pkg/apiserver/utils/gorm_test.go",
"chars": 547,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/che"
},
{
"path": "pkg/apiserver/utils/jwt.go",
"chars": 1726,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\tjwt \"github.com/gol"
},
{
"path": "pkg/apiserver/utils/mw_experimental.go",
"chars": 423,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/"
},
{
"path": "pkg/apiserver/utils/ngm.go",
"chars": 3246,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\""
},
{
"path": "pkg/apiserver/utils/subset.go",
"chars": 432,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"strings\"\n\n\t\"github.com/samber/lo\"\n"
},
{
"path": "pkg/apiserver/utils/tidb_conn.go",
"chars": 3238,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage utils\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github"
},
{
"path": "pkg/apiserver/visualplan/module.go",
"chars": 185,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage visualplan\n\nimport \"go.uber.org/fx\"\n\nvar Module = fx"
},
{
"path": "pkg/apiserver/visualplan/service.go",
"chars": 1778,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage visualplan\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-g"
},
{
"path": "pkg/config/config.go",
"chars": 2281,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage config\n\nimport (\n\t\"crypto/tls\"\n\t\"net/url\"\n\t\"strings\""
},
{
"path": "pkg/config/dynamic_config.go",
"chars": 4142,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage config\n\nimport (\n\t\"slices\"\n\n\t\"github.com/pingcap/tid"
},
{
"path": "pkg/config/dynamic_config_manager.go",
"chars": 4436,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage config\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"sync\""
},
{
"path": "pkg/dbstore/dbstore.go",
"chars": 1099,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage dbstore\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path\"\n\n\t\"github"
},
{
"path": "pkg/httpc/client.go",
"chars": 2992,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage httpc\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"io\"\n\t\"net"
},
{
"path": "pkg/httpc/client_test.go",
"chars": 1654,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage httpc\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/http/ht"
},
{
"path": "pkg/keyvisual/decorator/decorator.go",
"chars": 1798,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// Package decorator contains all implementations of LabelSt"
},
{
"path": "pkg/keyvisual/decorator/decorator_test.go",
"chars": 187,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage decorator\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap"
},
{
"path": "pkg/keyvisual/decorator/separator.go",
"chars": 1502,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage decorator\n\nimport (\n\t\"strings\"\n\t\"sync/atomic\"\n\n\t\"git"
},
{
"path": "pkg/keyvisual/decorator/tidb.go",
"chars": 3853,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage decorator\n\nimport (\n\t\"context\"\n\t\"encoding/hex\"\n\t\"fmt"
},
{
"path": "pkg/keyvisual/decorator/tidb_requests.go",
"chars": 4872,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage decorator\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fm"
},
{
"path": "pkg/keyvisual/decorator/tidb_test.go",
"chars": 186,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage decorator\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nv"
},
{
"path": "pkg/keyvisual/input/api.go",
"chars": 4717,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage input\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"f"
},
{
"path": "pkg/keyvisual/input/file.go",
"chars": 1708,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage input\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepa"
},
{
"path": "pkg/keyvisual/input/input.go",
"chars": 897,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// Package input defines several different data inputs.\npack"
},
{
"path": "pkg/keyvisual/input/periodic.go",
"chars": 973,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage input\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/pin"
},
{
"path": "pkg/keyvisual/manager.go",
"chars": 2883,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage keyvisual\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"sync\"\n\n"
},
{
"path": "pkg/keyvisual/matrix/average.go",
"chars": 1370,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\n// AverageSplitStrategy adopts the strategy "
},
{
"path": "pkg/keyvisual/matrix/average_test.go",
"chars": 189,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nvar "
},
{
"path": "pkg/keyvisual/matrix/axis.go",
"chars": 8643,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/tidb-dashboard"
},
{
"path": "pkg/keyvisual/matrix/axis_test.go",
"chars": 823,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nvar "
},
{
"path": "pkg/keyvisual/matrix/distance.go",
"chars": 6834,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"context\"\n\t\"math\"\n\t\"runtime\"\n\t\"sor"
},
{
"path": "pkg/keyvisual/matrix/distance_test.go",
"chars": 1870,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"compress/gzip\"\n\t\"context\"\n\t\"encod"
},
{
"path": "pkg/keyvisual/matrix/interface.go",
"chars": 759,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/tidb-dashboard"
},
{
"path": "pkg/keyvisual/matrix/key.go",
"chars": 590,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"sync\"\n)\n\n// KeyMap is used for st"
},
{
"path": "pkg/keyvisual/matrix/key_test.go",
"chars": 181,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nvar "
},
{
"path": "pkg/keyvisual/matrix/matrix.go",
"chars": 1499,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// Package matrix abstracts the source data as Plane, and th"
},
{
"path": "pkg/keyvisual/matrix/matrix_test.go",
"chars": 253,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/ch"
},
{
"path": "pkg/keyvisual/matrix/plane.go",
"chars": 3690,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// Plane stores "
},
{
"path": "pkg/keyvisual/matrix/plane_test.go",
"chars": 185,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nvar "
},
{
"path": "pkg/keyvisual/matrix/util.go",
"chars": 3039,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"sort\"\n)\n\n// MemsetUint64 sets all"
},
{
"path": "pkg/keyvisual/matrix/util_test.go",
"chars": 460,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage matrix\n\nimport (\n\t\"github.com/pingcap/check\"\n)\n\nvar "
},
{
"path": "pkg/keyvisual/region/interface.go",
"chars": 457,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage region\n\ntype RegionsInfo interface {\n\tLen() int\n\tGet"
},
{
"path": "pkg/keyvisual/region/tag.go",
"chars": 1854,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage region\n\n// StatTag is a tag for statistics of differ"
},
{
"path": "pkg/keyvisual/region/utils.go",
"chars": 498,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage region\n\nimport (\n\t\"unsafe\"\n)\n\n// String converts sli"
},
{
"path": "pkg/keyvisual/service.go",
"chars": 8992,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage keyvisual\n\nimport (\n\t\"context\"\n\t\"encoding/hex\"\n\t\"mat"
},
{
"path": "pkg/keyvisual/storage/model.go",
"chars": 2027,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"time\"\n\n"
},
{
"path": "pkg/keyvisual/storage/model_test.go",
"chars": 5252,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"path\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gith"
},
{
"path": "pkg/keyvisual/storage/region.go",
"chars": 2636,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"github.com/pingcap/log\"\n\t\"go.ube"
},
{
"path": "pkg/keyvisual/storage/region_test.go",
"chars": 254,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/c"
},
{
"path": "pkg/keyvisual/storage/stat.go",
"chars": 6843,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\n// Package storage stores the input axes in order, and can g"
},
{
"path": "pkg/keyvisual/storage/stat_persist.go",
"chars": 3261,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"time\"\n\n\t\"github.com/pingcap/log\""
},
{
"path": "pkg/keyvisual/storage/stat_test.go",
"chars": 248,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage storage\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/c"
},
{
"path": "pkg/pd/client.go",
"chars": 2431,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage pd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/ht"
},
{
"path": "pkg/pd/client_test.go",
"chars": 1224,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage pd\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/http/httpt"
},
{
"path": "pkg/pd/etcd.go",
"chars": 1103,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage pd\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/pingca"
},
{
"path": "pkg/pd/pd.go",
"chars": 158,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage pd\n\nimport (\n\t\"github.com/joomcode/errorx\"\n)\n\nvar Er"
},
{
"path": "pkg/scheduling/client.go",
"chars": 2155,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage scheduling\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n"
},
{
"path": "pkg/scheduling/scheduling.go",
"chars": 174,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage scheduling\n\nimport (\n\t\"github.com/joomcode/errorx\"\n)"
},
{
"path": "pkg/swaggerserver/handler.go",
"chars": 284,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage swaggerserver\n\nimport (\n\t\"net/http\"\n\n\thttpSwagger \"g"
},
{
"path": "pkg/ticdc/client.go",
"chars": 2146,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage ticdc\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net"
},
{
"path": "pkg/ticdc/ticdc.go",
"chars": 164,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage ticdc\n\nimport (\n\t\"github.com/joomcode/errorx\"\n)\n\nvar"
},
{
"path": "pkg/tidb/client.go",
"chars": 7683,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage tidb\n\nimport (\n\t\"context\"\n\t\"database/sql/driver\"\n\t\"f"
},
{
"path": "pkg/tidb/forwarder.go",
"chars": 3089,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage tidb\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n\t"
},
{
"path": "pkg/tidb/model/codec.go",
"chars": 5813,
"preview": "// Copyright 2026 PingCAP, Inc. Licensed under Apache-2.0.\n\npackage model\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\n\t\"githu"
}
]
// ... and 1462 more files (download for full content)
About this extraction
This page contains the full source code of the pingcap/tidb-dashboard GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1662 files (6.1 MB), approximately 1.7M tokens, and a symbol index with 4904 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.