View a markdown version of this page

Konfigurasikan visibilitas titik akhir HTTP - Amazon CloudWatch

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Konfigurasikan visibilitas titik akhir HTTP

Halaman ini memberikan panduan untuk pelanggan Sinyal Aplikasi yang mengharapkan operasi layanan HTTP mereka dipisahkan oleh nama titik akhir tertentu, tetapi sebaliknya melihat beberapa titik akhir yang dikelompokkan ke dalam metrik yang sama. Secara default, Sinyal Aplikasi memotong dimensi Operation metrik ke segmen jalur URL pertama untuk layanan HTTP (misalnya, /api/v1/users menjadiGET /api) untuk mempertahankan metrik kardinalitas rendah. Akibatnya, pengguna mungkin menemukan bahwa layanan dengan beberapa titik akhir yang berbagi awalan yang sama memiliki visibilitas terbatas ke dalam kesehatan operasional masing-masing titik akhir. Anda dapat mengikuti langkah-langkah di bawah ini untuk mengonfigurasi titik akhir operasi layanan ke perincian yang Anda inginkan.

penting

Memodifikasi visibilitas titik akhir merupakan perubahan besar karena mempengaruhi dimensi metrik Sinyal Aplikasi untuk operasi layanan. Ingatlah untuk memperbarui ambang batas SLO, alarm, and/or dasbor Anda sesuai dengan itu.

AWS Distro untuk solusi OpenTelemetry (ADOT)

Untuk pelanggan yang menggunakan AWS Distro for OpenTelemetry (ADOT), atur variabel OTEL_AWS_HTTP_OPERATION_PATHS lingkungan dengan daftar templat jalur URL yang dipisahkan koma untuk layanan HTTP:

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

Variabel ini menggunakan awalan pencocokan terpanjang terhadap url.path atribut rentang server HTTP untuk menentukan nama operasi. Pola wildcard cocok dengan segmen URL tunggal mana pun dan dapat dilambangkan dengan{placeholder},:placeholder, atau. * Setelah menyetel variabel, mulai ulang aplikasi Anda agar pengelompokan titik akhir yang baru berlaku.

Variabel ini didukung di ADOT untuk Java, Python Node.js, dan .NET.

Contoh

Pertimbangkan layanan API yang menerima lalu lintas berikut:

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

Secara default, Sinyal Aplikasi mengelompokkan semua ini ke dalam GET /api atau metrik POST /api layanan, sehingga tidak mungkin untuk membedakan kinerja antara titik akhir.

Untuk memperbaikinya, atur variabel lingkungan dengan template jalur yang diinginkan:

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

Dengan konfigurasi ini, Sinyal Aplikasi menunjukkan operasi yang berbeda. Beberapa permintaan dapat diselesaikan ke template yang dikonfigurasi yang sama:

Permintaan masuk Operasi default Dengan konfigurasi
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

OpenTelemetry Solusi asli

Jika Anda menggunakan OpenTelemetry SDK asli (tanpa ADOT), Anda dapat mengganti nama rentang menggunakan prosesor transformasi di OpenTelemetry Kolektor Anda atau langsung dalam kode aplikasi.

catatan

Anda harus mengonfigurasi kolektor Anda dengan pengekspor OTLP untuk mempertahankan nama OpenTelemetry rentang sehingga CloudWatch dapat menguraikannya untuk nama operasi Sinyal Aplikasi. Untuk informasi selengkapnya, lihat Men girim data OTLP ke CloudWatch.

Opsi 1 (disarankan): Collector-side transformasi

Gunakan prosesor transformasi untuk mengatur nama rentang berdasarkan pola URL. Prosesor transformasi menggunakan OTTL (OpenTelemetry Transformation Language) dan dapat memodifikasi name bidang span secara langsung.

Urutkan aturan dari yang paling dangkal hingga terdalam — pernyataan berjalan secara berurutan, jadi kecocokan yang lebih spesifik nanti dalam daftar menggantikan yang umum yang ditetapkan sebelumnya. Dalam contoh berikut, nilai atribut span dicocok url.path kan dan nama rentang yang dihasilkan disetel ke metode permintaan diikuti oleh pola URL yang diinginkan.

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]

Opsi 2: Mengatur nama rentang dalam kode aplikasi

Anda dapat secara manual mengatur nama rentang untuk rentang server dalam kode aplikasi Anda menggunakan OpenTelemetry API. Tetapkan nama ke {HTTP_METHOD} {route_template} tempat template rute menggunakan placeholder parameter. Perhatikan bahwa ini adalah opsi fallback hardcode, dan Anda harus memperbarui nama span secara manual di setiap pengendali permintaan HTTP untuk menerapkan perubahan ini.

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