Topik ini menjelaskan cara mengirim metrik ke Managed Service for Prometheus dari aplikasi yang diterapkan di kluster Container Service for Kubernetes (ACK) dan diinstrumentasi dengan OpenTelemetry SDK. Anda dapat menyatukan pengumpulan metrik OpenTelemetry (OTel) native, metrik bisnis kustom, serta metrik yang dikonversi dari rentang jejak untuk mencapai observabilitas aplikasi secara menyeluruh. Mengonversi data jejak menjadi metrik dapat secara signifikan mengurangi volume ingesti data.
Ikhtisar OpenTelemetry
OpenTelemetry (OTel) adalah framework observabilitas open-source yang menyediakan serangkaian API, SDK, dan alat terpadu untuk menghasilkan, mengumpulkan, dan mengekspor data telemetri dari sistem terdistribusi, termasuk metrik, jejak, dan log. Tujuan utamanya adalah mengatasi fragmentasi data observabilitas di berbagai alat dan sistem.
Metrik OpenTelemetry adalah data terstruktur yang mengkuantifikasi perilaku sistem dan digunakan untuk memantau kinerja serta kesehatan sistem. Sumber metrik bergantung pada instrumentasi SDK atau agen untuk bahasa pemrograman tertentu. Untuk aplikasi Java, metrik biasanya mencakup metrik standar Java Virtual Machine (JVM), metrik kustom yang diinstrumentasi pengguna, serta metrik yang berasal dari data jejak.
Metrik OpenTelemetry dirancang agar kompatibel dengan Prometheus. Dengan menggunakan OpenTelemetry Collector, Anda dapat mengonversi metrik ke format Prometheus untuk integrasi tanpa hambatan dengan Managed Service for Prometheus.
Peran OpenTelemetry Collector
OpenTelemetry Collector adalah pipeline pemrosesan data yang dapat diperluas untuk mengumpulkan data telemetri dari sumber seperti aplikasi dan layanan, lalu mengonversinya ke format yang dibutuhkan oleh sistem target seperti Prometheus.
Pengumpulan data
Aplikasi menggunakan OpenTelemetry SDK untuk menghasilkan data metrik dan mengirimkannya ke Collector menggunakan OpenTelemetry Protocol (OTLP) atau protokol lain, seperti protokol native Prometheus.
Konversi data
Ekstensi Collector dari komunitas menyediakan dua exporter untuk mengonversi metrik OTel ke format Prometheus.
-
Prometheus Exporter mengonversi metrik OpenTelemetry ke format Prometheus dan menyediakan titik akhir bagi agen Prometheus untuk mengambil data.
-
Pemetaan nama metrik: Mengonversi nama metrik OpenTelemetry ke format yang kompatibel dengan Prometheus.
-
Penanganan label: Mempertahankan atau mengganti nama label agar sesuai dengan aturan penamaan Prometheus.
-
Konversi tipe data:
-
gauge→ Prometheusgauge -
sum→ Prometheuscounterataugauge(berdasarkan propertiMonotonic) -
histogram→ Prometheushistogram(dengan menggunakan sub-metrikbucketdansum)
Contoh konfigurasi berikut mengekspos titik akhir pengambilan metrik pada port
1234.exporters: prometheus: endpoint: "0.0.0.0:1234" namespace: "acs" const_labels: label1: value1 send_timestamps: true metric_expiration: 5m enable_open_metrics: true add_metric_suffixes: false resource_to_telemetry_conversion: enabled: true -
-
-
Prometheus Remote Write Exporter mengonversi metrik OpenTelemetry ke format Prometheus dan menuliskannya langsung ke layanan Prometheus target menggunakan protokol Remote Write.
Seperti Prometheus Exporter, exporter ini juga mengonversi format data. Kode berikut memberikan contoh konfigurasinya:
exporters: prometheusremotewrite: endpoint: http://<Prometheus Endpoint>/api/v1/write namespace: "acs" resource_to_telemetry_conversion: enabled: true timeout: 10s headers: Prometheus-Remote-Write-Version: "0.1.0" external_labels: data-mode: metrics
Praktik terbaik untuk aplikasi di kluster ACK
Langkah 1: Siapkan Managed Service for Prometheus
-
Pemantauan Prometheus diaktifkan untuk kluster
Jika pemantauan Prometheus diaktifkan untuk kluster ACK Anda, instans Prometheus sudah tersedia. Masuk ke Konsol CloudMonitor. Di panel navigasi kiri, pilih . Temukan instans Prometheus yang memiliki nama sama dengan kluster ACK Anda dan pastikan instans tersebut berada dalam status Running di wilayah yang ditentukan.
-
Pemantauan Prometheus tidak diaktifkan untuk kluster
Masuk ke Konsol ACK. Klik nama kluster target dan buka halaman Add-ons. Di tab Logging and Monitoring, temukan dan instal komponen ack-arms-prometheus. Setelah instalasi, pemantauan Prometheus akan diaktifkan secara otomatis untuk kluster tersebut. Verifikasi bahwa komponen telah terinstal.
Langkah 2: Terapkan Collector dalam mode sidecar
Untuk perhitungan metrik yang akurat, semua metrik dan jejak dari satu Pod harus dikirim ke Collector yang sama. Penerapan dalam mode gateway memerlukan konfigurasi load balancing yang kompleks. Oleh karena itu, kami merekomendasikan agar Anda menerapkan Collector dalam mode sidecar.
Mode Prometheus Exporter
Metode ini membebaskan Anda dari menangani otentikasi jalur tulis Prometheus. Anda juga dapat mengubah konfigurasi pengambilan untuk menyesuaikan interval pengumpulan metrik.
Diagram arsitektur
Contoh konfigurasi penerapan
# Contoh Deployment Kubernetes
apiVersion: apps/v1
kind: Deployment
spec:
template:
metadata:
labels:
# Tambahkan label spesifik ke Pod. Label biasanya dinamai sesuai aplikasi untuk memudahkan konfigurasi pengambilan metrik.
observability: opentelemetry-collector
spec:
volumes:
- name: otel-config-volume
configMap:
# Konfigurasi ini dibuat berdasarkan contoh konfigurasi Collector berikut.
name: otel-config
containers:
- name: app
image: your-app:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://localhost:4317
- name: otel-collector
# Anda dapat menggunakan image Collector yang kami sediakan. Image tersebut mencakup ekstensi terkait Prometheus.
# Ganti <regionid> dalam nama image dengan ID wilayah Anda.
image: registry-<regionId>.ack.aliyuncs.com/acs/otel-collector:v0.128.0-7436f91
args: ["--config=/etc/otel/config/otel-config.yaml"]
ports:
- containerPort: 1234 # Titik akhir Prometheus
name: metrics
volumeMounts:
- name: otel-config-volume
mountPath: /etc/otel/config</regionid>
Contoh konfigurasi Collector
Konfigurasikan batas sumber daya (CPU dan memori) untuk Collector berdasarkan volume permintaan aplikasi Anda guna memastikan Collector mampu memproses seluruh data.
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-config
namespace: <app-namespace>
data:
otel-config.yaml: |
extensions:
zpages:
endpoint: localhost:55679
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
memory_limiter:
# 75% dari memori maksimum hingga 2 GB
limit_mib: 1536
# 25% dari batas hingga 2 GB
spike_limit_mib: 512
check_interval: 5s
resource:
attributes:
- key: process.runtime.description
action: delete
- key: process.command_args
action: delete
- key: telemetry.distro.version
action: delete
- key: telemetry.sdk.name
action: delete
- key: telemetry.sdk.version
action: delete
- key: service.instance.id
action: delete
- key: process.runtime.name
action: delete
- key: process.runtime.description
action: delete
- key: process.pid
action: delete
- key: process.executable.path
action: delete
- key: process.command.args
action: delete
- key: os.description
action: delete
- key: instance
action: delete
- key: container.id
action: delete
connectors:
spanmetrics:
histogram:
explicit:
buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10]
dimensions:
- name: http.method
default: "GET"
- name: http.response.status_code
- name: http.route
# Atribut kustom
- name: user.id
metrics_flush_interval: 15s
exclude_dimensions:
metrics_expiration: 3m
events:
enabled: true
dimensions:
- name: default
default: "GET"
exporters:
debug:
verbosity: detailed
prometheus:
endpoint: "0.0.0.0:1234"
namespace: "acs"
const_labels:
label1: value1
send_timestamps: true
metric_expiration: 5m
enable_open_metrics: true
add_metric_suffixes: false
resource_to_telemetry_conversion:
enabled: true
service:
pipelines:
logs:
receivers: [otlp]
exporters: [debug]
traces:
receivers: [otlp]
processors: [resource]
exporters: [spanmetrics]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]
metrics/2:
receivers: [spanmetrics]
exporters: [prometheus]
extensions: [zpages]
Konfigurasi ini memproses data metrik dan jejak yang masuk. Konfigurasi ini menggunakan processor tipe resource untuk menghapus atribut lingkungan yang umumnya tidak relevan, sehingga mencegah volume data metrik menjadi terlalu besar. Konfigurasi ini juga menggunakan spanmetrics untuk mengonversi statistik span penting menjadi metrik.
Konfigurasi tugas pengambilan
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: opentelemetry-collector-podmonitor
namespace: default
annotations:
arms.prometheus.io/discovery: "true"
spec:
selector:
matchLabels:
observability: opentelemetry-collector
podMetricsEndpoints:
- port: metrics
interval: 15s
scheme: http
path: /metrics
Mode Prometheus Remote Write Exporter
-
Metode ini cocok untuk skenario dengan volume data besar atau pengambilan yang tidak stabil, di mana Collector menulis langsung ke instans Prometheus.
-
Konfigurasinya lebih kompleks karena Anda perlu mengonfigurasi jalur penulisan data.
Diagram arsitektur
Persiapan jalur penulisan data
Dalam mode ini, Collector menulis data langsung ke instans Prometheus. Anda harus terlebih dahulu mendapatkan titik akhir Prometheus dan informasi otentikasi.
-
Dapatkan titik akhir
Masuk ke Konsol CloudMonitor. Di panel navigasi kiri, pilih dan temukan instans Prometheus yang sesuai dengan kluster Anda. ID dan nama instans Prometheus biasanya sama dengan ID dan nama kluster ACK. Klik nama instans target. Di halaman Settings, temukan Remote Write URL dan salin alamat jaringan internal untuk digunakan nanti.
-
Dapatkan kredensial otentikasi
Pilih salah satu metode berikut:
-
Instans Prometheus V2 mendukung kebijakan tanpa kata sandi yang memungkinkan penulisan tanpa kata sandi dari dalam virtual private cloud (VPC) kluster.
-
Buat pengguna RAM untuk menulis data metrik, berikan kebijakan sistem
AliyunPrometheusMetricWriteAccesskepada pengguna RAM tersebut, lalu peroleh Pasangan Kunci Akses-nya. ID AccessKey digunakan sebagai username dan Rahasia AccessKey digunakan sebagai password untuk menulis data.
-
Contoh konfigurasi penerapan
Konfigurasi penerapan Collector sama dengan mode Prometheus Exporter. Untuk informasi lebih lanjut, lihat contoh konfigurasi penerapan untuk mode Prometheus Exporter.
Contoh konfigurasi Collector
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-config
namespace: <app-namespace>
data:
otel-config.yaml: |
extensions:
zpages:
endpoint: localhost:55679
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
memory_limiter:
# 75% dari memori maksimum hingga 2 GB
limit_mib: 1536
# 25% dari batas hingga 2 GB
spike_limit_mib: 512
check_interval: 5s
resource:
attributes:
- key: process.runtime.description
action: delete
- key: process.command_args
action: delete
- key: telemetry.distro.version
action: delete
- key: telemetry.sdk.name
action: delete
- key: telemetry.sdk.version
action: delete
- key: service.instance.id
action: delete
- key: process.runtime.name
action: delete
- key: process.runtime.description
action: delete
- key: process.pid
action: delete
- key: process.executable.path
action: delete
- key: process.command.args
action: delete
- key: os.description
action: delete
- key: instance
action: delete
- key: container.id
action: delete
connectors:
spanmetrics:
histogram:
explicit:
buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10]
dimensions:
- name: http.method
default: "GET"
- name: http.response.status_code
- name: http.route
# Atribut kustom
- name: user.id
metrics_flush_interval: 15s
exclude_dimensions:
metrics_expiration: 3m
events:
enabled: true
dimensions:
- name: default
default: "GET"
exporters:
debug:
verbosity: detailed
prometheusremotewrite:
# Ganti ini dengan alamat jaringan internal titik akhir Prometheus Remote Write.
endpoint: http://<Endpoint>/api/v3/write
namespace: "acs"
resource_to_telemetry_conversion:
enabled: true
timeout: 10s
headers:
Prometheus-Remote-Write-Version: "0.1.0"
# Header ini diperlukan jika kebijakan tanpa kata sandi tidak diaktifkan.
Authorization: Basic <base64-encoded-username-password>
external_labels:
data-mode: metrics
service:
pipelines:
logs:
receivers: [otlp]
exporters: [debug]
traces:
receivers: [otlp]
processors: [resource]
exporters: [spanmetrics]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheusremotewrite]
metrics/2:
receivers: [spanmetrics]
exporters: [prometheusremotewrite]
extensions: [zpages]
-
Ganti URL titik akhir Prometheus Remote Write dalam konfigurasi dengan URL yang telah Anda peroleh.
-
Untuk menghasilkan nilai
base64-encoded-username-password, jalankan perintah berikut:echo -n 'AK:SK' | base64