]> git.immae.eu Git - github/fretlink/haskell-graylog.git/blame - src/Graylog/Gelf.hs
Allow sending numbers in additional fields
[github/fretlink/haskell-graylog.git] / src / Graylog / Gelf.hs
CommitLineData
52696643
A
1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE OverloadedStrings #-}
8c9d965d 4{-# LANGUAGE RecordWildCards #-}
52696643 5
d9a5d441
A
6-- | Default formatting for Graylog messages,
7-- see http://docs.graylog.org/en/latest/pages/gelf.html
52696643
A
8module Graylog.Gelf where
9
4b663780
TC
10import Data.Aeson (ToJSON (..), Value (..), object, toJSON,
11 (.=))
8c9d965d 12import Data.HashMap.Strict (HashMap)
4b663780 13import Data.Scientific (Scientific)
8c9d965d
TC
14import Data.Semigroup ((<>))
15import Data.Text (Text)
52696643
A
16import Data.Time
17import Data.Typeable
8c9d965d 18import GHC.Exts (toList)
52696643
A
19import GHC.Generics
20
21data GELF
22 = GELF
15981d57
A
23 { _gelfVersion :: Version
24 , _gelfHost :: Text
25 , _gelfShortMessage :: Text
26 , _gelfFullMessage :: Maybe Text
27 , _gelfTimestamp :: Maybe UTCTime
28 , _gelfLevel :: Maybe SyslogLevel
29 , _gelfLine :: Maybe Word
30 , _gelfFile :: Maybe Text
4b663780 31 , _gelfMeta :: HashMap Text MetaValue
52696643
A
32 }
33 deriving (Show, Typeable, Generic)
34
4b663780
TC
35data MetaValue
36 = TextValue Text
37 | NumberValue Scientific
38 deriving (Show)
39
40instance ToJSON MetaValue where
41 toJSON (TextValue txt) = toJSON txt
42 toJSON (NumberValue n) = toJSON n
43
44class ToMeta a where
45 toMeta :: a -> MetaValue
46
47instance ToMeta Text where
48 toMeta = TextValue
49
50instance ToMeta Scientific where
51 toMeta = NumberValue
52
53instance ToMeta Integer where
54 toMeta = NumberValue . fromInteger
55
56instance ToMeta Int where
57 toMeta = toMeta . toInteger
58
52696643 59instance ToJSON GELF where
8c9d965d
TC
60 toJSON GELF{..} = object $ [ "version" .= _gelfVersion
61 , "host" .= _gelfHost
62 , "short_message" .= _gelfShortMessage
63 , "full_message" .= _gelfFullMessage
64 , "timestamp" .= _gelfTimestamp
65 , "level" .= _gelfLevel
66 , "line" .= _gelfLine
67 , "file" .= _gelfFile
4b663780 68 ] <> toList (toJSON <$> _gelfMeta)
52696643
A
69
70--
71
72data Version
73 = Version1x1
74 deriving (Eq, Show, Typeable, Generic)
75
76instance ToJSON Version where
77 toJSON Version1x1 = String "1.1"
78
79--
80
81data SyslogLevel
82 = Emergency
83 | Alert
84 | Critical
85 | Error
86 | Warning
87 | Notice
88 | Informational
89 | Debug
90 deriving (Eq, Ord, Show, Typeable, Generic)
91
92instance ToJSON SyslogLevel where
93 toJSON Emergency = Number 0
94 toJSON Alert = Number 1
95 toJSON Critical = Number 2
96 toJSON Error = Number 3
97 toJSON Warning = Number 4
98 toJSON Notice = Number 5
99 toJSON Informational = Number 6
100 toJSON Debug = Number 7
b23afe7b
A
101
102--
103
104simpleGelf
105 :: Text -- ^ Hostname
106 -> Text -- ^ Short message
107 -> GELF
108simpleGelf host short =
8c9d965d 109 GELF Version1x1 host short Nothing Nothing Nothing Nothing Nothing mempty