对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

db.setProfilingLevel()(mongosh方法)

db.setProfilingLevel(level, options)

在版本5.0中进行了更改。

对于 mongod 实例,该方法可启用、禁用或配置数据库分析器。分析器捕获并记录正在运行的 mongod 实例上的写入操作、游标和数据库命令性能的数据。如果分析器被禁用,该方法将配置如何将慢操作记录到诊断日志中。

注意

使用 db.setProfilingLevel() 对分析级别所做的更改不会保留。当服务器重新启动时,它会恢复为 0(默认值),或者由 operationProfiling.mode 设置或 --profile 命令行选项设置的值。

如果数据库分析器级别为 1 或 2(具体来说,已启用数据库分析器),则 slowms 和 sampleRate 会同时影响分析器和 diagnostic log 的行为。

如果数据库分析器级别为 0(具体来说,数据库分析器已禁用),则 slowms 和 sampleRate 仅影响 诊断日志。

使用 mongos 实例,该方法设置 slowms、sampleRate 和 filter 配置设置,从而配置如何将操作写入诊断日志。您无法在 mongos 实例上启用数据库分析器,因为 mongos 没有分析器可以写入的任何集合。对于 mongos 实例,profile 等级必须为 0。

您可以在mongod 和 mongos 实例上指定过滤,以控制分析器记录哪些操作。当您为分析器指定 filter 时,slowms 和 sampleRate 选项不会用于分析和慢速查询日志行。

db.setProfilingLevel() 提供了 profile 命令的封装器。

从MongoDB 5.0 开始,使用 profile 命令或 db.setProfilingLevel() 包装器方法对数据库分析器level、slowms、sampleRate 或 filter 所做的更改会记录在 log file。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas :用于在云中部署MongoDB 的完全托管服务

重要

M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。

db.setProfilingLevel() 方法采用以下形式:

db.setProfilingLevel(<level>, <options>)
Parameter
类型
说明

整型

配置数据库分析器级别。以下分析器级别可用:

0

分析器已关闭,因此不收集任何数据。这是默认的分析器级别。

1

分析器会收集用时超过 slowms 值或与过滤匹配的操作的数据。

设置筛选器后:

2

分析器会收集所有操作的数据。当设立为 2 级时,分析器会忽略用户提供的 slowms 和 filter 值。

由于分析在 mongos 上不可用,因此不能使用 db.setProfilingLevel() 在 mongos实例上将分析级别设立为 0 以外的值。

文档或整数

可选。接受整数或选项文档。如果将整数值而不是文档作为 options 参数传递,则该值将分配给 slowms。可以使用以下选项:

  • slowms:

    默认: 100
    类型: 整数

    慢速操作时长阈值(以毫秒为单位)。运行时长超过此阈值的操作被视为慢速操作。

    当 logLevel 设置为 0 时,MongoDB 会将慢速操作记录到诊断日志中,记录速度由 slowOpSampleRate 确定。

    在较高的 logLevel 设置下,所有操作都会出现在诊断日志中,无论其延迟如何,但从节点(secondary node from replica set)记录慢速 oplog 条目消息的操作除外。从节点(secondary node from replica set)仅日志慢速 oplog 条目;增加 logLevel 不会日志所有 oplog 条目。

    对于 mongod 实例,该设置会影响诊断日志,如果启用,还会影响分析器。

    对于 mongos 实例,该设置仅影响诊断日志,不影响分析器,因为在 mongos 上无法进行分析。

    此参数影响与配置文件选项 slowOpThresholdMs 相同的设置。

  • sampleRate:

    默认值:1.0
    类型:double

    要分析或日志的慢速操作的比例。 sampleRate 接受介于 0 和 1(含)之间的值。

  • 过滤器:

    类型:对象

    一个筛选器表达式,用于控制要分析和记录的操作。该筛选器表达式中的字段可以是分析器输出中的任何字段。

    对于 mongod 实例,该设置会影响诊断日志,如果启用,还会影响分析器。

    对于 mongos 实例,该设置仅影响诊断日志,不影响分析器,因为在 mongos 上无法进行分析。

    从 MongoDB 8.0 开始,您可以指定 workingMillis 作为过滤器参数,以根据 MongoDB 处理该操作所花费的时间来记录操作。

    有关用于控制记录的操作的过滤示例,请参阅设置筛选器以确定分析的操作。

    设立分析过滤后,slowms 和 sampleRate 选项不会影响诊断日志或分析器。

该方法返回一个包含先前设置值的文档。

{
"was" : 2,
"slowms" : 100,
"sampleRate" : 1,
"filter" : {
"$and" : [
{
"op" : {
"$eq" : "query"
}
},
{
"millis" : {
"$gt" : 20000
}
}
]
},
"note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",
"ok" : 1
}

其中:

  • was 是上一个级别设置。

  • slowms 是之前的 slowms 设置。

  • sampleRate 是之前的 sampleRate 设置。

  • filter 是上一个过滤设置。

  • note 是解释 filter 行为的字符串。只有当 filter 也存在时,此字段才会出现在输出中。

注意

filter 和 note 字段仅在先前级别设置中存在的情况下才会出现在输出中。

要查看当前分析级别,请参阅 db.getProfilingStatus()。

警告

分析会降低性能,并在系统日志中暴露未经加密的查询数据。在生产部署中配置和启用分析器之前,请仔细考虑对性能和安全的影响。

有关潜在性能下降的更多信息,请参阅分析器开销。

以下示例集用于 mongod 实例:

  • 将分析级别设置为1,

  • 慢操作阈值减慢至 20 毫秒,并且

  • 将 sampleRate 设置为 0.42。

db.setProfilingLevel(1, { slowms: 20, sampleRate: 0.42 })

该操作返回一个包含先前设置值的文档。

要查看当前分析级别,请参阅 db.getProfilingStatus()。

下面的示例为 mongod 或 mongos 实例进行了设置:

  • 将分析级别设置为0,

  • 慢操作阈值减慢至 20 毫秒,并且

  • 将 sampleRate 设置为 0.42。

db.setProfilingLevel(0, { slowms: 20, sampleRate: 0.42 })

该操作返回一个包含先前设置值的文档。

要查看当前分析级别,请参阅 db.getProfilingStatus()。

以下示例集用于 mongod 实例:

  • 将分析级别设置为1,

  • 过滤{ op: "query", millis: { $gt: 2000 } },这会导致分析器仅记录耗时超过 2 秒的 query 操作。

db.setProfilingLevel( 1, { filter: { op: "query", millis: { $gt: 2000 } } } )

该操作返回一个包含先前设置值的文档。

要查看当前分析级别,请参阅 db.getProfilingStatus()。

您可以在不启用数据库分析器的情况下设立filter。以下示例使用分析级别为 0 的过滤。

db.setProfilingLevel( 0, { filter: { op: "query", millis: { $gt: 2000 } } } )

由于分析级别为 0,分析器已禁用,因此不会将匹配的操作记录到分析器集合。过滤器仍然应用于诊断日志。

该操作返回一个包含先前设置值的文档。

要查看当前分析级别,请参阅 db.getProfilingStatus()。

要清除分析筛选器,请运行带有 filter: "unset" 选项的 db.setProfilingLevel()。

db.setProfilingLevel( 1, { filter: "unset" } )

该操作返回一个包含先前设置值的文档。

要查看当前分析级别,请参阅 db.getProfilingStatus()。