Skip to content

Commit 6c70dc7

Browse files
committed
chaning sidecar code
1 parent a949253 commit 6c70dc7

File tree

7 files changed

+429
-226
lines changed

7 files changed

+429
-226
lines changed

Makefile

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,14 @@ azure-vnet-telemetry-binary:
219219
cd $(CNI_TELEMETRY_DIR) && CGO_ENABLED=0 go build -v -o $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT) -ldflags "-X main.version=$(CNI_VERSION) -X $(CNI_AI_PATH)=$(CNI_AI_ID)" -gcflags="-dwarflocationlists=true"
220220

221221
# Build the Azure CNI Telemetry Sidecar binary.
222-
cni-telemetry-sidecar-binary:
223-
cd $(CNI_TELEMETRY_SIDECAR_DIR) && CGO_ENABLED=0 go build -v -o $(CNI_TELEMETRY_SIDECAR_BUILD_DIR)/azure-cni-telemetry-sidecar$(EXE_EXT) -ldflags "-X main.version=$(CNI_TELEMETRY_SIDECAR_VERSION) -X $(CNI_AI_PATH)=$(CNI_TELEMETRY_SIDECAR_AI_ID)" -gcflags="-dwarflocationlists=true"
224-
222+
cni-telemetry-sidecar-binary: ## build cni-telemetry-sidecar binary.
223+
$(MKDIR) $(CNI_TELEMETRY_SIDECAR_BUILD_DIR)
224+
cd $(CNI_TELEMETRY_SIDECAR_DIR) && CGO_ENABLED=0 go build \
225+
-v \
226+
-o $(CNI_TELEMETRY_SIDECAR_BUILD_DIR)/azure-cni-telemetry-sidecar$(EXE_EXT) \
227+
-ldflags "-X main.version=$(CNI_TELEMETRY_SIDECAR_VERSION) -X $(CNI_AI_PATH)=$(CNI_TELEMETRY_SIDECAR_AI_ID)" \
228+
-gcflags="-dwarflocationlists=true" \
229+
.
225230
# Build the Azure CLI network binary.
226231
acncli-binary:
227232
cd $(ACNCLI_DIR) && CGO_ENABLED=0 go build -v -o $(ACNCLI_BUILD_DIR)/acn$(EXE_EXT) -ldflags "-X main.version=$(ACN_VERSION)" -gcflags="-dwarflocationlists=true"
@@ -564,7 +569,7 @@ cni-telemetry-sidecar-image: ## build cni-telemetry-sidecar container image.
564569
$(MAKE) container \
565570
DOCKERFILE=cns/cni-telemetry-sidecar/Dockerfile \
566571
IMAGE=$(CNI_TELEMETRY_SIDECAR_IMAGE) \
567-
EXTRA_BUILD_ARGS='--build-arg CNI_AI_PATH=$(CNI_AI_PATH) --build-arg CNI_AI_ID=$(CNI_TELEMETRY_SIDECAR_AI_ID)' \
572+
EXTRA_BUILD_ARGS='--build-arg CNI_AI_PATH=$(CNI_AI_PATH) --build-arg CNI_AI_ID=$(CNI_TELEMETRY_SIDECAR_AI_ID) --build-arg VERSION=$(CNI_TELEMETRY_SIDECAR_VERSION)' \
568573
PLATFORM=$(PLATFORM) \
569574
TAG=$(CNI_TELEMETRY_SIDECAR_PLATFORM_TAG) \
570575
TARGET=$(OS) \
Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,44 @@
1-
# Azure CNI Telemetry Sidecar Dockerfile
2-
# Based on proven CNI Dockerfile pattern from azure-container-networking
31
ARG ARCH
42
ARG OS_VERSION
53
ARG OS
64

7-
# Use the same proven base images as CNI
8-
# mcr.microsoft.com/oss/go/microsoft/golang:1.23-azurelinux3.0
95
FROM --platform=linux/${ARCH} mcr.microsoft.com/oss/go/microsoft/golang@sha256:8f60e85f4b2f567c888d0b3a4cd12dc74bee534d94c528655546452912d90c74 AS go
106

