Mendownload data profil

Dokumen ini menjelaskan cara mendownload data profil ke sistem lokal, dan cara mengambil data profil secara terprogram menggunakan aplikasi Go.

Mendownload profil menggunakan konsol Google Cloud

Untuk mendownload profil yang ditampilkan dalam grafik flame, klik Download .

Profiler menggunakan konvensi penamaan berikut untuk file yang didownload:

profiler_[SERVICE_NAME]_[PROFILE_TYPE]_[FROM_DATE]_[TO_DATE]_[ZONE]_[VERSION].pb.gz

Dalam ekspresi ini:

  • SERVICE_NAME berisi pilihan Layanan Anda
  • PROFILE_TYPE berisi pilihan Profile type Anda
  • FROM_DATE dan TO_DATE berisi spesifikasi rentang waktu Anda
  • ZONE berisi pilihan Zona Anda
  • VERSION berisi pilihan Versi Anda

Contoh: profiler_docdemo-service_HEAP_2018-04-22T20_25_31Z_2018-05-22T20_25_31Z_us-east1-c.pb.gz

Mendownload profil secara terprogram

Untuk mengambil data profil, gunakan metode API ListProfiles. Contoh program Go berikut menunjukkan penggunaan API ini.

Program contoh membuat folder di direktori tempat program dijalankan, dan membuat serangkaian file pprof bernomor. Setiap file memiliki konvensi penamaan yang mirip dengan profile000042.pb.gz. Setiap direktori berisi data profil dan file metadata - metadata.csv, yang berisi informasi tentang file yang didownload.


// Sample export shows how ListProfiles API can be used to download
// existing pprof profiles for a given project from GCP.
package main

import (
	"bytes"
	"context"
	"encoding/csv"
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"log"
	"os"
	"time"

	cloudprofiler "cloud.google.com/go/cloudprofiler/apiv2"
	pb "cloud.google.com/go/cloudprofiler/apiv2/cloudprofilerpb"
	"google.golang.org/api/iterator"
)

var project = flag.String("project", "", "GCP project ID from which profiles should be fetched")
var pageSize = flag.Int("page_size", 100, "Number of profiles fetched per page. Maximum 1000.")
var pageToken = flag.String("page_token", "", "PageToken from a previous ListProfiles call. If empty, the listing will start from the begnning. Invalid page tokens result in error.")
var maxProfiles = flag.Int("max_profiles", 1000, "Maximum number of profiles to fetch across all pages. If this is <= 0, will fetch all available profiles")

const ProfilesDownloadedSuccessfully = "Read max allowed profiles"

// This function reads profiles for a given project and stores them into locally created files.
// The profile metadata gets stored into a 'metdata.csv' file, while the individual pprof files
// are created per profile.
func downloadProfiles(ctx context.Context, w io.Writer, project, pageToken string, pageSize, maxProfiles int) error {
	client, err := cloudprofiler.NewExportClient(ctx)
	if err != nil {
		return err
	}
	defer client.Close()
	log.Printf("Attempting to fetch %v profiles with a pageSize of %v for %v\n", maxProfiles, pageSize, project)

	// Initial request for the ListProfiles API
	request := &pb.ListProfilesRequest{
		Parent:    fmt.Sprintf("projects/%s", project),
		PageSize:  int32(pageSize),
		PageToken: pageToken,
	}

	// create a folder for storing profiles & metadata
	profilesDirName := fmt.Sprintf("profiles_%v", time.Now().Unix())
	if err := os.Mkdir(profilesDirName, 0750); err != nil {
		log.Fatal(err)
	}
	// create a file for storing profile metadata
	metadata, err := os.