99 "fmt"
1010 "log"
1111 "os"
12+ "strconv"
1213 "time"
1314
1415 "github.com/alitto/pond"
@@ -20,30 +21,82 @@ import (
2021 "go.temporal.io/sdk/client"
2122)
2223
23- var nWorfklows = flag .Int ("c" , 10 , "concurrent workflows" )
24+ var nWorkflows = flag .Int ("c" , 10 , "concurrent workflows" )
2425var sWorkflow = flag .String ("t" , "" , "workflow type" )
2526var sSignalType = flag .String ("s" , "" , "signal type" )
2627var bWait = flag .Bool ("w" , true , "wait for workflows to complete" )
2728var sNamespace = flag .String ("n" , "default" , "namespace" )
2829var sTaskQueue = flag .String ("tq" , "benchmark" , "task queue" )
2930
31+ // Track which flags were explicitly set
32+ var flagsSet = make (map [string ]bool )
33+
34+ // flagValue helps implement precedence: command line > environment variable > default
35+ func getStringValue (flagName , envName , flagValue , defaultValue string ) string {
36+ if flagsSet [flagName ] {
37+ return flagValue
38+ }
39+ if envValue := os .Getenv (envName ); envValue != "" {
40+ return envValue
41+ }
42+ return defaultValue
43+ }
44+
45+ func getIntValue (flagName , envName string , flagValue , defaultValue int ) int {
46+ if flagsSet [flagName ] {
47+ return flagValue
48+ }
49+ if envValue := os .Getenv (envName ); envValue != "" {
50+ if parsed , err := strconv .Atoi (envValue ); err == nil {
51+ return parsed
52+ }
53+ }
54+ return defaultValue
55+ }
56+
57+ func getBoolValue (flagName , envName string , flagValue , defaultValue bool ) bool {
58+ if flagsSet [flagName ] {
59+ return flagValue
60+ }
61+ if envValue := os .Getenv (envName ); envValue != "" {
62+ if parsed , err := strconv .ParseBool (envValue ); err == nil {
63+ return parsed
64+ }
65+ }
66+ return defaultValue
67+ }
68+
3069func main () {
3170 flag .Usage = func () {
3271 fmt .Fprintf (flag .CommandLine .Output (), "Usage: %s [flags] [workflow input] ...\n " , os .Args [0 ])
3372 flag .PrintDefaults ()
73+ fmt .Fprintf (flag .CommandLine .Output (), "\n Environment variables (used if flag not set):\n " )
74+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_CONCURRENT_WORKFLOWS\n " )
75+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_WORKFLOW_TYPE\n " )
76+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_SIGNAL_TYPE\n " )
77+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_WAIT\n " )
78+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_NAMESPACE\n " )
79+ fmt .Fprintf (flag .CommandLine .Output (), " TEMPORAL_TASK_QUEUE\n " )
3480 }
3581
3682 flag .Parse ()
3783
84+ // Track which flags were explicitly set by the user
85+ flag .Visit (func (f * flag.Flag ) {
86+ flagsSet [f .Name ] = true
87+ })
88+
3889 if _ , err := maxprocs .Set (); err != nil {
3990 log .Printf ("WARNING: failed to set GOMAXPROCS: %v.\n " , err )
4091 }
4192
42- namespace := * sNamespace
43- envNamespace := os .Getenv ("TEMPORAL_NAMESPACE" )
44- if envNamespace != "" && envNamespace != "default" {
45- namespace = envNamespace
46- }
93+ // Apply precedence: command line > environment variable > default
94+ concurrentWorkflows := getIntValue ("c" , "TEMPORAL_CONCURRENT_WORKFLOWS" , * nWorkflows , 10 )
95+ workflowType := getStringValue ("t" , "TEMPORAL_WORKFLOW_TYPE" , * sWorkflow , "" )
96+ signalType := getStringValue ("s" , "TEMPORAL_SIGNAL_TYPE" , * sSignalType , "" )
97+ waitForCompletion := getBoolValue ("w" , "TEMPORAL_WAIT" , * bWait , true )
98+ namespace := getStringValue ("n" , "TEMPORAL_NAMESPACE" , * sNamespace , "default" )
99+ taskQueue := getStringValue ("tq" , "TEMPORAL_TASK_QUEUE" , * sTaskQueue , "benchmark" )
47100
48101 log .Printf ("Using namespace: %s" , namespace )
49102
@@ -111,23 +164,23 @@ func main() {
111164 input = append (input , i )
112165 }
113166
114- pool := pond .New (* nWorfklows , 0 )
167+ pool := pond .New (concurrentWorkflows , 0 )
115168
116169 var starter func () (client.WorkflowRun , error )
117170
118- if * sSignalType != "" {
171+ if signalType != "" {
119172 starter = func () (client.WorkflowRun , error ) {
120173 wID := uuid .New ()
121174 return c .SignalWithStartWorkflow (
122175 context .Background (),
123176 wID ,
124- * sSignalType ,
177+ signalType ,
125178 nil ,
126179 client.StartWorkflowOptions {
127180 ID : wID ,
128- TaskQueue : * sTaskQueue ,
181+ TaskQueue : taskQueue ,
129182 },
130- * sWorkflow ,
183+ workflowType ,
131184 input ... ,
132185 )
133186 }
@@ -136,9 +189,9 @@ func main() {
136189 return c .ExecuteWorkflow (
137190 context .Background (),
138191 client.StartWorkflowOptions {
139- TaskQueue : * sTaskQueue ,
192+ TaskQueue : taskQueue ,
140193 },
141- * sWorkflow ,
194+ workflowType ,
142195 input ... ,
143196 )
144197 }
@@ -153,7 +206,7 @@ func main() {
153206 return
154207 }
155208
156- if * bWait {
209+ if waitForCompletion {
157210 err = wf .Get (context .Background (), nil )
158211 if err != nil {
159212 log .Println ("Workflow failed" , err )
0 commit comments