pulumi/pkg/cmd/pulumi/view-trace.go
Pat Gavlin 4da051a799
Add a convert-trace command. (#7319)
This command converts an appdash trace into a pprof file for use with
`go tool pprof`. Spans are converted into stacks by sampling each root
span at a given rate and recording the stack of subspans at each sample.

These changes also replace the conditional addition of experimental and
debug commands with conditional visibility. Experimental and debug
commands will always be available, but will be hidden unless the
appropraite environment variables are set.

Co-authored-by: Levi Blackstone <levi@pulumi.com>
2021-06-17 14:46:05 -07:00

84 lines
2.3 KiB
Go

// Copyright 2016-2018, Pulumi Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"github.com/spf13/cobra"
"sourcegraph.com/sourcegraph/appdash"
"sourcegraph.com/sourcegraph/appdash/traceapp"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/cmdutil"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
)
func readTrace(path string, store io.ReaderFrom) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer contract.IgnoreClose(f)
_, err = store.ReadFrom(f)
return err
}
func newViewTraceCmd() *cobra.Command {
var port int
var cmd = &cobra.Command{
Use: "view-trace [trace-file]",
Short: "Display a trace from the Pulumi CLI",
Long: "Display a trace from the Pulumi CLI.\n" +
"\n" +
"This command is used to display execution traces collected by a prior\n" +
"invocation of the Pulumi CLI.\n" +
"\n" +
"This command loads trace data from the indicated file and starts a\n" +
"webserver to display the trace. By default, this server will listen\n" +
"port 8008; the --port flag can be used to change this if necessary.",
Args: cmdutil.ExactArgs(1),
Hidden: !hasDebugCommands(),
Run: cmdutil.RunFunc(func(cmd *cobra.Command, args []string) error {
url, err := url.Parse(fmt.Sprintf("http://localhost:%d", port))
if err != nil {
return err
}
store := appdash.NewMemoryStore()
if err := readTrace(args[0], store); err != nil {
return err
}
app, err := traceapp.New(nil, url)
if err != nil {
return err
}
app.Store, app.Queryer = store, store
fmt.Printf("Displaying trace at %v\n", url)
return http.ListenAndServe(fmt.Sprintf(":%d", port), app)
}),
}
cmd.PersistentFlags().IntVar(&port, "port", 8008,
"the port the trace viewer will listen on")
return cmd
}