Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/usagestats/stats.go
4095 views
1
package usagestats
2
3
import (
4
"bytes"
5
"context"
6
"encoding/json"
7
"fmt"
8
"io"
9
"net/http"
10
"runtime"
11
"time"
12
13
"github.com/prometheus/common/version"
14
)
15
16
var (
17
httpClient = http.Client{Timeout: 5 * time.Second}
18
usageStatsURL = "https://stats.grafana.org/agent-usage-report"
19
)
20
21
// Report is the payload to be sent to stats.grafana.org
22
type Report struct {
23
UsageStatsID string `json:"usageStatsId"`
24
CreatedAt time.Time `json:"createdAt"`
25
Interval time.Time `json:"interval"`
26
Version string `json:"version"`
27
Metrics map[string]interface{} `json:"metrics"`
28
Os string `json:"os"`
29
Arch string `json:"arch"`
30
}
31
32
func sendReport(ctx context.Context, seed *AgentSeed, interval time.Time, metrics map[string]interface{}) error {
33
report := Report{
34
UsageStatsID: seed.UID,
35
CreatedAt: seed.CreatedAt,
36
Version: version.Version,
37
Os: runtime.GOOS,
38
Arch: runtime.GOARCH,
39
Interval: interval,
40
Metrics: metrics,
41
}
42
out, err := json.MarshalIndent(report, "", " ")
43
if err != nil {
44
return err
45
}
46
req, err := http.NewRequest(http.MethodPost, usageStatsURL, bytes.NewBuffer(out))
47
if err != nil {
48
return err
49
}
50
req.Header.Set("Content-Type", "application/json")
51
52
resp, err := httpClient.Do(req.WithContext(ctx))
53
if err != nil {
54
return err
55
}
56
defer resp.Body.Close()
57
if resp.StatusCode != http.StatusOK {
58
data, err := io.ReadAll(resp.Body)
59
if err != nil {
60
return err
61
}
62
return fmt.Errorf("failed to send usage stats: %s body: %s", resp.Status, string(data))
63
}
64
return nil
65
}
66
67