1
0
mirror of https://github.com/minio/mc.git synced 2025-11-10 13:42:32 +03:00

Prometheus config generation (#2781)

Add `admin promethes --generate` to generate the prometheus config
This commit is contained in:
Praveen raj Mani
2019-09-22 20:28:17 +05:30
committed by kannappanr
parent 1db7a3bbed
commit 508869e3f1
5 changed files with 273 additions and 1 deletions

View File

@@ -42,6 +42,7 @@ var adminCmd = cli.Command{
adminTopCmd,
adminTraceCmd,
adminConsoleCmd,
adminPrometheusCmd,
},
}

View File

@@ -0,0 +1,190 @@
/*
* MinIO Client (C) 2019 MinIO, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* 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.
*/
package cmd
import (
"fmt"
"net/url"
"time"
"github.com/fatih/color"
"github.com/minio/cli"
"github.com/minio/mc/pkg/console"
"github.com/minio/mc/pkg/probe"
jwtgo "github.com/dgrijalva/jwt-go"
json "github.com/minio/mc/pkg/colorjson"
yaml "gopkg.in/yaml.v2"
)
const (
defaultJobName = "minio-job"
defaultMetricsPath = "/minio/prometheus/metrics"
)
var adminPrometheusGenerateCmd = cli.Command{
Name: "generate",
Usage: "generates prometheus config",
Action: mainAdminPrometheusGenerate,
Before: setGlobalsFromContext,
Flags: globalFlags,
HideHelpCommand: true,
CustomHelpTemplate: `NAME:
{{.HelpName}} - {{.Usage}}
USAGE:
{{.HelpName}} TARGET
FLAGS:
{{range .VisibleFlags}}{{.}}
{{end}}
EXAMPLES:
1. Generate a default prometheus config.
$ {{.HelpName}} myminio
`,
}
// PrometheusConfig - container to hold the top level scrape config.
type PrometheusConfig struct {
ScrapeConfigs []ScrapeConfig `yaml:"scrape_configs,omitempty"`
}
// String colorized prometheus config yaml.
func (c PrometheusConfig) String() string {
b, err := yaml.Marshal(c)
if err != nil {
return fmt.Sprintf("error creating config string: %s", err)
}
return console.Colorize("yaml", string(b))
}
// JSON jsonified prometheus config.
func (c PrometheusConfig) JSON() string {
jsonMessageBytes, e := json.MarshalIndent(c.ScrapeConfigs[0], "", " ")
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
return string(jsonMessageBytes)
}
// StatConfig - container to hold the targets config.
type StatConfig struct {
Targets []string `yaml:",flow" json:"targets"`
}
// String colorized stat config yaml.
func (t StatConfig) String() string {
b, err := yaml.Marshal(t)
if err != nil {
return fmt.Sprintf("error creating config string: %s", err)
}
return console.Colorize("yaml", string(b))
}
// JSON jsonified stat config.
func (t StatConfig) JSON() string {
jsonMessageBytes, e := json.MarshalIndent(t.Targets, "", " ")
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
return string(jsonMessageBytes)
}
// ScrapeConfig configures a scraping unit for Prometheus.
type ScrapeConfig struct {
JobName string `yaml:"job_name" json:"jobName"`
BearerToken string `yaml:"bearer_token" json:"bearerToken"`
MetricsPath string `yaml:"metrics_path,omitempty" json:"metricsPath"`
Scheme string `yaml:"scheme,omitempty" json:"scheme"`
StaticConfigs []StatConfig `yaml:"static_configs,omitempty" json:"staticConfigs"`
}
const (
defaultPrometheusJWTExpiry = 100 * 365 * 24 * time.Hour
)
var defaultConfig = PrometheusConfig{
ScrapeConfigs: []ScrapeConfig{
{
JobName: defaultJobName,
MetricsPath: defaultMetricsPath,
StaticConfigs: []StatConfig{
{
Targets: []string{""},
},
},
},
},
}
// checkAdminPrometheusSyntax - validate all the passed arguments
func checkAdminPrometheusSyntax(ctx *cli.Context) {
if len(ctx.Args()) != 1 {
cli.ShowCommandHelpAndExit(ctx, "generate", 1) // last argument is exit code
}
}
func generatePrometheusConfig(ctx *cli.Context) error {
// Get the alias parameter from cli
args := ctx.Args()
alias := args.Get(0)
if !isValidAlias(alias) {
fatalIf(errInvalidAlias(alias), "Invalid alias.")
}
hostConfig := mustGetHostConfig(alias)
if hostConfig == nil {
fatalIf(errInvalidAliasedURL(alias), "No such alias `"+alias+"` found.")
}
u, err := url.Parse(hostConfig.URL)
if err != nil {
return err
}
jwt := jwtgo.NewWithClaims(jwtgo.SigningMethodHS512, jwtgo.StandardClaims{
ExpiresAt: UTCNow().Add(defaultPrometheusJWTExpiry).Unix(),
Subject: hostConfig.AccessKey,
Issuer: "prometheus",
})
token, err := jwt.SignedString([]byte(hostConfig.SecretKey))
if err != nil {
return err
}
// Setting the values
defaultConfig.ScrapeConfigs[0].BearerToken = token
defaultConfig.ScrapeConfigs[0].Scheme = u.Scheme
defaultConfig.ScrapeConfigs[0].StaticConfigs[0].Targets[0] = u.Host
printMsg(defaultConfig)
return nil
}
// mainAdminPrometheus is the handle for "mc admin prometheus generate" sub-command.
func mainAdminPrometheusGenerate(ctx *cli.Context) error {
console.SetColor("yaml", color.New(color.FgGreen))
checkAdminPrometheusSyntax(ctx)
if err := generatePrometheusConfig(ctx); err != nil {
return nil
}
return nil
}

