MCPcopy Index your code
hub / github.com/coder/coder / provisionReadAndLog

Method provisionReadAndLog

provisioner/terraform/executor.go:653–690  ·  view source on GitHub ↗
(sink logSink, r io.Reader, done chan<- any)

Source from the content-addressed store, hash-verified

651}
652
653func (e *executor) provisionReadAndLog(sink logSink, r io.Reader, done chan<- any) {
654 defer close(done)
655
656 errCount := 0
657
658 scanner := bufio.NewScanner(r)
659 for scanner.Scan() {
660 log := parseTerraformLogLine(scanner.Bytes())
661 if log == nil {
662 continue
663 }
664
665 logLevel := convertTerraformLogLevel(log.Level, sink)
666 sink.ProvisionLog(logLevel, log.Message)
667
668 ts, span, err := extractTimingSpan(log)
669 if err != nil {
670 // It's too noisy to log all of these as timings are not an essential feature, but we do need to log *some*.
671 if errCount%10 == 0 {
672 e.logger.Warn(context.Background(), "(sampled) failed to extract timings entry from log line",
673 slog.F("line", log.Message), slog.Error(err))
674 }
675 errCount++
676 } else {
677 // Only ingest valid timings.
678 e.timings.ingest(ts, span)
679 }
680
681 // If the diagnostic is provided, let's provide a bit more info!
682 if log.Diagnostic == nil {
683 continue
684 }
685 logLevel = convertTerraformLogLevel(string(log.Diagnostic.Severity), sink)
686 for _, diagLine := range strings.Split(FormatDiagnostic(log.Diagnostic), "\n") {
687 sink.ProvisionLog(logLevel, diagLine)
688 }
689 }
690}
691
692func parseTerraformLogLine(line []byte) *terraformProvisionLog {
693 var log terraformProvisionLog

Callers 1

provisionLogWriterMethod · 0.95

Calls 9

parseTerraformLogLineFunction · 0.85
convertTerraformLogLevelFunction · 0.85
extractTimingSpanFunction · 0.85
FormatDiagnosticFunction · 0.85
ingestMethod · 0.80
ProvisionLogMethod · 0.65
ScanMethod · 0.45
BytesMethod · 0.45
ErrorMethod · 0.45

Tested by

no test coverage detected