source.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package exporter
  2. import (
  3. "time"
  4. "github.com/google/uuid"
  5. "github.com/opencost/opencost/core/pkg/heartbeat"
  6. )
  7. // HeartbeatSource is an `export.ExportSource` implementation that provides the basic data for a `Heartbeat` payload, and
  8. // leverages a `HeartbeatMetadataProvider` to inject custom metadata.
  9. type HeartbeatSource struct {
  10. startTime time.Time
  11. applicationName string
  12. version string
  13. metadataProvider HeartbeatMetadataProvider
  14. }
  15. // NewHeartbeatSource creates a new `HeartbeatSource` instance. The `provider` parameter is used to inject custom metadata,
  16. // but can be set to `nil` if no metadata is needed.
  17. func NewHeartbeatSource(applicationName string, version string, provider HeartbeatMetadataProvider) *HeartbeatSource {
  18. return &HeartbeatSource{
  19. startTime: time.Now().UTC(),
  20. applicationName: applicationName,
  21. version: version,
  22. metadataProvider: provider,
  23. }
  24. }
  25. // Make creates a new `Heartbeat` instance with the provided current time.
  26. func (h *HeartbeatSource) Make(t time.Time) *heartbeat.Heartbeat {
  27. id := uuid.Must(uuid.NewV7()).String()
  28. uptime := uint64(t.Sub(h.startTime).Minutes())
  29. var metadata map[string]any
  30. if h.metadataProvider != nil {
  31. metadata = h.metadataProvider.GetMetadata()
  32. }
  33. return heartbeat.NewHeartbeat(id, t, uptime, h.applicationName, h.version, metadata)
  34. }
  35. func (h *HeartbeatSource) Name() string {
  36. return heartbeat.HeartbeatEventName + "-source"
  37. }