@@ -106,3 +106,46 @@ extension TraceParent: CustomStringConvertible {
106106 self . rawValue
107107 }
108108}
109+
110+ extension TraceParent {
111+ /// Returns a random `TraceParent`, using the given generator as a source for randomness.
112+ /// - Parameter generator: The random number generator used as a source for generating the different values.
113+ /// - Note: `traceFlags` will be set to 0.
114+ /// - Returns: A `TraceParent` with random `traceID` & `parentID`.
115+ public static func random< G: RandomNumberGenerator > ( using generator: inout G ) -> TraceParent {
116+ let traceID = Self . randomTraceID ( using: & generator)
117+ let parentID = Self . randomParentID ( using: & generator)
118+ return . init( traceID: traceID, parentID: parentID, traceFlags: UInt64 ( 0 ) . paddedHexString ( radix: 2 ) )
119+ }
120+
121+ /// Returns a random `TraceParent` using the system random number generator.
122+ /// - Note: `traceFlags` will be set to 0.
123+ /// - Returns: A `TraceParent` with random `traceID` & `parentID`.
124+ public static func random( ) -> TraceParent {
125+ var g = SystemRandomNumberGenerator ( )
126+ return . random( using: & g)
127+ }
128+
129+ static func randomTraceID< G: RandomNumberGenerator > ( using generator: inout G ) -> String {
130+ let traceIDHigh = UInt64
131+ . random ( in: 1 ... UInt64 . max, using: & generator)
132+ . paddedHexString ( radix: 16 )
133+ let traceIDLow = UInt64
134+ . random ( in: 1 ... UInt64 . max, using: & generator)
135+ . paddedHexString ( radix: 16 )
136+ return traceIDHigh + traceIDLow
137+ }
138+
139+ static func randomParentID< G: RandomNumberGenerator > ( using generator: inout G ) -> String {
140+ UInt64
141+ . random ( in: 1 ... UInt64 . max, using: & generator)
142+ . paddedHexString ( radix: 16 )
143+ }
144+ }
145+
146+ extension UInt64 {
147+ func paddedHexString( radix: Int ) -> String {
148+ let unpadded = String ( self , radix: radix, uppercase: false )
149+ return String ( repeating: " 0 " , count: radix - unpadded. count) + unpadded
150+ }
151+ }
0 commit comments