Cloud Trace e Cloud Service Mesh
O Cloud Trace é um sistema de rastreamento distribuído que coleta dados de latência dos aplicativos e os exibe quase em tempo real. Com ele, é possível seguir uma solicitação de amostra por meio do sistema distribuído, observar as chamadas de rede e criar o perfil do sistema de ponta a ponta.
O Cloud Trace está disponível com instalações do Cloud Service Mesh nas seguintes plataformas:
- GKE no Google Cloud
- Clusters do GKE Enterprise no local se você tiver instalado com a autoridade de certificação do Cloud Service Mesh
O Cloud Trace fica desativado por padrão. Depois da ativação, as páginas do Cloud Service Mesh no console do Google Cloud fornecem um link para os rastros na página do Cloud Trace . Para informações detalhadas de preço do Cloud Trace, consulte esta página.
Ativar o Cloud Trace
Nesta seção, mostraremos como ativar o Cloud Trace.
Gerenciado
Nesta seção, mostramos como ativar o Cloud Trace no Cloud Service Mesh gerenciado.
Execute este comando:
cat <<EOF | kubectl apply -f - apiVersion: v1 data: mesh: |- defaultConfig: tracing: stackdriver: {} kind: ConfigMap metadata: name: istio-release-channel namespace: istio-system EOF
em que release-channel é o canal de lançamento (
asm-managed
,asm-managed-stable
ouasm-managed-rapid
).Execute este comando para ver o configmap:
kubectl get configmap istio-release-channel -n istio-system -o yaml
Para verificar se o Cloud Trace está ativado, verifique se as linhas a seguir aparecem na seção
mesh:
.... apiVersion: v1 data: mesh: | .... defaultConfig: tracing: stackdriver:{} ...
Reinicie os proxies.
Atualmente, a configuração do rastreador faz parte da configuração de inicialização do proxy. Por isso, cada pod precisa ser reiniciado e reinjetado para coletar a atualização do rastreador. Por exemplo, é possível usar o seguinte comando para reiniciar pods que pertencem a uma implantação:
kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME
No cluster
Nesta seção, mostramos como ativar o Cloud Trace no Cloud Service Mesh no cluster.
Para ativar o Cloud Trace, reimplante o plano de controle utilizando o seguinte arquivo de sobreposição. Para mais informações sobre arquivos de sobreposição, consulte Sobre os arquivos de sobreposição.
.Padrão
Execute o comando a seguir para ativar o Cloud Trace:
./asmcli install \
OTHER_FLAGS \
--option cloud-trace
Este comando aplica o seguinte arquivo de sobreposição para ativar o rastreamento com opções padrão. A taxa de amostragem padrão é de 1%. Se você quiser
substituir o padrão, use --custom-overlay
.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
values:
global:
proxy:
tracer: stackdriver
Para ver uma lista de opções, consulte o
pacote anthos-service-mesh
.
Personalizado
É possível substituir o padrão especificando um valor tracing.sampling
. O valor
precisa estar no intervalo de 0,0 a 100,0 com uma
precisão de 0,01. Por exemplo,
para gerar traces de cinco solicitações de cada 10.000, use 0,05.
O exemplo a seguir mostra uma taxa de amostragem de 100%, que é o que você faria apenas para fins de demonstração ou solução de problemas.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
defaultConfig:
tracing:
sampling: 100
values:
global:
proxy:
tracer: stackdriver
Execute o comando a seguir para ativar o Cloud Trace:
./asmcli install \
OTHER_FLAGS \
--custom_overlay PATH_TO_FILE
A configuração do tracer faz parte da configuração do bootstrap de proxy. Portanto, os pods precisam ser reiniciados e injetados novamente para retomar a atualização do rastreador. Use o seguinte comando para reiniciar pods que pertençam a uma implantação:
kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME
Propagação do contexto de trace
Os proxies secundários podem enviar períodos de trace automaticamente, mas eles precisam de algumas dicas para unir todo o trace. Os aplicativos precisam propagar os cabeçalhos HTTP apropriados para que, quando os proxies enviarem informações de período, os períodos possam ser correlacionados corretamente em um único trace.
Para fazer isso, um aplicativo precisa coletar e propagar os cabeçalhos apropriados da solicitação de entrada para qualquer solicitação de saída: A configuração de rastreamento do Stackdriver do Cloud Service Mesh aceita qualquer um dos seguintes formatos de cabeçalho e propaga todos os seguintes formatos:
- B3 (
x-b3-traceid
,x-b3-spanid
,x-b3parentspanid
,x-b3-sampled
,x-b3-flags
) - W3C TraceContext (
traceparent
) - Google Cloud Trace (
x-cloud-trace-context
) - gRPC TraceBin (
grpc-trace-bin
)
Isso significa que os aplicativos podem usar qualquer um desses formatos para propagar o contexto de rastreamento, e os traces serão gerados e definidos adequadamente para o Stackdriver.
Exemplo
Veja um exemplo de solicitação HTTP-Get com um cabeçalho traceparent
na solicitação
original. Observe os cabeçalhos adicionais de contexto de trace adicionados pelo proxy.
$ kubectl exec -it sleep-557747455f-n6flv -- curl "httpbin:8000/anything?freeform=" -H "accept: application/json" -H "Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01" -vv
* Trying 10.12.3.52:8000...
* Connected to httpbin (10.12.3.52) port 8000 (#0)
> GET /anything?freeform= HTTP/1.1
> Host: httpbin:8000
> User-Agent: curl/7.80.0-DEV
> accept: application/json
> Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: envoy
< date: Wed, 10 Nov 2021 20:36:04 GMT
< content-type: application/json
< content-length: 1032
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 5
<
{
"args": {
"freeform": ""
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Grpc-Trace-Bin": "AAB1Q9FeCeXWGAHU90zeEmm4AaDHmGRtdM7wAgE",
"Host": "httpbin:8000",
"Traceparent": "00-7543d15e09e5d61801d4f74cde1269b8-a0c798646d74cef0-01",
"User-Agent": "curl/7.80.0-DEV",
"X-B3-Sampled": "1",
"X-B3-Spanid": "a0c798646d74cef0",
"X-B3-Traceid": "7543d15e09e5d61801d4f74cde1269b8",
"X-Cloud-Trace-Context": "7543d15e09e5d61801d4f74cde1269b8/11585396123534413552;o=1",
"X-Envoy-Attempt-Count": "1",
"X-Forwarded-Client-Cert": "<REDACTED>"
},
"json": null,
"method": "GET",
"origin": "127.0.0.6",
"url": "http://httpbin:8000/anything?freeform="
}
No conjunto retornado de cabeçalhos de solicitação, o conjunto completo de cabeçalhos de contexto de trace está presente.
Para mais exemplos de propagação dos cabeçalhos, consulte Rastrear a propagação de contexto.
Criar um trace do cliente com um ID personalizado.
Para criar um trace de um cliente com um ID personalizado, use o comando curl
para
criar uma solicitação com um cliente externo e forçá-lo a mostrar um trace. Exemplo:
curl $URL --header "x-client-trace-id: 105445aa7843bc8bf206b12000100000"
Para mais informações sobre x-client-trace-id
, consulte a documentação do Envoy (em inglês).
Traces de acesso
Ver amostras de traces para um serviço
Para ver uma amostra de traces de um serviço no app, siga estas etapas:
Acesse a página do Cloud Service Mesh no console do Google Cloud.
Em Serviços, selecione o nome do serviço que você quer inspecionar.
A captura de tela abaixo mostra um exemplo de um serviço
frontend
.Em Solicitar traces, clique em qualquer trace para ver mais informações.
A captura de tela abaixo mostra um exemplo do subpainel de solicitação de trace.
Ver todos os traces
Para ver todos os traces de um serviço, siga estas etapas:
Acesse a página do Cloud Service Mesh no console do Google Cloud.
Em Serviços, selecione o nome do serviço que você quer inspecionar.
Acesse a página Métricas.
Especifique um período no menu suspenso Período ou defina um período personalizado com a linha do tempo.
Clique em Visualizar traces.
Os traces de um serviço no Cloud Service Mesh contêm as seguintes informações:
- Solicitar latência em diferentes serviços na malha.
- Propriedades da solicitação HTTP, incluindo ID, URL, tamanho, latência e protocolo.
- Nome do serviço, namespace e código da malha como parte dos rótulos
istio.canonical_service
,istio.namespace
eistio.mesh_id
, respectivamente.