mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
GRPC Server: Add gRPC server service (#47849)
Co-authored-by: Todd Treece <todd.treece@grafana.com> Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
This commit is contained in:
@@ -5,9 +5,11 @@ package setting
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -463,6 +465,10 @@ type Cfg struct {
|
||||
RBACPermissionCache bool
|
||||
// Enable Permission validation during role creation and provisioning
|
||||
RBACPermissionValidationEnabled bool
|
||||
// GRPC Server.
|
||||
GRPCServerNetwork string
|
||||
GRPCServerAddress string
|
||||
GRPCServerTLSConfig *tls.Config
|
||||
}
|
||||
|
||||
type CommandLineArgs struct {
|
||||
@@ -946,6 +952,10 @@ func (cfg *Cfg) Load(args CommandLineArgs) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := readGRPCServerSettings(cfg, iniFile); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// read dashboard settings
|
||||
dashboards := iniFile.Section("dashboards")
|
||||
DashboardVersionsToKeep = dashboards.Key("versions_to_keep").MustInt(20)
|
||||
@@ -1492,6 +1502,68 @@ func readAlertingSettings(iniFile *ini.File) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func readGRPCServerSettings(cfg *Cfg, iniFile *ini.File) error {
|
||||
server := iniFile.Section("grpc_server")
|
||||
errPrefix := "grpc_server:"
|
||||
useTLS := server.Key("use_tls").MustBool(false)
|
||||
certFile := server.Key("cert_file").String()
|
||||
keyFile := server.Key("cert_key").String()
|
||||
if useTLS {
|
||||
serverCert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s error loading X509 key pair: %w", errPrefix, err)
|
||||
}
|
||||
cfg.GRPCServerTLSConfig = &tls.Config{
|
||||
Certificates: []tls.Certificate{serverCert},
|
||||
ClientAuth: tls.NoClientCert,
|
||||
}
|
||||
}
|
||||
|
||||
cfg.GRPCServerNetwork = valueAsString(server, "network", "tcp")
|
||||
cfg.GRPCServerAddress = valueAsString(server, "address", "")
|
||||
switch cfg.GRPCServerNetwork {
|
||||
case "unix":
|
||||
if cfg.GRPCServerAddress != "" {
|
||||
// Explicitly provided path for unix domain socket.
|
||||
if stat, err := os.Stat(cfg.GRPCServerAddress); os.IsNotExist(err) {
|
||||
// File does not exist - nice, nothing to do.
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("%s error getting stat for a file: %s", errPrefix, cfg.GRPCServerAddress)
|
||||
} else {
|
||||
if stat.Mode()&fs.ModeSocket == 0 {
|
||||
return fmt.Errorf("%s file %s already exists and is not a unix domain socket", errPrefix, cfg.GRPCServerAddress)
|
||||
}
|
||||
// Unix domain socket file, should be safe to remove.
|
||||
err := os.Remove(cfg.GRPCServerAddress)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s can't remove unix socket file: %s", errPrefix, cfg.GRPCServerAddress)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Use temporary file path for a unix domain socket.
|
||||
tf, err := os.CreateTemp("", "gf_grpc_server_api")
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s error creating tmp file: %v", errPrefix, err)
|
||||
}
|
||||
unixPath := tf.Name()
|
||||
if err := tf.Close(); err != nil {
|
||||
return fmt.Errorf("%s error closing tmp file: %v", errPrefix, err)
|
||||
}
|
||||
if err := os.Remove(unixPath); err != nil {
|
||||
return fmt.Errorf("%s error removing tmp file: %v", errPrefix, err)
|
||||
}
|
||||
cfg.GRPCServerAddress = unixPath
|
||||
}
|
||||
case "tcp":
|
||||
if cfg.GRPCServerAddress == "" {
|
||||
cfg.GRPCServerAddress = "127.0.0.1:10000"
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("%s unsupported network %s", errPrefix, cfg.GRPCServerNetwork)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsLegacyAlertingEnabled returns whether the legacy alerting is enabled or not.
|
||||
// It's safe to be used only after readAlertingSettings() and ReadUnifiedAlertingSettings() are executed.
|
||||
func IsLegacyAlertingEnabled() bool {
|
||||
|
||||
Reference in New Issue
Block a user