Membuat kueri dan melihat log

Halaman ini memberikan petunjuk mendetail tentang cara membuat kueri dan memvisualisasikan log menggunakan antarmuka pengguna Grafana dan Log Query API untuk mendapatkan insight tentang peristiwa dan aktivitas layanan Anda.

Setelah mengumpulkan log dari workload dan layanan yang di-deploy di Google Distributed Cloud (GDC) air-gapped, Anda dapat mulai menganalisisnya. Untuk menganalisis log, Anda dapat memvisualisasikan dan memfilternya di panel Grafana yang informatif atau mengaksesnya langsung dari Log Query API menggunakan panggilan HTTP atau gRPC untuk akses terprogram.

Anda dapat mengakses log dengan salah satu dari dua metode berikut:

  • Panel Grafana: Dapatkan insight tentang catatan aktivitas project Anda melalui panel Log instance Grafana. Panel ini memungkinkan Anda membuat kueri dan menemukan log tertentu, sehingga memberikan visibilitas data terperinci yang disesuaikan dengan kebutuhan Anda. Grafana menyediakan antarmuka yang mudah digunakan untuk memfilter dan menganalisis data workload Anda, serta membuat dasbor dan panel yang disesuaikan untuk visualisasi yang komprehensif.
  • Log Query API: Untuk akses terprogram, buat kueri log langsung dari Log Query API project Anda. The Log Query API adalah API non-Kubernetes yang mendukung HTTP dan gRPC, sehingga mengekspos endpoint-nya sendiri kepada Anda. Akses API ini hanya dalam organisasi tertentu di Distributed Cloud dengan mengikuti metode akses API standar.

Sebelum memulai

Untuk mendapatkan izin yang Anda perlukan untuk membuat kueri dan memvisualisasikan log di antarmuka pengguna Grafana, minta Admin IAM Organisasi atau Admin IAM Project Anda untuk memberi Anda salah satu peran Grafana Viewer Organisasi atau Grafana Viewer Project yang telah ditentukan. 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 membuat kueri log dari Log Query API, minta Admin IAM Project Anda 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 dan memfilter log

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

Panel Log Grafana

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

Mengidentifikasi endpoint Grafana

URL berikut adalah endpoint instance Grafana project Anda:

  https://GDC_URL/PROJECT_NAMESPACE/grafana

Ganti kode berikut:

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

    Misalnya, endpoint Grafana untuk project platform-obs di organisasi org-1 adalah https://org-1/platform-obs/grafana.

Melihat log di antarmuka pengguna Grafana

Buat 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.

  4. Di antarmuka pengguna, klik explore Explore dari menu navigasi untuk membuka halaman Explore.

  5. 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:

      • Operational logs: Menampilkan log operasional.
      • Audit logs: Menampilkan log audit.
    • Universe multi-zona: Grafana dapat terhubung ke zona yang berbeda dan menampilkan data lintas zona. Pilih salah satu sumber data berikut untuk menampilkan data logging dari zona mana pun di universe Anda, terlepas dari zona tempat Anda login:

      • 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.

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

    • Gunakan 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 Export untuk mendownload log dalam format teks biasa atau CSV. Anda juga dapat memilih rentang waktu untuk log Anda.

    Opsi Log audit dipilih di halaman Jelajahi untuk mendapatkan log audit.

    Gambar 1. Opsi menu untuk membuat kueri 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 membuat kueri log yang berbeda, lihat Contoh kueri dan label.

Memilih rentang waktu untuk log

Untuk membuat kueri 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 klik Apply time range.
  3. Secara opsional, klik Change time settings untuk mengubah setelan Timezone dan Fiscal year dari kontrol rentang waktu.

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

Log Query API

Bagian ini menjelaskan cara mengakses log menggunakan Log Query API.

Mengidentifikasi endpoint API Kueri Log Anda

Log Query API mengekspos dua endpoint berikut untuk membuat kueri log audit dan operasional:

  • Endpoint log audit:

    audit-log-query-api.ORG_DOMAIN
    
  • Endpoint log operasional:

    operational-log-query-api.ORG_DOMAIN
    

Ganti ORG_DOMAIN dengan nama domain organisasi. Anda dapat melihat properti ini menggunakan perintah gdcloud config list. Nama domain harus mengikuti sintaksis org-name.zone.google.gdch.com. Misalnya, organisasi bernama org-1, di zona zone1 dan di lingkungan pengujian memiliki domain seperti org-1.zone1.google.gdch.test.

Log Query API memiliki tiga opsi endpoint berikut:

  • labels: Mencantumkan semua label untuk project.
  • labels/labels/LABEL/values: Mencantumkan nilai label tertentu untuk project.
  • logs: Mencantumkan log untuk project tertentu.

Untuk informasi selengkapnya, lihat dokumentasi API.

Mengirim kueri

Kirim kueri ke endpoint API Log Query 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 membuat kueri API, dan Anda dapat menggunakan format yang serupa untuk perintah wget:

  1. Autentikasi permintaan cURL:

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

      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 nama pengguna dan sandi Anda untuk mengautentikasi 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 dari tempat Anda ingin membuat kueri 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 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:

  3. Jika Anda ingin mencantumkan nilai label tertentu untuk 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:

  4. Jika Anda ingin membuat kueri 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:

    Lihat dokumentasi API untuk melihat semua opsi untuk 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:

  • Buat library klien Anda sendiri berdasarkan buffer protokol yang disediakan Google.
  • Implementasikan autentikasi di klien.
  • Implementasikan percobaan ulang.

Untuk mengetahui informasi tentang buffer 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 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:

    Jika flag server tidak ditentukan, permintaan default akan masuk 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 log yang berbeda:

  • Pilih log server:

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

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