Configurar a visibilidade do endpoint HTTP
Esta página fornece orientação para clientes do Application Signals que esperam ver suas operações de serviço HTTP separadas por nomes de endpoints específicos, mas, em vez disso, veem vários endpoints agrupados na mesma métrica. Por padrão, o Application Signals trunca a dimensão métrica Operation para o primeiro segmento de caminho de URL para serviços HTTP (por exemplo, /api/v1/users torna-se GET /api) para preservar métricas de baixa cardinalidade. Como resultado, os usuários podem descobrir que serviços com vários endpoints compartilhando o mesmo prefixo têm visibilidade limitada da integridade operacional de endpoints individuais. Você pode seguir as etapas abaixo para configurar os endpoints de operação de serviço de acordo com a granularidade desejada.
Importante
Modificar a visibilidade do endpoint é uma mudança importante, pois afeta as dimensões métricas do Application Signals para operações de serviço. Lembre-se de atualizar seus limites de SLO, alarmes e/ou painéis adequadamente.
Solução do AWS Distro para OpenTelemetry (ADOT)
Para clientes que usam o AWS Distro for OpenTelemetry (ADOT), defina a variável de ambiente OTEL_AWS_HTTP_OPERATION_PATHS com uma lista separada por vírgulas de modelos de caminho de URL para o serviço HTTP:
export OTEL_AWS_HTTP_OPERATION_PATHS="/path/to/endpoint, /another/{placeholder}/endpoint"
Essa variável usa o prefixo correspondente mais longo no atributo url.path do intervalo do servidor HTTP para determinar o nome da operação. Os padrões curinga correspondem a qualquer segmento de URL e podem ser indicados por {placeholder}, :placeholder ou *. Depois de definir a variável, reinicie sua aplicação para que os novos agrupamentos de endpoints entrem em vigor.
Esta variável é compatível em Java, Python, Node.js e .NET.
Exemplo
Considere um serviço de API que receba o seguinte tráfego:
GET /api/users GET /api/users/42 GET /api/users/42/orders POST /api/users/99/orders POST /api/users/42/orders GET /api/users/42/orders/7/items GET /api/products
Por padrão, o Application Signals agrupa tudo isso nas métricas de serviço GET /api ou POST /api, tornando impossível distinguir o desempenho entre endpoints.
Para corrigir isso, defina a variável de ambiente com os modelos de caminho desejados:
export OTEL_AWS_HTTP_OPERATION_PATHS="/api/users/{userId}/orders/{orderId}/items, /api/users/{userId}/orders, /api/users/{userId}, /api/users, /api/products"
Com essa configuração, o Application Signals mostra operações distintas. Várias solicitações podem ser resolvidas com o mesmo modelo configurado:
| Solicitação de entrada | Operação padrão | Com config |
|---|---|---|
GET /api/users |
GET /api |
GET /api/users |
GET /api/users/42 |
GET /api |
GET /api/users/{userId} |
GET /api/users/42/orders |
GET /api |
GET /api/users/{userId}/orders |
POST /api/users/99/orders |
POST /api |
POST /api/users/{userId}/orders |
POST /api/users/42/orders |
POST /api |
POST /api/users/{userId}/orders |
GET /api/users/42/orders/7/items |
GET /api |
GET /api/users/{userId}/orders/{orderId}/items |
GET /api/products |
GET /api |
GET /api/products |
Solução do OpenTelemetry nativo
Se você estiver usando o SDK nativo do OpenTelemetry (sem ADOT), poderá substituir o nome do intervalo usando o processador de transformação no seu OpenTelemetry Collector ou diretamente no código da aplicação.
nota
Você deve configurar seu coletor com um exportador OTLP para preservar o nome do intervalo OpenTelemetry para que o CloudWatch possa analisá-lo para o nome da operação do Application Signals. Para obter mais informações, consulte Como enviar dados OTLP para o CloudWatch.
Opção 1 (recomendada): transformação do lado do coletor
Use o processador de transformaçãoname diretamente.
Ordene as regras da mais superficial para a mais profunda — as instruções são executadas sequencialmente, para que correspondências mais específicas posteriormente na lista substituam as gerais definidas anteriormente. No exemplo apresentado a seguir, o valor do atributo span url.path é correspondido e o nome do intervalo resultante é definido como o método de solicitação seguido pelo padrão de URL desejado.
processors: transform/operation_names: trace_statements: - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests(/|$)") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests"], " ")) - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests/[^/]+$") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests/{id}"], " ")) - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests/[^/]+/leaderboard(/|$)") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests/{id}/leaderboard"], " ")) service: pipelines: traces: receivers: [otlp] processors: [resourcedetection, transform/operation_names, batch] exporters: [otlphttp/xray]
Opção 2: definir o nome do intervalo no código da aplicação
Você pode definir manualmente o nome do intervalo para os intervalos do servidor no código da sua aplicação usando a API OpenTelemetry. Escolha o nome para {HTTP_METHOD} {route_template} onde o modelo de rota usa espaços reservados parametrizados. Observe que essa é uma opção alternativa codificada e você deve atualizar manualmente o nome do intervalo em cada manipulador de solicitação HTTP para aplicar essa alteração.
Java
import io.opentelemetry.api.trace.Span; // Inside your request handler Span.current().updateName("GET /api/contests/{id}/leaderboard");
Python
from opentelemetry import trace # Inside your request handler span = trace.get_current_span() span.update_name("GET /api/contests/{id}/leaderboard")
Go
import "go.opentelemetry.io/otel/trace" // Inside your request handler span := trace.SpanFromContext(ctx) span.SetName("GET /api/contests/{id}/leaderboard")
Node.js
import { trace } from '@opentelemetry/api'; // Inside your request handler const span = trace.getActiveSpan(); if (span) { span.updateName('GET /api/contests/{id}/leaderboard'); }