Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:11:07 +08:00

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
}