{-# LANGUAGE NamedFieldPuns, OverloadedStrings, DuplicateRecordFields #-} module Instances where import Servant.Tracing import Tracing.Core import Data.Char (isAscii) import Test.QuickCheck hiding (sample) import Data.Time.Clock.POSIX import qualified Data.Map as M import qualified Data.Text as T instance Arbitrary TracingInstructions where arbitrary = do tid <- arbitrary sid <- arbitrary parentSpanId <- arbitrary dbg <- arbitrary sample <- arbitrary pure TracingInstructions { traceId=tid, spanId=sid, parentSpanId, debug=dbg, sample } where positiveArb :: (Integral a, Arbitrary a) => Gen a positiveArb = suchThat arbitrary (>= 0) instance Arbitrary TraceId where arbitrary = TraceId <$> positiveArb instance Arbitrary SpanId where arbitrary = SpanId <$> positiveArb instance Arbitrary SpanContext where arbitrary = SpanContext <$> arbitrary <*> arbitrary instance Arbitrary OpName where arbitrary = OpName <$> arbitrary instance Arbitrary SpanRelation where arbitrary = do rel <- elements [ChildOf, FollowsFrom] rel <$> arbitrary instance Arbitrary T.Text where arbitrary = T.pack <$> listOf (suchThat arbitrary isAscii) instance Arbitrary SpanRelationTag where arbitrary = elements [Child, Follows] -- TODO add tags and baggage once they're supported instance Arbitrary Span where arbitrary = do o <- arbitrary c <- arbitrary rels <- arbitrary dbg <- arbitrary svc <- arbitrary pure Span { operationName = o, context = c, timestamp = 1522024571, duration = 123, relations = rels, tags = M.empty, baggage = M.empty, debug = dbg, serviceName = svc }