Skip to content

Commit

Permalink
cluster: support configure grafana in server_configs (#1703)
Browse files Browse the repository at this point in the history
  • Loading branch information
nexustar authored Jan 6, 2022
1 parent 99bbe1d commit e292245
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 3 deletions.
10 changes: 8 additions & 2 deletions components/dm/spec/topology_dm.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ type (
type (
// DMServerConfigs represents the server runtime configuration
DMServerConfigs struct {
Master map[string]interface{} `yaml:"master"`
Worker map[string]interface{} `yaml:"worker"`
Master map[string]interface{} `yaml:"master"`
Worker map[string]interface{} `yaml:"worker"`
Grafana map[string]string `yaml:"grafana"`
}

// Specification represents the specification of topology.yaml
Expand Down Expand Up @@ -838,3 +839,8 @@ func getPort(v reflect.Value) string {
}
return ""
}

// GetGrafanaConfig returns global grafana configurations
func (s *Specification) GetGrafanaConfig() map[string]string {
return s.ServerConfigs.Grafana
}
1 change: 1 addition & 0 deletions pkg/cluster/ansible/import_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ server_configs:
pump: {}
drainer: {}
cdc: {}
grafana: {}
tidb_servers: []
tikv_servers: []
tiflash_servers: []
Expand Down
1 change: 1 addition & 0 deletions pkg/cluster/ansible/test-data/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ topology:
pump: {}
drainer: {}
cdc: {}
grafana: {}
tidb_servers:
- host: 172.16.1.218
ssh_port: 9999
Expand Down
37 changes: 36 additions & 1 deletion pkg/cluster/spec/grafana.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"context"
"crypto/tls"
"fmt"
"os"
"path/filepath"
"reflect"
"strings"
Expand All @@ -27,6 +28,7 @@ import (
"github.com/pingcap/tiup/pkg/cluster/template/config"
"github.com/pingcap/tiup/pkg/cluster/template/scripts"
"github.com/pingcap/tiup/pkg/meta"
"gopkg.in/ini.v1"
)

// GrafanaSpec represents the Grafana topology specification in topology.yaml
Expand All @@ -38,6 +40,7 @@ type GrafanaSpec struct {
IgnoreExporter bool `yaml:"ignore_exporter,omitempty"`
Port int `yaml:"port" default:"3000"`
DeployDir string `yaml:"deploy_dir,omitempty"`
Config map[string]string `yaml:"config,omitempty" validate:"config:ignore"`
ResourceControl meta.ResourceControl `yaml:"resource_control,omitempty" validate:"resource_control:editable"`
Arch string `yaml:"arch,omitempty"`
OS string `yaml:"os,omitempty"`
Expand Down Expand Up @@ -181,11 +184,22 @@ func (i *GrafanaInstance) InitConfig(
return err
}

userConfig := i.topo.GetGrafanaConfig()
if userConfig == nil {
userConfig = make(map[string]string)
}
for k, v := range spec.Config {
userConfig[k] = v
}
err := mergeAdditionalGrafanaConf(fp, userConfig)
if err != nil {
return err
}

dst = filepath.Join(paths.Deploy, "conf", "grafana.ini")
if err := e.Transfer(ctx, fp, dst, false, 0, false); err != nil {
return err
}

if err := i.installDashboards(ctx, e, paths.Deploy, clusterName, clusterVersion); err != nil {
return errors.Annotate(err, "install dashboards")
}
Expand Down Expand Up @@ -330,3 +344,24 @@ func (i *GrafanaInstance) ScaleConfig(
i.topo = topo.Merge(i.topo)
return i.InitConfig(ctx, e, clusterName, clusterVersion, deployUser, paths)
}

func mergeAdditionalGrafanaConf(source string, addition map[string]string) error {
bytes, err := os.ReadFile(source)
if err != nil {
return err
}
result, err := ini.Load(bytes)
if err != nil {
return err
}
for k, v := range addition {
// convert "log.file.level to [log.file] level"
for i := len(k) - 1; i >= 0; i-- {
if k[i] == '.' {
result.Section(k[:i]).Key(k[i+1:]).SetValue(v)
break
}
}
}
return result.SaveTo(source)
}
91 changes: 91 additions & 0 deletions pkg/cluster/spec/grafana_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package spec

import (
"context"
"fmt"
"os"
"os/user"
"path"
Expand Down Expand Up @@ -67,3 +68,93 @@ func TestLocalDashboards(t *testing.T) {
assert.FileExists(t, path.Join(deployDir, "dashboards", f.Name()))
}
}

func TestMergeAdditionalGrafanaConf(t *testing.T) {
file, err := os.CreateTemp("", "tiup-cluster-spec-test")
if err != nil {
panic(fmt.Sprintf("create temp file: %s", err))
}
defer os.Remove(file.Name())

_, err = file.WriteString(`#################################### SMTP / Emailing ##########################
[smtp]
;enabled = false
;host = localhost:25
;user =
;password =
;cert_file =
;key_file =
;skip_verify = false
;from_address = admin@grafana.localhost
[emails]
;welcome_email_on_sign_up = false
#################################### Logging ##########################
[log]
# Either "console", "file", "syslog". Default is console and file
# Use space to separate multiple modes, e.g. "console file"
mode = file
# Either "trace", "debug", "info", "warn", "error", "critical", default is "info"
;level = info
# For "console" mode only
[log.console]
;level =
# log line format, valid options are text, console and json
;format = console
# For "file" mode only
[log.file]
level = info
`)
assert.Nil(t, err)

expected := `# ################################### SMTP / Emailing ##########################
[smtp]
enabled = true
; enabled = false
; host = localhost:25
; user =
; password =
; cert_file =
; key_file =
; skip_verify = false
; from_address = admin@grafana.localhost
[emails]
; welcome_email_on_sign_up = false
# ################################### Logging ##########################
[log]
# Either "console", "file", "syslog". Default is console and file
# Use space to separate multiple modes, e.g. "console file"
mode = file
# Either "trace", "debug", "info", "warn", "error", "critical", default is "info"
; level = info
# For "console" mode only
[log.console]
; level =
# log line format, valid options are text, console and json
; format = console
# For "file" mode only
[log.file]
level = warning
`

addition := map[string]string{
"log.file.level": "warning",
"smtp.enabled": "true",
}

err = mergeAdditionalGrafanaConf(file.Name(), addition)
assert.Nil(t, err)
result, err := os.ReadFile(file.Name())
assert.Nil(t, err)

assert.Equal(t, expected, string(result))
}
7 changes: 7 additions & 0 deletions pkg/cluster/spec/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ type (
Pump map[string]interface{} `yaml:"pump"`
Drainer map[string]interface{} `yaml:"drainer"`
CDC map[string]interface{} `yaml:"cdc"`
Grafana map[string]string `yaml:"grafana"`
}

// Specification represents the specification of topology.yaml
Expand Down Expand Up @@ -153,6 +154,7 @@ type Topology interface {
TLSConfig(dir string) (*tls.Config, error)
Merge(that Topology) Topology
FillHostArch(hostArchmap map[string]string) error
GetGrafanaConfig() map[string]string

ScaleOutTopology
}
Expand Down Expand Up @@ -856,3 +858,8 @@ func setHostArch(field reflect.Value, hostArch map[string]string) error {

return nil
}

// GetGrafanaConfig returns global grafana configurations
func (s *Specification) GetGrafanaConfig() map[string]string {
return s.ServerConfigs.Grafana
}
3 changes: 3 additions & 0 deletions pkg/cluster/spec/spec_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ func (t *TestTopology) CountDir(host string, dir string) int {
return 0
}

func (t *TestTopology) GetGrafanaConfig() map[string]string {
return nil
}
func TestSpec(t *testing.T) {
dir, err := os.MkdirTemp("", "test-*")
assert.Nil(t, err)
Expand Down

0 comments on commit e292245

Please sign in to comment.