Membuat kueri dan melihat log

Halaman ini memberikan petunjuk mendetail tentang cara membuat kueri dan memvisualisasikan log Anda 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) yang terisolasi, 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 data aktivitas project Anda melalui panel Log instance Grafana Anda. Panel ini memungkinkan Anda membuat kueri dan menentukan log tertentu, sehingga memberikan kemampuan observasi 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. Log Query API adalah API non-Kubernetes yang mendukung HTTP dan gRPC, yang 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 membuat kueri dan memvisualisasikan log, Anda harus memiliki izin yang diperlukan.

Meminta peran organisasi IAM

Hubungi Admin IAM Organisasi Anda untuk meminta peran berikut:

  • Organization Grafana Viewer (organization-grafana-viewer): memvisualisasikan data yang dapat diamati terkait organisasi di dasbor instance pemantauan Grafana.
  • Log Querier (log-query-api-querier-pa): mengakses Log Query API untuk mengkueri log platform di project platform-obs.

Meminta peran project IAM

Hubungi Project IAM Admin Anda untuk meminta peran berikut:

  • Project Grafana Viewer (project-grafana-viewer): memvisualisasikan data yang dapat diamati terkait project di dasbor instance pemantauan Grafana di namespace project.
  • Log Querier (log-query-api-querier): mengakses Log Query API untuk membuat kueri log aplikasi di namespace project.

Tabel berikut merangkum persyaratan Role untuk persona PA dan AO:

Persona Objek Cluster Peran Namespace Grup/Pengguna
PA grafana server API pengelolaan project-grafana-viewer platform-obs Grup
PA log-query-api server API pengelolaan log-query-api-querier-pa platform-obs Grup
PA grafana server API pengelolaan project-grafana-viewer platform-obs Pengguna
PA log-query-api server API pengelolaan log-query-api-querier-pa platform-obs Pengguna
AO grafana server API pengelolaan project-grafana-viewer PROJECT_NAMESPACE Grup
AO log-query-api server API pengelolaan log-query-api-querier PROJECT_NAMESPACE Grup
AO grafana server API pengelolaan project-grafana-viewer PROJECT_NAMESPACE Pengguna
AO log-query-api server API pengelolaan log-query-api-querier PROJECT_NAMESPACE Pengguna

Pilih salah satu konfigurasi berikut untuk memberikan akses Grafana ke grup pengguna (Config 1) atau pengguna perorangan (Config 2) di server management API. Untuk setiap konfigurasi, Anda dapat menjalankan perintah kubectl untuk membuat RoleBinding secara langsung, atau menyimpan manifes YAML RoleBinding ke jalur file Infrastructure as Code (IaC) yang ditentukan untuk menerapkannya melalui GitOps:

Konfigurasi 1

Konfigurasi ini memberikan izin kepada grup pengguna untuk mengakses PA dan AO Grafana di server API pengelolaan. Setelah menyiapkan konfigurasi ini, lihat bagian Dasbor Grafana dalam dokumen ini untuk melihat log di Grafana.

  • Perintah kubectl

    Jalankan perintah berikut untuk membuat RoleBinding secara langsung:

    kubectl --kubeconfig KUBECONFIG create rolebinding RULE_NAME -n platform-obs --group=GROUP_NAME --role=project-grafana-viewer
    

    Contoh:

    kubectl --kubeconfig KUBECONFIG_PATH create rolebinding project-grafana-viewers-binding --role=project-grafana-viewer --group=my-team --namespace=platform-obs
    
  • Jalur file IaC

    Atau, untuk mengelola RoleBinding menggunakan IaC, buat file YAML di jalur berikut:

    /infrastructure/zonal/zones/ZONE/org-admin/rolebindings/GROUP_NAME/YAML_FILE
    
  • File YAML

    Simpan manifes RoleBinding berikut dalam file YAML di jalur file IaC:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: RULE_NAME
      namespace: platform-obs
    subjects:
    - kind: Group
      name: GROUP_NAME
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: project-grafana-viewer
      apiGroup: rbac.authorization.k8s.io
    

