Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17f27677 authored by Nan Zhang's avatar Nan Zhang
Browse files

Generate build timing metrics to proto format file

Test: Dumped the text formated based metrics file to out dir,
and checked the file.
Bug: b/63815990

Change-Id: Iff476f72a0be74eb53b6b26ef468d11c0f24a404
parent a45e15e2
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import (

	"android/soong/ui/build"
	"android/soong/ui/logger"
	"android/soong/ui/metrics"
	"android/soong/ui/status"
	"android/soong/ui/terminal"
	"android/soong/ui/tracer"
@@ -73,6 +74,8 @@ func main() {
	trace := tracer.New(log)
	defer trace.Close()

	met := metrics.New()

	stat := &status.Status{}
	defer stat.Finish()
	stat.AddOutput(terminal.NewStatusOutput(writer, os.Getenv("NINJA_STATUS")))
@@ -87,6 +90,7 @@ func main() {
	buildCtx := build.Context{ContextImpl: &build.ContextImpl{
		Context: ctx,
		Logger:  log,
		Metrics: met,
		Tracer:  trace,
		Writer:  writer,
		Status:  stat,
@@ -100,6 +104,9 @@ func main() {

	build.SetupOutDir(buildCtx, config)

	metricsPath := filepath.Join(config.OutDir(), "build_metrics")
	defer met.Dump(metricsPath)

	logsDir := config.OutDir()
	if config.Dist() {
		logsDir = filepath.Join(config.DistDir(), "logs")
@@ -116,7 +123,7 @@ func main() {
			if start_time, err := strconv.ParseUint(start, 10, 64); err == nil {
				log.Verbosef("Took %dms to start up.",
					time.Since(time.Unix(0, int64(start_time))).Nanoseconds()/time.Millisecond.Nanoseconds())
				buildCtx.CompleteTrace("startup", start_time, uint64(time.Now().UnixNano()))
				buildCtx.CompleteTrace(metrics.RunSetupTool, "startup", start_time, uint64(time.Now().UnixNano()))
			}
		}

+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ bootstrap_go_package {
    deps: [
        "soong-ui-build-paths",
        "soong-ui-logger",
        "soong-ui-metrics",
        "soong-ui-status",
        "soong-ui-terminal",
        "soong-ui-tracer",
+3 −1
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import (
	"os"
	"path/filepath"
	"strings"

	"android/soong/ui/metrics"
)

func removeGlobs(ctx Context, globs ...string) {
@@ -158,7 +160,7 @@ func installCleanIfNecessary(ctx Context, config Config) {
		return
	}

	ctx.BeginTrace("installclean")
	ctx.BeginTrace(metrics.PrimaryNinja, "installclean")
	defer ctx.EndTrace()

	prevConfig := strings.TrimPrefix(strings.TrimSuffix(string(prev), suffix), prefix)
+3 −0
Original line number Diff line number Diff line
@@ -217,6 +217,9 @@ func NewConfig(ctx Context, args ...string) Config {
	} else {
		content = strconv.FormatInt(time.Now().Unix(), 10)
	}
	if ctx.Metrics != nil {
		ctx.Metrics.SetBuildDateTime(content)
	}
	err := ioutil.WriteFile(buildDateTimeFile, []byte(content), 0777)
	if err != nil {
		ctx.Fatalln("Failed to write BUILD_DATETIME to file:", err)
+23 −4
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ import (
	"context"

	"android/soong/ui/logger"
	"android/soong/ui/metrics"
	"android/soong/ui/metrics/metrics_proto"
	"android/soong/ui/status"
	"android/soong/ui/terminal"
	"android/soong/ui/tracer"
@@ -31,6 +33,8 @@ type ContextImpl struct {
	context.Context
	logger.Logger

	Metrics *metrics.Metrics

	Writer terminal.Writer
	Status *status.Status

@@ -39,9 +43,12 @@ type ContextImpl struct {
}

// BeginTrace starts a new Duration Event.
func (c ContextImpl) BeginTrace(name string) {
func (c ContextImpl) BeginTrace(name, desc string) {
	if c.Tracer != nil {
		c.Tracer.Begin(name, c.Thread)
		c.Tracer.Begin(desc, c.Thread)
	}
	if c.Metrics != nil {
		c.Metrics.TimeTracer.Begin(name, desc, c.Thread)
	}
}

@@ -50,11 +57,23 @@ func (c ContextImpl) EndTrace() {
	if c.Tracer != nil {
		c.Tracer.End(c.Thread)
	}
	if c.Metrics != nil {
		c.Metrics.SetTimeMetrics(c.Metrics.TimeTracer.End(c.Thread))
	}
}

// CompleteTrace writes a trace with a beginning and end times.
func (c ContextImpl) CompleteTrace(name string, begin, end uint64) {
func (c ContextImpl) CompleteTrace(name, desc string, begin, end uint64) {
	if c.Tracer != nil {
		c.Tracer.Complete(name, c.Thread, begin, end)
		c.Tracer.Complete(desc, c.Thread, begin, end)
	}
	if c.Metrics != nil {
		realTime := end - begin
		c.Metrics.SetTimeMetrics(
			metrics_proto.PerfInfo{
				Desc:      &desc,
				Name:      &name,
				StartTime: &begin,
				RealTime:  &realTime})
	}
}
Loading