Skip to content

Commit 58c030e

Browse files
committed
bench: Integrate cardano-timeseries-io into cardano-tracer
1 parent 1e6d822 commit 58c030e

18 files changed

Lines changed: 343 additions & 69 deletions

File tree

cabal.project

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,11 @@ if impl(ghc >= 9.12)
107107
proto-lens-tests-dep
108108
proto-lens-tests
109109
proto-lens
110+
111+
source-repository-package
112+
type: git
113+
location: https://github.com/input-output-hk/ekg-forward.git
114+
tag: c72c9a29045431df7484b665bed33c12ea71d0ac
115+
--sha256: sha256-b87qt8RMI4gNPF8QTrRjfS5KK2/JhbxUp5ijscn2Vf8=
116+
subdir:
117+
.

cardano-tracer/cardano-tracer.cabal

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ library
123123
Cardano.Tracer.Handlers.Metrics.Monitoring
124124
Cardano.Tracer.Handlers.Metrics.Prometheus
125125
Cardano.Tracer.Handlers.Metrics.Servers
126+
Cardano.Tracer.Handlers.Metrics.TimeseriesServer
126127
Cardano.Tracer.Handlers.Metrics.Utils
127128

128129
Cardano.Tracer.Handlers.Notifications.Check
@@ -147,6 +148,8 @@ library
147148

148149
other-modules: Cardano.Tracer.Handlers.Logs.Journal.NoSystemd
149150
Cardano.Tracer.Handlers.Notifications.Timer
151+
Cardano.Tracer.Time
152+
150153
Paths_cardano_tracer
151154

152155
autogen-modules: Paths_cardano_tracer
@@ -201,6 +204,7 @@ library
201204
, warp ^>= 3.4
202205
, warp-tls
203206
, yaml
207+
, cardano-timeseries-io
204208

205209
if os(windows)
206210
build-depends: Win32

cardano-tracer/src/Cardano/Tracer/Acceptors/Client.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import Data.Word (Word32)
4141
import qualified Network.Mux as Mux
4242
import qualified Network.Socket as Socket
4343
import qualified System.Metrics.Configuration as EKGF
44-
import System.Metrics.Network.Acceptor (acceptEKGMetricsInit)
44+
import System.Metrics.Network.Acceptor (acceptMetricsInit)
4545

4646
import qualified Trace.Forward.Configuration.DataPoint as DPF
4747
import qualified Trace.Forward.Configuration.TraceObject as TF
@@ -192,10 +192,11 @@ runEKGAcceptorInit
192192
respoinderCtx
193193
LBS.ByteString IO () Void
194194
runEKGAcceptorInit tracerEnv ekgConfig errorHandler =
195-
acceptEKGMetricsInit
195+
acceptMetricsInit
196196
ekgConfig
197197
(prepareMetricsStores tracerEnv . micConnectionId)
198-
(errorHandler . micConnectionId)
198+
(store tracerEnv . connIdToNodeId . micConnectionId)
199+
(errorHandler . micConnectionId) where
199200

200201
runTraceObjectsAcceptorInit
201202
:: Show addr

cardano-tracer/src/Cardano/Tracer/Acceptors/Server.hs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ module Cardano.Tracer.Acceptors.Server
55
( runAcceptorsServer
66
) where
77

