Docs 菜单

db.setProfilingLevel()

db.setProfilingLevel(level, options)

5.0 版本中的更改

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

注意

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

如果数据库分析器级别12(具体而言,数据库分析器已启用),则 slowmssampleRate 会影响分析器和 diagnostic log 的行为

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

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

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

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

从 MongoDB 5.0 开始,使用 profile 命令或 db.setProfilingLevel() 封装方法对数据库分析器 levelslowmssampleRatefilter 进行的更改记录在 log file 中。

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

重要

M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。

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

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

整型

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

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

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

设置筛选器后:

  • slowmssampleRate 选项不用于分析。

  • 分析器仅捕获与筛选器匹配的操作。

2
该分析器会收集所有操作的数据。

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

文档或整数

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

Default: 100
Type: integer

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

根据 workingMillis记录慢操作,这是 MongoDB 处理该操作所花费的时间。这意味着等待锁和流量控制等因素不会影响操作是否超过慢操作阈值。

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

如果 logLevel 设置得较高,所有操作无论延迟如何,都会显示在诊断日志中,但从节点记录慢速 oplog 条目消息这项操作除外。从节点仅记录慢速 oplog 条目。增加 logLevel 不会导致记录所有 oplog 条目。

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

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

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

Default: 1.0
Type: double

应分析或记录的慢速操作的比例。sampleRate 接受 0 到 1(含)之间的值。

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

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

此参数影响与配置选项 slowOpSampleRate 相同的设置。

类型:对象

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

对于 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" : 0,
"slowms" : 100,
"sampleRate" : 1,
"filter" : {
"$and" : [
{
"op" : {
"$eq" : "query"
}
},
{
"millis" : {
"$gte" : 2000
}
}
]
},
"note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1572991238, 1),
"signature" : {
"hash" : BinData(0,"hg6GnlrVhV9MAhwWdeHmHQ4T4qU="),
"keyId" : NumberLong("6755945537557495811")
}
},
"operationTime" : Timestamp(1572991238, 1)
}
{
"was" : 0,
"slowms" : 100,
"sampleRate" : 1,
"filter" : {
"$and" : [
{
"op" : {
"$eq" : "query"
}
},
{
"millis" : {
"$gte" : 2000
}
}
]
},
"note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",
"ok" : 1,
"operationTime" : Timestamp(1572991499, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1572991499, 2),
"signature" : {
"hash" : BinData(0,"nhCquIxUw7thlrBudXe3PnsnvP0="),
"keyId" : NumberLong("6755946491040235540")
}
}
}

其中:

  • was上一个级别设置。

  • slowms之前slowms 设置。

  • sampleRate之前的 sampleRate 设置。

  • filter之前的过滤器设置。

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

注意

filternote 字段仅在先前的级别设置中存在时才会出现在输出中。

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

警告

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

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

以下示例集用于 mongod 实例:

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

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

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

下面的示例为 mongodmongos 实例进行了设置:

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: "unset" 选项的 db.setProfilingLevel()

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

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

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