75f3dd141c
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CI and Release / lint-frontend (push) Has been cancelled
CI and Release / dockerfile-scan (push) Has been cancelled
CI and Release / test-frontend (push) Has been cancelled
CI and Release / lint-verification-agent (push) Has been cancelled
CI and Release / test-verification-agent (push) Has been cancelled
CI and Release / e2e-verification-agent (push) Has been cancelled
CI and Release / test-backend (push) Has been cancelled
CI and Release / build-dev-image (push) Has been cancelled
CI and Release / push-dev-image (push) Has been cancelled
CI and Release / build-image (push) Has been cancelled
CI and Release / build-verification-image (push) Has been cancelled
CI and Release / determine-version (push) Has been cancelled
CI and Release / push-image (push) Has been cancelled
CI and Release / push-verification-image (12) (push) Has been cancelled
CI and Release / lint-backend (push) Has been cancelled
CI and Release / push-verification-image (17) (push) Has been cancelled
CI and Release / push-verification-image (18) (push) Has been cancelled
CI and Release / release (push) Has been cancelled
CI and Release / publish-helm-chart (push) Has been cancelled
CI and Release / push-verification-image (13) (push) Has been cancelled
CI and Release / push-verification-image (14) (push) Has been cancelled
CI and Release / push-verification-image (15) (push) Has been cancelled
CI and Release / push-verification-image (16) (push) Has been cancelled
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
type TelemetrySender interface {
|
|
Send(ctx context.Context, req *CollectRequest) error
|
|
}
|
|
|
|
type HTTPTelemetrySender struct {
|
|
endpoint string
|
|
appVersion string
|
|
httpClient *http.Client
|
|
}
|
|
|
|
func NewHTTPTelemetrySender(endpoint, appVersion string) *HTTPTelemetrySender {
|
|
return &HTTPTelemetrySender{
|
|
endpoint: endpoint,
|
|
appVersion: appVersion,
|
|
httpClient: &http.Client{Timeout: 5 * time.Second},
|
|
}
|
|
}
|
|
|
|
func (s *HTTPTelemetrySender) Send(ctx context.Context, req *CollectRequest) error {
|
|
body, err := json.Marshal(req)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to encode telemetry request: %w", err)
|
|
}
|
|
|
|
httpReq, err := http.NewRequestWithContext(
|
|
ctx, http.MethodPost, s.endpoint, bytes.NewReader(body),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to build telemetry request: %w", err)
|
|
}
|
|
|
|
httpReq.Header.Set("Content-Type", "application/json")
|
|
httpReq.Header.Set("User-Agent", "Databasus-Telemetry/"+s.appVersion)
|
|
|
|
resp, err := s.httpClient.Do(httpReq)
|
|
if err != nil {
|
|
return fmt.Errorf("telemetry request failed: %w", err)
|
|
}
|
|
defer func() { _ = resp.Body.Close() }()
|
|
|
|
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
|
|
// Drain a small slice so the connection can be reused.
|
|
respBody, _ := io.ReadAll(io.LimitReader(resp.Body, 512))
|
|
return fmt.Errorf("telemetry endpoint returned %d: %s", resp.StatusCode, string(respBody))
|
|
}
|
|
|
|
return nil
|
|
}
|