mirror of
https://github.com/prometheus/prometheus.git
synced 2025-02-21 03:16:00 -08:00
Add "dump" command to tsdb tool to dump all samples (#532)
* Add "dump" command to tsdb tool to dump all samples Signed-off-by: Julius Volz <julius.volz@gmail.com>
This commit is contained in:
parent
10d395259b
commit
752e022aba
|
@ -19,6 +19,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -40,6 +41,8 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
|
defaultDBPath = filepath.Join("benchout", "storage")
|
||||||
|
|
||||||
cli = kingpin.New(filepath.Base(os.Args[0]), "CLI tool for tsdb")
|
cli = kingpin.New(filepath.Base(os.Args[0]), "CLI tool for tsdb")
|
||||||
benchCmd = cli.Command("bench", "run benchmarks")
|
benchCmd = cli.Command("bench", "run benchmarks")
|
||||||
benchWriteCmd = benchCmd.Command("write", "run a write performance benchmark")
|
benchWriteCmd = benchCmd.Command("write", "run a write performance benchmark")
|
||||||
|
@ -48,13 +51,20 @@ func main() {
|
||||||
benchSamplesFile = benchWriteCmd.Arg("file", "input file with samples data, default is ("+filepath.Join("..", "testdata", "20kseries.json")+")").Default(filepath.Join("..", "testdata", "20kseries.json")).String()
|
benchSamplesFile = benchWriteCmd.Arg("file", "input file with samples data, default is ("+filepath.Join("..", "testdata", "20kseries.json")+")").Default(filepath.Join("..", "testdata", "20kseries.json")).String()
|
||||||
listCmd = cli.Command("ls", "list db blocks")
|
listCmd = cli.Command("ls", "list db blocks")
|
||||||
listCmdHumanReadable = listCmd.Flag("human-readable", "print human readable values").Short('h').Bool()
|
listCmdHumanReadable = listCmd.Flag("human-readable", "print human readable values").Short('h').Bool()
|
||||||
listPath = listCmd.Arg("db path", "database path (default is "+filepath.Join("benchout", "storage")+")").Default(filepath.Join("benchout", "storage")).String()
|
listPath = listCmd.Arg("db path", "database path (default is "+defaultDBPath+")").Default(defaultDBPath).String()
|
||||||
analyzeCmd = cli.Command("analyze", "analyze churn, label pair cardinality.")
|
analyzeCmd = cli.Command("analyze", "analyze churn, label pair cardinality.")
|
||||||
analyzePath = analyzeCmd.Arg("db path", "database path (default is "+filepath.Join("benchout", "storage")+")").Default(filepath.Join("benchout", "storage")).String()
|
analyzePath = analyzeCmd.Arg("db path", "database path (default is "+defaultDBPath+")").Default(defaultDBPath).String()
|
||||||
analyzeBlockID = analyzeCmd.Arg("block id", "block to analyze (default is the last block)").String()
|
analyzeBlockID = analyzeCmd.Arg("block id", "block to analyze (default is the last block)").String()
|
||||||
analyzeLimit = analyzeCmd.Flag("limit", "how many items to show in each list").Default("20").Int()
|
analyzeLimit = analyzeCmd.Flag("limit", "how many items to show in each list").Default("20").Int()
|
||||||
|
dumpCmd = cli.Command("dump", "dump samples from a TSDB")
|
||||||
|
dumpPath = dumpCmd.Arg("db path", "database path (default is "+defaultDBPath+")").Default(defaultDBPath).String()
|
||||||
|
dumpMinTime = dumpCmd.Flag("min-time", "minimum timestamp to dump").Default(strconv.FormatInt(math.MinInt64, 10)).Int64()
|
||||||
|
dumpMaxTime = dumpCmd.Flag("max-time", "maximum timestamp to dump").Default(strconv.FormatInt(math.MaxInt64, 10)).Int64()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
safeDBOptions := *tsdb.DefaultOptions
|
||||||
|
safeDBOptions.RetentionDuration = 0
|
||||||
|
|
||||||
switch kingpin.MustParse(cli.Parse(os.Args[1:])) {
|
switch kingpin.MustParse(cli.Parse(os.Args[1:])) {
|
||||||
case benchWriteCmd.FullCommand():
|
case benchWriteCmd.FullCommand():
|
||||||
wb := &writeBenchmark{
|
wb := &writeBenchmark{
|
||||||
|
@ -64,13 +74,13 @@ func main() {
|
||||||
}
|
}
|
||||||
wb.run()
|
wb.run()
|
||||||
case listCmd.FullCommand():
|
case listCmd.FullCommand():
|
||||||
db, err := tsdb.Open(*listPath, nil, nil, nil)
|
db, err := tsdb.Open(*listPath, nil, nil, &safeDBOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exitWithError(err)
|
exitWithError(err)
|
||||||
}
|
}
|
||||||
printBlocks(db.Blocks(), listCmdHumanReadable)
|
printBlocks(db.Blocks(), listCmdHumanReadable)
|
||||||
case analyzeCmd.FullCommand():
|
case analyzeCmd.FullCommand():
|
||||||
db, err := tsdb.Open(*analyzePath, nil, nil, nil)
|
db, err := tsdb.Open(*analyzePath, nil, nil, &safeDBOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exitWithError(err)
|
exitWithError(err)
|
||||||
}
|
}
|
||||||
|
@ -90,6 +100,12 @@ func main() {
|
||||||
exitWithError(fmt.Errorf("block not found"))
|
exitWithError(fmt.Errorf("block not found"))
|
||||||
}
|
}
|
||||||
analyzeBlock(block, *analyzeLimit)
|
analyzeBlock(block, *analyzeLimit)
|
||||||
|
case dumpCmd.FullCommand():
|
||||||
|
db, err := tsdb.Open(*dumpPath, nil, nil, &safeDBOptions)
|
||||||
|
if err != nil {
|
||||||
|
exitWithError(err)
|
||||||
|
}
|
||||||
|
dumpSamples(db, *dumpMinTime, *dumpMaxTime)
|
||||||
}
|
}
|
||||||
flag.CommandLine.Set("log.level", "debug")
|
flag.CommandLine.Set("log.level", "debug")
|
||||||
}
|
}
|
||||||
|
@ -531,3 +547,32 @@ func analyzeBlock(b *tsdb.Block, limit int) {
|
||||||
fmt.Printf("\nHighest cardinality metric names:\n")
|
fmt.Printf("\nHighest cardinality metric names:\n")
|
||||||
printInfo(postingInfos)
|
printInfo(postingInfos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dumpSamples(db *tsdb.DB, mint, maxt int64) {
|
||||||
|
q, err := db.Querier(mint, maxt)
|
||||||
|
if err != nil {
|
||||||
|
exitWithError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ss, err := q.Select(labels.NewMustRegexpMatcher("", ".*"))
|
||||||
|
if err != nil {
|
||||||
|
exitWithError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for ss.Next() {
|
||||||
|
series := ss.At()
|
||||||
|
labels := series.Labels()
|
||||||
|
it := series.Iterator()
|
||||||
|
for it.Next() {
|
||||||
|
ts, val := it.At()
|
||||||
|
fmt.Printf("%s %g %d\n", labels, val, ts)
|
||||||
|
}
|
||||||
|
if it.Err() != nil {
|
||||||
|
exitWithError(ss.Err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ss.Err() != nil {
|
||||||
|
exitWithError(ss.Err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue