metadataprovider.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package exporter
  2. import (
  3. "maps"
  4. "github.com/opencost/opencost/core/pkg/clusters"
  5. "github.com/opencost/opencost/core/pkg/log"
  6. )
  7. // HeartbeatMetadataProvider is an interface that provides metadata for heartbeat instances. It can be used to inject
  8. // custom metadata into a generic `Heartbeat` payload.
  9. type HeartbeatMetadataProvider interface {
  10. // GetMetadata returns the metadata for new heartbeat instances.
  11. GetMetadata() map[string]any
  12. }
  13. // ClusterInfoMetadataProvider is a `HeartbeatMetadataProvider` implementation that provides metadata about the cluster
  14. // leveraging a `ClusterInfoProvider` implementation.
  15. type ClusterInfoMetadataProvider struct {
  16. clusterInfoProvider clusters.ClusterInfoProvider
  17. }
  18. // NewClusterInfoMetadataProvider creates a new `ClusterInfoMetadataProvider` instance. The `provider` parameter is used to
  19. // inject custom metadata, but can be set to `nil` if no metadata is needed.
  20. func NewClusterInfoMetadataProvider(provider clusters.ClusterInfoProvider) *ClusterInfoMetadataProvider {
  21. return &ClusterInfoMetadataProvider{
  22. clusterInfoProvider: provider,
  23. }
  24. }
  25. // GetMetadata returns the metadata for new heartbeat instances. It uses the `ClusterInfoProvider` to get the cluster
  26. // information and injects it into the metadata map.
  27. func (c *ClusterInfoMetadataProvider) GetMetadata() map[string]any {
  28. m := c.clusterInfoProvider.GetClusterInfo()
  29. metadata := make(map[string]any, len(m))
  30. for k, v := range m {
  31. metadata[k] = v
  32. }
  33. return metadata
  34. }
  35. // LogLevelMetadataProvider is a `HeartbeatMetadataProvider` implementation that provides the log level.
  36. type LogLevelMetadataProvider struct{}
  37. // NewLogLevelMetadataProvider creates a new `LogLevelMetadataProvider` instance.
  38. func NewLogLevelMetadataProvider() *LogLevelMetadataProvider {
  39. return &LogLevelMetadataProvider{}
  40. }
  41. // GetMetadata returns the metadata for new heartbeat instances. It uses the log level from the global logger.
  42. func (l *LogLevelMetadataProvider) GetMetadata() map[string]any {
  43. return map[string]any{
  44. "logLevel": log.GetLogLevel(),
  45. }
  46. }
  47. // MultiMetadataProvider is a `HeartbeatMetadataProvider` implementation that provides metadata from multiple providers.
  48. type MultiMetadataProvider struct {
  49. providers []HeartbeatMetadataProvider
  50. }
  51. // NewMultiMetadataProvider creates a new `MultiMetadataProvider` instance.
  52. func NewMultiMetadataProvider(providers ...HeartbeatMetadataProvider) *MultiMetadataProvider {
  53. return &MultiMetadataProvider{
  54. providers: providers,
  55. }
  56. }
  57. // GetMetadata returns the metadata for new heartbeat instances.
  58. // It uses the `MultiMetadataProvider` to get the metadata from multiple providers and injects it into the metadata map.
  59. func (m *MultiMetadataProvider) GetMetadata() map[string]any {
  60. metadata := make(map[string]any)
  61. for _, provider := range m.providers {
  62. maps.Copy(metadata, provider.GetMetadata())
  63. }
  64. return metadata
  65. }