cni/telemetry/service/telemetrymain.go (144 lines of code) (raw):
package main
// Entry point of the telemetry service if started by CNI
import (
"context"
"fmt"
"os"
"runtime"
"time"
"github.com/Azure/azure-container-networking/aitelemetry"
"github.com/Azure/azure-container-networking/cni/log"
acn "github.com/Azure/azure-container-networking/common"
"github.com/Azure/azure-container-networking/telemetry"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
const (
defaultReportToHostIntervalInSecs = 30
defaultRefreshTimeoutInSecs = 15
defaultBatchSizeInBytes = 16384
defaultBatchIntervalInSecs = 15
defaultGetEnvRetryCount = 2
defaultGetEnvRetryWaitTimeInSecs = 3
pluginName = "AzureCNI"
azureVnetTelemetry = "azure-vnet-telemetry"
configExtension = ".config"
maxLogFileSizeInMb = 5
maxLogFileCount = 8
)
var version string
var args = acn.ArgumentList{
{
Name: acn.OptLogLevel,
Shorthand: acn.OptLogLevelAlias,
Description: "Set the logging level",
Type: "int",
DefaultValue: acn.OptLogLevelInfo,
ValueMap: map[string]interface{}{
acn.OptLogLevelInfo: zapcore.InfoLevel,
acn.OptLogLevelError: zapcore.ErrorLevel,
},
},
{
Name: acn.OptLogLocation,
Shorthand: acn.OptLogLocationAlias,
Description: "Set the directory location where logs will be saved",
Type: "string",
DefaultValue: "",
},
{
Name: acn.OptVersion,
Shorthand: acn.OptVersionAlias,
Description: "Print version information",
Type: "bool",
DefaultValue: false,
},
{
Name: acn.OptTelemetryConfigDir,
Shorthand: acn.OptTelemetryConfigDirAlias,
Description: "Set the telmetry config directory",
Type: "string",
DefaultValue: telemetry.CniInstallDir,
},
}
// Prints description and version information.
func printVersion() {
fmt.Printf("Azure Container Telemetry Service\n")
fmt.Printf("Version %v\n", version)
}
func setTelemetryDefaults(config *telemetry.TelemetryConfig) {
if config.ReportToHostIntervalInSeconds == 0 {
config.ReportToHostIntervalInSeconds = defaultReportToHostIntervalInSecs
}
if config.RefreshTimeoutInSecs == 0 {
config.RefreshTimeoutInSecs = defaultRefreshTimeoutInSecs
}
if config.BatchIntervalInSecs == 0 {
config.BatchIntervalInSecs = defaultBatchIntervalInSecs
}
if config.BatchSizeInBytes == 0 {
config.BatchSizeInBytes = defaultBatchSizeInBytes
}
if config.GetEnvRetryCount == 0 {
config.GetEnvRetryCount = defaultGetEnvRetryCount
}
if config.GetEnvRetryWaitTimeInSecs == 0 {
config.GetEnvRetryWaitTimeInSecs = defaultGetEnvRetryWaitTimeInSecs
}
}
func main() {
var tb *telemetry.TelemetryBuffer
var config telemetry.TelemetryConfig
var configPath string
var err error
acn.ParseArgs(&args, printVersion)
configDirectory := acn.GetArg(acn.OptTelemetryConfigDir).(string)
vers := acn.GetArg(acn.OptVersion).(bool)
if vers {
printVersion()
os.Exit(0)
}
logger := log.TelemetryLogger.With(zap.String("component", "cni-telemetry"))
logger.Info("Telemetry invocation info", zap.Any("arguments", os.Args))
if runtime.GOOS == "linux" {
configPath = fmt.Sprintf("%s/%s%s", configDirectory, azureVnetTelemetry, configExtension)
} else {
configPath = fmt.Sprintf("%s\\%s%s", configDirectory, azureVnetTelemetry, configExtension)
}
logger.Info("Config path", zap.String("path", configPath))
config, err = telemetry.ReadConfigFile(configPath)
if err != nil {
logger.Error("Error reading telemetry config", zap.Error(err))
}
logger.Info("read config returned", zap.Any("config", config))
setTelemetryDefaults(&config)
logger.Info("Config after setting defaults", zap.Any("config", config))
// Cleaning up orphan socket if present
tbtemp := telemetry.NewTelemetryBuffer(logger)
tbtemp.Cleanup(telemetry.FdName)
tb = telemetry.NewTelemetryBuffer(logger)
for {
logger.Info("Starting telemetry server")
err = tb.StartServer()
if err == nil || tb.FdExists {
break
}
logger.Error("Telemetry service starting failed", zap.Error(err))
tb.Cleanup(telemetry.FdName)
time.Sleep(time.Millisecond * 200)
}
aiConfig := aitelemetry.AIConfig{
AppName: pluginName,
AppVersion: version,
BatchSize: config.BatchSizeInBytes,
BatchInterval: config.BatchIntervalInSecs,
RefreshTimeout: config.RefreshTimeoutInSecs,
DisableMetadataRefreshThread: config.DisableMetadataThread,
DebugMode: config.DebugMode,
GetEnvRetryCount: config.GetEnvRetryCount,
GetEnvRetryWaitTimeInSecs: config.GetEnvRetryWaitTimeInSecs,
}
if err := tb.CreateAITelemetryHandle(aiConfig, config.DisableAll, config.DisableTrace, config.DisableMetric); err != nil { // nolint
logger.Error("AI Handle creation error:", zap.Error(err))
}
logger.Info("Report to host interval", zap.Duration("seconds", config.ReportToHostIntervalInSeconds))
tb.PushData(context.Background())
telemetry.CloseAITelemetryHandle()
}