Logging dan pemantauan aplikasi

Halaman ini menunjukkan cara mengonfigurasi cluster pengguna untuk Google Distributed Cloud agar log dan metrik kustom dari aplikasi pengguna akan dikirim ke Cloud Logging dan Cloud Monitoring. Metrik dari aplikasi pengguna dikumpulkan dengan Google Cloud Managed Service for Prometheus.

Mengaktifkan Google Cloud Managed Service for Prometheus untuk aplikasi pengguna

Konfigurasi untuk Google Cloud Managed Service for Prometheus adalah disimpan di objek Stackdriver bernama stackdriver.

  1. Buka objek stackdriver untuk mengedit:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    Ganti USER_CLUSTER_KUBECONFIG dengan jalur pengguna Anda file kubeconfig cluster.

  2. Di bagian spec, tetapkan enableGMPForApplications ke true:

      apiVersion: addons.gke.io/v1alpha1
      kind: Stackdriver
      metadata:
        name: stackdriver
        namespace: kube-system
      spec:
        projectID: ...
        clusterName: ...
        clusterLocation: ...
        proxyConfigSecretName: ...
        enableGMPForApplications: true
        enableVPC: ...
        optimizedMetrics: true
    
  3. Tutup file yang diedit. Tindakan ini akan mulai menjalankan komponen Prometheus (GMP) yang dikelola Google di cluster.

  4. Untuk memeriksa komponen, jalankan perintah berikut:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace gmp-system get pods
    

    Output perintah ini akan mirip dengan berikut ini:

     NAME                                 READY   STATUS    RESTARTS        AGE
     collector-abcde                      2/2     Running   1 (5d18h ago)   5d18h
     collector-fghij                      2/2     Running   1 (5d18h ago)   5d18h
     collector-klmno                      2/2     Running   1 (5d18h ago)   5d18h
     gmp-operator-68d49656fc-abcde        1/1     Running   0               5d18h
     rule-evaluator-7c686485fc-fghij      2/2     Running   1 (5d18h ago)   5d18h
    

Managed Service for Prometheus mendukung evaluasi dan pemberitahuan aturan. Untuk menyiapkan evaluasi aturan, lihat Evaluasi aturan.

Menjalankan aplikasi contoh

Di bagian ini, Anda akan membuat aplikasi yang memunculkan metrik Prometheus, dan menggunakan Prometheus yang dikelola Google untuk mengumpulkan metrik. Untuk informasi selengkapnya, lihat Google Cloud Managed Service for Prometheus.

Men-deploy aplikasi contoh

  1. Buat namespace gmp-test untuk resource yang Anda buat sebagai bagian dari aplikasi contoh:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG create ns gmp-test
    
  2. Layanan terkelola menyediakan manifes untuk aplikasi contoh yang memunculkan Metrik Prometheus di port metrics-nya. Aplikasi ini menggunakan tiga replika.

    Untuk men-deploy aplikasi contoh, jalankan perintah berikut:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
    

Mengonfigurasi resource PodMonitoring

Untuk menyerap data metrik yang dikeluarkan oleh aplikasi contoh, Anda menggunakan penyalinan target. Layanan terkelola menggunakan Resource kustom PodMonitoring (CR) untuk mengonfigurasi penyalinan target dan penyerapan metrik. Anda dapat mengonversi resource operator prometheus yang ada ke CR PodMonitoring.

Scraping CR PodMonitoring hanya menargetkan di namespace tempat CR di-deploy. Untuk melakukan scraping target di beberapa namespace, deploy CR PodMonitoring yang sama di setiap namespace. Anda dapat memastikan bahwa resource PodMonitoring sudah diinstal di namespace yang diinginkan dengan menjalankan perintah berikut:

 kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get podmonitoring -A

Untuk dokumentasi referensi tentang semua Google Cloud Managed Service for Prometheus CR, lihat referensi prometheus-engine/doc/api.

Manifes berikut menentukan resource PodMonitoring, prom-example, di namespace gmp-test. Resource menemukan semua Pod di namespace yang memiliki label app dengan nilai prom-example. Pod yang cocok adalah disalin pada port bernama metrics, setiap 30 detik, pada /metrics Jalur HTTP.

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: prom-example
spec:
  selector:
    matchLabels:
      app: prom-example
  endpoints:
  - port: metrics
    interval: 30s

Untuk menerapkan resource ini, jalankan perintah berikut:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml

Managed Service for Prometheus kini menyalin Pod yang cocok.

Membuat kueri data metrik

Cara paling sederhana untuk memverifikasi bahwa data Prometheus Anda diekspor adalah dengan menggunakan Kueri PromQL di Metrics Explorer di Konsol Google Cloud.

