Menggunakan metrik berbasis log

Halaman ini membahas dasar-dasar pembuatan log untuk membuat SLI ketersediaan dan latensi. Panduan ini juga memberikan contoh penerapan cara menentukan SLO menggunakan metrik berbasis log.

Menggunakan elemen data dalam entri log untuk membuat indikator tingkat layanan adalah salah satu cara untuk memanfaatkan payload log yang ada. Jika tidak, Anda mungkin dapat menambahkan logging ke layanan yang ada, yang mungkin lebih mudah daripada membuat instrumentasi metrik.

Log dan metrik

Log mengumpulkan data yang disebut entri log yang menjelaskan peristiwa tertentu yang terjadi di sistem komputer. Log ditulis oleh kode, oleh layanan platform tempat kode berjalan (misalnya, Dataflow), dan infrastruktur yang menjadi dependensi platform (misalnya, instance Compute Engine).

Karena log dalam sistem modern berasal dari—dan terkadang masih berupa—file teks yang ditulis ke disk, entri log analog dengan baris dalam file log dan dapat dianggap sebagai unit kuantum logging.

Entri log minimal terdiri dari dua hal:

  • Stempel waktu yang menunjukkan kapan peristiwa terjadi atau saat peristiwa tersebut ditransfer ke sistem logging
  • Payload teks, baik sebagai data teks tidak terstruktur maupun data terstruktur, paling umum dalam JSON.

Log juga dapat membawa metadata terkait, terutama saat ditransfer ke Cloud Logging. Metadata tersebut dapat mencakup resource yang menulis log, nama log, dan tingkat keparahan untuk setiap entri.

Log

Log digunakan untuk dua tujuan utama:

  • Log Peristiwa menjelaskan peristiwa tertentu yang terjadi dalam sistem. Anda dapat menggunakan log peristiwa untuk menampilkan pesan yang meyakinkan pengguna bahwa semuanya berfungsi dengan baik ("tugas berhasil") atau untuk memberikan informasi saat terjadi kegagalan ("menerima pengecualian dari server").
  • Log Transaksi menjelaskan detail setiap transaksi yang diproses oleh sistem atau komponen. Misalnya, load balancer mencatat setiap permintaan yang diterima, baik permintaan berhasil diselesaikan maupun tidak, dan mencatat informasi tambahan seperti URL yang diminta, kode respons HTTP, dan mungkin informasi seperti backend mana yang digunakan untuk menayangkan permintaan.

Metrik

Tidak seperti log, metrik biasanya tidak mendeskripsikan peristiwa tertentu. Lebih umum lagi, metrik digunakan untuk mewakili status atau kondisi sistem dari waktu ke waktu. Metrik terdiri dari serangkaian titik data yang mengukur sesuatu tentang sistem Anda; setiap titik data menyertakan stempel waktu dan nilai numerik.

Metrik juga dapat memiliki metadata yang terkait dengannya; serangkaian titik data, yang disebut sebagai deret waktu, dapat mencakup informasi seperti nama metrik, deskripsi, dan sering kali label yang menentukan resource mana yang menulis data. Untuk informasi tentang model metrik Monitoring, lihat Metrik, deret waktu, dan resource.

Metrik berbasis log

Metrik berbasis log adalah metrik yang dibuat dari entri log dengan mengekstrak informasi dari entri log dan mengubahnya menjadi data deret waktu. Cloud Logging menyediakan mekanisme untuk membuat dua jenis metrik dari entri log:

  • Metrik penghitung, yang menghitung jumlah entri log yang cocok dengan filter tertentu. Anda dapat menggunakan metrik penghitung untuk menentukan, misalnya, jumlah permintaan atau error yang dicatat dalam log.

  • Metrik distribusi, yang menggunakan ekspresi reguler untuk mengurai payload di setiap entri log guna mengekstrak nilai numerik sebagai distribusi.

Untuk informasi selengkapnya tentang metrik berbasis log di Cloud Logging, lihat Menggunakan metrik berbasis log.

Menggunakan metrik berbasis log sebagai SLI

Metrik berbasis log memungkinkan Anda mengekstrak data dari log dalam bentuk yang dapat digunakan untuk membuat SLI di Monitoring:

  • Anda dapat menggunakan metrik penghitung berbasis log untuk menyatakan SLI ketersediaan berbasis permintaan.

  • Anda dapat menggunakan metrik distribusi berbasis log untuk menyatakan SLI latensi berbasis permintaan.

Contoh entri log