11-
# mcr.microsoft.com/azurelinux/base/core:3.0
12-
FROM --platform=linux/${ARCH} mcr.microsoft.com/azurelinux/base/core@sha256:9948138108a3d69f1dae62104599ac03132225c3b7a5ac57b85a214629c8567d AS mariner-core
13-
14-
FROM go AS azure-cni-telemetry-sidecar
7+
FROM go AS cni-telemetry-sidecar
158
ARG OS
169
ARG VERSION
1710
ARG CNI_AI_PATH
1811
ARG CNI_AI_ID
1912

13+
# Add debug output to verify build args are received
14+
RUN echo "=== Dockerfile Build Debug ==="
15+
RUN echo "VERSION = $VERSION"
16+
RUN echo "CNI_AI_ID = $CNI_AI_ID"
17+
RUN echo "CNI_AI_PATH = $CNI_AI_PATH"
18+
2019
WORKDIR /azure-container-networking
2120
COPY . .
2221

23-
# Debug: Check if the source file exists and show Go version
24-
RUN ls -la cns/cni-telemetry-sidecar/ && go version
25-
26-
# Build the Azure CNI telemetry sidecar binary for Linux
27-
RUN CGO_ENABLED=0 GOOS=linux go build \
28-
-a \
29-
-o /go/bin/azure-cni-telemetry-sidecar \
30-
-trimpath \
31-
-ldflags "-X main.version=${VERSION:-unknown} -X ${CNI_AI_PATH:-main.aiMetadata}=${CNI_AI_ID:-unknown}" \
32-
-gcflags="-dwarflocationlists=true" \
33-
./cns/cni-telemetry-sidecar/
34-
35-
# Build the Azure CNI telemetry sidecar binary for Windows
36-
RUN CGO_ENABLED=0 GOOS=windows go build \
37-
-a \
38-
-o /go/bin/azure-cni-telemetry-sidecar.exe \
22+
# Build the telemetry sidecar with embedded AppInsights key using CNI_AI_PATH
23+
RUN GOOS=$OS CGO_ENABLED=0 go build -a -o /go/bin/azure-cni-telemetry-sidecar \
3924
-trimpath \
40-
-ldflags "-X main.version=${VERSION:-unknown} -X ${CNI_AI_PATH:-main.aiMetadata}=${CNI_AI_ID:-unknown}" \
25+
-ldflags "-X main.version=$VERSION -X $CNI_AI_PATH=$CNI_AI_ID" \
4126
-gcflags="-dwarflocationlists=true" \
42-
./cns/cni-telemetry-sidecar/
27+
./cns/cni-telemetry-sidecar
4328

44-
# Verify both binaries were built
45-
RUN ls -la /go/bin/azure-cni-telemetry-sidecar*
29+
# Verify the key is embedded in the telemetry.aiMetadata variable
30+
RUN echo "=== Binary Debug ==="
31+
RUN strings /go/bin/azure-cni-telemetry-sidecar | grep "5515a1eb" || echo "AI key NOT found in binary!"
32+
RUN ls -la /go/bin/azure-cni-telemetry-sidecar
4633

