@@ -18,6 +18,7 @@ module PostgREST.ApiRequest.Preferences
18
18
, PreferTransaction (.. )
19
19
, PreferTimezone (.. )
20
20
, PreferMaxAffected (.. )
21
+ , PreferMetrics (.. )
21
22
, fromHeaders
22
23
, shouldCount
23
24
, prefAppliedHeader
@@ -44,6 +45,7 @@ import Protolude
44
45
-- >>> deriving instance Show PreferHandling
45
46
-- >>> deriving instance Show PreferTimezone
46
47
-- >>> deriving instance Show PreferMaxAffected
48
+ -- >>> deriving instance Show PreferMetrics
47
49
-- >>> deriving instance Show Preferences
48
50
49
51
-- | Preferences recognized by the application.
@@ -58,6 +60,7 @@ data Preferences
58
60
, preferHandling :: Maybe PreferHandling
59
61
, preferTimezone :: Maybe PreferTimezone
60
62
, preferMaxAffected :: Maybe PreferMaxAffected
63
+ , preferMetrics :: Maybe PreferMetrics
61
64
, invalidPrefs :: [ByteString ]
62
65
}
63
66
@@ -67,7 +70,7 @@ data Preferences
67
70
-- >>> let sc = S.fromList ["America/Los_Angeles"]
68
71
--
69
72
-- One header with comma-separated values can be used to set multiple preferences:
70
- -- >>> pPrint $ fromHeaders True sc [("Prefer", "resolution=ignore-duplicates, count=exact, timezone=America/Los_Angeles, max-affected=100")]
73
+ -- >>> pPrint $ fromHeaders True sc [("Prefer", "resolution=ignore-duplicates, count=exact, timezone=America/Los_Angeles, max-affected=100, metrics=timings ")]
71
74
-- Preferences
72
75
-- { preferResolution = Just IgnoreDuplicates
73
76
-- , preferRepresentation = Nothing
@@ -80,6 +83,7 @@ data Preferences
80
83
-- ( PreferTimezone "America/Los_Angeles" )
81
84
-- , preferMaxAffected = Just
82
85
-- ( PreferMaxAffected 100 )
86
+ -- , preferMetrics = Just Timings
83
87
-- , invalidPrefs = []
84
88
-- }
85
89
--
@@ -97,6 +101,7 @@ data Preferences
97
101
-- , preferTimezone = Nothing
98
102
-- , preferMaxAffected = Just
99
103
-- ( PreferMaxAffected 5999 )
104
+ -- , preferMetrics = Nothing
100
105
-- , invalidPrefs = [ "invalid" ]
101
106
-- }
102
107
--
@@ -129,6 +134,7 @@ data Preferences
129
134
-- , preferHandling = Just Strict
130
135
-- , preferTimezone = Nothing
131
136
-- , preferMaxAffected = Nothing
137
+ -- , preferMetrics = Nothing
132
138
-- , invalidPrefs = [ "anything" ]
133
139
-- }
134
140
--
@@ -144,6 +150,7 @@ fromHeaders allowTxDbOverride acceptedTzNames headers =
144
150
, preferHandling = parsePrefs [Strict , Lenient ]
145
151
, preferTimezone = if isTimezonePrefAccepted then PreferTimezone <$> timezonePref else Nothing
146
152
, preferMaxAffected = PreferMaxAffected <$> maxAffectedPref
153
+ , preferMetrics = parsePrefs [Timings ]
147
154
, invalidPrefs = filter isUnacceptable prefs
148
155
}
149
156
where
@@ -155,7 +162,8 @@ fromHeaders allowTxDbOverride acceptedTzNames headers =
155
162
mapToHeadVal [ExactCount , PlannedCount , EstimatedCount ] ++
156
163
mapToHeadVal [Commit , Rollback ] ++
157
164
mapToHeadVal [ApplyDefaults , ApplyNulls ] ++
158
- mapToHeadVal [Strict , Lenient ]
165
+ mapToHeadVal [Strict , Lenient ] ++
166
+ mapToHeadVal [Timings ]
159
167
160
168
prefHeaders = filter ((==) HTTP. hPrefer . fst ) headers
161
169
prefs = fmap BS. strip . concatMap (BS. split ' ,' . snd ) $ prefHeaders
@@ -179,7 +187,7 @@ fromHeaders allowTxDbOverride acceptedTzNames headers =
179
187
prefMap = Map. fromList . fmap (\ pref -> (toHeaderValue pref, pref))
180
188
181
189
prefAppliedHeader :: Preferences -> Maybe HTTP. Header
182
- prefAppliedHeader Preferences {preferResolution, preferRepresentation, preferParameters, preferCount, preferTransaction, preferMissing, preferHandling, preferTimezone, preferMaxAffected } =
190
+ prefAppliedHeader Preferences {preferResolution, preferRepresentation, preferParameters, preferCount, preferTransaction, preferMissing, preferHandling, preferTimezone, preferMaxAffected, preferMetrics } =
183
191
if null prefsVals
184
192
then Nothing
185
193
else Just (HTTP. hPreferenceApplied, combined)
@@ -195,6 +203,7 @@ prefAppliedHeader Preferences {preferResolution, preferRepresentation, preferPar
195
203
, toHeaderValue <$> preferHandling
196
204
, toHeaderValue <$> preferTimezone
197
205
, if preferHandling == Just Strict then toHeaderValue <$> preferMaxAffected else Nothing
206
+ , toHeaderValue <$> preferMetrics
198
207
]
199
208
200
209
-- |
@@ -302,3 +311,12 @@ newtype PreferMaxAffected = PreferMaxAffected Int64
302
311
303
312
instance ToHeaderValue PreferMaxAffected where
304
313
toHeaderValue (PreferMaxAffected n) = " max-affected=" <> show n
314
+
315
+ -- |
316
+ -- Show Performance Metrics
317
+ data PreferMetrics
318
+ = Timings -- show server timings for the request
319
+ deriving Eq
320
+
321
+ instance ToHeaderValue PreferMetrics where
322
+ toHeaderValue Timings = " metrics=timings"
0 commit comments