Konfigurasi 2

Konfigurasi ini memberikan izin kepada pengguna untuk mengakses PA dan AO Grafana di server Management API. Setelah menyiapkan konfigurasi ini, lihat bagian Dasbor Grafana dalam dokumen ini untuk melihat log di Grafana.

  • Perintah kubectl

    Jalankan perintah berikut untuk membuat RoleBinding secara langsung:

    kubectl --kubeconfig KUBECONFIG create rolebinding RULE_NAME -n platform-obs --user=EMAIL_ADDRESS --role=project-grafana-viewer
    

    Contoh:

    kubectl --kubeconfig KUBECONFIG_PATH create rolebinding project-grafana-viewers-binding --role=project-grafana-viewer --user=my-email@example.com --namespace=platform-obs
    
  • Jalur file IaC

    Atau, untuk mengelola RoleBinding menggunakan IaC, buat file YAML di jalur berikut:

    /infrastructure/zonal/zones/ZONE/org-admin/rolebindings/EMAIL_ADDRESS/YAML_FILE
    
  • File YAML

    Simpan manifes RoleBinding berikut dalam file YAML di jalur file IaC:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: RULE_NAME
      namespace: platform-obs
    subjects:
    - kind: User
      name: EMAIL_ADDRESS
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: project-grafana-viewer
      apiGroup: rbac.authorization.k8s.io
    

Ganti kode berikut:

  • KUBECONFIG: jalur ke file kubeconfig untuk cluster tertentu yang berisi NAMESPACE tempat RoleBinding ini diterapkan.
  • KUBECONFIG_PATH: jalur ke file kubeconfig dalam contoh perintah.
  • RULE_NAME: nama unik untuk resource RoleBinding ini dalam namespace, seperti pa-project-grafana-viewer.
  • NAMESPACE: namespace Kubernetes tempat RoleBinding ini dibuat dan diterapkan. Cari kolom Namespace di tabel sebelumnya.
  • EMAIL_ADDRESS: ID untuk pengguna yang diberi peran, seperti application-operator@example.com.
  • ROLE: nama Role yang berisi izin yang ingin Anda berikan kepada pengguna. Cari peran yang tersedia di tabel sebelumnya.
  • GROUP_NAME: nama Group yang menjadi tempat pengguna PA, seperti pa-group.
  • ZONE: nama zona.
  • YAML_FILE: nama file YAML untuk resource RoleBinding.

Untuk mengetahui informasi selengkapnya tentang peran ini, lihat Siapkan 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 Anda

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

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 dan menampilkan antarmuka pengguna.

  4. Di antarmuka pengguna, klik jelajahi Jelajahi dari menu navigasi untuk membuka halaman Jelajahi.

  5. Dari menu di panel Jelajahi, pilih sumber data untuk mengambil log, sesuai dengan jenis semesta 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.
    • Universe multi-zona: Grafana dapat terhubung ke berbagai zona dan menampilkan data lintas zona. Pilih salah satu sumber data berikut untuk menampilkan data logging dari zona mana pun di semesta 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 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 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 guna membuat kueri log yang berbeda, lihat Contoh kueri dan label.

Memilih rentang waktu untuk log Anda

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 Terapkan rentang waktu.
  3. Atau, 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.

Log Query API

Bagian ini menjelaskan cara mengakses log menggunakan Log Query API.

Mengidentifikasi endpoint API Log Query 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 mengetahui 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.

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 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 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 dari tempat Anda ingin membuat kueri log dan domain yang ingin Anda hubungkan. Oleh karena itu, nilai untuk tanda 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 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 mengirim kueri 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 mengirim kueri 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:

  • Buat library klien Anda sendiri berdasarkan buffer 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 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:

    • PATH_TO_API: jalur ke file API.
    • LOG_QUERY_API_ENDPOINT: endpoint API Log Query tempat Anda ingin mengirim kueri 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 mengkueri 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"}