4734
FROM scratch AS bins
48-
COPY --from=azure-cni-telemetry-sidecar /go/bin/* /
35+
COPY --from=cni-telemetry-sidecar /go/bin/azure-cni-telemetry-sidecar /
4936

50-
FROM scratch AS linux
51-
COPY --from=azure-cni-telemetry-sidecar /go/bin/azure-cni-telemetry-sidecar /azure-cni-telemetry-sidecar
52-
ENTRYPOINT [ "/azure-cni-telemetry-sidecar" ]
37+
FROM mcr.microsoft.com/azurelinux/base/core:3.0 AS linux
38+
COPY --from=cni-telemetry-sidecar /go/bin/azure-cni-telemetry-sidecar /usr/local/bin/
5339

54-
# Windows support following CNI pattern
55-
FROM --platform=windows/${ARCH} mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image@sha256:b4c9637e032f667c52d1eccfa31ad8c63f1b035e8639f3f48a510536bf34032b AS hpc
40+
# Create directories for logs and config
41+
RUN mkdir -p /var/log /etc/azure-cns /var/run
5642

57-
FROM hpc AS windows
58-
COPY --from=azure-cni-telemetry-sidecar /go/bin/azure-cni-telemetry-sidecar.exe /azure-cni-telemetry-sidecar.exe
59-
ENTRYPOINT [ "/azure-cni-telemetry-sidecar.exe" ]
43+
ENTRYPOINT ["/usr/local/bin/azure-cni-telemetry-sidecar"]
44+
CMD ["--config=/etc/azure-cns/cns_config.json", "--log-level=info"]

cns/cni-telemetry-sidecar/configmanager.go

Lines changed: 107 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77

88
"github.com/Azure/azure-container-networking/cns/configuration"
9+
"github.com/Azure/azure-container-networking/telemetry"
910
"go.uber.org/zap"
1011
)
1112

@@ -29,7 +30,6 @@ func (cm *ConfigManager) SetLogger(logger *zap.Logger) {
2930

3031
// LoadConfig loads the CNS configuration from file
3132
func (cm *ConfigManager) LoadConfig() (*configuration.CNSConfig, error) {
32-
// Use zap logger if available, otherwise create a default config
3333
if cm.logger != nil {
3434
cm.logger.Debug("Loading CNS configuration", zap.String("path", cm.configPath))
3535
}
@@ -40,22 +40,7 @@ func (cm *ConfigManager) LoadConfig() (*configuration.CNSConfig, error) {
4040
cm.logger.Info("CNS config file not found, using default configuration",
4141
zap.String("path", cm.configPath))
4242
}
43-
44-
// Return default configuration
45-
return &configuration.CNSConfig{
46-
TelemetrySettings: configuration.TelemetrySettings{
47-
DisableAll: false,
48-
TelemetryBatchSizeBytes: 16384,
49-
TelemetryBatchIntervalInSecs: 15,
50-
RefreshIntervalInSecs: 15,
51-
DisableMetadataRefreshThread: false,
52-
DebugMode: false,
53-
DisableTrace: false,
54-
DisableMetric: false,
55-
DisableEvent: false,
56-
AppInsightsInstrumentationKey: "", // Will be set by environment or config
57-
},
58-
}, nil
43+
return cm.createDefaultConfig(), nil
5944
}
6045

6146
// Read the config file
@@ -80,22 +65,119 @@ func (cm *ConfigManager) LoadConfig() (*configuration.CNSConfig, error) {
8065
return nil, fmt.Errorf("failed to parse config file: %w", err)
8166
}
8267

68+
// Apply defaults and environment variable overrides
69+
cm.setConfigDefaults(&config)
70+
71+
// Check for AppInsights key from all sources (build-time, config, env)
72+
hasAppInsightsKey := cm.hasEffectiveAppInsightsKey(&config.TelemetrySettings)
73+
74+
if cm.logger != nil {
75+
cm.logger.Info("Successfully loaded CNS configuration",
76+
zap.String("path", cm.configPath),
77+
zap.Bool("telemetryDisabled", config.TelemetrySettings.DisableAll),
78+
zap.Bool("cniTelemetryEnabled", config.TelemetrySettings.EnableCNITelemetry),
79+
zap.String("socketPath", config.TelemetrySettings.CNITelemetrySocketPath),
80+
zap.Bool("hasAppInsightsKey", hasAppInsightsKey))
81+
}
82+
83+
return &config, nil
84+
}
85+
86+
// createDefaultConfig creates a default configuration
87+
func (cm *ConfigManager) createDefaultConfig() *configuration.CNSConfig {
88+
config := &configuration.CNSConfig{
89+
TelemetrySettings: configuration.TelemetrySettings{
90+
DisableAll: false,
91+
TelemetryBatchSizeBytes: defaultBatchSizeInBytes,
92+
TelemetryBatchIntervalInSecs: defaultBatchIntervalInSecs,
93+
RefreshIntervalInSecs: defaultRefreshTimeoutInSecs,
94+
DisableMetadataRefreshThread: false,
95+
DebugMode: false,
96+
DisableTrace: false,
97+
DisableMetric: false,
98+
DisableEvent: false,
99+
EnableCNITelemetry: false, // Default to false
100+
CNITelemetrySocketPath: "/var/run/azure-vnet-telemetry.sock",
101+
},
102+
}
103+
104+
// Set AppInsights key from environment variables (if any)
105+
cm.setAppInsightsKeyFromEnv(&config.TelemetrySettings)
106+
107+
return config
108+
}
109+
110+
// setConfigDefaults applies default values and environment variable overrides
111+
func (cm *ConfigManager) setConfigDefaults(config *configuration.CNSConfig) {
83112
// Set default values for telemetry settings if not specified
84113
if config.TelemetrySettings.TelemetryBatchSizeBytes == 0 {
85-
config.TelemetrySettings.TelemetryBatchSizeBytes = 16384
114+
config.TelemetrySettings.TelemetryBatchSizeBytes = defaultBatchSizeInBytes
86115
}
87116
if config.TelemetrySettings.TelemetryBatchIntervalInSecs == 0 {
88-
config.TelemetrySettings.TelemetryBatchIntervalInSecs = 15
117+
config.TelemetrySettings.TelemetryBatchIntervalInSecs = defaultBatchIntervalInSecs
89118
}
90119
if config.TelemetrySettings.RefreshIntervalInSecs == 0 {
91-
config.TelemetrySettings.RefreshIntervalInSecs = 15
120+
config.TelemetrySettings.RefreshIntervalInSecs = defaultRefreshTimeoutInSecs
92121
}
93122

94-
if cm.logger != nil {
95-
cm.logger.Info("Successfully loaded CNS configuration",
96-
zap.String("path", cm.configPath),
97-
zap.Bool("telemetryDisabled", config.TelemetrySettings.DisableAll))
123+
// Set default CNI telemetry socket path
124+
if config.TelemetrySettings.CNITelemetrySocketPath == "" {
125+
config.TelemetrySettings.CNITelemetrySocketPath = "/var/run/azure-vnet-telemetry.sock"
98126
}
99127

100-
return &config, nil
128+
// Handle AppInsights instrumentation key from environment variables
129+
cm.setAppInsightsKeyFromEnv(&config.TelemetrySettings)
130+
}
131+
132+
// setAppInsightsKeyFromEnv sets the AppInsights instrumentation key from environment variables
133+
func (cm *ConfigManager) setAppInsightsKeyFromEnv(ts *configuration.TelemetrySettings) {
134+
// Try multiple environment variable names
135+
envKeys := []string{
136+
"APPINSIGHTS_INSTRUMENTATIONKEY",
137+
"APPLICATIONINSIGHTS_CONNECTION_STRING",
138+
"AI_INSTRUMENTATION_KEY",
139+
}
140+
141+
// If no key is set in config, try environment variables
142+
if ts.AppInsightsInstrumentationKey == "" {
143+
for _, envKey := range envKeys {
144+
if key := os.Getenv(envKey); key != "" {
145+
ts.AppInsightsInstrumentationKey = key
146+
if cm.logger != nil {
147+
cm.logger.Debug("Found AppInsights key in environment variable",
148+
zap.String("envVar", envKey))
149+
}
150+
break
151+
}
152+
}
153+
}
154+
}
155+
156+
// hasEffectiveAppInsightsKey checks if AppInsights key is available from any source
157+
// (build-time aiMetadata, config file, or environment variables)
158+
func (cm *ConfigManager) hasEffectiveAppInsightsKey(ts *configuration.TelemetrySettings) bool {
159+
// Priority 1: Build-time embedded key via telemetry.aiMetadata
160+
if buildTimeKey := telemetry.GetAIMetadata(); buildTimeKey != "" {
161+
return true
162+
}
163+
164+
// Priority 2: Config file
165+
if ts.AppInsightsInstrumentationKey != "" {
166+
return true
167+
}
168+
169+
// Priority 3: Environment variables
170+
envKeys := []string{
171+
"APPINSIGHTS_INSTRUMENTATIONKEY",
172+
"APPLICATIONINSIGHTS_CONNECTION_STRING",
173+
"AI_INSTRUMENTATION_KEY",
174+
}
175+
176+
for _, envKey := range envKeys {
177+
if key := os.Getenv(envKey); key != "" {
178+
return true
179+
}
180+
}
181+
182+
return false
101183
}

0 commit comments

Comments
 (0)