@fluidframework/container-runtime 2.0.0-internal.5.3.2 → 2.0.0-internal.6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/dist/batchTracker.d.ts +2 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +1 -1
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +13 -2
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +103 -25
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/connectionTelemetry.d.ts.map +1 -1
  11. package/dist/connectionTelemetry.js +12 -4
  12. package/dist/connectionTelemetry.js.map +1 -1
  13. package/dist/containerRuntime.d.ts +69 -22
  14. package/dist/containerRuntime.d.ts.map +1 -1
  15. package/dist/containerRuntime.js +344 -238
  16. package/dist/containerRuntime.js.map +1 -1
  17. package/dist/dataStore.js +11 -2
  18. package/dist/dataStore.js.map +1 -1
  19. package/dist/dataStoreContext.d.ts +1 -1
  20. package/dist/dataStoreContext.d.ts.map +1 -1
  21. package/dist/dataStoreContext.js +40 -44
  22. package/dist/dataStoreContext.js.map +1 -1
  23. package/dist/dataStoreContexts.js +1 -1
  24. package/dist/dataStoreContexts.js.map +1 -1
  25. package/dist/dataStores.d.ts +21 -5
  26. package/dist/dataStores.d.ts.map +1 -1
  27. package/dist/dataStores.js +102 -58
  28. package/dist/dataStores.js.map +1 -1
  29. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  30. package/dist/deltaManagerSummarizerProxy.js +2 -0
  31. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  32. package/dist/deltaScheduler.d.ts.map +1 -1
  33. package/dist/deltaScheduler.js +5 -5
  34. package/dist/deltaScheduler.js.map +1 -1
  35. package/dist/gc/garbageCollection.d.ts.map +1 -1
  36. package/dist/gc/garbageCollection.js +29 -25
  37. package/dist/gc/garbageCollection.js.map +1 -1
  38. package/dist/gc/gcConfigs.js +13 -11
  39. package/dist/gc/gcConfigs.js.map +1 -1
  40. package/dist/gc/gcHelpers.d.ts +1 -0
  41. package/dist/gc/gcHelpers.d.ts.map +1 -1
  42. package/dist/gc/gcHelpers.js +5 -6
  43. package/dist/gc/gcHelpers.js.map +1 -1
  44. package/dist/gc/gcSummaryStateTracker.js +4 -6
  45. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  46. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  47. package/dist/gc/gcTelemetry.js +44 -33
  48. package/dist/gc/gcTelemetry.js.map +1 -1
  49. package/dist/id-compressor/idCompressor.d.ts +3 -3
  50. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  51. package/dist/id-compressor/idCompressor.js +52 -52
  52. package/dist/id-compressor/idCompressor.js.map +1 -1
  53. package/dist/id-compressor/idRange.js +2 -2
  54. package/dist/id-compressor/idRange.js.map +1 -1
  55. package/dist/id-compressor/sessionIdNormalizer.js +11 -16
  56. package/dist/id-compressor/sessionIdNormalizer.js.map +1 -1
  57. package/dist/index.d.ts +1 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/opLifecycle/batchManager.js +10 -6
  61. package/dist/opLifecycle/batchManager.js.map +1 -1
  62. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  63. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  64. package/dist/opLifecycle/opCompressor.js +7 -2
  65. package/dist/opLifecycle/opCompressor.js.map +1 -1
  66. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  67. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  68. package/dist/opLifecycle/opDecompressor.js +12 -10
  69. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  70. package/dist/opLifecycle/opGroupingManager.js +13 -5
  71. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  72. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  73. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  74. package/dist/opLifecycle/opSplitter.js +11 -7
  75. package/dist/opLifecycle/opSplitter.js.map +1 -1
  76. package/dist/opLifecycle/outbox.d.ts +6 -5
  77. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  78. package/dist/opLifecycle/outbox.js +6 -14
  79. package/dist/opLifecycle/outbox.js.map +1 -1
  80. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  81. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  82. package/dist/opLifecycle/remoteMessageProcessor.js +8 -2
  83. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  84. package/dist/opProperties.js +1 -2
  85. package/dist/opProperties.js.map +1 -1
  86. package/dist/packageVersion.d.ts +1 -1
  87. package/dist/packageVersion.js +1 -1
  88. package/dist/packageVersion.js.map +1 -1
  89. package/dist/pendingStateManager.d.ts +6 -3
  90. package/dist/pendingStateManager.d.ts.map +1 -1
  91. package/dist/pendingStateManager.js +41 -32
  92. package/dist/pendingStateManager.js.map +1 -1
  93. package/dist/scheduleManager.d.ts.map +1 -1
  94. package/dist/scheduleManager.js +15 -11
  95. package/dist/scheduleManager.js.map +1 -1
  96. package/dist/summary/orderedClientElection.d.ts +2 -1
  97. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  98. package/dist/summary/orderedClientElection.js +18 -19
  99. package/dist/summary/orderedClientElection.js.map +1 -1
  100. package/dist/summary/runningSummarizer.d.ts +3 -5
  101. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  102. package/dist/summary/runningSummarizer.js +42 -66
  103. package/dist/summary/runningSummarizer.js.map +1 -1
  104. package/dist/summary/summarizer.js +5 -8
  105. package/dist/summary/summarizer.js.map +1 -1
  106. package/dist/summary/summarizerClientElection.js +5 -9
  107. package/dist/summary/summarizerClientElection.js.map +1 -1
  108. package/dist/summary/summarizerHeuristics.js +8 -12
  109. package/dist/summary/summarizerHeuristics.js.map +1 -1
  110. package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -5
  111. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  112. package/dist/summary/summarizerNode/summarizerNode.js +26 -22
  113. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  114. package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  115. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  116. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
  117. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  118. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +13 -16
  119. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  120. package/dist/summary/summaryCollection.js +3 -5
  121. package/dist/summary/summaryCollection.js.map +1 -1
  122. package/dist/summary/summaryFormat.js +1 -2
  123. package/dist/summary/summaryFormat.js.map +1 -1
  124. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  125. package/dist/summary/summaryGenerator.js +67 -21
  126. package/dist/summary/summaryGenerator.js.map +1 -1
  127. package/dist/summary/summaryManager.d.ts +2 -3
  128. package/dist/summary/summaryManager.d.ts.map +1 -1
  129. package/dist/summary/summaryManager.js +9 -7
  130. package/dist/summary/summaryManager.js.map +1 -1
  131. package/lib/batchTracker.d.ts +2 -1
  132. package/lib/batchTracker.d.ts.map +1 -1
  133. package/lib/batchTracker.js +2 -2
  134. package/lib/batchTracker.js.map +1 -1
  135. package/lib/blobManager.d.ts +13 -2
  136. package/lib/blobManager.d.ts.map +1 -1
  137. package/lib/blobManager.js +103 -25
  138. package/lib/blobManager.js.map +1 -1
  139. package/lib/connectionTelemetry.d.ts.map +1 -1
  140. package/lib/connectionTelemetry.js +13 -5
  141. package/lib/connectionTelemetry.js.map +1 -1
  142. package/lib/containerRuntime.d.ts +69 -22
  143. package/lib/containerRuntime.d.ts.map +1 -1
  144. package/lib/containerRuntime.js +343 -238
  145. package/lib/containerRuntime.js.map +1 -1
  146. package/lib/dataStore.js +11 -2
  147. package/lib/dataStore.js.map +1 -1
  148. package/lib/dataStoreContext.d.ts +1 -1
  149. package/lib/dataStoreContext.d.ts.map +1 -1
  150. package/lib/dataStoreContext.js +42 -46
  151. package/lib/dataStoreContext.js.map +1 -1
  152. package/lib/dataStoreContexts.js +2 -2
  153. package/lib/dataStoreContexts.js.map +1 -1
  154. package/lib/dataStores.d.ts +21 -5
  155. package/lib/dataStores.d.ts.map +1 -1
  156. package/lib/dataStores.js +103 -59
  157. package/lib/dataStores.js.map +1 -1
  158. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  159. package/lib/deltaManagerSummarizerProxy.js +2 -0
  160. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  161. package/lib/deltaScheduler.d.ts.map +1 -1
  162. package/lib/deltaScheduler.js +6 -6
  163. package/lib/deltaScheduler.js.map +1 -1
  164. package/lib/gc/garbageCollection.d.ts.map +1 -1
  165. package/lib/gc/garbageCollection.js +30 -26
  166. package/lib/gc/garbageCollection.js.map +1 -1
  167. package/lib/gc/gcConfigs.js +13 -11
  168. package/lib/gc/gcConfigs.js.map +1 -1
  169. package/lib/gc/gcHelpers.d.ts +1 -0
  170. package/lib/gc/gcHelpers.d.ts.map +1 -1
  171. package/lib/gc/gcHelpers.js +5 -6
  172. package/lib/gc/gcHelpers.js.map +1 -1
  173. package/lib/gc/gcSummaryStateTracker.js +4 -6
  174. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  175. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  176. package/lib/gc/gcTelemetry.js +45 -34
  177. package/lib/gc/gcTelemetry.js.map +1 -1
  178. package/lib/id-compressor/idCompressor.d.ts +3 -3
  179. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  180. package/lib/id-compressor/idCompressor.js +52 -52
  181. package/lib/id-compressor/idCompressor.js.map +1 -1
  182. package/lib/id-compressor/idRange.js +2 -2
  183. package/lib/id-compressor/idRange.js.map +1 -1
  184. package/lib/id-compressor/sessionIdNormalizer.js +11 -16
  185. package/lib/id-compressor/sessionIdNormalizer.js.map +1 -1
  186. package/lib/index.d.ts +1 -1
  187. package/lib/index.d.ts.map +1 -1
  188. package/lib/index.js.map +1 -1
  189. package/lib/opLifecycle/batchManager.js +10 -6
  190. package/lib/opLifecycle/batchManager.js.map +1 -1
  191. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  192. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  193. package/lib/opLifecycle/opCompressor.js +8 -3
  194. package/lib/opLifecycle/opCompressor.js.map +1 -1
  195. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  196. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  197. package/lib/opLifecycle/opDecompressor.js +13 -11
  198. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  199. package/lib/opLifecycle/opGroupingManager.js +13 -5
  200. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  201. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  202. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  203. package/lib/opLifecycle/opSplitter.js +12 -8
  204. package/lib/opLifecycle/opSplitter.js.map +1 -1
  205. package/lib/opLifecycle/outbox.d.ts +6 -5
  206. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  207. package/lib/opLifecycle/outbox.js +7 -15
  208. package/lib/opLifecycle/outbox.js.map +1 -1
  209. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  210. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  211. package/lib/opLifecycle/remoteMessageProcessor.js +8 -2
  212. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  213. package/lib/opProperties.js +1 -2
  214. package/lib/opProperties.js.map +1 -1
  215. package/lib/packageVersion.d.ts +1 -1
  216. package/lib/packageVersion.js +1 -1
  217. package/lib/packageVersion.js.map +1 -1
  218. package/lib/pendingStateManager.d.ts +6 -3
  219. package/lib/pendingStateManager.d.ts.map +1 -1
  220. package/lib/pendingStateManager.js +41 -32
  221. package/lib/pendingStateManager.js.map +1 -1
  222. package/lib/scheduleManager.d.ts.map +1 -1
  223. package/lib/scheduleManager.js +16 -12
  224. package/lib/scheduleManager.js.map +1 -1
  225. package/lib/summary/orderedClientElection.d.ts +2 -1
  226. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  227. package/lib/summary/orderedClientElection.js +19 -20
  228. package/lib/summary/orderedClientElection.js.map +1 -1
  229. package/lib/summary/runningSummarizer.d.ts +3 -5
  230. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  231. package/lib/summary/runningSummarizer.js +43 -67
  232. package/lib/summary/runningSummarizer.js.map +1 -1
  233. package/lib/summary/summarizer.js +6 -9
  234. package/lib/summary/summarizer.js.map +1 -1
  235. package/lib/summary/summarizerClientElection.js +5 -9
  236. package/lib/summary/summarizerClientElection.js.map +1 -1
  237. package/lib/summary/summarizerHeuristics.js +8 -12
  238. package/lib/summary/summarizerHeuristics.js.map +1 -1
  239. package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -5
  240. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  241. package/lib/summary/summarizerNode/summarizerNode.js +27 -23
  242. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  243. package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  244. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  245. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
  246. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  247. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -17
  248. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  249. package/lib/summary/summaryCollection.js +3 -5
  250. package/lib/summary/summaryCollection.js.map +1 -1
  251. package/lib/summary/summaryFormat.js +1 -2
  252. package/lib/summary/summaryFormat.js.map +1 -1
  253. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  254. package/lib/summary/summaryGenerator.js +68 -22
  255. package/lib/summary/summaryGenerator.js.map +1 -1
  256. package/lib/summary/summaryManager.d.ts +2 -3
  257. package/lib/summary/summaryManager.d.ts.map +1 -1
  258. package/lib/summary/summaryManager.js +10 -8
  259. package/lib/summary/summaryManager.js.map +1 -1
  260. package/package.json +30 -18
  261. package/src/batchTracker.ts +4 -3
  262. package/src/blobManager.ts +113 -15
  263. package/src/connectionTelemetry.ts +7 -3
  264. package/src/containerRuntime.ts +354 -194
  265. package/src/dataStore.ts +10 -1
  266. package/src/dataStoreContext.ts +31 -33
  267. package/src/dataStoreContexts.ts +2 -2
  268. package/src/dataStores.ts +108 -71
  269. package/src/deltaManagerSummarizerProxy.ts +2 -0
  270. package/src/deltaScheduler.ts +6 -10
  271. package/src/gc/garbageCollection.ts +13 -8
  272. package/src/gc/gcHelpers.ts +1 -0
  273. package/src/gc/gcTelemetry.ts +13 -10
  274. package/src/id-compressor/idCompressor.ts +6 -5
  275. package/src/index.ts +0 -1
  276. package/src/opLifecycle/opCompressor.ts +4 -3
  277. package/src/opLifecycle/opDecompressor.ts +4 -3
  278. package/src/opLifecycle/opSplitter.ts +4 -3
  279. package/src/opLifecycle/outbox.ts +13 -25
  280. package/src/opLifecycle/remoteMessageProcessor.ts +8 -2
  281. package/src/packageVersion.ts +1 -1
  282. package/src/pendingStateManager.ts +34 -25
  283. package/src/scheduleManager.ts +2 -2
  284. package/src/summary/orderedClientElection.ts +4 -3
  285. package/src/summary/runningSummarizer.ts +18 -44
  286. package/src/summary/summarizer.ts +2 -2
  287. package/src/summary/summarizerNode/summarizerNode.ts +13 -15
  288. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +8 -7
  289. package/src/summary/summaryGenerator.ts +6 -2
  290. package/src/summary/summaryManager.ts +9 -5
