Habilitar o Application Signals em plataformas Kubernetes
Para habilitar aplicações em execução em sistemas Kubernetes que não sejam o Amazon EKS, siga as instruções nesta seção. O Application Signals é compatível com aplicações em Java, Python e .NET.
Requisitos
Você tem permissões de administrador no cluster do Kubernetes em que está realizando a habilitação do Application Signals.
Você deve ter a AWS CLI instalada no ambiente em que seu cluster do Kubernetes está sendo executado. Para obter mais informações sobre como instalar a AWS CLI, consulte Instalar ou atualizar para a versão mais recente da AWS CLI.
Você tem o kubectl e o helm instalados em seu terminal local. Para obter mais informações, consulte a documentação do kubectl
e do Helm .
Etapa 1: habilitar o Application Signals em sua conta
Caso ainda não tenha habilitado o Application Signals nessa conta, você deve conceder as permissões necessárias para o Application Signals descobrir seus serviços. Para fazê-lo, siga as etapas apresentadas a seguir. Você precisa fazer isso somente uma vez para a conta.
Como habilitar o Application Signals para suas aplicações
Abra o console do CloudWatch em https://console.aws.amazon.com/cloudwatch/
. No painel de navegação, escolha Serviços.
Escolha Começar a descobrir os serviços.
Marque a caixa de seleção e escolha Começar a descobrir os serviços.
Ao concluir essa etapa pela primeira vez em sua conta, o Application Signals cria o perfil vinculado ao serviço AWSServiceRoleForCloudWatchApplicationSignals. Essa função concede as seguintes permissões ao Application Signals:
-
xray:GetServiceGraph
-
logs:StartQuery
-
logs:GetQueryResults
-
cloudwatch:GetMetricData
-
cloudwatch:ListMetrics
-
tag:GetResources
Para obter mais informações sobre essa função, consulte Permissões de perfis vinculados ao serviço para o CloudWatch Application Signals.
-
Etapa 2: instalar o operador do agente do CloudWatch no seu cluster
A instalação do operador do agente do CloudWatch instala o operador, o agente do CloudWatch e outras instrumentações automáticas no cluster. Para fazer isso, insira o comando a seguir. Substitua $REGION
pela sua região da AWS. Substitua $YOUR_CLUSTER_NAME
pelo nome que você deseja que apareça para seu cluster nos painéis do Application Signals.
helm repo add aws-observability https://aws-observability.github.io/helm-charts helm install amazon-cloudwatch-operator aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch --create-namespace \ --set region=
$REGION
\ --set clusterName=$YOUR_CLUSTER_NAME
Para obter mais informações, consulte amazon-cloudwatch-observability
Etapa 3: configurar as credenciais da AWS para seus clusters do Kubernetes
Importante
Se o cluster do Kubernetes estiver hospedado no Amazon EC2, ignore esta seção e vá para Etapa 4: adicionar anotações.
Se o cluster do Kubernetes estiver hospedado on-premises, você deverá usar as instruções nesta seção para adicionar as credenciais da AWS ao seu ambiente do Kubernetes.
Para configurar permissões para um cluster do Kubernetes on-premises
Crie o usuário do IAM a ser usado para fornecer permissões ao seu host on-premises:
Abra o console do IAM, em https://console.aws.amazon.com/iam/
. Escolha Usuários, Criar usuário.
Em Detalhes do usuário, em Nome do usuário, insira um nome para o novo usuário do IAM. Esse é o nome de login para a AWS que será usado para autenticar seu host. Em seguida, escolha Próximo
Na página Definir permissões, em Opções de permissões, escolha Anexar políticas diretamente.
Na lista de Políticas de permissões, selecione a política CloudWatchAgentServerPolicy para adicionar ao seu usuário. Escolha Próximo.
Na página Revisar e criar, verifique se você está satisfeito com o nome de usuário e se a política CloudWatchAgentServerPolicy está no Resumo de permissões.
Escolha Criar usuário
Crie e recupere sua chave de acesso da AWS e uma chave secreta:
No painel de navegação do console do IAM, escolha Usuários e depois selecione o nome do usuário do usuário que você criou na etapa anterior.
Na página do usuário, escolha a guia Credenciais de segurança. Depois, na seção Chaves de acesso, escolha Criar chave de acesso.
Em Criar chave de acesso: etapa 1, escolha Command Line Interface (CLI).
Em Criar chave de acesso: etapa 2, insira uma tag opcional e escolha Próximo.
Em Criar chave de acesso: etapa 3, selecione Baixar arquivo .csv para salvar um arquivo .csv com a chave de acesso e a chave de acesso secreta do usuário do IAM. Você precisará dessas informações para as próximas etapas.
Selecione Concluído.
Configure suas credenciais da AWS no host on-premises ao inserir o comando a seguir. Substitua
ACCESS_KEY_ID
eSECRET_ACCESS_ID
pela chave de acesso recém-gerada e pela chave de acesso secreta do arquivo.csv que você baixou na etapa anterior. Por padrão, o arquivo de credencial é salvo em/home/
user
/.aws/credentials.$ aws configure --profile AmazonCloudWatchAgent AWS Access Key ID [None]:
ACCESS_KEY_ID
AWS Secret Access Key [None]:SECRET_ACCESS_ID
Default region name [None]:MY_REGION
Default output format [None]: jsonEdite o recurso personalizado que o agente do CloudWatch instalou usando o chart do Helm para adicionar o segredo de credenciais AWS recém-criado.
kubectl edit amazoncloudwatchagent cloudwatch-agent -n amazon-cloudwatch
Enquanto seu editor de arquivos estiver aberto, monte as credenciais da AWS no contêiner do agente do CloudWatch adicionando a configuração a seguir na parte superior da implantação. Substitua o caminho
/home/
pelo local do seu arquivo de credenciais da AWS local.user
/.aws/credentialsapiVersion: cloudwatch.aws.amazon.com/v1alpha1 kind: AmazonCloudWatchAgent metadata: name: cloudwatch-agent namespace: amazon-cloudwatch spec: volumeMounts: - mountPath: /rootfs volumeMounts: - name: aws-credentials mountPath: /root/.aws readOnly: true volumes: - hostPath: path: /home/
user
/.aws/credentials name: aws-credentials ---
Etapa 4: adicionar anotações
nota
Se você estiver habilitando o Application Signals para uma aplicação do Node.js com ESM, ignore as etapas apresentadas nesta seção e, em vez disso, consulte Configuração de uma aplicação do Node.js usando o formato de módulo ESM.
A próxima etapa é instrumentar sua aplicação para o CloudWatch Application Signals adicionando uma anotação
Para adicionar as anotações para o Application Signals
-
Você tem duas opções para a anotação:
Anotar a workload instrumenta automaticamente uma única workload em um cluster.
Anotar o namespace instrumenta automaticamente todas as workloads implantadas no namespace selecionado.
Escolha uma das opções e siga as etapas apropriadas.
Para anotar uma única workload, insira um dos comandos apresentados a seguir. Substitua
$WORKLOAD_TYPE
e$WORKLOAD_NAME
com os valores para a sua workload.Para workloads em Java:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-java": "true"}}}}}'Para workloads em Python:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'Para aplicações em Python, existem configurações adicionais necessárias. Para ter mais informações, consulte A aplicação em Python não é iniciada após a habilitação do Application Signals.
Para workloads .NET:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-dotnet": "true"}}}}}'nota
Para habilitar o Application Signals para uma workload em .NET em imagens baseadas no Alpine Linux (
linux-musl-x64
), adicione a anotação adicional apresentada a seguir.instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: "linux-musl-x64"
Para workloads em Node.js:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
-
Para anotar todas as workloads em um namespace, insira um dos comandos a seguir. Substitua
$NAMESPACE
pelo nome do seu namespace.Se o namespace incluir workloads em Java, Python e .NET, adicione todas as anotações ao namespace.
Para workloads em Java no namespace:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-java=truePara workloads em Python no namespace:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-python=truePara aplicações em Python, existem configurações adicionais necessárias. Para ter mais informações, consulte A aplicação em Python não é iniciada após a habilitação do Application Signals.
-
Para workloads do .NET no namespace:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-dotnet=true -
Para workloads em Node.js no namespace:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-nodejs=true
Depois de adicionar as anotações, reinicie todos os pods no namespace inserindo o seguinte comando:
kubectl rollout restart
Quando as etapas anteriores forem concluídas, no console do CloudWatch, escolha Application Signals, Serviços. Essa ação abre os painéis nos quais você pode consultar os dados que o Application Signals coleta. Pode demorar alguns minutos para que os dados sejam exibidos.
Para obter mais informações sobre a visualização dos Serviços, consulte Monitorar a integridade operacional das suas aplicações com o Application Signals.
Configuração de uma aplicação do Node.js usando o formato de módulo ESM
Fornecemos suporte limitado para aplicações do Node.js com o formato de módulo ESM. Para obter detalhes, consulte Limitações conhecidas sobre o uso de ESM com o Node.js.
No formato de módulo ESM, a habilitação do Application Signals ao usar a anotação do arquivo manifesto não funciona corretamente. Ignore o procedimento anterior e, em vez disso, execute as seguintes ações:
Para habilitar o Application Signals em uma aplicação do Node.js com o ESM
Instale as dependências relevantes para a instrumentação automática na aplicação do Node.js:
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
Adicione as variáveis de ambiente, apresentadas a seguir, ao Dockerfile da aplicação e crie a imagem.
... ENV OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true ENV OTEL_TRACES_SAMPLER_ARG='endpoint=http://cloudwatch-agent.amazon-cloudwatch:2000' ENV OTEL_TRACES_SAMPLER='xray' ENV OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf' ENV OTEL_EXPORTER_OTLP_TRACES_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/traces' ENV OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/metrics' ENV OTEL_METRICS_EXPORTER='none' ENV OTEL_LOGS_EXPORTER='none' ENV NODE_OPTIONS='--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs' ENV OTEL_SERVICE_NAME='YOUR_SERVICE_NAME' #replace with a proper service name ENV OTEL_PROPAGATORS='tracecontext,baggage,b3,xray' ... # command to start the application # for example # CMD ["node", "index.mjs"]
Adicione as variáveis de ambiente
OTEL_RESOURCE_ATTRIBUTES_POD_NAME
,OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
,OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME
,POD_NAMESPACE
eOTEL_RESOURCE_ATTRIBUTES
ao arquivo de implantação no formato YAML da aplicação. Por exemplo:apiVersion: apps/v1 kind: Deployment metadata: name: nodejs-app labels: app: nodejs-app spec: replicas: 2 selector: matchLabels: app: nodejs-app template: metadata: labels: app: nodejs-app # annotations: # make sure this annotation doesn't exit # instrumentation.opentelemetry.io/inject-nodejs: 'true' spec: containers: - name: nodejs-app image:
your-nodejs-application-image
#replace it with a proper image uri imagePullPolicy: Always ports: - containerPort: 8000 env: - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME valueFrom: fieldRef: fieldPath: metadata.labels['app'] # Assuming 'app' label is set to the deployment name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: OTEL_RESOURCE_ATTRIBUTES value: "k8s.deployment.name=$(OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME),k8s.namespace.name=$(POD_NAMESPACE),k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME)"Realize a implantação da aplicação do Node.js no cluster do Kubernetes.