Untuk menjalankan kueri PromQL, lakukan hal berikut:

  1. Di konsol Google Cloud, buka halaman Monitoring atau klik tombol berikut:

    Buka Monitoring

  2. Pada panel navigasi, pilih Metrics Explorer.

  3. Gunakan Bahasa Kueri Prometheus (PromQL) untuk menentukan data yang akan ditampilkan di bagan:

    1. Di toolbar panel Select a metric, pilih Code Editor.

    2. Pilih PromQL di tombol Language. Tombol bahasa adalah di bagian bawah panel Code Editor.

    3. Masukkan kueri Anda ke dalam editor kueri. Misalnya, untuk membuat diagram jumlah rata-rata detik yang dihabiskan CPU di setiap mode selama satu jam terakhir, gunakan kueri berikut:

      avg(rate(kubernetes_io:anthos_container_cpu_usage_seconds_total
      {monitored_resource="k8s_node"}[1h]))
      

    Untuk informasi selengkapnya tentang penggunaan PromQL, lihat PromQL di Cloud Monitoring.

Screenshot berikut menampilkan diagram yang menampilkan Metrik anthos_container_cpu_usage_seconds_total:

Diagram Managed Service for Prometheus untuk metrik `anthos_container_cpu_usage_seconds_total` Prometheus.

Jika Anda mengumpulkan banyak data, Anda mungkin ingin memfilter metrik yang diekspor untuk menekan biaya.

Mengaktifkan Cloud Logging untuk aplikasi pengguna

Konfigurasi untuk Logging disimpan di objek Stackdriver bernama stackdriver.

  1. Buka objek stackdriver untuk mengedit:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    Ganti USER_CLUSTER_KUBECONFIG dengan jalur pengguna Anda file kubeconfig cluster.

  2. Di bagian spec, tetapkan enableCloudLoggingForApplications ke true:

      apiVersion: addons.gke.io/v1alpha1
      kind: Stackdriver
      metadata:
        name: stackdriver
        namespace: kube-system
      spec:
        projectID: ...
        clusterName: ...
        clusterLocation: ...
        proxyConfigSecretName: ...
        enableCloudLoggingForApplications: true
        enableVPC: ...
        optimizedMetrics: true
    
  3. Tutup file yang diedit.

Menjalankan aplikasi contoh

Di bagian ini, Anda akan membuat aplikasi yang menulis log kustom.

  1. Simpan manifes Deployment berikut ke file bernama my-app.yaml.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: "monitoring-example"
      namespace: "default"
      labels:
        app: "monitoring-example"
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: "monitoring-example"
      template:
        metadata:
          labels:
            app: "monitoring-example"
        spec:
          containers:
          - image: gcr.io/google-samples/prometheus-dummy-exporter:latest
            name: prometheus-example-exporter
            imagePullPolicy: Always
            command:
            - /bin/sh
            - -c
            - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090
            resources:
              requests:
                cpu: 100m
    
  2. Membuat Deployment:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
    

Melihat log aplikasi

Konsol

  1. Buka Logs Explorer di konsol Google Cloud.

    Buka Logs Explorer

  2. Klik Resource. Pada ALL_RESOURCE_TYPES, pilih Kubernetes Container.

  3. Di bagian CLUSTER_NAME, pilih nama cluster pengguna Anda.

  4. Di bagian NAMESPACE_NAME, pilih default.

  5. Klik Add, lalu klik Run Query.

  6. Di bawah Query results, Anda dapat melihat entri log dari Deployment monitoring-example. Contoh:

    {
      "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n",
      "insertId": "1oa4vhg3qfxidt",
      "resource": {
        "type": "k8s_container",
        "labels": {
          "pod_name": "monitoring-example-7685d96496-xqfsf",
          "cluster_name": ...,
          "namespace_name": "default",
          "project_id": ...,
          "location": "us-west1",
          "container_name": "prometheus-example-exporter"
        }
      },
      "timestamp": "2020-11-14T01:24:24.358600252Z",
      "labels": {
        "k8s-pod/pod-template-hash": "7685d96496",
        "k8s-pod/app": "monitoring-example"
      },
      "logName": "projects/.../logs/stdout",
      "receiveTimestamp": "2020-11-14T01:24:39.562864735Z"
    }
    

gcloud

  1. Jalankan perintah ini:

    gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \
        resource.type="k8s_container" AND resource.labels.namespace_name="default"'
    

    Ganti PROJECT_ID dengan ID Anda project pemantauan logging.

  2. Di output, Anda dapat melihat entri log dari monitoring-example Penyebaran. Contoh:

    insertId: 1oa4vhg3qfxidt
    labels:
      k8s-pod/app: monitoring-example
      k8s- pod/pod-template-hash: 7685d96496
    logName: projects/.../logs/stdout
    receiveTimestamp: '2020-11-14T01:24:39.562864735Z'
    resource:
      labels:
        cluster_name: ...
        container_name: prometheus-example-exporter
        location: us-west1
        namespace_name: default
        pod_name: monitoring-example-7685d96496-xqfsf
        project_id: ...
      type: k8s_container
    textPayload: |
      2020/11/14 01:24:24 Starting to listen on :9090
    timestamp: '2020-11-14T01:24:24.358600252Z'
    

