Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
d1906af
add cmd report; pernding performance improvements
tclemos Dec 2, 2025
f9b09bf
report: add some parallelism and concurrency to report generation
tclemos Dec 3, 2025
53becda
report: load receipts by block instead of one by one
tclemos Dec 9, 2025
8dd9f33
report: add support to pdf format
tclemos Dec 9, 2025
dc4ab98
Merge branch 'main' into thiago/cmd-report
tclemos Dec 29, 2025
6c65ff5
fix merge conflict
tclemos Dec 29, 2025
da2f3f9
Merge branch 'main' into thiago/cmd-report
tclemos Dec 29, 2025
7ab4029
make gen; linter fixes
tclemos Dec 29, 2025
5c1eac5
report: copilot fixes
tclemos Dec 30, 2025
d686bc3
report: review start-block and end-block flags behavior and defaults
tclemos Dec 30, 2025
ac9e5cc
report: remove leftover errorChan
tclemos Dec 30, 2025
22fbd7b
report: fix average base-fee computation
tclemos Dec 30, 2025
56885c3
report: add rpc requirements to docs
tclemos Dec 30, 2025
f7bfc0f
report: review dependency versions
tclemos Dec 30, 2025
927deeb
report: add unit tests
tclemos Dec 30, 2025
93f2f68
report: improve flag validation
tclemos Dec 30, 2025
ee06b65
report: improved chrome dependency validation to generate pdf reports
tclemos Dec 30, 2025
097e7df
report: fix timer goroutine leak in pdf generation
tclemos Dec 30, 2025
8edcaf0
report: fix error message formatting in pdf generation
tclemos Dec 30, 2025
b5856d8
fix: restore viper to main require block in go.mod
tclemos Dec 30, 2025
b99f267
report: add defensive validation to prevent infinite loop
tclemos Dec 30, 2025
4f2f8d9
report: fix context shadowing in pdf generation
tclemos Dec 30, 2025
d8922c7
report: reduce channel buffer to avoid excessive memory allocation
tclemos Dec 30, 2025
8ddce4f
report: propagate context to pdf generation for immediate cancellation
tclemos Dec 30, 2025
9a476a4
report: add html escaping to stat card titles and values
tclemos Dec 30, 2025
4e6e7e4
report: fix goroutine leak in block channel producer
tclemos Dec 30, 2025
c26d5f7
report: add retry mechanism to ensure deterministic reports
tclemos Dec 30, 2025
eb69a61
docs: add code quality checklist to prevent common mistakes
tclemos Dec 30, 2025
69cab77
docs: update retry behavior to match implementation
tclemos Dec 31, 2025
18e7103
report: fix race condition by draining failedChan after main loop
tclemos Dec 31, 2025
de06605
report: improve progress logging to show successful and failed blocks
tclemos Dec 31, 2025
eeaac15
report: use effectiveGasPrice from receipt for EIP-1559 compatibility
tclemos Dec 31, 2025
fc4bbee
docs: update code quality checklist with critical thinking and new le…
tclemos Dec 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
611 changes: 611 additions & 0 deletions cmd/report/html.go

Large diffs are not rendered by default.

79 changes: 79 additions & 0 deletions cmd/report/pdf.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package report

import (
"context"
"fmt"
"os"
"time"

"github.com/chromedp/cdproto/page"
"github.com/chromedp/chromedp"
"github.com/rs/zerolog/log"
)

// outputPDF generates a PDF report from the BlockReport data
func outputPDF(report *BlockReport, outputFile string) error {
log.Info().Msg("Generating PDF report from HTML")

// Generate HTML from the existing template
html := generateHTML(report)

// Create chromedp context with timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

// Allocate a new browser context
ctx, cancel = chromedp.NewContext(ctx)
defer cancel()

var buf []byte
err := chromedp.Run(ctx,
chromedp.Navigate("about:blank"),
chromedp.ActionFunc(func(ctx context.Context) error {
// Get the frame tree to set document content
frameTree, err := page.GetFrameTree().Do(ctx)
if err != nil {
return fmt.Errorf("failed to get frame tree: %w", err)
}

// Set the HTML content
return page.SetDocumentContent(frameTree.Frame.ID, html).Do(ctx)
}),
chromedp.ActionFunc(func(ctx context.Context) error {
// Wait a bit for any dynamic content to settle
time.Sleep(500 * time.Millisecond)
return nil
}),
chromedp.ActionFunc(func(ctx context.Context) error {
// Print to PDF with appropriate settings
var err error
buf, _, err = page.PrintToPDF().
WithPrintBackground(true).
WithScale(0.8).
WithPreferCSSPageSize(false).
WithPaperWidth(8.5).
WithPaperHeight(11).
WithMarginTop(0.4).
WithMarginBottom(0.4).
WithMarginLeft(0.4).
WithMarginRight(0.4).
Do(ctx)
if err != nil {
return fmt.Errorf("failed to print to PDF: %w", err)
}
return nil
}),
)

if err != nil {
return fmt.Errorf("failed to generate PDF: %w", err)
}

// Write PDF to file
if err := os.WriteFile(outputFile, buf, 0644); err != nil {
return fmt.Errorf("failed to write PDF file: %w", err)
}

log.Info().Str("file", outputFile).Msg("PDF report written")
return nil
}
Loading
Loading