Solusi ini memungkinkan pemantauan metrik komprehensif untuk aplikasi yang diterapkan di kluster Container Service for Kubernetes (ACK) dengan instrumen OpenTelemetry SDK melalui Layanan Terkelola untuk Prometheus Alibaba Cloud. Metrik OTel asli, metrik instrumen bisnis kustom, dan metrik yang dikonversi dari rentang jejak dapat dikumpulkan secara seragam. Mengonversi data jejak menjadi metrik dapat secara efektif mengurangi volume ingesti data.
Ikhtisar OpenTelemetry
OpenTelemetry (OTel) adalah kerangka observabilitas sumber terbuka yang menyediakan API, SDK, dan alat terpadu untuk menghasilkan, mengumpulkan, dan mengekspor data telemetri (termasuk metrik, jejak, dan log) dari sistem terdistribusi. Tujuan utamanya adalah untuk memecahkan masalah fragmentasi data observabilitas antara alat dan sistem yang berbeda.
Metrik OpenTelemetry adalah data terstruktur yang mengukur perilaku sistem, digunakan untuk memantau performa dan status kesehatan sistem. Sumber metrik bergantung pada instrumen SDK atau agen dalam berbagai bahasa. Untuk aplikasi Java, metrik biasanya mencakup metrik JVM standar, metrik kustom, dan metrik yang dikonversi dari data jejak.
Desain metrik OpenTelemetry kompatibel dengan Prometheus. Melalui OpenTelemetry Collector, metrik dapat dikonversi ke format Prometheus, memungkinkan integrasi tanpa hambatan dengan Layanan Terkelola untuk Prometheus Alibaba Cloud.
Peran OpenTelemetry Collector
OpenTelemetry Collector adalah pipa pengolahan data yang dapat diperluas yang bertanggung jawab untuk mengumpulkan data telemetri dari sumber data (seperti aplikasi dan layanan) dan mengonversi data tersebut ke format yang dibutuhkan oleh sistem target (seperti Prometheus).
Pengumpulan data
Aplikasi menghasilkan data metrik melalui OpenTelemetry SDK dan mengirimkannya ke Collector melalui Protokol OpenTelemetry (OTLP) atau protokol lainnya (seperti protokol Prometheus asli).
Transformasi data
Dalam ekstensi Collector komunitas, Anda dapat menggunakan dua eksportir berikut untuk mengonversi metrik OTel ke format Prometheus.
Prometheus exporter mengonversi metrik OpenTelemetry ke format Prometheus dan menyediakan titik akhir untuk Agen Prometheus untuk mengambil data.
Pemetaan nama metrik: mengonversi nama metrik OpenTelemetry ke format yang kompatibel dengan Prometheus.
Pemrosesan label: mempertahankan atau mengganti nama label agar sesuai dengan aturan penamaan Prometheus.
Konversi tipe data:
gauge→ Prometheusgaugesum→ Prometheuscounterataugauge(berdasarkan propertiMonotonic)histogram→ Prometheushistogram(melalui sub-metrikbucketdansum)
Berikut adalah contoh konfigurasi yang menunjukkan 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 menulis langsung ke layanan Prometheus target melalui protokol RemoteWrite.
Seperti Prometheus exporter, eksportir ini juga melakukan konversi format data. Contoh konfigurasi:
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 yang diterapkan di kluster ACK
1. Persiapkan di Layanan Terkelola untuk Prometheus
Kluster dengan pemantauan Prometheus diaktifkan
Jika pemantauan Prometheus diaktifkan untuk kluster ACK Anda, instans Prometheus sudah ada. Anda dapat masuk ke Konsol CloudMonitor, navigasikan ke halaman , dan temukan instans Prometheus dengan nama yang sama dengan kluster ACK Anda.

Kluster tanpa pemantauan Prometheus diaktifkan
Masuk ke Konsol ACK, klik nama kluster, navigasikan ke halaman Add-ons, lalu instal komponen ack-arms-prometheus, yang akan otomatis mengaktifkan pemantauan Prometheus untuk kluster.

