status-im/status-go

View on GitHub
wakuv2/telemetry.go

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
package wakuv2

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "time"

    "github.com/google/uuid"
    "github.com/libp2p/go-libp2p/core/metrics"
    "go.uber.org/zap"
)

type BandwidthTelemetryClient struct {
    serverURL  string
    httpClient *http.Client
    hostID     string
    logger     *zap.Logger
}

func NewBandwidthTelemetryClient(logger *zap.Logger, serverURL string) *BandwidthTelemetryClient {
    return &BandwidthTelemetryClient{
        serverURL:  serverURL,
        httpClient: &http.Client{Timeout: time.Minute},
        hostID:     uuid.NewString(),
        logger:     logger.Named("bandwidth-telemetry"),
    }
}

func (c *BandwidthTelemetryClient) PushProtocolStats(relayStats metrics.Stats, storeStats metrics.Stats) {
    url := fmt.Sprintf("%s/protocol-stats", c.serverURL)
    postBody := map[string]interface{}{
        "hostID": c.hostID,
        "relay": map[string]interface{}{
            "rateIn":   relayStats.RateIn,
            "rateOut":  relayStats.RateOut,
            "totalIn":  relayStats.TotalIn,
            "totalOut": relayStats.TotalOut,
        },
        "store": map[string]interface{}{
            "rateIn":   storeStats.RateIn,
            "rateOut":  storeStats.RateOut,
            "totalIn":  storeStats.TotalIn,
            "totalOut": storeStats.TotalOut,
        },
    }

    body, _ := json.Marshal(postBody)
    _, err := c.httpClient.Post(url, "application/json", bytes.NewBuffer(body))
    if err != nil {
        c.logger.Error("Error sending message to telemetry server", zap.Error(err))
    }
}