func()

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)
		}
	}
}