8-
import "contra-tracer" Control.Tracer (nullTracer)
9-
108
import Cardano.Logging (TraceObject)
119
import qualified Cardano.Logging.Types as Net
1210
import Cardano.Tracer.Acceptors.Utils
@@ -25,25 +23,25 @@ import Ouroboros.Network.Mux (MiniProtocol (..), MiniProtocolLimits (.
2523
miniProtocolNum, miniProtocolRun)
2624
import Ouroboros.Network.Protocol.Handshake (Handshake, HandshakeArguments (..))
2725
import qualified Ouroboros.Network.Protocol.Handshake as Handshake
26+
import qualified Ouroboros.Network.Server.Simple as Server
2827
import Ouroboros.Network.Snocket (LocalAddress, LocalSocket, Snocket,
2928
localAddressFromPath, localSnocket, makeLocalBearer, makeSocketBearer,
3029
socketSnocket)
31-
import Ouroboros.Network.Socket (ConnectionId (..),
32-
SomeResponderApplication (..))
33-
import qualified Ouroboros.Network.Server.Simple as Server
30+
import Ouroboros.Network.Socket (ConnectionId (..), SomeResponderApplication (..))
3431

3532
import Codec.CBOR.Term (Term)
3633
import Control.Concurrent.Async (wait)
34+
import "contra-tracer" Control.Tracer (nullTracer)
3735
import qualified Data.ByteString.Lazy as LBS
36+
import Data.Functor (void)
3837
import Data.List.NonEmpty (NonEmpty ((:|)))
3938
import qualified Data.Text as Text
40-
import Data.Functor (void)
4139
import Data.Void (Void)
4240
import Data.Word (Word32)
4341
import qualified Network.Mux as Mux
4442
import qualified Network.Socket as Socket
4543
import qualified System.Metrics.Configuration as EKGF
46-
import System.Metrics.Network.Acceptor (acceptEKGMetricsResp)
44+
import System.Metrics.Network.Acceptor (acceptMetricsResp)
4745

4846
import qualified Trace.Forward.Configuration.DataPoint as DPF
4947
import qualified Trace.Forward.Configuration.TraceObject as TF
@@ -184,9 +182,10 @@ runEKGAcceptor
184182
-> (ConnectionId addr -> IO ())
185183
-> RunMiniProtocol 'Mux.ResponderMode initiatorCtx (ResponderContext addr) LBS.ByteString IO Void ()
186184
runEKGAcceptor tracerEnv ekgConfig errorHandler =
187-
acceptEKGMetricsResp
185+
acceptMetricsResp
188186
ekgConfig
189187
(prepareMetricsStores tracerEnv . rcConnectionId)
188+
(store tracerEnv . connIdToNodeId . rcConnectionId)
190189
(errorHandler . rcConnectionId)
191190

192191
runTraceObjectsAcceptor

cardano-tracer/src/Cardano/Tracer/Acceptors/Utils.hs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE NamedFieldPuns #-}
22
{-# LANGUAGE OverloadedStrings #-}
33
{-# LANGUAGE TupleSections #-}
4+
{-# LANGUAGE ViewPatterns #-}
45

56
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
67

@@ -9,29 +10,38 @@ module Cardano.Tracer.Acceptors.Utils
910
, prepareMetricsStores
1011
, removeDisconnectedNode
1112
, notifyAboutNodeDisconnected
13+
, store
1214
) where
1315

1416
#if RTVIEW
1517
import Cardano.Logging (SeverityS (..))
18+
#endif
19+
import qualified Cardano.Timeseries.Component as Timeseries
20+
import Cardano.Timeseries.Domain.Types (MetricIdentifier)
21+
import Cardano.Tracer.Environment
22+
#if RTVIEW
1623
import Cardano.Tracer.Handlers.Notifications.Types
1724
import Cardano.Tracer.Handlers.Notifications.Utils
1825
#endif
19-
import Cardano.Tracer.Environment
26+
import Cardano.Tracer.Time (getTimeMs)
2027
import Cardano.Tracer.Types
2128
import Cardano.Tracer.Utils
2229
import Ouroboros.Network.Socket (ConnectionId (..))
2330

2431
import Control.Concurrent.STM (atomically)
2532
import Control.Concurrent.STM.TVar (TVar, modifyTVar', newTVarIO)
2633
import qualified Data.Bimap as BM
34+
import Data.Foldable
2735
import qualified Data.Map.Strict as M
36+
import Data.Maybe (mapMaybe)
2837
import qualified Data.Set as S
29-
import Data.Time.Clock.POSIX (getPOSIXTime)
3038
#if RTVIEW
3139
import Data.Time.Clock.System (getSystemTime, systemToUTCTime)
3240
#endif
3341
import qualified System.Metrics as EKG
34-
import System.Metrics.Store.Acceptor (MetricsLocalStore, emptyMetricsLocalStore)
42+
import System.Metrics.ReqResp
43+
import System.Metrics.Store.Acceptor (MetricsLocalStore, emptyMetricsLocalStore,
44+
storeMetrics)
3545

3646
import Trace.Forward.Utils.DataPoint (DataPointRequestor, initDataPointRequestor)
3747

@@ -54,26 +64,17 @@ prepareMetricsStores
5464
-> IO (EKG.Store, TVar MetricsLocalStore)
5565
prepareMetricsStores TracerEnv{teConnectedNodes, teAcceptedMetrics} connId = do
5666
addConnectedNode teConnectedNodes connId
57-
store <- EKG.newStore
67+
st <- EKG.newStore
5868

59-
EKG.registerCounter "ekg.server_timestamp_ms" getTimeMs store
60-
storesForNewNode <- (store ,) <$> newTVarIO emptyMetricsLocalStore
69+
EKG.registerCounter "ekg.server_timestamp_ms" getTimeMs st
70+
storesForNewNode <- (st ,) <$> newTVarIO emptyMetricsLocalStore
6171

6272
atomically do
6373
modifyTVar' teAcceptedMetrics do
6474
M.insert (connIdToNodeId connId) storesForNewNode
6575

6676
return storesForNewNode
6777

68-
where
69-
-- forkServer definition of `getTimeMs'. The ekg frontend relies
70-
-- on the "ekg.server_timestamp_ms" metric being in every
71-
-- store. While forkServer adds that that automatically we must
72-
-- manually add it.
73-
-- url
74-
-- + https://github.com/tvh/ekg-wai/blob/master/System/Remote/Monitoring/Wai.hs#L237-L238
75-
getTimeMs = (round . (* 1000)) `fmap` getPOSIXTime
76-
7778
addConnectedNode
7879
:: Show addr
7980
=> ConnectedNodes
@@ -115,3 +116,21 @@ notifyAboutNodeDisconnected TracerEnvRTView{teEventsQueues} connId = do
115116
#else
116117
notifyAboutNodeDisconnected _ _ = pure ()
117118
#endif
119+
120+
store :: TracerEnv -> NodeId -> (EKG.Store, TVar MetricsLocalStore) -> Response -> IO ()
121+
store tracerEnv (NodeId nodeId) (ekgStore, localStore) resp@(ResponseMetrics ms) = do
122+
storeMetrics resp ekgStore localStore
123+
ts <- getTimeMs
124+
for_ (teTimeseriesHandle tracerEnv) $ \h ->
125+
Timeseries.insert h "node_id" nodeId (fromIntegral ts) (mapMaybe parseMetric ms)
126+
127+
where
128+
numeralOnly :: MetricValue -> Maybe Double
129+
numeralOnly (GaugeValue x) = Just (fromIntegral x)
130+
numeralOnly (CounterValue x) = Just (fromIntegral x)
131+
numeralOnly (LabelValue _) = Nothing
132+
133+
parseMetric :: (MetricName, MetricValue) -> Maybe (MetricIdentifier, Double)
134+
parseMetric (k, numeralOnly -> Just v) = Just (k, v)
135+
parseMetric _ = Nothing
136+

cardano-tracer/src/Cardano/Tracer/Configuration.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ data TracerConfig = TracerConfig
164164
, hasEKG :: !(Maybe Endpoint) -- ^ Endpoint for EKG web-page.
165165
, hasPrometheus :: !(Maybe Endpoint) -- ^ Endpoint for Prometheus web-page.
166166
, hasRTView :: !(Maybe Endpoint) -- ^ Endpoint for RTView web-page.
167+
, hasTimeseries :: !(Maybe Endpoint)
167168
, tlsCertificate :: !(Maybe Certificate)
168169
-- | Socket for tracer's to reforward on. Second member of the triplet is the list of prefixes to reforward.
169170
-- Third member of the triplet is the forwarder config.

cardano-tracer/src/Cardano/Tracer/Environment.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Cardano.Tracer.Environment
66
) where
77

88
import Cardano.Logging.Types
9+
import Cardano.Timeseries.Component (TimeseriesHandle)
910
import Cardano.Tracer.Configuration
1011
#if RTVIEW
1112
import Cardano.Tracer.Handlers.Notifications.Types
@@ -36,6 +37,7 @@ data TracerEnv = TracerEnv
3637
, teRegistry :: !HandleRegistry
3738
, teStateDir :: !(Maybe FilePath)
3839
, teMetricsHelp :: ![(Text, Builder)]
40+
, teTimeseriesHandle :: !(Maybe TimeseriesHandle)
3941
}
4042

4143
#if RTVIEW

cardano-tracer/src/Cardano/Tracer/Handlers/Metrics/Servers.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
{-# LANGUAGE NumericUnderscores #-}
21
{-# LANGUAGE NamedFieldPuns #-}
3-
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE NumericUnderscores #-}
43

54
module Cardano.Tracer.Handlers.Metrics.Servers
65
( runMetricsServers
@@ -10,17 +9,19 @@ import Cardano.Tracer.Configuration
109
import Cardano.Tracer.Environment
1110
import Cardano.Tracer.Handlers.Metrics.Monitoring
1211
import Cardano.Tracer.Handlers.Metrics.Prometheus
12+
import Cardano.Tracer.Handlers.Metrics.TimeseriesServer (runTimeseriesServer)
1313
import qualified Cardano.Tracer.Handlers.Metrics.Utils as Utils
1414
import Cardano.Tracer.Utils (sequenceConcurrently_)
1515

1616
import Control.AutoUpdate
17-
import Data.Maybe (catMaybes)
1817
import Control.Monad (unless)
18+
import Data.Maybe (catMaybes)
1919

2020
-- | Runs metrics servers if needed:
2121
--
2222
-- 1. Prometheus exporter.
2323
-- 2. EKG monitoring web-page.
24+
-- 3. Timeseries query server.
2425
--
2526
runMetricsServers
2627
:: TracerEnv
@@ -44,8 +45,11 @@ runMetricsServers tracerEnv = do
4445
servers = catMaybes
4546
[ runPrometheusServer tracerEnv <$> hasPrometheus
4647
, runMonitoringServer tracerEnv <$> hasEKG
48+
, const <$> (runTimeseriesServer teTracer cfg <$> hasTimeseries <*> teTimeseriesHandle)
4749
]
4850

4951
TracerEnv
50-
{ teConfig = TracerConfig { hasPrometheus, hasEKG }
52+
{ teConfig = cfg@TracerConfig { hasPrometheus, hasEKG, hasTimeseries },
53+
teTracer,
54+
teTimeseriesHandle
5155
} = tracerEnv

0 commit comments

Comments
 (0)