extension/agenthealth/handler/stats/provider/flag.go (62 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package provider
import (
"sync"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/amazon-cloudwatch-agent/cfg/envconfig"
"github.com/aws/amazon-cloudwatch-agent/extension/agenthealth/handler/stats/agent"
)
const (
flagGetInterval = 5 * time.Minute
)
var (
flagSingleton *flagStats
flagOnce sync.Once
)
type flagStats struct {
*intervalStats
flagSet agent.FlagSet
}
func (p *flagStats) update() {
p.stats.Store(agent.Stats{
ImdsFallbackSucceed: boolToSparseInt(p.flagSet.IsSet(agent.FlagIMDSFallbackSuccess)),
SharedConfigFallback: boolToSparseInt(p.flagSet.IsSet(agent.FlagSharedConfigFallback)),
AppSignals: boolToSparseInt(p.flagSet.IsSet(agent.FlagAppSignal)),
EnhancedContainerInsights: boolToSparseInt(p.flagSet.IsSet(agent.FlagEnhancedContainerInsights)),
RunningInContainer: boolToInt(p.flagSet.IsSet(agent.FlagRunningInContainer)),
Mode: p.flagSet.GetString(agent.FlagMode),
RegionType: p.flagSet.GetString(agent.FlagRegionType),
})
}
func boolToInt(value bool) *int {
result := boolToSparseInt(value)
if result != nil {
return result
}
return aws.Int(0)
}
func boolToSparseInt(value bool) *int {
if value {
return aws.Int(1)
}
return nil
}
func newFlagStats(flagSet agent.FlagSet, interval time.Duration) *flagStats {
stats := &flagStats{
flagSet: flagSet,
intervalStats: newIntervalStats(interval),
}
stats.flagSet.OnChange(stats.update)
if envconfig.IsRunningInContainer() {
stats.flagSet.Set(agent.FlagRunningInContainer)
} else {
stats.update()
}
return stats
}
func GetFlagsStats() agent.StatsProvider {
flagOnce.Do(func() {
flagSingleton = newFlagStats(agent.UsageFlags(), flagGetInterval)
})
return flagSingleton
}