freckle-app 1.10.0.0 → 1.10.1.0
raw patch · 6 files changed
+48/−32 lines, 6 files
Files
- CHANGELOG.md +8/−1
- freckle-app.cabal +1/−1
- library/Freckle/App/Kafka/Consumer.hs +13/−11
- library/Freckle/App/OpenTelemetry.hs +16/−0
- library/Network/Wai/Middleware/OpenTelemetry.hs +9/−18
- package.yaml +1/−1
CHANGELOG.md view
@@ -1,4 +1,11 @@-## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.10.0.0...main)+## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.10.1.0...main)++## [v1.10.0.1](https://github.com/freckle/freckle-app/compare/v1.10.0.0...v1.10.1.0)++- Use `withTraceIdContext` in `Freckle.App.Kafka.Consumer.runConsumer`, ensuring+ all logging contains the `trace_id` in context.+- Add `getCurrentTraceIdAsDatadog` and `withTraceIdContext` to+ `Freckle.App.OpenTelemetry`. ## [v1.10.0.0](https://github.com/freckle/freckle-app/compare/v1.9.5.1...v1.10.0.0)
freckle-app.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: freckle-app-version: 1.10.0.0+version: 1.10.1.0 license: MIT license-file: LICENSE maintainer: Freckle Education
library/Freckle/App/Kafka/Consumer.hs view
@@ -20,6 +20,7 @@ import Freckle.App.Async import Freckle.App.Env import Freckle.App.Kafka.Producer (envKafkaBrokerAddresses)+import Freckle.App.OpenTelemetry (withTraceIdContext) import Kafka.Consumer hiding ( Timeout , closeConsumer@@ -153,14 +154,15 @@ => Timeout -> (a -> m ()) -> m ()-runConsumer pollTimeout onMessage = immortalCreateLogged $ do- consumer <- view kafkaConsumerL- eMessage <-- pollMessage consumer $ Kafka.Timeout $ timeoutMs pollTimeout- case eMessage of- Left (KafkaResponseError RdKafkaRespErrTimedOut) -> logDebug "Polling timeout"- Left err -> logError $ "Error polling for message from Kafka" :# ["error" .= show err]- Right ConsumerRecord {..} -> for_ crValue $ \bs ->- case eitherDecodeStrict bs of- Left err -> logError $ "Could not decode message value" :# ["error" .= err]- Right a -> onMessage a+runConsumer pollTimeout onMessage =+ withTraceIdContext $ immortalCreateLogged $ do+ consumer <- view kafkaConsumerL+ eMessage <-+ pollMessage consumer $ Kafka.Timeout $ timeoutMs pollTimeout+ case eMessage of+ Left (KafkaResponseError RdKafkaRespErrTimedOut) -> logDebug "Polling timeout"+ Left err -> logError $ "Error polling for message from Kafka" :# ["error" .= show err]+ Right ConsumerRecord {..} -> for_ crValue $ \bs ->+ case eitherDecodeStrict bs of+ Left err -> logError $ "Could not decode message value" :# ["error" .= err]+ Right a -> onMessage a
library/Freckle/App/OpenTelemetry.hs view
@@ -34,7 +34,9 @@ , defaultSpanArguments -- * Querying+ , withTraceIdContext , getCurrentTraceId+ , getCurrentTraceIdAsDatadog , getCurrentSpanContext -- * Setup@@ -47,8 +49,13 @@ import Freckle.App.Prelude +import Blammo.Logging (MonadMask, withThreadContext, (.=))+import Data.Word (Word64) import OpenTelemetry.Context (lookupSpan) import OpenTelemetry.Context.ThreadLocal (getContext)+import OpenTelemetry.Propagator.Datadog+ ( convertOpenTelemetryTraceIdToDatadogTraceId+ ) import OpenTelemetry.Trace hiding (inSpan) import OpenTelemetry.Trace.Core (getSpanContext) import qualified OpenTelemetry.Trace.Core as Trace (SpanContext (..))@@ -65,7 +72,16 @@ getCurrentTraceId :: MonadIO m => m (Maybe TraceId) getCurrentTraceId = fmap Trace.traceId <$> getCurrentSpanContext +getCurrentTraceIdAsDatadog :: MonadIO m => m (Maybe Word64)+getCurrentTraceIdAsDatadog =+ fmap convertOpenTelemetryTraceIdToDatadogTraceId <$> getCurrentTraceId+ getCurrentSpanContext :: MonadIO m => m (Maybe SpanContext) getCurrentSpanContext = do mSpan <- lookupSpan <$> getContext traverse getSpanContext mSpan++withTraceIdContext :: (MonadIO m, MonadMask m) => m a -> m a+withTraceIdContext f = do+ mTraceId <- getCurrentTraceIdAsDatadog+ maybe f (\traceId -> withThreadContext ["trace_id" .= traceId] f) mTraceId
library/Network/Wai/Middleware/OpenTelemetry.hs view
@@ -5,15 +5,11 @@ import Freckle.App.Prelude -import Blammo.Logging (withThreadContext, (.=)) import qualified Data.ByteString.Char8 as BS8 import Freckle.App.OpenTelemetry import Network.Wai import Network.Wai.Middleware.AddHeaders import qualified OpenTelemetry.Instrumentation.Wai as Trace-import OpenTelemetry.Propagator.Datadog- ( convertOpenTelemetryTraceIdToDatadogTraceId- ) newOpenTelemetryWaiMiddleware :: IO Middleware newOpenTelemetryWaiMiddleware = do@@ -27,18 +23,13 @@ -- -- This is added automatically by our 'newOpenTelemetryWaiMiddleware'. openTelemetryMiddleware :: Middleware-openTelemetryMiddleware app request respond = do- mTraceId <- getCurrentTraceId- case mTraceId of- Nothing -> app request respond- Just traceId -> do- let- traceIdInt = convertOpenTelemetryTraceIdToDatadogTraceId traceId- traceIdIntBS = BS8.pack $ show traceIdInt+openTelemetryMiddleware app request respond =+ withTraceIdContext $ addTraceIdHeader app request respond - withThreadContext ["trace_id" .= traceIdInt] $- addHeaders- [("X-Datadog-Trace-Id", traceIdIntBS)]- app- request- respond+addTraceIdHeader :: Middleware+addTraceIdHeader app request respond = do+ mTraceId <- getCurrentTraceIdAsDatadog+ maybe id addHeader mTraceId app request respond+ where+ addHeader traceId =+ addHeaders [("X-Datadog-Trace-Id", BS8.pack $ show traceId)]
package.yaml view
@@ -1,5 +1,5 @@ name: freckle-app-version: 1.10.0.0+version: 1.10.1.0 maintainer: Freckle Education category: Utils github: freckle/freckle-app