Skip to content

Commit a7a94a3

Browse files
committed
Make queue name configurable
1 parent 049f8cd commit a7a94a3

File tree

4 files changed

+61
-15
lines changed

4 files changed

+61
-15
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
11
# sqscat
22

33
Poll AWS SQS payloads for inspection.
4+
5+
## Usage
6+
7+
```sh
8+
$ ./sqscat --help
9+
Usage:
10+
sqscat [OPTIONS] queue-name
11+
12+
Application Options:
13+
-c, --concurrency= Number of concurrent SQS pollers; Defaults to 10 x Num. of CPUs
14+
15+
Help Options:
16+
-h, --help Show this help message
17+
```

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/aws/aws-sdk-go-v2 v1.9.1
77
github.com/aws/aws-sdk-go-v2/config v1.8.2
88
github.com/aws/aws-sdk-go-v2/service/sqs v1.9.1
9+
github.com/jessevdk/go-flags v1.5.0
910
)
1011

1112
require (
@@ -16,4 +17,5 @@ require (
1617
github.com/aws/aws-sdk-go-v2/service/sso v1.4.1 // indirect
1718
github.com/aws/aws-sdk-go-v2/service/sts v1.7.1 // indirect
1819
github.com/aws/smithy-go v1.8.0 // indirect
20+
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4 // indirect
1921
)

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
2222
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2323
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
2424
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
25+
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
26+
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
2527
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
2628
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
2729
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2830
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
31+
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4 h1:EZ2mChiOa8udjfp6rRmswTbtZN/QzUQp4ptM4rnjHvc=
32+
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
2933
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
3034
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
3135
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

main.go

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,89 @@ import (
66
"log"
77
"os"
88
"os/signal"
9+
"runtime"
910
"sync"
1011

1112
"github.com/aws/aws-sdk-go-v2/aws"
1213
"github.com/aws/aws-sdk-go-v2/config"
1314
"github.com/aws/aws-sdk-go-v2/service/sqs"
15+
flags "github.com/jessevdk/go-flags"
1416
)
1517

1618
const (
17-
queueURL = "https://sqs.us-east-1.amazonaws.com/xxxxxxxx/yyyyyyyyy"
18-
concurrency = 10
19+
maxNumberOfMessages = 10
20+
waitTimeSeconds = 20
1921
)
2022

21-
var (
22-
outputDelimiter = []byte("\n")
23-
)
23+
type opts struct {
24+
Concurrency int `short:"c" long:"concurrency" description:"Number of concurrent SQS pollers; Defaults to 10 x Num. of CPUs"`
25+
Positional struct {
26+
QueueName string `positional-arg-name:"queue-name"`
27+
} `positional-args:"true" required:"true"`
28+
}
2429

2530
func main() {
31+
opts := opts{}
32+
if _, err := flags.Parse(&opts); err != nil {
33+
if e, ok := err.(*flags.Error); ok {
34+
if e.Type == flags.ErrHelp {
35+
os.Exit(0)
36+
} else {
37+
os.Exit(1)
38+
}
39+
}
40+
}
41+
2642
awsCfg, err := config.LoadDefaultConfig(context.Background())
2743
if err != nil {
2844
log.Fatalf("config.LoadDefaultConfig() failed: %v", err)
2945
}
46+
3047
sqsClient := sqs.NewFromConfig(awsCfg)
3148

49+
resp, err := sqsClient.GetQueueUrl(context.Background(), &sqs.GetQueueUrlInput{
50+
QueueName: aws.String(opts.Positional.QueueName),
51+
})
52+
if err != nil {
53+
log.Fatalf("sqsClient.GetQueueUrl(%s) failed: %v", opts.Positional.QueueName, err)
54+
}
55+
3256
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
3357
defer stop()
3458

59+
if opts.Concurrency <= 0 {
60+
opts.Concurrency = 10 * runtime.NumCPU()
61+
}
62+
3563
wg := &sync.WaitGroup{}
36-
for i := 0; i < concurrency; i++ {
64+
for i := 0; i < opts.Concurrency; i++ {
3765
wg.Add(1)
38-
go poll(ctx, sqsClient, os.Stdout, wg)
66+
go poll(ctx, sqsClient, resp.QueueUrl, os.Stdout, wg)
3967
}
4068

4169
wg.Wait()
4270
}
4371

44-
func poll(ctx context.Context, sqsClient *sqs.Client, f *os.File, wg *sync.WaitGroup) {
72+
func poll(ctx context.Context, sqsClient *sqs.Client, queueURL *string, f *os.File, wg *sync.WaitGroup) {
4573
defer wg.Done()
4674

4775
for {
4876
select {
4977
case <-ctx.Done():
50-
log.Printf("poller exited")
5178
return
5279
default:
5380
resp, err := sqsClient.ReceiveMessage(ctx, &sqs.ReceiveMessageInput{
54-
QueueUrl: aws.String(queueURL),
55-
MaxNumberOfMessages: int32(10),
56-
WaitTimeSeconds: int32(20),
81+
QueueUrl: queueURL,
82+
MaxNumberOfMessages: maxNumberOfMessages,
83+
WaitTimeSeconds: waitTimeSeconds,
5784
})
5885
if err != nil {
5986
if errors.Is(err, context.Canceled) {
60-
log.Printf("poller exited")
6187
return
6288
}
6389
log.Fatalf("sqsClient.ReceiveMessage() failed: %v", err)
6490
}
6591

66-
log.Printf("received messages; count = %d\n", len(resp.Messages))
67-
6892
for _, msg := range resp.Messages {
6993
// sequential is ok, poller is concurrent
7094
handleMessage(f, *msg.Body)
@@ -73,6 +97,8 @@ func poll(ctx context.Context, sqsClient *sqs.Client, f *os.File, wg *sync.WaitG
7397
}
7498
}
7599

100+
var outputDelimiter = []byte("\n")
101+
76102
func handleMessage(f *os.File, body string) {
77103
if _, err := f.WriteString(body); err != nil {
78104
log.Fatalf("WriteString() failed: %v", err)

0 commit comments

Comments
 (0)