

# Configuración de la visibilidad de puntos de conexión HTTP
<a name="Application-Signals-EndpointVisibility"></a>

Esta página proporciona orientación para los clientes de Application Signals que esperan ver sus operaciones de servicios HTTP separadas por nombres de punto de conexión específicos, pero que, en cambio, ven varios puntos de conexión agrupados en la misma métrica. De forma predeterminada, Application Signals trunca la dimensión de la métrica `Operation` al primer segmento de ruta de URL de los servicios HTTP (por ejemplo, `/api/v1/users` se convierte en `GET /api`) para preservar las métricas de baja cardinalidad. Como resultado, los usuarios pueden darse cuenta de que los servicios con varios puntos de conexión que comparten el mismo prefijo tienen una visibilidad limitada del estado operativo de los puntos de conexión individuales. Puede seguir los pasos que se indican a continuación para configurar los puntos de conexión de operación del servicio con la granularidad que desee.

**importante**  
La modificación de la visibilidad de los puntos de conexión es un cambio radical, ya que afecta a las dimensiones de las métricas de Application Signals para las operaciones de servicio. Recuerde actualizar los umbrales, las alarmas o los paneles de SLO en consecuencia.

## Solución AWS Distro para OpenTelemetry (ADOT)
<a name="Application-Signals-EndpointVisibility-ADOT"></a>

Para los clientes que utilizan AWS Distro para OpenTelemetry (ADOT), defina la variable de entorno `OTEL_AWS_HTTP_OPERATION_PATHS` con una lista separada por comas de plantillas de rutas de URL para el servicio HTTP:

```
export OTEL_AWS_HTTP_OPERATION_PATHS="/path/to/endpoint, /another/{placeholder}/endpoint"
```

Esta variable utiliza el prefijo más largo que coincida con el atributo `url.path` de intervalo del servidor HTTP para determinar el nombre de la operación. Los patrones comodín coinciden con cualquier segmento de URL individual y se pueden indicar con`{placeholder}`, `:placeholder` o `*`. Después de configurar la variable, reinicie la aplicación para que surtan efecto las nuevas agrupaciones de puntos de conexión.

Esta variable es compatible con ADOT para Java, Python, Node.js y .NET.

**Ejemplo**

Considere un servicio de API que reciba el siguiente tráfico:

```
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
```

De forma predeterminada, Application Signals agrupa todo esto en métricas de servicio `GET /api` o `POST /api`, lo que hace imposible distinguir el rendimiento entre los puntos de conexión.

Para solucionar este problema, defina la variable de entorno con las plantillas de ruta deseadas:

```
export OTEL_AWS_HTTP_OPERATION_PATHS="/api/users/{userId}/orders/{orderId}/items, /api/users/{userId}/orders, /api/users/{userId}, /api/users, /api/products"
```

Con esta configuración, Application Signals muestra distintas operaciones. Se pueden resolver varias solicitudes en la misma plantilla configurada:


**Ejemplo de resultados de configuración de visibilidad de puntos de conexión**  

| Solicitud entrante | Operación predeterminada | Con configuración | 
| --- | --- | --- | 
| 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 | 

## Solución nativa de OpenTelemetry
<a name="Application-Signals-EndpointVisibility-NativeOTel"></a>

Si utiliza el SDK de OpenTelemetry nativo (sin ADOT), puede anular el nombre del intervalo mediante el procesador de transformación del recopilador de OpenTelemetry o directamente en el código de la aplicación.

**nota**  
Debe configurar el recopilador con un exportador de OTLP para conservar el nombre del intervalo de OpenTelemetry, de modo que CloudWatch pueda analizarlo en busca del nombre de la operación de Application Signals. Para obtener más información, consulte [Envío de datos de OTLP a CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OTLPSimplesetup.html).

**Opción 1 (recomendada): transformación del recopilador**

Utilice el [procesador de transformación](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessor) para configurar los nombres de los intervalos en función de los patrones de URL. El procesador de transformación utiliza OTTL (lenguaje de programación de OpenTelemetry) y puede modificar el campo `name` del intervalo directamente.

Ordene las reglas de la más superficial a la más profunda: las instrucciones se ejecutan de forma secuencial, de modo que las coincidencias más específicas que se encuentren más adelante en la lista anulan las generales establecidas anteriormente. En el siguiente ejemplo, el valor del atributo `url.path` del intervalo coincide y el nombre del intervalo resultante se establece en el método de solicitud seguido del patrón de URL deseado.

```
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]
```

**Opción 2: configuración del nombre del intervalo en el código de la aplicación**

Puede configurar manualmente el nombre de las unidades de seguimiento del servidor en el código de la aplicación mediante la API de OpenTelemetry. Establezca el nombre como `{HTTP_METHOD} {route_template}` en el lugar en el que la plantilla de ruta utiliza los marcadores de posición parametrizados. Tenga en cuenta que se trata de una opción de reserva codificada y debe actualizar manualmente el nombre del intervalo en cada controlador de solicitudes HTTP para aplicar este cambio.

**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');
}
```