Esta
é a documentação da Apigee e da Apigee híbrida.
Não há documentação equivalente do
Apigee Edge para esse tópico.
Sintoma
Ao serem iniciados, os pods de métricas permanecem no estado CrashLoopBackoff. Isso pode causar lacunas periódicas nas métricas/gráficos à medida que os pods são reiniciados. Isso também pode causar discrepâncias com os dados do Analytics, já que algumas seções de dados estão faltando.
Esse problema pode ocorrer se a instalação híbrida produzir uma grande quantidade de dados de métricas. Uma grande quantidade de dados pode ser produzida devido a uma alta carga de tráfego (resultando em um grande número de recursos subjacentes, por exemplo, MPs emitindo métricas) ou um grande número de recursos do Apigee (por exemplo, proxies, destinos, ambientes, políticas etc.) sendo monitorados.
Mensagens de erro
Ao usar kubectl para visualizar os estados do pod, você verá que um ou mais pods de métricas estão no estado CrashLoopBackoff. Exemplo:
kubectl get pods -n NAMESPACE
NAME READY STATUS RESTARTS AGE
apigee-metrics-default-telemetry-proxy-1a2b3c4 0/1 CrashLoopBackoff 10 10m
apigee-metrics-adapter-apigee-telemetry-a2b3c4d 0/1 CrashLoopBackoff 10 10m
...Causas possíveis
| Causa | Descrição | Instruções de solução de problemas aplicáveis para |
|---|---|---|
| Os pods de métricas estão sem memória | Os pods de telemetria estão em CrashLoopBackoff devido à falta de memória | Apigee híbrido |
Causa 1
Os pods de métricas estão sem memória (OOM) com o motivo do erro OOMKilled.
Diagnóstico
Verifique se o problema está ocorrendo inspecionando os registros do pod:
- Liste os pods para conseguir o ID do pod de métricas que está apresentando falhas:
kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
- Verifique o registro do pod com falha:
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
Por exemplo:
kubectl describe -n apigee pods apigee-metrics-default-telemetry-proxy-1a2b3c4
Investigue a seção apigee-prometheus-agg da saída. Uma saída como a seguinte indica que o contêiner está atingindo repetidamente uma condição de falta de memória:
Containers:
apigee-prometheus-agg:
Container ID: docker://cd893dbb06c2672c41a7d6f3f7d0de4d76742e68cef70d4250bf2d5cdfcdeae6
Image: us.gcr.io/apigee-saas-staging-repo/thirdparty/apigee-prom-prometheus/master:v2.9.2
Image ID: docker-pullable://us.gcr.io/apigee-saas-staging-repo/thirdparty/apigee-prom-prometheus/master@sha256:05350e0d1a577674442046961abf56b3e883dcd82346962f9e73f00667958f6b
Port: 19090/TCP
Host Port: 0/TCP
Args:
--config.file=/etc/prometheus/agg/prometheus.yml
--storage.tsdb.path=/prometheus/agg/
--storage.tsdb.retention=48h
--web.enable-admin-api
--web.listen-address=127.0.0.1:19090
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Wed, 21 Oct 2020 16:53:42 +0000
Finished: Wed, 21 Oct 2020 16:54:28 +0000
Ready: False
Restart Count: 1446
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
Resolução
- Verifique os limites atuais de contêineres com o seguinte comando:
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
-
Configure os limites do pod de métricas no arquivo
overrides.yamlcom as seguintes propriedades:metrics: aggregator: # The apigee-prometheus-agg container in the "proxy" pod resources: limits: memory: 32Gi # default: 3Gi app: # The apigee-prometheus-app container in the "app" pod resources: limits: memory: 16Gi # default: 1Gi - Aplique as mudanças com o
helm upgrade:helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ -f OVERRIDES_FILE
Se o erro de falta de memória ainda ocorrer depois de aumentar o limite, aumente o tamanho dos nós subjacentes para permitir mais uso de memória.
Documentos relacionados
Gerenciar componentes do plano de execução
É necessário coletar informações de diagnóstico
Reúna as seguintes informações de diagnóstico e entre em contato com o suporte da Apigee:
Coletar dados do contêiner do Prometheus para solução de problemas
Inicie o encaminhamento de portas para o contêiner do Prometheus. Repita para os pods de app e proxy. Exemplo:
kubectl port-forward -n apigee apigee-metrics-apigee-telemetry-app-1a2-b3c4-d5ef 8081:9090
Use o script abaixo no cluster para coletar dados:
#!/bin/bash
set -e
# check if jq is installed
jq --version &> /dev/null
if [ $? -ne 0 ]; then
echo "jq not installed"
exit 1
fi
# check if curl is installed
curl --version &> /dev/null
if [ $? -ne 0 ] ; then
echo "curl not installed"
exit 1
fi
# Simple check for missing arguments
if [[ $# -eq 0 ]] ; then
echo 'No arguments provided'
exit 1
fi
# Simple check for missing arguments
if [[ $# -ne 3 ]]; then
echo 'Illegal number of arguments'
exit 1
fi
FORWARDED_PORT=${1}
DEST_DIR=${2}
CASE_NUMBER=${3}
DIR_FULL_PATH=${DEST_DIR}/${CASE_NUMBER}_$(date +%Y_%m_%d_%H_%M_%S)
CURRENT_DATE=$(date +%Y-%m-%d)
# we set the default start date for query at 10 days before current date
START_DATE=$(date +%Y-%m-%d -d "10 days ago")
mkdir -pv ${DIR_FULL_PATH}
set -x
curl -s '127.0.0.1:'${FORWARDED_PORT}'/status' | tee ${DIR_FULL_PATH}/prometheus_status_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/config' | tee ${DIR_FULL_PATH}/prometheus_config_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/targets' | tee ${DIR_FULL_PATH}/prometheus_targets_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/status/config' | jq . | tee ${DIR_FULL_PATH}/prometheus_status_config_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/heap' --output ${DIR_FULL_PATH}/prometheus_heap_$(date +%Y.%m.%d_%H.%M.%S).hprof
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/heap?debug=1' | tee ${DIR_FULL_PATH}/prometheus_heap_$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/goroutine' --output ${DIR_FULL_PATH}/prometheus_goroutine_$(date +%Y.%m.%d_%H.%M.%S)
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/goroutine?debug=1' | tee ${DIR_FULL_PATH}/prometheus_goroutine_$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/profile?seconds=10' --output ${DIR_FULL_PATH}/prometheus_profile_10_seconds_$(date +%Y.%m.%d_%H.%M.%S)
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(__name__)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_count_by_name_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(__name__%2C%20job)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_group_by_job_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(job)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_job_most_timeseries_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
set +x
ls -latrh ${DIR_FULL_PATH}
tar -cvzf ${DIR_FULL_PATH}.tar.gz ${DIR_FULL_PATH}/
exit 0
Argumentos:
O script usa três argumentos posicionais.
- Número da porta: defina como a porta de encaminhamento (por exemplo, 8081).
- Diretório: diretório base para arquivos de saída.
- Número do caso: usado para o nome do arquivo gerado.
Exemplo de uso
./prometheus_gather.sh 8081 . 1510679