summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/telemetry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/telemetry.cpp')
-rw-r--r--src/mongo/db/query/telemetry.cpp43
1 files changed, 28 insertions, 15 deletions
diff --git a/src/mongo/db/query/telemetry.cpp b/src/mongo/db/query/telemetry.cpp
index 7b8c2c36c89..05b9a46b351 100644
--- a/src/mongo/db/query/telemetry.cpp
+++ b/src/mongo/db/query/telemetry.cpp
@@ -290,6 +290,26 @@ std::string fleSafeFieldNameRedactor(const BSONElement& e) {
return e.fieldNameStringData().toString();
}
+/**
+ * Append the element to the builder and redact any literals within the element. The element may be
+ * of any type.
+ */
+void appendWithRedactedLiterals(BSONObjBuilder& builder, const BSONElement& el) {
+ if (el.type() == Object) {
+ builder.append(el.fieldNameStringData(), el.Obj().redact(false, fleSafeFieldNameRedactor));
+ } else if (el.type() == Array) {
+ BSONObjBuilder arrayBuilder = builder.subarrayStart(fleSafeFieldNameRedactor(el));
+ for (auto&& arrayElem : el.Obj()) {
+ appendWithRedactedLiterals(arrayBuilder, arrayElem);
+ }
+ arrayBuilder.done();
+ } else {
+ auto fieldName = fleSafeFieldNameRedactor(el);
+ builder.append(fieldName, "###"_sd);
+ }
+ builder.done();
+}
+
} // namespace
const BSONObj& TelemetryMetrics::redactKey(const BSONObj& key) const {
@@ -380,11 +400,8 @@ void registerAggRequest(const AggregateCommandRequest& request, OperationContext
BSONObjBuilder pipelineBuilder = telemetryKey.subarrayStart("pipeline"_sd);
try {
for (auto&& stage : request.getPipeline()) {
- auto el = stage.firstElement();
BSONObjBuilder stageBuilder = pipelineBuilder.subobjStart("stage"_sd);
- stageBuilder.append(el.fieldNameStringData(),
- el.Obj().redact(false, fleSafeFieldNameRedactor));
- stageBuilder.done();
+ appendWithRedactedLiterals(stageBuilder, stage.firstElement());
}
pipelineBuilder.done();
telemetryKey.append("namespace", request.getNamespace().toString());
@@ -433,18 +450,14 @@ void registerFindRequest(const FindCommandRequest& request,
}
BSONObjBuilder telemetryKey;
- BSONObjBuilder findBuilder = telemetryKey.subobjStart("find"_sd);
try {
- auto findBson = request.toBSON({});
- for (auto&& findEntry : findBson) {
- if (findEntry.isABSONObj()) {
- telemetryKey.append(findEntry.fieldNameStringData(),
- findEntry.Obj().redact(false, fleSafeFieldNameRedactor));
- } else {
- telemetryKey.append(findEntry.fieldNameStringData(), "###"_sd);
- }
- }
- findBuilder.done();
+ // Serialize the request.
+ BSONObjBuilder serializedRequest;
+ BSONObjBuilder asElement = serializedRequest.subobjStart("find");
+ request.serialize({}, &asElement);
+ asElement.done();
+ // And append as an element to the telemetry key.
+ appendWithRedactedLiterals(telemetryKey, serializedRequest.obj().firstElement());
telemetryKey.append("namespace", collection.toString());
if (request.getReadConcern()) {
telemetryKey.append("readConcern", *request.getReadConcern());