on master help sign in
Added log processing
commitab582760a5e70d5bb4a79cde8bc9440b0fc96c5c authoriko <ilyakooo0@gmail.com> dateMon 24 Feb 2020, 23:16 (7 years ago) parent9009766
3 files changed+21−5
src/Docker/Client/Api.hs+4−4 src/Docker/Client/Internal.hs−1 src/Docker/Client/Utils.hs+17
src/Docker/Client/Api.hs+4−4
@@ -34,7 +34,7 @@ import Control.Monad.Reader (ask, lift)
3434import Data.Aeson (FromJSON, eitherDecode')
3535import qualified Data.ByteString as BS
3636import qualified Data.ByteString.Lazy as BSL
37−import Data.Conduit (Sink)
37+import Data.Conduit (Sink, (.|))
3838import qualified Data.Conduit.Binary as Conduit
3939import qualified Data.Text as T
4040import qualified Data.Text as Text
@@ -172,7 +172,7 @@ inspectContainer cid = requestHelper GET (InspectContainerEndpoint cid) >>= pars
172172-- __NOTE__: It's recommended to use one of the other 'LogDriverType's available (like
173173-- syslog) for creating your containers.
174174getContainerLogs :: forall m. (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> DockerT m (Either DockerError BSL.ByteString)
175−getContainerLogs logopts cid = requestHelper GET (ContainerLogsEndpoint logopts False cid)
175+getContainerLogs logopts cid = getContainerLogsStream logopts cid Conduit.sinkLbs
176176
177177{-| Continuously gets the container's logs as a stream. Uses conduit.
178178
@@ -189,7 +189,8 @@ __Example__:
189189
190190-}
191191getContainerLogsStream :: forall m b . (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> Sink BS.ByteString m b -> DockerT m (Either DockerError b)
192−getContainerLogsStream logopts cid = requestHelper' GET (ContainerLogsEndpoint logopts True cid)
192+getContainerLogsStream logopts cid sink =
193+ requestHelper' GET (ContainerLogsEndpoint logopts True cid) (processLog .| sink)
193194-- JP: Should the second (follow) argument be True? XXX
194195
195196-- | Build an Image from a Dockerfile
@@ -224,4 +225,3 @@ createNetwork opts = requestHelper POST (CreateNetworkEndpoint opts) >>= parseR
224225-- | Removes a network
225226removeNetwork :: forall m. (MonadIO m, MonadMask m) => NetworkID -> DockerT m (Either DockerError ())
226227removeNetwork nid = requestUnit DELETE $ RemoveNetworkEndpoint nid
227−
src/Docker/Client/Internal.hs−1
@@ -105,4 +105,3 @@ getEndpointRequestBody (RemoveNetworkEndpoint _) = Nothing
105105getEndpointContentType :: Endpoint -> BSC.ByteString
106106getEndpointContentType (BuildImageEndpoint _ _) = BSC.pack "application/tar"
107107getEndpointContentType _ = BSC.pack "application/json; charset=utf-8"
108−
src/Docker/Client/Utils.hs+17
@@ -9,7 +9,11 @@ import qualified Codec.Archive.Tar as Tar
99import qualified Codec.Compression.GZip as GZip
1010import Control.Monad (filterM, liftM, unless)
1111import Control.Monad.IO.Class
12+import Data.Bits
1213import qualified Data.ByteString.Lazy as BS
14+import qualified Data.ByteString as BSS
15+import Data.Conduit (ConduitT, yield)
16+import qualified Data.Conduit.Binary as CB
1317import Data.Monoid ((<>))
1418import qualified Data.Text as T
1519import qualified Data.Text.IO as TIO
@@ -129,3 +133,16 @@ exclusionCheck f ps = any id (map (\(ExclusionPattern p) -> f ~~ T.unpack p) ps)
129133inclusionCheck :: FilePath -> [InclusionPattern] -> Bool
130134inclusionCheck f ps = any id (map (\(InclusionPattern p) -> f ~~ T.unpack p) ps)
131135
136+
137+processLog :: Monad m => ConduitT BSS.ByteString BSS.ByteString m ()
138+processLog = do
139+ -- metadata (is the next string is stdout or stderr)
140+ _ <- CB.take 4
141+ len' <- CB.take 4
142+ let len = BS.foldl (\i w -> shiftL i 8 .&. fromIntegral w) 0 len'
143+ case len of
144+ 0 -> return ()
145+ n -> do
146+ chunk <- CB.take n
147+ yield . BS.toStrict $ chunk
148+ processLog