Aplikasi Stack Doctor adalah contoh layanan yang diinstrumentasikan untuk memunculkan pesan log yang berisi informasi tentang semua permintaan, error, dan latensi yang dibuat untuk layanan. Kode untuk layanan ini tersedia di repositori GitHub stack-doctor.

Layanan ini menghasilkan entri log Cloud Logging dalam log projects/stack-doctor/logs/bunyan_log. Entri log untuk setiap jenis peristiwa menyertakan nilai message yang berbeda. Entri log untuk berbagai jenis peristiwa terlihat seperti berikut:

  • Pada setiap permintaan:

    {
      "insertId": "..........iTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "pid": 81846,
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "hostname": "<hostname>",
        "level": 30,
        "message": "request made",
        "v": 0,
        "name": "sli-log"
      },
        "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.263999938Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.003471183Z"
    }
    
  • Jika permintaan berhasil:

    {
      "insertId": "..........qTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "name": "sli-log",
        "v": 0,
        "pid": 81846,
        "level": 30,
        "hostname": "<hostname>",
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "message": "success!"
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Pada permintaan yang sudah selesai:

    {
      "insertId": "..........mTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "level": 30,
        "name": "sli-log",
        "message": "slept for 606 ms",
        "hostname": "<hostname>",
        "pid": 81846,
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Saat error:

    {
      "insertId": "..........DTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "hostname": "<hostname>",
        "level": 50,
        "pid": 81846,
        "message": "failure!",
        "name": "sli-log",
        "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)",
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:44.414999961Z",
      "severity": "ERROR",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:46.182157077Z"
    }
    

Berdasarkan entri ini, Anda dapat membuat metrik berbasis log yang menghitung semua permintaan, menghitung error, dan melacak latensi permintaan. Kemudian, Anda dapat menggunakan metrik berbasis log untuk membuat SLI ketersediaan dan latensi.

Membuat metrik berbasis log untuk SLI.

Sebelum dapat membuat SLI pada metrik berbasis log, Anda harus membuat metrik berbasis log.

  • Untuk SLI ketersediaan pada jumlah permintaan dan error, gunakan metrik penghitung berbasis log.
  • Untuk SLI latensi, gunakan metrik distribusi berbasis log.

Setelah membuat metrik berbasis log, Anda dapat menemukannya di Monitoring dengan menelusurinya di Metrics Explorer. Di Monitoring, metrik berbasis log memiliki awalan logging.googleapis.com/user.

Metrik untuk SLI ketersediaan

Anda menyatakan SLI ketersediaan berbasis permintaan di Cloud Monitoring API dengan menggunakan struktur TimeSeriesRatio untuk menyiapkan rasio permintaan "baik" atau "buruk" terhadap total permintaan. Rasio ini digunakan di kolom goodTotalRatio dari struktur RequestBasedSli.

Anda harus membuat metrik penghitung berbasis log yang dapat digunakan untuk membuat rasio ini. Anda harus membuat setidaknya dua dari hal berikut:

  1. Metrik yang menghitung total peristiwa; gunakan metrik ini di totalServiceFilter rasio.

    Untuk contoh "stack-doctor", Anda dapat membuat metrik berbasis log yang menghitung entri log tempat string pesan "request made" muncul.

  2. Metrik yang menghitung peristiwa "buruk", gunakan metrik ini dalam badServiceFilter rasio.

    Untuk contoh "stack-doctor", Anda dapat membuat metrik berbasis log yang menghitung entri log tempat string pesan "failure!" muncul.

  3. Metrik yang menghitung peristiwa "baik", gunakan metrik ini dalam goodServiceFilter rasio.

    Untuk contoh "stack-doctor", Anda dapat membuat metrik berbasis log yang menghitung entri log tempat string pesan "success!" muncul.

SLI yang dijelaskan untuk contoh ini didasarkan pada metrik untuk total permintaan bernama log_based_total_requests, dan metrik untuk error bernama log_based_errors.

Anda dapat membuat metrik berbasis log menggunakan konsol Google Cloud, Cloud Logging API, atau Google Cloud CLI. Untuk membuat metrik penghitung berbasis log menggunakan konsol Google Cloud, Anda dapat menggunakan prosedur berikut:

  1. Di konsol Google Cloud, buka halaman Log-based Metrics:

    Buka Metrik Berbasis Log

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

    Halaman metrik berbasis log menampilkan tabel metrik yang ditentukan pengguna dan tabel metrik yang ditentukan sistem.

  2. Klik Create Metric, yang terletak di atas tabel metrik yang ditentukan pengguna.

  3. Di panel Metric type, pilih Counter.

  4. Di panel Details, beri nama metrik baru Anda. Untuk contoh "stack-doctor", masukkan log_based_total_requests atau log_based_errors.

    Anda dapat mengabaikan kolom lainnya untuk contoh ini.

  5. Di panel Filter selection, buat kueri yang hanya mengambil entri log yang ingin Anda hitung dalam metrik.

    Untuk contoh "stack-doctor", kueri untuk log_based_total_requests dapat mencakup hal berikut:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="request made"
    

    Kueri untuk logs_based_errors mengubah string pesan:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="failure!"
    
  6. Klik Pratinjau log untuk memeriksa filter Anda, dan sesuaikan jika perlu.

  7. Abaikan panel Label untuk contoh ini.

  8. Klik Create Metric untuk menyelesaikan prosedur.

Untuk informasi selengkapnya tentang cara membuat metrik penghitung berbasis log, lihat Membuat metrik penghitung.

Metrik untuk SLI latensi

Anda menyatakan SLI latensi berbasis permintaan di Cloud Monitoring API dengan menggunakan struktur DistributionCut, yang digunakan di kolom distributionCut dari struktur RequestBasedSli. Anda harus membuat metrik distribusi berbasis log untuk membuat SLI latensi. Contoh ini membuat metrik distribusi berbasis log bernama log_based_latency.

Anda dapat membuat metrik berbasis log menggunakan konsol Google Cloud, Cloud Logging API, atau Google Cloud CLI. Untuk membuat metrik distribusi berbasis log menggunakan konsol Google Cloud, Anda dapat menggunakan prosedur berikut:

  1. Di konsol Google Cloud, buka halaman Log-based Metrics:

    Buka Metrik Berbasis Log

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

    Halaman metrik berbasis log menampilkan tabel metrik yang ditentukan pengguna dan tabel metrik yang ditentukan sistem.

  2. Klik Create Metric, yang terletak di atas tabel metrik yang ditentukan pengguna.

  3. Di panel Jenis metrik, pilih Distribusi.

  4. Di panel Details, beri nama metrik baru Anda. Untuk contoh "stack-doctor", masukkan log_based_latency.

    Anda dapat mengabaikan kolom lainnya untuk contoh ini.

  5. Di panel Filter selection, buat kueri yang hanya mengambil entri log yang ingin Anda hitung dalam metrik.

    Untuk contoh "stack-doctor", kueri untuk log_based_latency dapat mencakup hal berikut:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="slept for"
    

    Tentukan kolom berikut untuk kueri filter:

    • Nama kolom: json.message
    • Regular expression: \s(\d*)\s

      String pesan untuk permintaan yang telah selesai memiliki bentuk "tidur selama n md". Ekspresi reguler mengekstrak nilai latensi n dari string.

  6. Abaikan panel Label untuk contoh ini.

  7. Klik Create Metric untuk menyelesaikan prosedur.

Untuk informasi selengkapnya tentang cara membuat metrik distribusi berbasis log, lihat Membuat Metrik distribusi.

SLI Ketersediaan

Di Cloud Monitoring, Anda menyatakan SLI ketersediaan berbasis permintaan menggunakan struktur TimeSeriesRatio. Contoh berikut menunjukkan SLO yang menggunakan metrik log_based_total_requests dan log_based_errors dalam rasio. SLO ini mengharapkan rasio permintaan "baik" terhadap total permintaan minimal 98% selama periode 24 jam bergulir:

{
 "serviceLevelIndicator": {
   "requestBased": {
     "goodTotalRatio": {
       "totalServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
          resource.type=\"global\"",
       "badServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_errors\"
          resource.type=\"global\""
     }
   }
 },
 "goal": 0.98,
 "rollingPeriod": "86400s",
 "displayName": "Log-Based Availability"
}

SLI berdasarkan Latensi

Di Cloud Monitoring, Anda menyatakan SLI latensi berbasis permintaan menggunakan struktur DistributionCut. Contoh berikut menunjukkan SLO yang menggunakan metrik log_based_latency dan mengharapkan 98% permintaan berada di bawah 500 md selama periode 24 jam bergulir:

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"logging.googleapis.com/user/log_based_latency\"
          resource.type=\"global\"",
        "range": {
          "min": 0,
          "max": 500
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 500 ms"
}

Referensi lainnya