From e7dbd4de0534504f9410343392ce6f30037b57cb Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Mon, 20 Mar 2023 10:13:04 -0400 Subject: [PATCH] packer: track template type in spans The template type for a builder, provisioner, post-processor or datasource was not tracked with telemetry data. This commit adds the infrastructure to track this, bumping the schema for non-crashes to `beta/packer/6' at the same time. --- command/meta.go | 2 ++ packer/telemetry.go | 32 +++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/command/meta.go b/command/meta.go index 1232aafca..99123fd8e 100644 --- a/command/meta.go +++ b/command/meta.go @@ -120,9 +120,11 @@ func (m *Meta) GetConfig(cla *MetaArgs) (packer.Handler, int) { switch cfgType { case ConfigTypeHCL2: + packer.CheckpointReporter.SetTemplateType(packer.HCL2Template) // TODO(azr): allow to pass a slice of files here. return m.GetConfigFromHCL(cla) default: + packer.CheckpointReporter.SetTemplateType(packer.JSONTemplate) // TODO: uncomment once we've polished HCL a bit more. // c.Ui.Say(`Legacy JSON Configuration Will Be Used. // The template will be parsed in the legacy configuration style. This style diff --git a/packer/telemetry.go b/packer/telemetry.go index 9148ea9f1..d4e206966 100644 --- a/packer/telemetry.go +++ b/packer/telemetry.go @@ -18,22 +18,32 @@ import ( "github.com/zclconf/go-cty/cty" ) -const TelemetryVersion string = "beta/packer/5" +type PackerTemplateType string + +const ( + UnknownTemplate PackerTemplateType = "Unknown" + HCL2Template PackerTemplateType = "HCL2" + JSONTemplate PackerTemplateType = "JSON" +) + +const TelemetryVersion string = "beta/packer/6" const TelemetryPanicVersion string = "beta/packer_panic/4" var CheckpointReporter *CheckpointTelemetry type PackerReport struct { - Spans []*TelemetrySpan `json:"spans"` - ExitCode int `json:"exit_code"` - Error string `json:"error"` - Command string `json:"command"` + Spans []*TelemetrySpan `json:"spans"` + ExitCode int `json:"exit_code"` + Error string `json:"error"` + Command string `json:"command"` + TemplateType PackerTemplateType `json:"template_type"` } type CheckpointTelemetry struct { spans []*TelemetrySpan signatureFile string startTime time.Time + templateType PackerTemplateType } func NewCheckpointReporter(disableSignature bool) *CheckpointTelemetry { @@ -57,6 +67,7 @@ func NewCheckpointReporter(disableSignature bool) *CheckpointTelemetry { return &CheckpointTelemetry{ signatureFile: signatureFile, startTime: time.Now().UTC(), + templateType: UnknownTemplate, } } @@ -108,6 +119,15 @@ func (c *CheckpointTelemetry) AddSpan(name, pluginType string, options interface return ts } +// SetTemplateType registers the template type being processed for a Packer command +func (c *CheckpointTelemetry) SetTemplateType(t PackerTemplateType) { + if c == nil { + return + } + + c.templateType = t +} + func (c *CheckpointTelemetry) Finalize(command string, errCode int, err error) error { if c == nil { return nil @@ -124,6 +144,8 @@ func (c *CheckpointTelemetry) Finalize(command string, errCode int, err error) e if err != nil { extra.Error = err.Error() } + + extra.TemplateType = c.templateType params.Payload = extra // b, _ := json.MarshalIndent(params, "", " ") // log.Println(string(b))