全部产品
Search
文档中心

Managed Service for Prometheus:Tulis metrik ke Layanan Terkelola untuk Prometheus berdasarkan OpenTelemetry Collector

更新时间:Aug 29, 2025

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.

    1. Pemetaan nama metrik: mengonversi nama metrik OpenTelemetry ke format yang kompatibel dengan Prometheus.

    2. Pemrosesan label: mempertahankan atau mengganti nama label agar sesuai dengan aturan penamaan Prometheus.

    3. Konversi tipe data:

      • gauge → Prometheus gauge

      • sum → Prometheus counter atau gauge (berdasarkan properti Monotonic)

      • histogram → Prometheus histogram (melalui sub-metrik bucket dan sum)

      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 Managed Service for Prometheus > Instances, dan temukan instans Prometheus dengan nama yang sama dengan kluster ACK Anda.image

  • 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.58

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

Catatan

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/config
Referensi konfigurasi Collector
Catatan

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: /metrics

Mode eksportir Prometheus RemoteWrite

Catatan
  • 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 Managed Service for Prometheus > Instances, 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.57

  • 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

3. Demo OpenTelemetry