in main.go [142:251]
func main() {
var esConfig elasticsearchConfig
flag.StringVar(&esConfig.host,
"es", "",
`Elasticsearch URL into which the benchmark data should be indexed, e.g. http://localhost:9200`,
)
flag.StringVar(&esConfig.index,
"index", "gobench",
"Elasticsearch index into which the benchmarks should be stored.",
)
flag.StringVar(&esConfig.user, "es-username", "",
"Elasticsearch username used for authentication.",
)
flag.StringVar(&esConfig.pass, "es-password", "",
"Elasticsearch password used for authentication.",
)
flag.Parse()
tags := make(map[string]string)
for _, field := range strings.Split(*tagsFlag, ",") {
field = strings.TrimSpace(field)
if field == "" {
continue
}
i := strings.IndexRune(field, '=')
if i == -1 {
fmt.Fprintf(
os.Stderr,
"invalid key-value pair %q in -tags: missing '='\n",
field,
)
os.Exit(2)
}
key, value := field[:i], field[i+1:]
tags[strings.TrimSpace(key)] = strings.TrimSpace(value)
}
var output io.Writer
var buf bytes.Buffer
var esURL *url.URL
if esConfig.host != "" {
url, err := url.Parse(esConfig.host)
if err != nil {
fmt.Fprintf(os.Stderr, "invalid Elasticsearch URL %q: %s\n", esConfig.host, err)
os.Exit(2)
}
esURL = url
output = &buf
if *verboseFlag {
output = io.MultiWriter(output, os.Stdout)
}
} else {
output = os.Stdout
}
encoder := json.NewEncoder(output)
if esURL != nil {
if err := createMapping(esConfig); err != nil {
log.Fatalf("error creating/updating mapping: %s", err)
}
}
var pkg, goos, goarch string
timestamp := time.Now().UTC()
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
switch {
case strings.HasPrefix(line, "pkg:"):
pkg = strings.TrimSpace(line[len("pkg:"):])
case strings.HasPrefix(line, "goos:"):
goos = strings.TrimSpace(line[len("goos:"):])
case strings.HasPrefix(line, "goarch:"):
goarch = strings.TrimSpace(line[len("goarch:"):])
default:
if b, err := parse.ParseLine(line); err == nil {
result := benchmark{Benchmark: *b}
result.extra = parseExtraMetrics(line)
encodeIndexOp(
encoder, result,
pkg, goos, goarch,
tags, timestamp,
esConfig,
)
}
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
if esURL == nil {
// Encoded to stdout.
return
}
bulkURL := *esURL
bulkURL.Path += "/_bulk"
req, err := http.NewRequest(http.MethodPost, bulkURL.String(), &buf)
if esConfig.user != "" && esConfig.pass != "" {
req.SetBasicAuth(esConfig.user, esConfig.pass)
}
req.Header.Set("Content-Type", "application/x-ndjson")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("error executing bulk updates: %s", err)
}
if err := handleResponse(resp); err != nil {
log.Fatalf("error executing bulk updates: %s", err)
}
}