package/src/dataStore.ts CHANGED
@@ -62,6 +62,9 @@ class DataStore implements IDataStore {
62
62
  private readonly pendingAliases: Map<string, Promise<AliasResult>>;
63
63
  private aliasResult: Promise<AliasResult> | undefined;
64
64
 
65
+ /**
66
+ * {@inheritDoc @fluidframework/runtime-definitions#IDataStore.trySetAlias}
67
+ */
65
68
  async trySetAlias(alias: string): Promise<AliasResult> {
66
69
  if (alias.includes("/")) {
67
70
  throw new UsageError(`The alias cannot contain slashes: '${alias}'`);
@@ -158,7 +161,10 @@ class DataStore implements IDataStore {
158
161
  return "Success";
159
162
  }
160
163
 
161
- async request(request: IRequest): Promise<IResponse> {
164
+ /**
165
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
166
+ */
167
+ public async request(request: IRequest): Promise<IResponse> {
162
168
  return this.fluidDataStoreChannel.request(request);
163
169
  }
164
170
 
@@ -179,6 +185,9 @@ class DataStore implements IDataStore {
179
185
  this.pendingAliases = datastores.pendingAliases;
180
186
  }
181
187
 
188
+ /**
189
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
190
+ */
182
191
  public get IFluidRouter() {
183
192
  return this.fluidDataStoreChannel;
184
193
  }
@@ -54,19 +54,14 @@ import {
54
54
  IIdCompressorCore,
55
55
  VisibilityState,
56
56
  } from "@fluidframework/runtime-definitions";
57
+ import { addBlobToSummary, convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
57
58
  import {
58
- addBlobToSummary,
59
- convertSummaryTreeToITree,
60
- packagePathToTelemetryProperty,
61
- } from "@fluidframework/runtime-utils";
62
- import {
63
- ChildLogger,
59
+ createChildMonitoringContext,
64
60
  generateStack,
65
61
  ITelemetryLoggerExt,
66
- loggerToMonitoringContext,
67
62
  LoggingError,
68
63
  MonitoringContext,
69
- TelemetryDataTag,
64
+ tagCodeArtifacts,
70
65
  ThresholdCounter,
71
66
  } from "@fluidframework/telemetry-utils";
72
67
  import {
@@ -316,9 +311,16 @@ export abstract class FluidDataStoreContext
316
311
  async (fullGC?: boolean) => this.getGCDataInternal(fullGC),
317
312
  );
318
313
 
319
- this.mc = loggerToMonitoringContext(
320
- ChildLogger.create(this.logger, "FluidDataStoreContext"),
321
- );
314
+ this.mc = createChildMonitoringContext({
315
+ logger: this.logger,
316
+ namespace: "FluidDataStoreContext",
317
+ properties: {
318
+ all: tagCodeArtifacts({
319
+ fluidDataStoreId: this.id,
320
+ fullPackageName: this.pkg?.join("/"),
321
+ }),
322
+ },
323
+ });
322
324
  this.thresholdOpsCounter = new ThresholdCounter(
323
325
  FluidDataStoreContext.pendingOpsCountThreshold,
324
326
  this.mc.logger,
@@ -374,10 +376,13 @@ export abstract class FluidDataStoreContext
374
376
  failedPkgPath?: string,
375
377
  fullPackageName?: readonly string[],
376
378
  ): never {
377
- throw new LoggingError(reason, {
378
- failedPkgPath: { value: failedPkgPath, tag: TelemetryDataTag.CodeArtifact },
379
- fullPackageName: packagePathToTelemetryProperty(fullPackageName),
380
- });
379
+ throw new LoggingError(
380
+ reason,
381
+ tagCodeArtifacts({
382
+ failedPkgPath,
383
+ packagePath: fullPackageName?.join("/"),
384
+ }),
385
+ );
381
386
  }
382
387
 
383
388
  public async realize(): Promise<IFluidDataStoreChannel> {
@@ -389,13 +394,12 @@ export abstract class FluidDataStoreContext
389
394
  error,
390
395
  "realizeFluidDataStoreContext",
391
396
  );
392
- errorWrapped.addTelemetryProperties({
393
- fluidDataStoreId: {
394
- value: this.id,
395
- tag: TelemetryDataTag.CodeArtifact,
396
- },
397
- packageName: packagePathToTelemetryProperty(this.pkg),
398
- });
397
+ errorWrapped.addTelemetryProperties(
398
+ tagCodeArtifacts({
399
+ fullPackageName: this.pkg?.join("/"),
400
+ fluidDataStoreId: this.id,
401
+ }),
402
+ );
399
403
  this.channelDeferred?.reject(errorWrapped);
400
404
  this.mc.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
401
405
  });
@@ -790,10 +794,6 @@ export abstract class FluidDataStoreContext
790
794
  this.mc.logger.sendErrorEvent(
791
795
  {
792
796
  eventName: "BindRuntimeError",
793
- fluidDataStoreId: {
794
- value: this.id,
795
- tag: TelemetryDataTag.CodeArtifact,
796
- },
797
797
  },
798
798
  error,
799
799
  );
@@ -917,11 +917,6 @@ export abstract class FluidDataStoreContext
917
917
  this.mc.logger.sendTelemetryEvent({
918
918
  eventName,
919
919
  type,
920
- fluidDataStoreId: {
921
- value: this.id,
922
- tag: TelemetryDataTag.CodeArtifact,
923
- },
924
- packageName: packagePathToTelemetryProperty(this.pkg),
925
920
  isSummaryInProgress: this.summarizerNode.isSummaryInProgress?.(),
926
921
  stack: generateStack(),
927
922
  });
@@ -943,8 +938,11 @@ export abstract class FluidDataStoreContext
943
938
  );
944
939
  }
945
940
 
946
- public async uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {
947
- return this.containerRuntime.uploadBlob(blob);
941
+ public async uploadBlob(
942
+ blob: ArrayBufferLike,
943
+ signal?: AbortSignal,
944
+ ): Promise<IFluidHandle<ArrayBufferLike>> {
945
+ return this.containerRuntime.uploadBlob(blob, signal);
948
946
  }
949
947
  }
950
948
 
@@ -7,7 +7,7 @@ import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
7
7
  import { assert, Deferred } from "@fluidframework/common-utils";
8
8
  import { Lazy } from "@fluidframework/core-utils";
9
9
  import { IDisposable } from "@fluidframework/core-interfaces";
10
- import { ChildLogger, ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
10
+ import { createChildLogger, ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
11
11
  import { FluidDataStoreContext, LocalFluidDataStoreContext } from "./dataStoreContext";
12
12
 
13
13
  export class DataStoreContexts implements Iterable<[string, FluidDataStoreContext]>, IDisposable {
@@ -47,7 +47,7 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
47
47
  private readonly _logger: ITelemetryLoggerExt;
48
48
 
49
49
  constructor(baseLogger: ITelemetryBaseLogger) {
50
- this._logger = ChildLogger.create(baseLogger);
50
+ this._logger = createChildLogger({ logger: baseLogger });
51
51
  }
52
52
 
53
53
  [Symbol.iterator](): Iterator<[string, FluidDataStoreContext]> {
package/src/dataStores.ts CHANGED
@@ -42,11 +42,10 @@ import {
42
42
  unpackChildNodesUsedRoutes,
43
43
  } from "@fluidframework/runtime-utils";
44
44
  import {
45
- ChildLogger,
46
- loggerToMonitoringContext,
47
45
  LoggingError,
48
46
  MonitoringContext,
49
- TelemetryDataTag,
47
+ createChildMonitoringContext,
48
+ tagCodeArtifacts,
50
49
  } from "@fluidframework/telemetry-utils";
51
50
  import { AttachState } from "@fluidframework/container-definitions";
52
51
  import { buildSnapshotTree } from "@fluidframework/driver-utils";
@@ -137,7 +136,7 @@ export class DataStores implements IDisposable {
137
136
  private readonly aliasMap: Map<string, string>,
138
137
  private readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),
139
138
  ) {
140
- this.mc = loggerToMonitoringContext(ChildLogger.create(baseLogger));
139
+ this.mc = createChildMonitoringContext({ logger: baseLogger });
141
140
  this.containerRuntimeHandle = new FluidObjectHandle(
142
141
  this.runtime,
143
142
  "/",
@@ -243,10 +242,7 @@ export class DataStores implements IDisposable {
243
242
  "Duplicate DataStore created with existing id",
244
243
  {
245
244
  ...extractSafePropertiesFromMessage(message),
246
- dataStoreId: {
247
- value: attachMessage.id,
248
- tag: TelemetryDataTag.CodeArtifact,
249
- },
245
+ ...tagCodeArtifacts({ dataStoreId: attachMessage.id }),
250
246
  },
251
247
  );
252
248
  throw error;
@@ -435,8 +431,7 @@ export class DataStores implements IDisposable {
435
431
  ) {
436
432
  const envelope = message.contents as IEnvelope;
437
433
  const transformed = { ...message, contents: envelope.contents };
438
- const request = { url: envelope.address };
439
- this.validateNotDeleted(envelope.address, request);
434
+ this.validateNotDeleted(envelope.address);
440
435
  const context = this.contexts.get(envelope.address);
441
436
  assert(!!context, 0x162 /* "There should be a store context for the op" */);
442
437
  context.process(transformed, local, localMessageMetadata);
@@ -455,114 +450,154 @@ export class DataStores implements IDisposable {
455
450
  requestHeaderData: RuntimeHeaderData,
456
451
  ): Promise<FluidDataStoreContext> {
457
452
  const headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };
458
- const request = { url: id };
459
-
460
- this.validateNotDeleted(id, request, headerData);
453
+ this.validateNotDeleted(id, headerData);
461
454
 
462
455
  const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
463
456
  if (context === undefined) {
464
457
  // The requested data store does not exits. Throw a 404 response exception.
458
+ const request: IRequest = { url: id };
465
459
  throw responseToException(create404Response(request), request);
466
460
  }
467
461
 
468
- this.validateNotTombstoned(context, request, requestHeaderData);
462
+ this.validateNotTombstoned(context, requestHeaderData);
469
463
 
470
464
  return context;
471
465
  }
472
466
 
473
467
  /**
474
- * Validate that the data store had not been deleted by GC.
475
- *
468
+ * Returns the data store requested with the given id if available. Otherwise, returns undefined.
469
+ */
470
+ public async getDataStoreIfAvailable(
471
+ id: string,
472
+ requestHeaderData: RuntimeHeaderData,
473
+ ): Promise<FluidDataStoreContext | undefined> {
474
+ // If the data store has been deleted, return undefined.
475
+ if (this.checkIfDeleted(id, requestHeaderData)) {
476
+ return undefined;
477
+ }
478
+ const headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };
479
+ const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
480
+ if (context === undefined) {
481
+ return undefined;
482
+ }
483
+ // Check if the data store is tombstoned. If so, we want to log a telemetry event.
484
+ this.checkIfTombstoned(context, requestHeaderData);
485
+ return context;
486
+ }
487
+
488
+ /**
489
+ * Checks if the data store has been deleted by GC.
476
490
  * @param id - data store id
477
491
  * @param request - the request information to log if the validation detects the data store has been deleted
478
492
  * @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
493
+ * @returns true if the data store is deleted. Otherwise, returns false.
479
494
  */
480
- private validateNotDeleted(
481
- id: string,
482
- request: IRequest,
483
- requestHeaderData?: RuntimeHeaderData,
484
- ) {
495
+ private checkIfDeleted(id: string, requestHeaderData?: RuntimeHeaderData) {
485
496
  const dataStoreNodePath = `/${id}`;
486
- if (this.isDataStoreDeleted(dataStoreNodePath)) {
487
- assert(
488
- !this.contexts.has(id),
489
- 0x570 /* Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime. */,
490
- );
497
+ if (!this.isDataStoreDeleted(dataStoreNodePath)) {
498
+ return false;
499
+ }
500
+ assert(
501
+ !this.contexts.has(id),
502
+ 0x570 /* Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime. */,
503
+ );
504
+ sendGCUnexpectedUsageEvent(
505
+ this.mc,
506
+ {
507
+ eventName: "GC_Deleted_DataStore_Requested",
508
+ category: "error",
509
+ isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
510
+ id,
511
+ headers: JSON.stringify(requestHeaderData),
512
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
513
+ },
514
+ undefined /* packagePath */,
515
+ );
516
+ return true;
517
+ }
518
+
519
+ /**
520
+ * Validate that the data store had not been deleted by GC.
521
+ * @param id - data store id
522
+ * @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
523
+ */
524
+ private validateNotDeleted(id: string, requestHeaderData?: RuntimeHeaderData) {
525
+ if (this.checkIfDeleted(id, requestHeaderData)) {
491
526
  // The requested data store is removed by gc. Create a 404 gc response exception.
492
- const error = responseToException(
527
+ const request: IRequest = { url: id };
528
+ throw responseToException(
493
529
  createResponseError(404, "DataStore was deleted", request),
494
530
  request,
495
531
  );
496
- sendGCUnexpectedUsageEvent(
497
- this.mc,
498
- {
499
- eventName: "GC_Deleted_DataStore_Requested",
500
- category: "error",
501
- isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
502
- headers: JSON.stringify(requestHeaderData),
503
- gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
504
- },
505
- undefined /** packagePath */,
506
- error,
507
- );
508
- throw error;
509
532
  }
510
533
  }
511
534
 
535
+ /**
536
+ * Checks if the data store has not been marked as tombstone by GC or not.
537
+ * @param context - the data store context in question
538
+ * @param requestHeaderData - the request header information to log if the validation detects the data store has been tombstoned
539
+ * @returns true if the data store is tombstoned. Otherwise, returns false.
540
+ */
541
+ private checkIfTombstoned(
542
+ context: FluidDataStoreContext,
543
+ requestHeaderData: RuntimeHeaderData,
544
+ ) {
545
+ if (!context.tombstoned) {
546
+ return false;
547
+ }
548
+ const logErrorEvent = this.throwOnTombstoneLoad && !requestHeaderData.allowTombstone;
549
+ sendGCUnexpectedUsageEvent(
550
+ this.mc,
551
+ {
552
+ eventName: "GC_Tombstone_DataStore_Requested",
553
+ category: logErrorEvent ? "error" : "generic",
554
+ isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
555
+ id: context.id,
556
+ headers: JSON.stringify(requestHeaderData),
557
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
558
+ },
559
+ context.isLoaded ? context.packagePath : undefined,
560
+ );
561
+ return true;
562
+ }
563
+
512
564
  /**
513
565
  * Validates that the data store context requested has not been marked as tombstone by GC.
514
- *
515
566
  * @param context - the data store context in question
516
567
  * @param request - the request information to log if the validation detects the data store has been tombstoned
517
- * @param headerData - the request header information to log if the validation detects the data store has been tombstoned
568
+ * @param requestHeaderData - the request header information to log if the validation detects the data store has been tombstoned
518
569
  */
519
570
  private validateNotTombstoned(
520
571
  context: FluidDataStoreContext,
521
- request: IRequest,
522
- headerData: RuntimeHeaderData,
572
+ requestHeaderData: RuntimeHeaderData,
523
573
  ) {
524
- if (context.tombstoned) {
525
- const shouldFail = this.throwOnTombstoneLoad && !headerData.allowTombstone;
526
-
574
+ if (this.checkIfTombstoned(context, requestHeaderData)) {
527
575
  // The requested data store is removed by gc. Create a 404 gc response exception.
576
+ const request: IRequest = { url: context.id };
528
577
  const error = responseToException(
529
578
  createResponseError(404, "DataStore was deleted", request, {
530
579
  [TombstoneResponseHeaderKey]: true,
531
580
  }),
532
581
  request,
533
582
  );
534
- sendGCUnexpectedUsageEvent(
535
- this.mc,
536
- {
537
- eventName: "GC_Tombstone_DataStore_Requested",
538
- category: shouldFail ? "error" : "generic",
539
- isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
540
- headers: JSON.stringify(headerData),
541
- gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
542
- },
543
- context.isLoaded ? context.packagePath : undefined,
544
- error,
545
- );
546
-
547
- if (shouldFail) {
583
+ // Throw an error if configured via options and via request headers.
584
+ if (this.throwOnTombstoneLoad && !requestHeaderData.allowTombstone) {
548
585
  throw error;
549
586
  }
550
587
  }
551
588
  }
552
589
 
553
- public processSignal(address: string, message: IInboundSignalMessage, local: boolean) {
554
- const request = { url: address };
555
- this.validateNotDeleted(address, request);
556
- const context = this.contexts.get(address);
590
+ public processSignal(fluidDataStoreId: string, message: IInboundSignalMessage, local: boolean) {
591
+ this.validateNotDeleted(fluidDataStoreId);
592
+ const context = this.contexts.get(fluidDataStoreId);
557
593
  if (!context) {
558
594
  // Attach message may not have been processed yet
559
595
  assert(!local, 0x163 /* "Missing datastore for local signal" */);
560
596
  this.mc.logger.sendTelemetryEvent({
561
597
  eventName: "SignalFluidDataStoreNotFound",
562
- fluidDataStoreId: {
563
- value: address,
564
- tag: TelemetryDataTag.CodeArtifact,
565
- },
598
+ ...tagCodeArtifacts({
599
+ fluidDataStoreId,
600
+ }),
566
601
  });
567
602
  return;
568
603
  }
@@ -571,7 +606,7 @@ export class DataStores implements IDisposable {
571
606
  }
572
607
 
573
608
  public setConnectionState(connected: boolean, clientId?: string) {
574
- for (const [fluidDataStore, context] of this.contexts) {
609
+ for (const [fluidDataStoreId, context] of this.contexts) {
575
610
  try {
576
611
  context.setConnectionState(connected, clientId);
577
612
  } catch (error) {
@@ -579,7 +614,9 @@ export class DataStores implements IDisposable {
579
614
  {
580
615
  eventName: "SetConnectionStateError",
581
616
  clientId,
582
- fluidDataStore,
617
+ ...tagCodeArtifacts({
618
+ fluidDataStoreId,
619
+ }),
583
620
  details: JSON.stringify({
584
621
  runtimeConnected: this.runtime.connected,
585
622
  connected,
@@ -41,6 +41,8 @@ export class DeltaManagerSummarizerProxy
41
41
 
42
42
  constructor(deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>) {
43
43
  super(deltaManager);
44
+ // We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
45
+ super.setMaxListeners(0);
44
46
  this.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;
45
47
  }
46
48
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryLoggerExt, TelemetryLogger } from "@fluidframework/telemetry-utils";
6
+ import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils";
7
7
  import { performance } from "@fluidframework/common-utils";
8
8
  import { IDeltaManager } from "@fluidframework/container-definitions";
9
9
  import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
@@ -111,20 +111,16 @@ export class DeltaScheduler {
111
111
  if (this.schedulingLog) {
112
112
  this.logger.sendTelemetryEvent({
113
113
  eventName: "InboundOpsPartialProcessingTime",
114
- duration: TelemetryLogger.formatTick(elapsedTime),
114
+ duration: formatTick(elapsedTime),
115
115
  opsProcessed:
116
116
  this.schedulingLog.lastSequenceNumber -
117
117
  this.schedulingLog.firstSequenceNumber +
118
118
  1,
119
119
  opsRemainingToProcess: this.deltaManager.inbound.length,
120
- processingTime: TelemetryLogger.formatTick(
121
- this.schedulingLog.totalProcessingTime,
122
- ),
120
+ processingTime: formatTick(this.schedulingLog.totalProcessingTime),
123
121
  numberOfTurns: this.schedulingLog.numberOfTurns,
124
122
  batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
125
- timeToResume: TelemetryLogger.formatTick(
126
- performance.now() - currentTime,
127
- ),
123
+ timeToResume: formatTick(performance.now() - currentTime),
128
124
  });
129
125
  }
130
126
  this.deltaManager.inbound.resume();
@@ -147,13 +143,13 @@ export class DeltaScheduler {
147
143
  eventName: "InboundOpsProcessingTime",
148
144
  opsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,
149
145
  numberOfTurns: this.schedulingLog.numberOfTurns,
150
- processingTime: TelemetryLogger.formatTick(this.schedulingLog.totalProcessingTime),
146
+ processingTime: formatTick(this.schedulingLog.totalProcessingTime),
151
147
  opsProcessed:
152
148
  this.schedulingLog.lastSequenceNumber -
153
149
  this.schedulingLog.firstSequenceNumber +
154
150
  1,
155
151
  batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
156
- duration: TelemetryLogger.formatTick(currentTime - this.schedulingLog.startTime),
152
+ duration: formatTick(currentTime - this.schedulingLog.startTime),
157
153
  schedulingCount: this.schedulingCount,
158
154
  });
159
155
 
@@ -16,9 +16,9 @@ import {
16
16
  } from "@fluidframework/runtime-definitions";
17
17
  import { ReadAndParseBlob } from "@fluidframework/runtime-utils";
18
18
  import {
19
- ChildLogger,
19
+ createChildLogger,
20
+ createChildMonitoringContext,
20
21
  ITelemetryLoggerExt,
21
- loggerToMonitoringContext,
22
22
  MonitoringContext,
23
23
  PerformanceEvent,
24
24
  } from "@fluidframework/telemetry-utils";
@@ -137,11 +137,13 @@ export class GarbageCollector implements IGarbageCollector {
137
137
  const baseSnapshot = createParams.baseSnapshot;
138
138
  const readAndParseBlob = createParams.readAndParseBlob;
139
139
 
140
- this.mc = loggerToMonitoringContext(
141
- ChildLogger.create(createParams.baseLogger, "GarbageCollector", {
140
+ this.mc = createChildMonitoringContext({
141
+ logger: createParams.baseLogger,
142
+ namespace: "GarbageCollector",
143
+ properties: {
142
144
  all: { completedGCRuns: () => this.completedRuns },
143
- }),
144
- );
145
+ },
146
+ });
145
147
 
146
148
  this.configs = generateGCConfigs(this.mc, createParams);
147
149
 
@@ -466,8 +468,11 @@ export class GarbageCollector implements IGarbageCollector {
466
468
  });
467
469
 
468
470
  const logger = options.logger
469
- ? ChildLogger.create(options.logger, undefined, {
470
- all: { completedGCRuns: () => this.completedRuns },
471
+ ? createChildLogger({
472
+ logger: options.logger,
473
+ properties: {
474
+ all: { completedGCRuns: () => this.completedRuns },
475
+ },
471
476
  })
472
477
  : this.mc.logger;
473
478
 
@@ -307,6 +307,7 @@ export function trimLeadingAndTrailingSlashes(str: string) {
307
307
 
308
308
  /**
309
309
  * Tags the passed value as a CodeArtifact and returns the tagged value.
310
+ * @deprecated - Use telemetry-utils tagCodeArtifacts instead
310
311
  */
311
312
  export function tagAsCodeArtifact(value: string) {
312
313
  return {
@@ -5,11 +5,11 @@
5
5
 
6
6
  import { ITelemetryGenericEvent } from "@fluidframework/core-interfaces";
7
7
  import { IGarbageCollectionData } from "@fluidframework/runtime-definitions";
8
- import { packagePathToTelemetryProperty } from "@fluidframework/runtime-utils";
9
8
  import {
10
9
  generateStack,
11
10
  ITelemetryLoggerExt,
12
11
  MonitoringContext,
12
+ tagCodeArtifacts,
13
13
  } from "@fluidframework/telemetry-utils";
14
14
  import { ICreateContainerMetadata } from "../summary";
15
15
  import {
@@ -161,7 +161,6 @@ export class GCTelemetryTracker {
161
161
  const { usageType, currentReferenceTimestampMs, packagePath, id, fromId, ...propsToLog } =
162
162
  nodeUsageProps;
163
163
  const eventProps: Omit<IUnreferencedEventProps, "state" | "usageType"> = {
164
- id: tagAsCodeArtifact(id),
165
164
  type: nodeType,
166
165
  unrefTime: nodeStateTracker.unreferencedTimestampMs,
167
166
  age:
@@ -171,7 +170,7 @@ export class GCTelemetryTracker {
171
170
  state === UnreferencedState.Inactive
172
171
  ? this.configs.inactiveTimeoutMs
173
172
  : this.configs.sweepTimeoutMs,
174
- fromId: fromId ? tagAsCodeArtifact(fromId) : undefined,
173
+ ...tagCodeArtifacts({ id, fromId }),
175
174
  ...propsToLog,
176
175
  ...this.createContainerMetadata,
177
176
  };
@@ -211,7 +210,7 @@ export class GCTelemetryTracker {
211
210
  const { id: taggedId, fromId: taggedFromId, ...otherProps } = eventProps;
212
211
  const event = {
213
212
  eventName: `${state}Object_${nodeUsageProps.usageType}`,
214
- pkg: packagePathToTelemetryProperty(nodeUsageProps.packagePath),
213
+ pkg: tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }).pkg,
215
214
  stack: generateStack(),
216
215
  id: taggedId,
217
216
  fromId: taggedFromId,
@@ -277,8 +276,10 @@ export class GCTelemetryTracker {
277
276
  if (missingExplicitRoutes.length > 0) {
278
277
  logger.sendErrorEvent({
279
278
  eventName: "gcUnknownOutboundReferences",
280
- id: tagAsCodeArtifact(nodeId),
281
- routes: tagAsCodeArtifact(JSON.stringify(missingExplicitRoutes)),
279
+ ...tagCodeArtifacts({
280
+ id: nodeId,
281
+ routes: JSON.stringify(missingExplicitRoutes),
282
+ }),
282
283
  });
283
284
  }
284
285
  }
@@ -318,8 +319,10 @@ export class GCTelemetryTracker {
318
319
  }),
319
320
  id,
320
321
  fromId,
321
- pkg: pkg ? tagAsCodeArtifact(pkg.join("/")) : undefined,
322
- fromPkg: fromPkg ? tagAsCodeArtifact(fromPkg.join("/")) : undefined,
322
+ ...tagCodeArtifacts({
323
+ pkg: pkg?.join("/"),
324
+ fromPkg: fromPkg?.join("/"),
325
+ }),
323
326
  };
324
327
 
325
328
  if (state === UnreferencedState.Inactive) {
@@ -379,7 +382,7 @@ export class GCTelemetryTracker {
379
382
  lastSummaryTime,
380
383
  ...this.createContainerMetadata,
381
384
  }),
382
- id: tagAsCodeArtifact(JSON.stringify(deletedNodeIds)),
385
+ ...tagCodeArtifacts({ id: JSON.stringify(deletedNodeIds) }),
383
386
  });
384
387
  }
385
388
  }
@@ -398,7 +401,7 @@ export function sendGCUnexpectedUsageEvent(
398
401
  packagePath: readonly string[] | undefined,
399
402
  error?: unknown,
400
403
  ) {
401
- event.pkg = packagePathToTelemetryProperty(packagePath);
404
+ event.pkg = tagCodeArtifacts({ pkg: packagePath?.join("/") })?.pkg;
402
405
  event.tombstoneFlags = JSON.stringify({
403
406
  DisableTombstone: mc.config.getBoolean(disableTombstoneKey),
404
407
  ThrowOnTombstoneUsage: mc.config.getBoolean(throwOnTombstoneUsageKey),
@@ -5,7 +5,6 @@
5
5
 
6
6
  /* eslint-disable @typescript-eslint/restrict-plus-operands */
7
7
 
8
- import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
9
8
  import { assert } from "@fluidframework/common-utils";
10
9
  import {
11
10
  IIdCompressor,
@@ -31,6 +30,8 @@ import type {
31
30
  VersionedSerializedIdCompressor,
32
31
  } from "@fluidframework/runtime-definitions";
33
32
  import BTree from "sorted-btree";
33
+ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
34
+ import { ITelemetryLoggerExt, createChildLogger } from "@fluidframework/telemetry-utils";
34
35
  import {
35
36
  hasAtLeastLength,
36
37
  compareFiniteNumbers,
@@ -305,15 +306,15 @@ export class IdCompressor implements IIdCompressorCore, IIdCompressor {
305
306
  private readonly finalIdToCluster: AppendOnlySortedMap<FinalCompressedId, IdCluster> =
306
307
  new AppendOnlySortedMap(compareFiniteNumbers);
307
308
 
309
+ private readonly logger: ITelemetryLoggerExt;
310
+
308
311
  /**
309
312
  * @param localSessionId - the `IdCompressor`'s current local session ID.
310
313
  * {@link generateStableId}.
311
314
  */
312
- public constructor(
313
- public readonly localSessionId: SessionId,
314
- private readonly logger?: ITelemetryLoggerExt,
315
- ) {
315
+ public constructor(public readonly localSessionId: SessionId, logger?: ITelemetryBaseLogger) {
316
316
  this.localSession = this.createSession(localSessionId);
317
+ this.logger = createChildLogger({ logger });
317
318
  }
318
319
 
319
320
  /**