47
cmd/admin-prometheus.go Normal file
View File

@@ -0,0 +1,47 @@
/*
* MinIO Client (C) 2019 MinIO, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* 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.
*/
package cmd
import "github.com/minio/cli"
var adminPrometheusCmd = cli.Command{
Name: "prometheus",
Usage: "manages prometheus config",
Action: mainAdminPrometheus,
Before: setGlobalsFromContext,
Flags: globalFlags,
HideHelpCommand: true,
Subcommands: []cli.Command{
adminPrometheusGenerateCmd,
},
CustomHelpTemplate: `NAME:
{{.HelpName}} - {{.Usage}}
USAGE:
{{.HelpName}} TARGET
FLAGS:
{{range .VisibleFlags}}{{.}}
{{end}}
`,
}
// mainAdminPrometheus is the handle for "mc admin prometheus" command.
func mainAdminPrometheus(ctx *cli.Context) error {
cli.ShowCommandHelp(ctx, ctx.Args().First())
return nil
}

View File

@@ -15,6 +15,7 @@ profile generate profile data for debugging purposes
top provide top like statistics for MinIO
trace show http trace for minio server
console show console logs for MinIO server
prometheus manages prometheus config settings
```
## 1. Download MinIO Client
@@ -277,7 +278,7 @@ Skip SSL certificate verification.
| [**top** - provide top like statistics for MinIO](#top) |
| [**trace** - show http trace for MinIO server](#trace) |
| [**console** - show console logs for MinIO server](#console) |
| [**prometheus** - manages prometheus config settings](#prometheus) |
<a name="update"></a>
### Command `update` - updates all MinIO servers
@@ -691,3 +692,33 @@ mc admin console myminio
2: cmd/notification.go:815:cmd.(*NotificationSys).Init()
1: cmd/server-main.go:375:cmd.serverMain()
```
<a name="prometheus"></a>
### Command `prometheus` - Manages prometheus config settings
`generate` command generates the prometheus config (To be pasted in `prometheus.yml`)
```sh
NAME:
mc admin prometheus - manages prometheus config
USAGE:
mc admin prometheus COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]
COMMANDS:
generate generates prometheus config
```
_Example: Generates prometheus config for an <alias>._
```sh
mc admin prometheus generate <alias>
- job_name: minio-job
bearer_token: <token>
metrics_path: /minio/prometheus/metrics
scheme: http
static_configs:
- targets: ['localhost:9000']
```

3
go.mod
View File

@@ -4,6 +4,8 @@ go 1.13
require (
github.com/cheggaaa/pb v1.0.28
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/dustin/go-humanize v1.0.0
github.com/fatih/color v1.7.0
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf
@@ -23,6 +25,7 @@ require (
golang.org/x/text v0.3.2
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
gopkg.in/h2non/filetype.v1 v1.0.5
gopkg.in/yaml.v2 v2.2.2
)
replace github.com/gorilla/rpc v1.2.0+incompatible => github.com/gorilla/rpc v1.2.0