Membuat kueri dan melihat log

Dengan kueri log di perangkat Google Distributed Cloud (GDC) dengan air gap, Anda dapat memeriksa peristiwa operasional dan audit di seluruh workload project setelah mengumpulkan log. Anda dapat memfilter, memvisualisasikan, dan mengekspor aliran log di panel Log Grafana dengan ekspresi Log Query Language (LogQL). Untuk alur kerja terprogram, buat kueri Log Query API organisasi Anda melalui HTTP atau gRPC dengan mengikuti metode akses API standar.

Sebelum memulai

Untuk mendapatkan izin yang diperlukan untuk membuat kueri dan memvisualisasikan log di antarmuka pengguna Grafana, minta Admin IAM Organisasi atau Admin IAM Project untuk memberi Anda salah satu peran Organization Grafana Viewer atau Project Grafana Viewer yang telah ditetapkan. Bergantung pada tingkat akses dan izin yang Anda perlukan, Anda mungkin mendapatkan peran Grafana di organisasi atau project.

Atau, untuk mendapatkan izin yang Anda perlukan untuk mengkueri log dari Log Query API, minta Project IAM Admin untuk memberi Anda peran Log Query API Querier di namespace project Anda.

Untuk mengetahui informasi selengkapnya tentang peran ini, lihat Menyiapkan izin IAM.

Membuat kueri untuk log Anda

Dengan membuat kueri log dari UI instance pemantauan sistem, Anda dapat memilih sumber data untuk mengambil log operasional dari project dan mendapatkan tampilan terintegrasi dari kueri Anda. Untuk memfilter hasil, telusuri log menurut label menggunakan ekspresi bahasa kueri. Misalnya, Anda dapat menetapkan label cluster dan namespace dalam kueri ke nilai yang mengidentifikasi cluster dan namespace project Anda.

Endpoint instance pemantauan sistem

Untuk Operator Aplikasi (AO)

URL berikut adalah endpoint instance pemantauan project Anda:

https://GDC_URL/PROJECT_NAMESPACE/grafana

Ganti kode berikut:

  • GDC_URL: URL organisasi Anda di GDC.
  • PROJECT_NAMESPACE: Namespace project Anda.

Untuk Admin Platform (PA)

URL berikut adalah endpoint instance pemantauan project Anda:

https://GDC_URL/platform-obs/grafana

Ganti GDC_URL dengan URL organisasi Anda di GDC.

Membuat kueri dan memfilter log

Pilih salah satu metode berikut untuk membuat kueri dan memfilter log dari workload project Anda:

Bagian ini menjelaskan cara mengakses log menggunakan panel Log di Grafana.

Mengidentifikasi endpoint Grafana Anda

Untuk Operator Aplikasi (AO)

URL berikut adalah endpoint instance pemantauan project Anda:

https://GDC_URL/PROJECT_NAMESPACE/grafana

Ganti kode berikut:

  • GDC_URL: URL organisasi Anda di GDC.
  • PROJECT_NAMESPACE: Namespace project Anda.

Untuk Admin Platform (PA)

URL berikut adalah endpoint instance pemantauan project Anda:

https://GDC_URL/platform-obs/grafana

Ganti GDC_URL dengan URL organisasi Anda di GDC.

Melihat log di antarmuka pengguna Grafana

Membuat kueri log di antarmuka pengguna Grafana:

  1. Di konsol GDC, pilih project Anda.
  2. Di menu navigasi, pilih Operations > Logging.
  3. Klik View all in Grafana Loki.

Halaman baru akan membuka endpoint Grafana Anda dan menampilkan antarmuka pengguna.

  1. Di antarmuka pengguna, klik explore Explore dari menu navigasi untuk membuka halaman Explore.
  2. Dari menu di panel Explore, pilih sumber data untuk mengambil log, sesuai dengan jenis universe Anda:
  • Universe zona tunggal: Pilih salah satu sumber data berikut untuk menampilkan data logging dari zona tunggal universe Anda:

  • Log operasional: Menampilkan log operasional.

  • Log audit: Menampilkan log audit.

  • Log operasional ZONE_NAME: Menampilkan log operasional dari zona tertentu.

  • Log audit ZONE_NAME: Menampilkan log audit dari zona tertentu.

