Skip to content

Commit 8be1369

Browse files
Merge #2191: RUM-8042 Add pending batches to batch deleted metric
Co-authored-by: maxep <[email protected]>
2 parents 7dba337 + 737e7f4 commit 8be1369

File tree

4 files changed

+31
-13
lines changed

4 files changed

+31
-13
lines changed

DatadogCore/Sources/Core/Storage/Files/Directory.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,13 @@ internal struct Directory: DirectoryProtocol {
129129
return File(url: fileURL)
130130
}
131131

132+
/// Returns count of files in this directory.
133+
func filesCount() throws -> Int {
134+
return try FileManager.default
135+
.contentsOfDirectory(at: url, includingPropertiesForKeys: [.isRegularFileKey])
136+
.count
137+
}
138+
132139
/// Returns all files of this directory.
133140
func files() throws -> [File] {
134141
return try FileManager.default

DatadogCore/Sources/Core/Storage/FilesOrchestrator.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ internal class FilesOrchestrator: FilesOrchestratorType {
120120
lastWritableFileObjectsCount = 1
121121
lastWritableFileApproximatedSize = writeSize
122122
lastWritableFileLastWriteDate = dateProvider.now
123+
123124
return newFile
124125
}
125126

@@ -175,8 +176,7 @@ internal class FilesOrchestrator: FilesOrchestratorType {
175176
func getReadableFiles(excludingFilesNamed excludedFileNames: Set<String> = [], limit: Int = .max) -> [ReadableFile] {
176177
do {
177178
let filesFromOldest = try directory.files()
178-
.map { (file: $0, fileCreationDate: fileCreationDateFrom(fileName: $0.name)) }
179-
.compactMap { try deleteFileIfItsObsolete(file: $0.file, fileCreationDate: $0.fileCreationDate) }
179+
.compactMap { try deleteFileIfItsObsolete(file: $0, fileCreationDate: fileCreationDateFrom(fileName: $0.name)) }
180180
.sorted(by: { $0.fileCreationDate < $1.fileCreationDate })
181181

182182
if ignoreFilesAgeWhenReading {
@@ -185,12 +185,11 @@ internal class FilesOrchestrator: FilesOrchestratorType {
185185
.map { $0.file }
186186
}
187187

188-
let filtered = filesFromOldest
188+
return filesFromOldest
189189
.filter {
190-
let fileAge = dateProvider.now.timeIntervalSince($0.fileCreationDate)
191-
return excludedFileNames.contains($0.file.name) == false && fileAge >= performance.minFileAgeForRead
190+
!excludedFileNames.contains($0.file.name) &&
191+
dateProvider.now.timeIntervalSince($0.fileCreationDate) >= performance.minFileAgeForRead
192192
}
193-
return filtered
194193
.prefix(limit)
195194
.map { $0.file }
196195
} catch {
@@ -278,7 +277,8 @@ internal class FilesOrchestrator: FilesOrchestratorType {
278277
BatchDeletedMetric.batchAgeKey: batchAge.toMilliseconds,
279278
BatchDeletedMetric.batchRemovalReasonKey: deletionReason.toString(),
280279
BatchDeletedMetric.inBackgroundKey: false,
281-
BatchDeletedMetric.backgroundTasksEnabled: metricsData.backgroundTasksEnabled
280+
BatchDeletedMetric.backgroundTasksEnabled: metricsData.backgroundTasksEnabled,
281+
BatchDeletedMetric.pendingBatches: try? directory.filesCount()
282282
],
283283
sampleRate: BatchDeletedMetric.sampleRate
284284
)

DatadogCore/Sources/SDKMetrics/BatchMetrics.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ internal enum BatchDeletedMetric {
5959
/// If the background tasks were enabled.
6060
static let backgroundTasksEnabled = "background_tasks_enabled"
6161

62+
/// Count of pending batches left on track.
63+
static let pendingBatches = "pending_batches"
64+
6265
/// Allowed values for `batchRemovalReasonKey`.
6366
enum RemovalReason {
6467
/// The batch was delivered to Intake and deleted upon receiving given `responseCode`.

DatadogCore/Tests/Datadog/Core/Persistence/FilesOrchestrator+MetricsTests.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,22 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
4949
func testWhenReadableFileIsDeleted_itSendsBatchDeletedMetric() throws {
5050
// Given
5151
let orchestrator = createOrchestrator()
52-
let file = try XCTUnwrap(orchestrator.getWritableFile(writeSize: 1) as? ReadableFile)
5352
let expectedBatchAge = storage.minFileAgeForRead + 1
5453

55-
// When:
56-
// - wait and delete the file
54+
// When: create 1 batch file
55+
_ = try orchestrator.getWritableFile(writeSize: 1)
56+
57+
// When: wait and create 2nd batch file
58+
dateProvider.advance(bySeconds: expectedBatchAge)
59+
let file = try XCTUnwrap(orchestrator.getWritableFile(writeSize: 1) as? ReadableFile)
60+
61+
// When: wait and delete one
5762
dateProvider.advance(bySeconds: expectedBatchAge)
5863
orchestrator.delete(readableFile: file, deletionReason: .intakeCode(responseCode: 202))
5964

6065
// Then
6166
let metric = try XCTUnwrap(telemetry.messages.firstMetric(named: "Batch Deleted"))
62-
DDAssertReflectionEqual(metric.attributes, [
67+
DDAssertJSONEqual(metric.attributes, [
6368
"metric_type": "batch deleted",
6469
"track": "track name",
6570
"consent": "consent value",
@@ -72,6 +77,7 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
7277
"background_tasks_enabled": false,
7378
"batch_age": expectedBatchAge.toMilliseconds,
7479
"batch_removal_reason": "intake-code-202",
80+
"pending_batches": 1
7581
])
7682
XCTAssertEqual(metric.sampleRate, BatchDeletedMetric.sampleRate)
7783
}
@@ -90,7 +96,7 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
9096

9197
// Then
9298
let metric = try XCTUnwrap(telemetry.messages.firstMetric(named: "Batch Deleted"))
93-
DDAssertReflectionEqual(metric.attributes, [
99+
DDAssertJSONEqual(metric.attributes, [
94100
"metric_type": "batch deleted",
95101
"track": "track name",
96102
"consent": "consent value",
@@ -103,6 +109,7 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
103109
"background_tasks_enabled": false,
104110
"batch_age": (storage.maxFileAgeForRead + 1).toMilliseconds,
105111
"batch_removal_reason": "obsolete",
112+
"pending_batches": 0
106113
])
107114
XCTAssertEqual(metric.sampleRate, BatchDeletedMetric.sampleRate)
108115
}
@@ -124,7 +131,7 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
124131

125132
// Then
126133
let metric = try XCTUnwrap(telemetry.messages.firstMetric(named: "Batch Deleted"))
127-
DDAssertReflectionEqual(metric.attributes, [
134+
DDAssertJSONEqual(metric.attributes, [
128135
"metric_type": "batch deleted",
129136
"track": "track name",
130137
"consent": "consent value",
@@ -137,6 +144,7 @@ class FilesOrchestrator_MetricsTests: XCTestCase {
137144
"background_tasks_enabled": false,
138145
"batch_age": expectedBatchAge.toMilliseconds,
139146
"batch_removal_reason": "purged",
147+
"pending_batches": 0
140148
])
141149
XCTAssertEqual(metric.sampleRate, BatchDeletedMetric.sampleRate)
142150
}

0 commit comments

Comments
 (0)