in agent/healthcheck/health_check.go [225:277]
func (healthStatus *HealthStatus) StartHealthCheck(
agentStartTime time.Time,
agentConfig config.AgentConfig,
messageSources *messagesources.MessageSources) {
var envoyEndPointData EnvoyEndpointHttpData
// Create a basic http client, we are polling health check routinely at a pretty short interval, so there
// is no need to use retryable client here.
httpClient, err := client.CreateDefaultHttpClientForEnvoyServer(agentConfig)
if err != nil {
log.Errorf("unable to create a default Http Client: %v", err)
return
}
// Ease the timeout to 2s for ready request and stats request for health check.
httpClient.Timeout = healthCheckHttpClientTimeout
envoyEndPointData.client = httpClient
var envoyAddress = fmt.Sprintf("%s://%s", agentConfig.EnvoyServerScheme, agentConfig.EnvoyServerHostName)
var filterQueryString = "filter=control_plane.connected_state&format=json"
var readyUrl = fmt.Sprintf("%s:%d%s",
envoyAddress,
agentConfig.EnvoyServerAdminPort,
agentConfig.EnvoyReadyUrl)
var statsUrl = fmt.Sprintf("%s:%d%s?%s",
envoyAddress,
agentConfig.EnvoyServerAdminPort,
agentConfig.EnvoyServerStatsUrl,
filterQueryString)
envoyEndPointData.readyReq, _ = client.CreateStandardAgentHttpRequest(http.MethodGet, readyUrl, nil)
envoyEndPointData.statsReq, _ = client.CreateStandardAgentHttpRequest(http.MethodGet, statsUrl, nil)
envoyEndPointData.agentStartTime = agentStartTime
healthStatus.EnvoyReadinessState = NOT_INITIALIZED
// Poll Envoy health once every 5 Envoy PID poll
// Add Jitter between 10ms - 50ms
jitter := time.Duration(rand.Intn(40)+10) * time.Millisecond
ticker := time.NewTicker(agentConfig.HcPollInterval + jitter)
defer ticker.Stop()
// Loop forever
for {
select {
case <-ticker.C:
healthStatus.computeHealthStatus(&envoyEndPointData, messageSources, agentConfig)
case <-messageSources.BlockingEnvoyStatusTrigger:
healthStatus.computeHealthStatus(&envoyEndPointData, messageSources, agentConfig)
}
}
}