Selain itu, untuk memiliki visualisasi data lintas zona dalam satu dasbor dan menambahkan beberapa zona ke kueri Anda, pilih Mixed sebagai sumber data.

  1. Masukkan kueri untuk menelusuri log dari panel Log menggunakan ekspresi LogQL (Log Query Language). Anda dapat melakukan langkah ini dengan salah satu cara berikut:

    • Menggunakan antarmuka pembuat kueri interaktif. Kemudian, klik Run query.
    • Masukkan kueri Anda langsung di kolom teks dan tekan Shift+Enter untuk menjalankan kueri.

    Halaman ini menampilkan log yang cocok dengan kueri Anda. Setelah membuat kueri log, Anda dapat mengekspornya. Klik Ekspor untuk mendownload log dalam format teks biasa atau CSV. Anda juga dapat memilih rentang waktu untuk log Anda.

    Opsi Audit logs dipilih di halaman Explore untuk mendapatkan log audit.

    Gambar 1. Opsi menu untuk mengkueri log audit dari antarmuka pengguna Grafana.

    Pada gambar 1, opsi Audit logs menampilkan antarmuka yang memungkinkan Anda membuat kueri dari Grafana untuk mengambil log audit.

    Untuk contoh label dan nilai untuk mengkueri berbagai log, lihat Contoh kueri dan label.

    Memilih rentang waktu untuk log Anda

    Untuk mengkueri log dalam rentang waktu, ikuti langkah-langkah berikut:

    1. Klik menu Time Picker di Grafana.

    2. Dari menu, lakukan salah satu tindakan berikut:

      • Pilih opsi rentang waktu relatif, misalnya, 30 menit terakhir.
      • Tetapkan rentang waktu absolut kustom dengan memilih tanggal dan waktu tertentu dari kalender, lalu mengklik Apply time range.
    3. Secara opsional, klik Ubah setelan waktu untuk mengubah setelan Zona waktu dan Tahun fiskal dari kontrol rentang waktu.

    Setelan waktu disimpan di tingkat dasbor. Untuk mengetahui informasi selengkapnya tentang kueri dalam rentang waktu, lihat https://grafana.com/docs/loki/latest/reference/api/#query-loki-over-a-range-of-time.

    Mengirim kueri

    Kirim kueri ke endpoint Log Query API menggunakan klien HTTP atau gRPC.

    HTTP

    Ikuti petunjuk untuk mengakses API secara langsung dengan klien HTTP. Anda dapat mengandalkan kubectl untuk mengelola autentikasi atau menangani autentikasi sendiri.

    Buat kueri Log Query API menggunakan klien HTTP seperti curl, wget, atau klien HTTP yang Anda buat dan kelola. Contoh berikut menggunakan alat curl untuk mengkueri API, dan Anda dapat menggunakan format yang serupa untuk perintah wget:

    1. Autentikasi permintaan cURL:

      1. Download dan instal gdcloud CLI.
      2. Tetapkan properti core/organization_console_url gdcloud:

        gdcloud config set core/organization_console_url https://GDC_URL
        

        Ganti GDC_URL dengan URL organisasi di GDC.

      3. Login dengan penyedia identitas yang dikonfigurasi:

        gdcloud auth login
        
      4. Gunakan pengguna dan sandi Anda untuk melakukan autentikasi dan login.

      5. Ekspor token identitas untuk akun yang ditentukan ke variabel lingkungan:

        export TOKEN="$($HOME/gdcloud auth print-identity-token --audiences=https://LOG_QUERY_API_ENDPOINT)"
        

        Ganti LOG_QUERY_API_ENDPOINT dengan endpoint API Log Query tempat Anda ingin mengkueri log dan domain yang ingin Anda hubungkan. Oleh karena itu, nilai untuk flag audiences dapat berupa, misalnya, https://operational-log-query-api.org-1.zone1.google.gdch.test.

        Jika login berhasil, Anda dapat menggunakan header otorisasi dalam permintaan cURL melalui perintah gdcloud auth print-identity-token. Untuk mengetahui informasi selengkapnya, lihat gdcloud auth print-identity-token.

    2. Jika Anda ingin mencantumkan semua label untuk sebuah project, kirim kueri berikut:

      curl -H "Authorization: Bearer ${TOKEN}" \
      https://LOG_QUERY_API_ENDPOINT/v1/projects/PROJECT_NAMESPACE/labels \
      -H "Content-Type: application/json" -v
      

      Ganti kode berikut:

      • LOG_QUERY_API_ENDPOINT: endpoint API Log Query tempat Anda ingin mengkueri log.
      • PROJECT_NAMESPACE: namespace project Anda.
    3. Jika Anda ingin mencantumkan nilai label tertentu untuk sebuah project, kirim kueri berikut:

      curl -H "Authorization: Bearer ${TOKEN}" \
      https://LOG_QUERY_API_ENDPOINT/v1/projects/PROJECT_NAMESPACE/labels/labels/LABEL/values \
      -H "Content-Type: application/json" -v
      

      Ganti kode berikut:

      • LOG_QUERY_API_ENDPOINT: endpoint API Log Query tempat Anda ingin mengkueri log.
      • PROJECT_NAMESPACE: namespace project Anda.
      • LABEL: label spesifik yang ingin Anda kueri nilainya.
    4. Jika Anda ingin mengkueri log untuk project tertentu, buat kueri logs_filter dan sertakan dalam isi permintaan:

      curl -X GET -H "Authorization: Bearer ${TOKEN}" \
      https://LOG_QUERY_API_ENDPOINT/v1/projects/PROJECT_NAMESPACE/logs \
      -H "Content-Type: application/json" -d \
      '{"logs_filter": {"labels_equal": {"LABEL": "LABEL_VALUE"}}}' -v
      

      Ganti kode berikut:

      • LOG_QUERY_API_ENDPOINT: endpoint API Log Query tempat Anda ingin mengkueri log.
      • PROJECT_NAMESPACE: namespace project Anda.
      • LABEL: label spesifik yang ingin Anda kueri lognya.
      • LABEL_VALUE: nilai label yang ingin Anda buat kueri lognya.

      Lihat dokumentasi API untuk melihat semua opsi dalam membuat kueri logs_filter.

    gRPC

    gRPC didukung secara luas di berbagai bahasa pemrograman dan menyediakan metode komunikasi yang lebih efisien dibandingkan dengan klien HTTP.

    Untuk membuat kueri log menggunakan gRPC, Anda harus memenuhi prasyarat berikut:

    • Membuat library klien Anda sendiri berdasarkan buffering protokol yang disediakan Google.
    • Terapkan autentikasi di klien.
    • Menerapkan percobaan ulang.

    Untuk mengetahui informasi tentang buffering protokol, lihat dokumentasi API.

    Contoh berikut menunjukkan cara membuat kueri log dari program Go menggunakan klien gRPC yang tidak diautentikasi. Contoh ini mengasumsikan bahwa Anda telah membuat paket golang yang menyertakan file build Bazel untuk mengimpor dependensi kode:

    1. Simpan kode berikut ke program Go bernama client.go:

      package main
      import (
              "context"
              "crypto/tls"
              "flag"
              "fmt"
              "google.golang.org/grpc/credentials"
              "google.golang.org/grpc/metadata"
              pb "<import path to generated log query api protos>/pkg/apis/public/logging/v1/proto"
              "google.golang.org/grpc"
      )
      
      var serverAddr = flag.String("server", "localhost:8080", "server address")
      
      func main() {
              flag.Parse()
              tc := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})
              conn, err := grpc.Dial(*serverAddr, grpc.WithTransportCredentials(tc))
      
              if err != nil {
                      panic(error.Error(fmt.Errorf("create client connection failed: %v", err)))
              }
              defer conn.Close()
      
              c := pb.NewLogsClient(conn)
              md := metadata.Pairs("clienttest", "test")
              ctx := metadata.NewOutgoingContext(context.Background(), md)
      
              err = listLabels(ctx, c, "project-foo")
              if err != nil {
                      panic(error.Error(err))
              }
      
              if err := listLabelValues(ctx, c, "project-foo", "resource-bar"); err != nil {
                      panic(error.Error(err))
              }
      
              if err := listLogs(ctx, c, "project-foo", &pb.ListLogsFilter{
                      LabelsEqual:    map[string]string{"resource-bar": "resource-bar-value"},
                      OrderAscending: true,
              }); err != nil {
                      panic(error.Error(err))
              }
      }
      
      // List all labels for a project.
      
      func listLabels(ctx context.Context, c pb.LogsClient, project string) error {
              lbr := &pb.ListLabelsRequest{
                      Parent:   project,
                      PageSize: 1000, // PageSize can be configured to limit the number of responses per page.
              }
              resp, err := c.ListLabels(ctx, lbr)
              if err != nil {
                      return fmt.Errorf("list labels: %v", err)
              }
              fmt.Printf("%v", resp)
              return nil
      }
      
      // List specific label values for a project.
      
      func listLabelValues(ctx context.Context, c pb.LogsClient, project string, label string) error {
              lbr := &pb.ListLabelValuesRequest{
                      Parent:   project,
                      Label:    label,
                      PageSize: 1000, // PageSize can be configured to limit the number of responses per page.
              }
              resp, err := c.ListLabelValues(ctx, lbr)
              if err != nil {
                      return fmt.Errorf("list label values: %v", err)
              }
              fmt.Printf("%v", resp)
              return nil
      }
      
      // List logs for a specific project.
      
      func listLogs(ctx context.Context, c pb.LogsClient, project string, lf *pb.ListLogsFilter) error {
              lbr := &pb.ListLogsRequest{
                      Parent:     project,
                      LogsFilter: lf,
                      PageSize:   5, // PageSize can be configured to limit the number of responses per page.
              }
              resp, err := c.ListLogs(ctx, lbr)
              if err != nil {
                      return fmt.Errorf("list logs: %v", err)
              }
              fmt.Printf("logs: %v", resp)
              return nil
      }
      
    2. Jalankan program Go:

      go run PATH_TO_API/client.go -server=LOG_QUERY_API_ENDPOINT:443
      

      Ganti kode berikut:

      • PATH_TO_API: jalur ke file API.
      • LOG_QUERY_API_ENDPOINT: endpoint API Log Query tempat Anda ingin mengkueri log.

      Jika flag server tidak ditentukan, permintaan default akan mengarah ke localhost.

Contoh kueri dan label

Berikut adalah beberapa label default yang dapat Anda gunakan untuk membuat kueri log:

  • cluster: nama cluster.
  • namespace: namespace project Anda.
  • node: nama node.
  • pod: nama pod.
  • container: nama container.

Contoh kode berikut menunjukkan penggunaan label dan nilai untuk membuat kueri berbagai log:

  • Pilih log server:

    {cluster="admin", namespace="kube-system", resources="k8s_container", container="kube-apiserver"}
    
  • Pilih log audit cluster:

    {cluster="admin", resources="k8s_audit"}