2. Terapkan Collector dalam mode SideCar
Karena perhitungan statistik metrik memerlukan metrik atau jejak dari instance pod yang sama untuk mencapai Collector yang sama, menggunakan mode penyebaran Gateway memerlukan penanganan penyeimbangan beban, yang relatif kompleks. Oleh karena itu, kami sarankan Anda menerapkan Collector dalam mode SideCar.
Mode eksportir Prometheus
Keuntungan dari pendekatan ini adalah Anda tidak perlu menangani otentikasi jalur tulis Prometheus, dan dapat menyesuaikan interval pengumpulan metrik dengan memodifikasi konfigurasi pengumpulan.
Diagram arsitektur penyebaran
Referensi konfigurasi penyebaran
# Contoh Deployment Kubernetes
apiVersion: apps/v1
kind: Deployment
spec:
template:
metadata:
labels:
# Tambahkan label spesifik ke pod, biasanya dinamai dengan informasi aplikasi untuk mempermudah konfigurasi pengumpulan metrik
observability: opentelemetry-collector
spec:
volumes:
- name: otel-config-volume
configMap:
# Konfigurasi ini dibuat menggunakan referensi konfigurasi Collector di bawah ini
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 langsung menggunakan gambar Collector yang disediakan (yang mencakup plugin ekstensi terkait Prometheus)
# Ganti regionId dalam nama gambar dengan ID wilayah sebenarnya
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/configReferensi konfigurasi Collector
Konfigurasikan batas sumber daya (CPU dan memori) Collector sesuai dengan volume permintaan aplikasi untuk memastikan ia dapat memproses semua data dengan benar.
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 2G
limit_mib: 1536
# 25% dari batas hingga 2G
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 metrik dan jejak masuk, menggunakan prosesor tipe resource processors untuk membuang atribut lingkungan yang biasanya tidak relevan, mencegah volume data metrik yang berlebihan. Ini menggunakan spanmetrics untuk mengonversi statistik rentang utama menjadi metrik.
Konfigurasikan tugas pengumpulan
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: /metricsMode eksportir Prometheus RemoteWrite
Pendekatan ini cocok untuk skenario dengan volume data besar dan pengumpulan yang tidak stabil, di mana Collector menulis langsung ke instans Prometheus.
Konfigurasinya relatif kompleks dan memerlukan penanganan konfigurasi jalur tulis data sendiri.
Diagram arsitektur penyebaran
Persiapkan jalur tulis data
Karena metode ini melibatkan Collector menulis data langsung ke instans Prometheus, Anda pertama-tama perlu mendapatkan titik akhir Prometheus dan informasi otentikasi.
Mendapatkan Titik Akhir
Masuk ke Konsol CloudMonitor, navigasikan ke halaman , temukan instans Prometheus yang sesuai dengan kluster Anda. Dalam banyak kasus, ID instans Prometheus sesuai dengan ID kluster ACK, dan nama instans sesuai dengan nama kluster kontainer. Klik nama instans. Di halaman Settings, temukan URL Penulisan Jarak Jauh dan dapatkan alamat jaringan internal untuk digunakan nanti.

Mendapatkan Informasi Otentikasi
Anda memiliki dua opsi berikut:
V2 Instans Prometheus mendukung konfigurasi kebijakan tanpa kata sandi, memungkinkan penulisan tanpa kata sandi dari dalam virtual private cloud (VPC) kluster saat ini.
Tetapkan Pengguna Resource Access Management (RAM) untuk penulisan data metrik, tetapkan kebijakan sistem AliyunPrometheusMetricWriteAccess, lalu dapatkan Pasangan Kunci Akses pengguna RAM untuk digunakan sebagai nama pengguna dan kata sandi untuk penulisan.
Referensi konfigurasi penyebaran
Konfigurasi penyebaran Collector sama dengan mode eksportir Prometheus.
Referensi 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 2G
limit_mib: 1536
# 25% dari batas hingga 2G
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 dengan alamat internal jaringan Prometheus RemoteWrite
endpoint: http://<Endpoint>/api/v3/write
namespace: "acs"
resource_to_telemetry_conversion:
enabled: true
timeout: 10s
headers:
Prometheus-Remote-Write-Version: "0.1.0"
# Konfigurasi ini diperlukan jika mode 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 titik akhir RemoteWrite Prometheus dalam konfigurasi dengan alamat yang diperoleh sebelumnya.
Jalankan perintah berikut untuk mendapatkan nilai
base64-encoded-username-password:echo -n 'AK:SK' | base64