4
4
5
5
import boto3
6
6
from botocore .client import ClientError
7
-
8
7
from sentry_plugins .base import CorePluginMixin
9
8
from sentry .plugins .bases .data_forwarding import DataForwardingPlugin
10
9
from sentry_plugins .utils import get_secret_field_config
@@ -43,13 +42,21 @@ def get_config(self, project, **kwargs):
43
42
get_secret_field_config (
44
43
name = "secret_key" , label = "Secret Key" , secret = self .get_option ("secret_key" , project )
45
44
),
45
+ {
46
+ "name" : "message_group_id" ,
47
+ "label" : "Message Group ID" ,
48
+ "type" : "text" ,
49
+ "required" : False ,
50
+ "placeholder" : "Required for FIFO queues, exclude for standard queues" ,
51
+ },
46
52
]
47
53
48
54
def forward_event (self , event , payload ):
49
55
queue_url = self .get_option ("queue_url" , event .project )
50
56
access_key = self .get_option ("access_key" , event .project )
51
57
secret_key = self .get_option ("secret_key" , event .project )
52
58
region = self .get_option ("region" , event .project )
59
+ message_group_id = self .get_option ("message_group_id" , event .project )
53
60
54
61
if not all ((queue_url , access_key , secret_key , region )):
55
62
return
@@ -68,7 +75,20 @@ def forward_event(self, event, payload):
68
75
aws_secret_access_key = secret_key ,
69
76
region_name = region ,
70
77
)
71
- client .send_message (QueueUrl = queue_url , MessageBody = message )
78
+
79
+ message = {"QueueUrl" : queue_url , "MessageBody" : message }
80
+
81
+ # need a MessageGroupId for FIFO queues
82
+ # note that if MessageGroupId is specified for non-FIFO, this will fail
83
+ if message_group_id :
84
+ from uuid import uuid4
85
+
86
+ message ["MessageGroupId" ] = message_group_id
87
+ # if content based de-duplication is not enabled, we need to provide a
88
+ # MessageDeduplicationId
89
+ message ["MessageDeduplicationId" ] = uuid4 ().hex
90
+
91
+ client .send_message (** message )
72
92
except ClientError as e :
73
93
if e .message .startswith ("An error occurred (AccessDenied)" ):
74
94
# If there's an issue with the user's token then we can't do
@@ -92,6 +112,27 @@ def forward_event(self, event, payload):
92
112
},
93
113
)
94
114
return False
115
+ elif e .message .endswith ("must contain the parameter MessageGroupId." ):
116
+ metrics_name = "sentry_plugins.amazon_sqs.missing_message_group_id"
117
+ logger .info (
118
+ metrics_name ,
119
+ extra = {
120
+ "queue_url" : queue_url ,
121
+ "access_key" : access_key ,
122
+ "region" : region ,
123
+ "project_id" : event .project .id ,
124
+ "organization_id" : event .project .organization_id ,
125
+ "message_group_id" : message_group_id ,
126
+ },
127
+ )
128
+ metrics .incr (
129
+ metrics_name ,
130
+ tags = {
131
+ "project_id" : event .project_id ,
132
+ "organization_id" : event .project .organization_id ,
133
+ },
134
+ )
135
+ return False
95
136
raise
96
137
97
138
return True
0 commit comments