|
|
@@ -27,6 +27,7 @@ import (
|
|
|
"runtime"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/accounts"
|
|
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
|
|
@@ -48,6 +49,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/les"
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
"github.com/ethereum/go-ethereum/metrics"
|
|
|
+ "github.com/ethereum/go-ethereum/metrics/influxdb"
|
|
|
"github.com/ethereum/go-ethereum/node"
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
|
|
@@ -360,10 +362,6 @@ var (
|
|
|
Name: "ethstats",
|
|
|
Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)",
|
|
|
}
|
|
|
- MetricsEnabledFlag = cli.BoolFlag{
|
|
|
- Name: metrics.MetricsEnabledFlag,
|
|
|
- Usage: "Enable metrics collection and reporting",
|
|
|
- }
|
|
|
FakePoWFlag = cli.BoolFlag{
|
|
|
Name: "fakepow",
|
|
|
Usage: "Disables proof-of-work verification",
|
|
|
@@ -532,6 +530,45 @@ var (
|
|
|
Usage: "Minimum POW accepted",
|
|
|
Value: whisper.DefaultMinimumPoW,
|
|
|
}
|
|
|
+
|
|
|
+ // Metrics flags
|
|
|
+ MetricsEnabledFlag = cli.BoolFlag{
|
|
|
+ Name: metrics.MetricsEnabledFlag,
|
|
|
+ Usage: "Enable metrics collection and reporting",
|
|
|
+ }
|
|
|
+ MetricsEnableInfluxDBFlag = cli.BoolFlag{
|
|
|
+ Name: "metrics.influxdb",
|
|
|
+ Usage: "Enable metrics export/push to an external InfluxDB database",
|
|
|
+ }
|
|
|
+ MetricsInfluxDBEndpointFlag = cli.StringFlag{
|
|
|
+ Name: "metrics.influxdb.endpoint",
|
|
|
+ Usage: "InfluxDB API endpoint to report metrics to",
|
|
|
+ Value: "http://localhost:8086",
|
|
|
+ }
|
|
|
+ MetricsInfluxDBDatabaseFlag = cli.StringFlag{
|
|
|
+ Name: "metrics.influxdb.database",
|
|
|
+ Usage: "InfluxDB database name to push reported metrics to",
|
|
|
+ Value: "geth",
|
|
|
+ }
|
|
|
+ MetricsInfluxDBUsernameFlag = cli.StringFlag{
|
|
|
+ Name: "metrics.influxdb.username",
|
|
|
+ Usage: "Username to authorize access to the database",
|
|
|
+ Value: "test",
|
|
|
+ }
|
|
|
+ MetricsInfluxDBPasswordFlag = cli.StringFlag{
|
|
|
+ Name: "metrics.influxdb.password",
|
|
|
+ Usage: "Password to authorize access to the database",
|
|
|
+ Value: "test",
|
|
|
+ }
|
|
|
+ // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB.
|
|
|
+ // It is used so that we can group all nodes and average a measurement across all of them, but also so
|
|
|
+ // that we can select a specific node and inspect its measurements.
|
|
|
+ // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key
|
|
|
+ MetricsInfluxDBHostTagFlag = cli.StringFlag{
|
|
|
+ Name: "metrics.influxdb.host.tag",
|
|
|
+ Usage: "InfluxDB `host` tag attached to all measurements",
|
|
|
+ Value: "localhost",
|
|
|
+ }
|
|
|
)
|
|
|
|
|
|
// MakeDataDir retrieves the currently requested data directory, terminating
|
|
|
@@ -1184,6 +1221,27 @@ func SetupNetwork(ctx *cli.Context) {
|
|
|
params.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name)
|
|
|
}
|
|
|
|
|
|
+func SetupMetrics(ctx *cli.Context) {
|
|
|
+ if metrics.Enabled {
|
|
|
+ log.Info("Enabling metrics collection")
|
|
|
+ var (
|
|
|
+ enableExport = ctx.GlobalBool(MetricsEnableInfluxDBFlag.Name)
|
|
|
+ endpoint = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name)
|
|
|
+ database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name)
|
|
|
+ username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name)
|
|
|
+ password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name)
|
|
|
+ hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name)
|
|
|
+ )
|
|
|
+
|
|
|
+ if enableExport {
|
|
|
+ log.Info("Enabling metrics export to InfluxDB")
|
|
|
+ go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", map[string]string{
|
|
|
+ "host": hosttag,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails.
|
|
|
func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
|
|
|
var (
|