Filter log aplikasi

Pemfilteran log aplikasi dapat mengurangi penagihan dan jaringan logging aplikasi traffic dari cluster ke Cloud Logging. Dimulai dengan Google Distributed Cloud rilis 1.15.0, saat enableCloudLoggingForApplications disetel ke true, Anda dapat memfilter log aplikasi berdasarkan kriteria berikut:

  • Label pod (podLabelSelectors)
  • Namespace (namespaces)
  • Ekspresi reguler untuk konten log (contentRegexes)

Google Distributed Cloud hanya mengirimkan hasil filter ke Cloud Logging.

Menentukan filter log aplikasi

Konfigurasi untuk Logging ditentukan dalam Stackdriver objek bernama stackdriver.

  1. Buka objek stackdriver untuk mengedit:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        edit stackdriver stackdriver
    

    Ganti USER_CLUSTER_KUBECONFIG dengan jalur ke file {i> kubeconfig cluster<i} pengguna Anda.

  2. Tambahkan bagian appLogFilter ke spec:

      apiVersion: addons.gke.io/v1alpha1
      kind: Stackdriver
      metadata:
        name: stackdriver
        namespace: kube-system
      spec:
        enableCloudLoggingForApplications: true
        projectID: ...
        clusterName: ...
        clusterLocation: ...
        appLogFilter:
          keepLogRules:
          - namespaces:
            - prod
            ruleName: include-prod-logs
          dropLogRules:
          - podLabelSelectors:
            - disableGCPLogging=yes
            ruleName: drop-logs
    
  3. Simpan dan tutup file yang telah diedit.

  4. (Opsional) Jika Anda menggunakan podLabelSelectors, mulai ulang stackdriver-log-forwarder DaemonSet untuk menerapkan perubahan Anda segera mungkin:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        rollout restart daemonset stackdriver-log-forwarder
    

    Biasanya, podLabelSelectors akan efektif setelah 10 menit. Memulai ulang DaemonSet stackdriver-log-forwarder membuat perubahan lebih efektif dengan cepat.

Contoh: Sertakan log ERROR atau WARN hanya di namespace prod

Contoh berikut mengilustrasikan cara kerja filter log aplikasi. Anda menentukan filter yang menggunakan namespace (prod), ekspresi reguler (.*(ERROR|WARN).*), dan label Pod (disableGCPLogging=yes). Lalu, untuk memverifikasi filter berfungsi, jalankan Pod di namespace prod untuk mengujinya kondisi filter.

Untuk menentukan dan menguji filter log aplikasi:

  1. Tentukan filter log aplikasi di objek Stackdriver:

    Pada contoh appLogFilter berikut, hanya ERROR atau WARN yang mencatat log dalam Namespace prod dipertahankan. Semua log untuk Pod yang memiliki label disableGCPLogging=yes dihapus:

    apiVersion: addons.gke.io/v1alpha1
    kind: Stackdriver
    metadata:
      name: stackdriver
      namespace: kube-system
    spec:
      ...
      appLogFilter:
        keepLogRules:
        - namespaces:
          - prod
          contentRegexes:
          - ".*(ERROR|WARN).*"
          ruleName: include-prod-logs
        dropLogRules:
        - podLabelSelectors:
          - disableGCPLogging=yes # kubectl label pods pod disableGCPLogging=yes
          ruleName: drop-logs
    ...
    
  2. Deploy Pod di namespace prod dan jalankan skrip yang menghasilkan ERROR dan INFO entri log:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG run pod1 \
        --image gcr.io/cloud-marketplace-containers/google/debian10:latest \
        --namespace prod --restart Never --command -- \
        /bin/sh -c "while true; do echo 'ERROR is 404\\nINFO is not 404' && sleep 1; done"
    

    Log yang difilter hanya boleh berisi entri ERROR, bukan INFO entri.

  3. Tambahkan label disableGCPLogging=yes ke Pod:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \
        --namespace prod disableGCPLogging=yes
    

    Log yang difilter tidak akan lagi berisi entri untuk Pod pod1.

Definisi API filter log aplikasi

Definisi untuk filter log aplikasi dideklarasikan dalam stackdriver definisi resource kustom.

Untuk mendapatkan definisi resource kustom stackdriver, jalankan perintah berikut:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
    --namespace kube-system -o yaml