Menggunakan metrik berbasis log

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

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

Log dan metrik

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

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

Entri log setidaknya terdiri dari dua hal:

  • Stempel waktu yang menunjukkan kapan peristiwa terjadi atau saat diserap ke dalam sistem logging
  • Payload teks, baik sebagai data teks tidak terstruktur atau data terstruktur, paling sering di JSON.

Log juga dapat membawa metadata terkait, terutama saat diserap 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 menghasilkan pesan yang meyakinkan pengguna bahwa segala sesuatunya berfungsi dengan baik ("tugas berhasil") atau untuk memberikan informasi saat ada hal yang gagal ("diterima pengecualian dari server").
  • Log transaksi menjelaskan detail setiap transaksi yang diproses oleh sistem atau komponen. Misalnya, load balancer mencatat setiap permintaan yang diterimanya ke dalam log, terlepas dari apakah permintaan tersebut berhasil diselesaikan atau tidak, dan mencatat informasi tambahan seperti URL yang diminta, kode respons HTTP, dan mungkin informasi seperti backend yang digunakan untuk menyalurkan permintaan.

Metrik

Tidak seperti log, metrik biasanya tidak menggambarkan peristiwa tertentu. Lebih umum, metrik digunakan untuk mewakili status atau kesehatan 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 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 untuk mengekstrak nilai numerik sebagai distribusi.

Untuk mengetahui informasi lebih lanjut 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 formulir yang dapat Anda gunakan untuk mem-build SLI di Monitoring:

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

  • Anda dapat menggunakan metrik distribusi berbasis log untuk mengekspresikan 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 pada layanan. Kode untuk layanan 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 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"
    }
    
  • Pada 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 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. Anda kemudian 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 berdasarkan 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. Dalam Monitoring, metrik berbasis log memiliki awalan logging.googleapis.com/user.

Metrik untuk SLI ketersediaan

Anda mengekspresikan 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 dalam kolom goodTotalRatio pada 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 dalam totalServiceFilter rasio.

    Untuk contoh "stack-doctor", Anda dapat membuat metrik berbasis log yang menghitung entri log tempat string pesan "request created" 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 dengan menggunakan Konsol Google Cloud, Cloud Logging API, atau Google Cloud CLI. Untuk membuat metrik penghitung berbasis log dengan menggunakan Google Cloud Console, Anda dapat menggunakan prosedur berikut:

  1. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log-based Metrics:

    Buka Metrik Berbasis Log

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

  2. Klik Buat Metrik, yang terletak di atas tabel metrik buatan pengguna.

  3. Di panel Metric type, pilih Counter.

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

    Anda dapat mengabaikan kolom lain untuk contoh ini.

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

    Untuk contoh "dokter stack", 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 Labels untuk contoh ini.

  8. Klik Buat Metrik untuk menyelesaikan prosedur.

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

Metrik untuk SLI latensi

Anda mengekspresikan SLI latensi berbasis permintaan di Cloud Monitoring API 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 dengan menggunakan Konsol Google Cloud, Cloud Logging API, atau Google Cloud CLI. Untuk membuat metrik distribusi berbasis log dengan menggunakan Google Cloud Console, Anda dapat menggunakan prosedur berikut:

  1. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log-based Metrics:

    Buka Metrik Berbasis Log

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

  2. Klik Buat Metrik, yang terletak di atas tabel metrik buatan pengguna.

  3. Di panel Jenis metrik, pilih Distribusi.

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

    Anda dapat mengabaikan kolom lain untuk contoh ini.

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

    Untuk contoh "dokter stack", 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
    • Ekspresi reguler: \s(\d*)\s

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

  6. Abaikan panel Labels untuk contoh ini.

  7. Klik Buat Metrik untuk menyelesaikan prosedur.

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

SLI Ketersediaan

Di Cloud Monitoring, Anda mengekspresikan SLI ketersediaan berbasis permintaan dengan menggunakan struktur TimeSeriesRatio. Contoh berikut menunjukkan SLO yang menggunakan metrik log_based_total_requests dan log_based_errors dalam rasionya. SLO ini memperkirakan bahwa rasio permintaan "baik" terhadap total setidaknya 98% selama periode 24 jam yang berkelanjutan:

{
 "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 mengekspresikan SLI latensi berbasis permintaan dengan menggunakan struktur DistributionCut. Contoh berikut menunjukkan SLO yang menggunakan metrik log_based_latency dan memperkirakan bahwa 98% permintaan berada di bawah 500 milidetik selama periode 24 jam yang berkelanjutan:

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