cns/metric/configsnapshot.go (46 lines of code) (raw):

package metric import ( "context" "crypto/md5" //nolint:gosec // used for checksum "encoding/json" "time" "github.com/Azure/azure-container-networking/aitelemetry" "github.com/Azure/azure-container-networking/cns/configuration" "github.com/Azure/azure-container-networking/cns/logger" "github.com/pkg/errors" ) // SendCNSConfigSnapshot emits CNS config periodically func SendCNSConfigSnapshot(ctx context.Context, config *configuration.CNSConfig) { ticker := time.NewTicker(time.Minute * time.Duration(config.TelemetrySettings.ConfigSnapshotIntervalInMins)) defer ticker.Stop() event, err := createCNSConfigSnapshotEvent(config) if err != nil { logger.Errorf("[Azure CNS] SendCNSConfigSnapshot: %v", err) return } // Log the first event immediately logger.LogEvent(event) for { select { case <-ctx.Done(): return case <-ticker.C: logger.LogEvent(event) } } } func createCNSConfigSnapshotEvent(config *configuration.CNSConfig) (aitelemetry.Event, error) { bb, err := json.Marshal(config) //nolint:musttag // no tag needed for config if err != nil { return aitelemetry.Event{}, errors.Wrap(err, "failed to marshal config") } cs := md5.Sum(bb) //nolint:gosec // used for checksum csStr := string(cs[:]) event := aitelemetry.Event{ EventName: logger.ConfigSnapshotMetricsStr, ResourceID: csStr, // not guaranteed unique, instead use VM ID and Subscription to correlate Properties: map[string]string{ logger.CNSConfigPropertyStr: string(bb), logger.CNSConfigMD5CheckSumPropertyStr: csStr, }, } return event, nil }