amazonka-kinesis-0.2.2: gen/Network/AWS/Kinesis/GetRecords.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-- Module : Network.AWS.Kinesis.GetRecords
-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License : This Source Code Form is subject to the terms of
-- the Mozilla Public License, v. 2.0.
-- A copy of the MPL can be found in the LICENSE file or
-- you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
--
-- Derived from AWS service descriptions, licensed under Apache 2.0.
-- | Gets data records from a shard.
--
-- Specify a shard iterator using the 'ShardIterator' parameter. The shard
-- iterator specifies the position in the shard from which you want to start
-- reading data records sequentially. If there are no records available in the
-- portion of the shard that the iterator points to, 'GetRecords' returns an empty
-- list. Note that it might take multiple calls to get to a portion of the shard
-- that contains records.
--
-- You can scale by provisioning multiple shards. Your application should have
-- one thread per shard, each reading continuously from its stream. To read from
-- a stream continually, call 'GetRecords' in a loop. Use 'GetShardIterator' to get
-- the shard iterator to specify in the first 'GetRecords' call. 'GetRecords'
-- returns a new shard iterator in 'NextShardIterator'. Specify the shard iterator
-- returned in 'NextShardIterator' in subsequent calls to 'GetRecords'. Note that if
-- the shard has been closed, the shard iterator can't return more data and 'GetRecords' returns 'null' in 'NextShardIterator'. You can terminate the loop when the shard
-- is closed, or when the shard iterator reaches the record with the sequence
-- number or other attribute that marks it as the last record to process.
--
-- Each data record can be up to 50 KB in size, and each shard can read up to 2
-- MB per second. You can ensure that your calls don't exceed the maximum
-- supported size or throughput by using the 'Limit' parameter to specify the
-- maximum number of records that 'GetRecords' can return. Consider your average
-- record size when determining this limit. For example, if your average record
-- size is 40 KB, you can limit the data returned to about 1 MB per call by
-- specifying 25 as the limit.
--
-- The size of the data returned by 'GetRecords' will vary depending on the
-- utilization of the shard. The maximum size of data that 'GetRecords' can return
-- is 10 MB. If a call returns 10 MB of data, subsequent calls made within the
-- next 5 seconds throw 'ProvisionedThroughputExceededException'. If there is
-- insufficient provisioned throughput on the shard, subsequent calls made
-- within the next 1 second throw 'ProvisionedThroughputExceededException'. Note
-- that 'GetRecords' won't return any data when it throws an exception. For this
-- reason, we recommend that you wait one second between calls to 'GetRecords';
-- however, it's possible that the application will get exceptions for longer
-- than 1 second.
--
-- To detect whether the application is falling behind in processing, add a
-- timestamp to your records and note how long it takes to process them. You can
-- also monitor how much data is in a stream using the CloudWatch metrics for
-- write operations ('PutRecord' and 'PutRecords'). For more information, see <http://docs.aws.amazon.com/kinesis/latest/dev/monitoring_with_cloudwatch.html Monitoring Amazon Kinesis with Amazon CloudWatch> in the /Amazon Kinesis Developer Guide/.
--
-- <http://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html>
module Network.AWS.Kinesis.GetRecords
(
-- * Request
GetRecords
-- ** Request constructor
, getRecords
-- ** Request lenses
, grLimit
, grShardIterator
-- * Response
, GetRecordsResponse
-- ** Response constructor
, getRecordsResponse
-- ** Response lenses
, grrNextShardIterator
, grrRecords
) where
import Network.AWS.Prelude
import Network.AWS.Request.JSON
import Network.AWS.Kinesis.Types
import qualified GHC.Exts
data GetRecords = GetRecords
{ _grLimit :: Maybe Nat
, _grShardIterator :: Text
} deriving (Eq, Ord, Read, Show)
-- | 'GetRecords' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'grLimit' @::@ 'Maybe' 'Natural'
--
-- * 'grShardIterator' @::@ 'Text'
--
getRecords :: Text -- ^ 'grShardIterator'
-> GetRecords
getRecords p1 = GetRecords
{ _grShardIterator = p1
, _grLimit = Nothing
}
-- | The maximum number of records to return. Specify a value of up to 10,000. If
-- you specify a value that is greater than 10,000, 'GetRecords' throws 'InvalidArgumentException'.
grLimit :: Lens' GetRecords (Maybe Natural)
grLimit = lens _grLimit (\s a -> s { _grLimit = a }) . mapping _Nat
-- | The position in the shard from which you want to start sequentially reading
-- data records. A shard iterator specifies this position using the sequence
-- number of a data record in the shard.
grShardIterator :: Lens' GetRecords Text
grShardIterator = lens _grShardIterator (\s a -> s { _grShardIterator = a })
data GetRecordsResponse = GetRecordsResponse
{ _grrNextShardIterator :: Maybe Text
, _grrRecords :: List "Records" Record
} deriving (Eq, Read, Show)
-- | 'GetRecordsResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'grrNextShardIterator' @::@ 'Maybe' 'Text'
--
-- * 'grrRecords' @::@ ['Record']
--
getRecordsResponse :: GetRecordsResponse
getRecordsResponse = GetRecordsResponse
{ _grrRecords = mempty
, _grrNextShardIterator = Nothing
}
-- | The next position in the shard from which to start sequentially reading data
-- records. If set to 'null', the shard has been closed and the requested iterator
-- will not return any more data.
grrNextShardIterator :: Lens' GetRecordsResponse (Maybe Text)
grrNextShardIterator =
lens _grrNextShardIterator (\s a -> s { _grrNextShardIterator = a })
-- | The data records retrieved from the shard.
grrRecords :: Lens' GetRecordsResponse [Record]
grrRecords = lens _grrRecords (\s a -> s { _grrRecords = a }) . _List
instance ToPath GetRecords where
toPath = const "/"
instance ToQuery GetRecords where
toQuery = const mempty
instance ToHeaders GetRecords
instance ToJSON GetRecords where
toJSON GetRecords{..} = object
[ "ShardIterator" .= _grShardIterator
, "Limit" .= _grLimit
]
instance AWSRequest GetRecords where
type Sv GetRecords = Kinesis
type Rs GetRecords = GetRecordsResponse
request = post "GetRecords"
response = jsonResponse
instance FromJSON GetRecordsResponse where
parseJSON = withObject "GetRecordsResponse" $ \o -> GetRecordsResponse
<$> o .:? "NextShardIterator"
<*> o .:? "Records" .!= mempty