cmd/apmbench/telemetry.go (58 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License 2.0;
// you may not use this file except in compliance with the Elastic License 2.0.
package main
import (
"encoding/json"
"errors"
"fmt"
"net/http"
)
type telemetry struct {
endpoint string
}
func (t telemetry) GetAll() (map[string]map[string]float64, error) {
resp, err := http.Get(t.endpoint + "/")
if err != nil {
return nil, fmt.Errorf("failed to get telemetry data: %w", err)
}
defer resp.Body.Close()
switch resp.StatusCode / 100 {
case 2:
m := make(map[string]map[string]float64)
if err := json.NewDecoder(resp.Body).Decode(&m); err != nil {
return nil, fmt.Errorf("failed to decode response body for getting telemetry data: %w", err)
}
return m, nil
default:
return nil, fmt.Errorf("unsuccessful response from benchmark telemetry server: %d", resp.StatusCode)
}
}
func (t telemetry) Get(key string) (map[string]float64, error) {
resp, err := http.Get(t.endpoint + "/" + key)
if err != nil {
return nil, fmt.Errorf("failed to get telemetry data: %w", err)
}
defer resp.Body.Close()
switch resp.StatusCode / 100 {
case 2:
m := make(map[string]map[string]float64)
if err := json.NewDecoder(resp.Body).Decode(&m); err != nil {
return nil, fmt.Errorf("failed to decode response body for getting telemetry data: %w", err)
}
if len(m) != 1 {
return nil, fmt.Errorf("invalid result, expected only 1 value but found %d", len(m))
}
return m[key], nil
default:
return nil, fmt.Errorf("unsuccessful response from benchmark telemetry server: %d", resp.StatusCode)
}
}
func (t telemetry) Reset() error {
resp, err := http.Post(t.endpoint+"/reset", "application/json", nil)
if err != nil {
return errors.New("failed to reset telemetry")
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return errors.New("failed to reset telemetry")
}
return nil
}