func (td *CallData) Regenerate() *CallData {
	now := time.Now()
	newUUID, _ := uuid.NewRandom()
	return &CallData{
		WorkerID:           td.WorkerID,
		RequestNumber:      td.RequestNumber,
		FullyQualifiedName: td.FullyQualifiedName,
		MethodName:         td.MethodName,
		ServiceName:        td.ServiceName,
		InputName:          td.InputName,
		OutputName:         td.OutputName,
		IsClientStreaming:  td.IsClientStreaming,
		IsServerStreaming:  td.IsServerStreaming,
		Timestamp:          now.Format(time.RFC3339),
		TimestampUnix:      now.Unix(),
		TimestampUnixMilli: now.UnixNano() / 1000000,
		TimestampUnixNano:  now.UnixNano(),
		UUID:               newUUID.String(),
		t:                  td.t,
	}
}
Regenerate generates a new instance of call data from this parent instance
The dynamic data like timestamps and UUIDs are re-filled
package runner
import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"math/rand"
	"strings"
	"text/template"
	"text/template/parse"
	"time"
	"github.com/Masterminds/sprig/v3"
	"github.com/google/uuid"
	"github.com/jhump/protoreflect/desc"
)
const charset = "abcdefghijklmnopqrstuvwxyz" +
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var seededRand *rand.Rand = rand.New(
	rand.NewSource(time.Now().UnixNano()))
type CallData struct {
	WorkerID           string  
	RequestNumber      int64   
	FullyQualifiedName string  
	MethodName         string  
	ServiceName        string  
	InputName          string  
	OutputName         string  
	IsClientStreaming  bool    
	IsServerStreaming  bool    
	Timestamp          string  
	TimestampUnix      int64   
	TimestampUnixMilli int64   
	TimestampUnixNano  int64   
	UUID               string  
	t *template.Template
}
var tmplFuncMap = template.FuncMap{
	"newUUID":      newUUID,
	"randomString": randomString,
	"randomInt":    randomInt,
}
func newCallData(
	mtd *desc.MethodDescriptor,
	funcs template.FuncMap,
	workerID string, reqNum int64) *CallData {
	fns := make(template.FuncMap, len(funcs)+2)
	for k, v := range tmplFuncMap {
		fns[k] = v
	}
	for k, v := range sprig.FuncMap() {
		fns[k] = v
	}
	if len(funcs) > 0 {
		for k, v := range funcs {
			fns[k] = v
		}
	}
	t := template.New("call_template_data").Funcs(fns)
	now := time.Now()
	newUUID, _ := uuid.NewRandom()
	return &CallData{
		WorkerID:           workerID,
		RequestNumber:      reqNum,
		FullyQualifiedName: mtd.GetFullyQualifiedName(),
		MethodName:         mtd.GetName(),
		ServiceName:        mtd.GetService().GetName(),
		InputName:          mtd.GetInputType().GetName(),
		OutputName:         mtd.GetOutputType().GetName(),
		IsClientStreaming:  mtd.IsClientStreaming(),
		IsServerStreaming:  mtd.IsServerStreaming(),
		Timestamp:          now.Format(time.RFC3339),
		TimestampUnix:      now.Unix(),
		TimestampUnixMilli: now.UnixNano() / 1000000,
		TimestampUnixNano:  now.UnixNano(),
		UUID:               newUUID.String(),
		t:                  t,
	}
}