Menggunakan metrik berbasis log

Halaman ini membahas dasar-dasar memancarkan log untuk membuat SLI ketersediaan dan latensi. Dokumen 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 dapat menambahkan logging ke layanan yang ada, yang mungkin lebih mudah daripada membuat instrumentasi metrik.

Log dan metrik

Log mengumpulkan rekaman 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 dasar 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 pencatatan log.

Entri log minimal terdiri dari dua hal:

  • Stempel waktu yang menunjukkan kapan peristiwa terjadi atau kapan peristiwa tersebut dimasukkan ke dalam sistem pencatatan log
  • Payload teks, baik sebagai data teks tidak terstruktur atau data terstruktur, paling umum dalam JSON.

Log juga dapat membawa metadata terkait, terutama saat di-ingest 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 berjalan 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 diterimanya, baik permintaan tersebut berhasil diselesaikan atau tidak, dan mencatat informasi tambahan seperti URL yang diminta, kode respons HTTP, dan mungkin informasi seperti backend mana yang digunakan untuk melayani permintaan.

Metrik

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

Metrik juga dapat memiliki metadata yang terkait dengannya; rangkaian 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 mengetahui 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 mengetahui 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 memancarkan pesan log yang berisi informasi tentang semua permintaan, error, dan latensi yang dibuat ke layanan. Kode untuk layanan ini tersedia di repositori GitHub stack-doctor.

Layanan ini membuat entri log Cloud Logging di log projects/stack-doctor/logs/bunyan_log. Entri log untuk setiap jenis peristiwa menyertakan nilai message yang berbeda. Entri log untuk berbagai jenis peristiwa akan 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"
    }
    
  • Untuk permintaan yang 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 telah 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 terjadi 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 hal berikut:

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

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

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

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

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

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

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 Google Cloud konsol, 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 Log-based Metrics

    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 Buat Metrik, yang berada di atas tabel metrik yang ditentukan pengguna.

  3. Di panel Jenis metrik, pilih Penghitung.

  4. Di panel Detail, 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 Pilihan filter, 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 Buat Metrik untuk menyelesaikan prosedur.

Untuk mengetahui 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 Google Cloud konsol, 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 Log-based Metrics

    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 Buat Metrik, yang berada di atas tabel metrik yang ditentukan pengguna.

  3. Di panel Jenis metrik, pilih Distribusi.

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

    Anda dapat mengabaikan kolom lainnya untuk contoh ini.

  5. Di panel Pilihan filter, 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 "slept for n ms". Ekspresi reguler mengekstrak nilai latensi n dari string.

  6. Abaikan panel Label untuk contoh ini.

  7. Klik Buat Metrik untuk menyelesaikan prosedur.

Untuk mengetahui 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 setidaknya 98% selama periode 24 jam yang terus berjalan:

{
 "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 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